【问题标题】:VIM: How to get the current function nameVIM:如何获取当前函数名
【发布时间】: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 作为入门。

标签: vim vi


【解决方案1】:

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

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

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

或者,您可以尝试通过模式提取来解析函数名称(正如 @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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2011-06-11
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多