我正在尝试映射热键以在Vim中执行以下操作:
因此,我使用CTAGS的一个例子在新标签中打开变量/函数的声明,如下所示:
map <C-\> :split<CR>:exec("tag ".expand("<cword>"))<CR>
当它点击 CTRL - \ 时,会打开一个新选项卡,其中包含光标所在的变量/函数的声明。
我想映射的命令如下所示:
:lvim /\<\(text_i_want_to_find\)\>/gj *.c
:lw
当我运行此命令时,会打开一个新选项卡,显示包含文本.c
的所有text_i_want_to_find
文件的列表。我需要修改它来做两件与现在不同的事情:
.c
,.h
,.cpp
,.mk
的所有文件,而不只是.c
,并搜索名为“Makefile”的文件以下是我的text_i_want_to_find
文件中的映射代码。我不完全确定 CTRL - / 是否可以完全映射,所以我还有一个问题需要解决。
.vimrc
有没有人有关于修复此Vim映射的任何提示?
编辑:
在查看提供给我的答案后,这是我的代码的最终版本:
map <C-/> :split<CR>:lvim /\<\(.expand("<cword>")\)\>/gj *.c *.h *.cpp *.mk Makefile
我将它映射到 CTRL + g 。我也可以像冒号一样调用它:
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>
希望这对其他人也有帮助!
答案 0 :(得分:4)
当然,它不起作用:您忘记:execute
,:lvimgrep
命令本身不接受表达式,因此您正在搜索未跟随关键字的expand("<cword>")
字符(\>
),前面是任何不遵循关键字字符(\<.
)的字符。 \(
和\)
在这里毫无用处。其他说明:
map
:您既不需要此映射在视觉和操作员挂起模式下工作,也不需要使用其他映射。*.[ch] *.cpp *.mk Makefile
甚至*.{[ch],cpp,mk} Makefile
。<C-\>
可以映射,但不能映射<C-/>
(我希望目前只有,但是没有真正修复它的工作):\
是0x5C而<C-\>
是0x5C-0x40的= 0x1C处。但/
为0x2F且0x2F-0x40 <0。在我的系统中,在终端中按<C-/>
转换为<C-_>
,<C-->
也是如此。:split
命令无法打开新选项卡,它会打开一个新窗口。使用:tab
作为前缀。:lvimgrep
不会向您显示结果。除非删除j
标志,否则它不会跳转到第一个结果。<CR>
以及:lw<CR>
。我在下面使用:lopen
,在这种情况下,它们会产生相同的结果。<C-u>
或:
之后忘记了<C-\><C-n>
:需要丢弃计数。:execute
因为<C-r>=expand("cword")<CR>
或默认快捷方式<C-r><C-w>
。: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>
。