gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:54:59 24 4
gpt4 key购买 nike

我正在尝试映射一个热键以在 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

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

最佳答案

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

  1. 不要使用 map :您既不需要此映射在可视模式和运算符(operator)挂起模式下工作,也不需要使用其他映射的能力。
  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> before:需要丢弃count。
  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> .

关于regex - 在 Vim 的新选项卡中显示所有匹配的 grep 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10303025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com