VIM:如何获取当前函数名

Posted

技术标签:

【中文标题】VIM:如何获取当前函数名【英文标题】:VIM: How to get the current function name 【发布时间】:2020-02-28 09:30:29 【问题描述】:

在我的 vim 配置中,我映射了 ,pt 以运行 phpunit 测试。

map <leader>pt :!clear && vendor/bin/phpunit % --testdox<cr>

但有时我想使用 phpunit --filter 运行特定测试

map <leader>pt :!clear && vendor/bin/phpunit --filter FUNCTION_NAME_HERE % --testdox<cr>

有没有办法在vim中自动填入函数名?

【问题讨论】:

让我试试@phd @phd,很抱歉,我做不到。我用map &lt;leader&gt;pg :!clear &amp;&amp; vendor/bin/phpunit --filter expand('&lt;sfile&gt;') % --testdox&lt;cr&gt; 更新了我的.vimrc,测试了它,结果是E498: no :source file name to substitute for "&lt;sfile&gt;" &lt;sfile&gt; 仅适用于 VimScript。我猜你需要shellescape(matchstr(getline(search('function', 'bcnW')), 'function\s\+\zs\w\+')) 或类似的东西。 谢谢@Matt,我很抱歉,但也没有用...map &lt;leader&gt;pg :!clear &amp;&amp; vendor/bin/phpunit --filter shellescape(matchstr(getline(search('function', 'bcnW')), 'function\s\+\zs\w\+')) % --testdox&lt;cr&gt; 当然不是,因为整个 VimScript 语句被逐字传送到 shell,它对 VimScript 一无所知。如果这行得通,我会很开心。阅读:h :execute 作为入门。 【参考方案1】:

作为一个文本编辑器,Vim 对底层源代码的结构了解有限。

当前方法名称的潜在来源可能是:

跳转到上一个方法的开始处::help [m 语法高亮 tags 数据库; taglist 和 tagbar 等插件会自动突出显示当前定义

或者,您可以尝试通过模式提取来解析函数名称(正如 @Matt 在 cmets 中所建议的那样;通过类似 matchstr(getline(search('function', 'bcnW')), 'function\s\+\zs\w\+') 的方式)-但这将仅限于当前语言并且很难 100% 正确时间。

总而言之,这并不简单,需要高级 Vimscript 才能做到正确。

另类

我不会使用完全自动化的映射,而是选择 80% 的解决方案,即自定义 :command,您可以传递函数名称:

command -nargs=1 Phpunit !clear && vendor/bin/phpunit --filter <args> % --testdox

与映射一样,它仍然可以节省大量输入。您可以 yank 将函数名称粘贴到其中,或者如果光标当前位于其顶部,只需通过 &lt;C-R&gt;&lt;C-W&gt; 将其插入到 :Phpunit 命令行中。

下一步,您可以让:Phpunit 处理零参数,然后删除--filter 参数,这样您的映射将变为:nnoremap &lt;Leader&gt;pt :Phpunit&lt;CR&gt;

【讨论】:

以上是关于VIM:如何获取当前函数名的主要内容,如果未能解决你的问题,请参考以下文章

在严格模式下获取当前函数名

如何获取网页的url

用c语言如何获取内存地址?

如何使用 C# 或 VB.NET 获取当前的本地主机名? [复制]

如何在Linux shell中获取本机主机名

node.js 在函数内获取当前函数