3

我正在尝试映射一个热键以在 Vim 中执行以下操作:

  1. 匹配光标当前标记的当前 c-word
  2. 生成当前项目中所有找到的事件的列表
  3. 打开一个显示结果的新选项卡

因此,我有一个使用 CTAGS 的示例在新选项卡中打开变量/函数的声明,如下所示:

map <C-\> :split<CR>:exec("tag ".expand("<cword>"))<CR>

当它点击CTRL-\时,将打开一个新选项卡,其中包含光标所在的变量/函数的声明。

我试图映射的命令如下所示:

:lvim /\<\(text_i_want_to_find\)\>/gj *.c
:lw

当我运行此命令时,会打开一个新选项卡,其中显示包含 text 的所有.c文件的列表text_i_want_to_find。我需要修改它以做与现在不同的两件事:

  1. 搜索所有扩展名为.c, .h, .cpp, .mk, 而不是 , 的.c文件,并搜索名为“Makefile”的文件
  2. 像上面显示的那样搜索光标下的 c-word CTRL\而不是手动输入文本text_i_want_to_find

这是我.vimrc的映射文件中的代码。我不完全确定CTRL-是否/可以被映射,所以还有一个问题需要我解决。

map <C-/> :split<CR>:lvim /\<\(.expand("<cword>")\)\>/gj *.c *.h *.cpp *.mk Makefile

有没有人有关于修复这个 Vim 映射的任何提示?


编辑:

查看提供给我的答案后,这是我的代码的最终版本:

command! -nargs=1 SearchAll execute " grep -srnw --binary-files=without-match --exclude={*~,tags} --exclude-dir=.svn  . -e " . expand("<args>") . " " <bar> cwindow
map <C-g> :SearchAll <cword><CR>

我将它映射到CTRL+ g。我也可以像冒号命令一样调用它:

:SearchAll my_text_to_search_for

希望这对其他人也有帮助!

4

1 回答 1

4

当然,它不起作用:您忘记了:execute:lvimgrep命令本身不接受表达式,因此您要搜索的expand("<cword>")是后面没有关键字字符 ( \>) 并且前面有任何不跟在关键字字符 ( ) 后面的字符\<.\(在这里\)没用。其他注意事项:

  1. 不要使用map:您既不需要此映射在可视和操作员挂起模式下工作,也不需要使用其他映射的能力。
  2. 一些模式可以合并:*.[ch] *.cpp *.mk Makefile甚至*.{[ch],cpp,mk} Makefile.
  3. <C-\>可以映射,但不能映射<C-/>(我希望只是目前,但没有完成修复它的实际工作):\是 0x5C 并且<C-\>是 0x5C-0x40=0x1C。但是/0x2F 和 0x2F-0x40<0。在我的系统上按下终端会<C-/>变成.<C-_><C-->
  4. :split命令不会打开新选项卡,而是打开一个新窗口。预先设置它:tab以执行此操作。
  5. :lvimgrep不会向您展示结果。j除非您删除标志,否则它不会跳转到第一个结果。
  6. 你忘记了 final<CR>以及:lw<CR>. 我:lopen在下面使用,在这种情况下,它们会产生相同的结果。
  7. 您忘记了<C-u>after first:<C-\><C-n>before:需要丢弃计数。
  8. 您实际上并不需要:execute任何一个映射,因为存在<C-r>=expand("cword")<CR>或默认快捷方式<C-r><C-w>
  9. 不要写:exec(str):它是令人困惑的,因为:execute它不是一个函数,而且这种语法鼓励其他人认为它是。使用:execute str.

因此最终的映射是:

nnoremap <C-\> :<C-u>tab split \| lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| lopen<CR>

. 将其替换为

nnoremap <C-\> :<C-u>lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| tab lopen<CR>

如果您不想在新打开的选项卡中看到当前文件。

如果您确实替换为 ,则这两个映射都假定您既没有/也没有选项。\'iskeyword'<C-r><C-w><C-r>=escape(expand('<cword>'), '/\')<CR>

于 2012-04-24T19:00:45.203 回答