【问题标题】:Show all matching grep results in new tab in Vim在 Vim 的新选项卡中显示所有匹配的 grep 结果
【发布时间】:2012-05-05 09:23:55
【问题描述】:

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

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

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

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

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

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

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

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

  1. 搜索所有扩展名为.c.h.cpp.mk 的文件,而不仅仅是.c,还搜索名为“Makefile”的文件
  2. 像上面显示的 CTRL-\ 映射一样搜索光标下的 c 字,而不必手动输入文本 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

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

【问题讨论】:

    标签: regex vim grep vi ctags


    【解决方案1】:

    当然不行:你忘了:execute:lvimgrep命令本身不接受表达式,所以你搜索的expand("&lt;cword&gt;")后面没有关键字字符(\&gt;)并且前面有任何不跟在关键字字符 (\&lt;.) 之后的字符。 \(\) 在这里没用。其他说明:

    1. 不要使用map:您既不需要此映射在可视模式和操作员挂起模式下工作,也不需要使用其他映射。
    2. 有些模式可以合并:*.[ch] *.cpp *.mk Makefile 甚至*.{[ch],cpp,mk} Makefile
    3. &lt;C-\&gt; 可以映射,但 &lt;C-/&gt; 不能映射(我希望只是目前,但没有实际修复它的工作):\ 是 0x5C,&lt;C-\&gt; 是 0x5C-0x40=0x1C。但是/ 是 0x2F 和 0x2F-0x40<C-/> 会转换为&lt;C-_&gt;&lt;C--&gt; 也是如此。
    4. :split 命令不会打开新选项卡,而是打开一个新窗口。在前面加上 :tab 来执行此操作。
    5. :lvimgrep 不会向您显示结果。除非您删除 j 标志,否则它不会跳转到第一个结果。
    6. 您忘记了最终的&lt;CR&gt;:lw&lt;CR&gt;。我在下面使用:lopen,在这种情况下,它们会产生相同的结果。
    7. 你在第一个:&lt;C-\&gt;&lt;C-n&gt;之后忘记了&lt;C-u&gt;:需要丢弃计数。
    8. 在任何一个映射中都不需要:execute,因为有&lt;C-r&gt;=expand("cword")&lt;CR&gt; 或默认快捷方式&lt;C-r&gt;&lt;C-w&gt;
    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>
    

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

    如果您确实将&lt;C-r&gt;&lt;C-w&gt; 替换为&lt;C-r&gt;=escape(expand('&lt;cword&gt;'), '/\')&lt;CR&gt;,则这两个映射都假定您在'iskeyword' 选项中既没有/ 也没有\

    【讨论】:

    • 谢谢。我最终也在 Vim wiki 上找到了部分答案: map :execute " grep -srnw --binary-files=without-match --exclude-dir=.git --exclude-from=exclude.list 。 -e" 。展开(“”)。 " " cwindow
    • @Dogbert Vim wiki 包含一堆糟糕的编码建议,我从不使用它:了解 Vim 帮助就足够了。它们可能很有用,但是每次我看到一个指向 vim wiki 的链接时,我看到的代码如果我按照该链接按原样 使用的话。有一个很好的建议可以打破几乎所有的 vim 技巧:用映射 noremap : ;noremap ; : 交换 :;。 // 这些映射被人们使用,因为省略 shift 可能会显着提高 ; 仍然可用。
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多