首页 > 解决方案 > VIM:如何获取当前函数名

问题描述

在我的 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中自动填写函数名吗?

标签: vimvi

解决方案


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

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

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

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

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

选择

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

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

像映射一样,它仍然会节省大量的输入。您可以拉出函数名称以将其粘贴,或者如果光标当前位于其顶部,只需通过 将其插入:Phpunit命令行<C-R><C-W>

作为下一步,您可以:Phpunit处理零参数,然后删除--filter参数,因此您的映射将变为:nnoremap <Leader>pt :Phpunit<CR>


推荐阅读