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 <leader>pg :!clear && vendor/bin/phpunit --filter expand('<sfile>') % --testdox<cr>
更新了我的.vimrc,测试了它,结果是E498: no :source file name to substitute for "<sfile>"
<sfile>
仅适用于 VimScript。我猜你需要shellescape(matchstr(getline(search('function', 'bcnW')), 'function\s\+\zs\w\+'))
或类似的东西。
谢谢@Matt,我很抱歉,但也没有用...map <leader>pg :!clear && vendor/bin/phpunit --filter shellescape(matchstr(getline(search('function', 'bcnW')), 'function\s\+\zs\w\+')) % --testdox<cr>
当然不是,因为整个 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 将函数名称粘贴到其中,或者如果光标当前位于其顶部,只需通过 <C-R><C-W>
将其插入到 :Phpunit
命令行中。
下一步,您可以让:Phpunit
处理零参数,然后删除--filter
参数,这样您的映射将变为:nnoremap <Leader>pt :Phpunit<CR>
【讨论】:
以上是关于VIM:如何获取当前函数名的主要内容,如果未能解决你的问题,请参考以下文章