在Vim的新选项卡中显示所有匹配的grep结果

时间:2012-04-24 17:33:36

标签: regex vim grep vi ctags

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

  1. 匹配当前由光标标记的当前c字
  2. 生成当前项目中所有找到的事件的列表
  3. 打开一个显示结果的新标签
  4. 因此,我使用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文件的列表。我需要修改它来做两件与现在不同的事情:

    1. 搜索扩展名为.c.h.cpp.mk的所有文件,而不只是.c,并搜索名为“Makefile”的文件
    2. 在光标下搜索c-word,如上面显示的 CTRL - \ 映射,而不是必须手动输入文本{{1 }}
    3. 以下是我的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>
      

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

1 个答案:

答案 0 :(得分: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. 您忘记了最终<CR>以及:lw<CR>。我在下面使用:lopen,在这种情况下,它们会产生相同的结果。
  7. 您在之前<C-u>:之后忘记了<C-\><C-n>:需要丢弃计数。
  8. 您的任何一个映射都不需要:execute因为<C-r>=expand("cword")<CR>或默认快捷方式<C-r><C-w>
  9. 不要写:exec(str):这是令人困惑的,因为:execute不是一个函数,这种语法鼓励其他人认为它是。使用:execute str
  10. 因此最终的映射是:

    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>