在 vim 中,如何创建一个命令来记住光标下的单词?

In vim, how do I create a command which remembers the word under the cursor?

我目前正在编写一些 C++ 代码,这些代码通过宏定义了很多东西,我发现了以下正则表达式,它在查找符号定义时包含这些宏时效果很好:

egrep -nrw --include=*.{c,h,i}{pp,xx} '^ *((struct|class|using|namespace) |typedef.*|[A-Z][_A-Z]*.)Symbol' .

我正在尝试将 Ctrl+F 映射到 vim 中的此命令,目前有以下内容:

map <C-F> :tabnew<CR>:redraw!<CR>:r! egrep -nrw --include=*.{c,h,i}{pp,xx} '^ *((struct<bar>class<bar>using<bar>namespace) <bar>typedef.*<bar>[A-Z][_A-Z]*.)Symbol' .

这行得通,但是当我按 Ctrl+F 时,如果能自动将 Symbol 替换为光标下的单词,那就太好了。我最好的猜测是将 Symbol 替换为 <C-r><C-w>,但这似乎失败了,因为前面的命令将光标从我想要查找的符号上移开。

如何让 vim 记住 <C-r><C-w> 以便稍后插入?

(此外,我猜想这种方法可以进行一些改进。我看到一个特殊的 window 显示编译器错误,在此之前它作为拆分缓冲区打开,当我按回车键时它跳转到那个位置。类似的东西也会很有帮助。)

您可以为此使用 <expr> 映射。这允许您将键绑定到函数的输出。将此与@Zach 的回答结合起来时,这应该可以满足您的要求:

map <expr> <C-F> ":tabnew<CR>:redraw!<CR>:r! egrep -nrw --include=*.{c,h,i}{pp,xx} '^ *((struct<bar>class<bar>using<bar>namespace) <bar>typedef.*<bar>[A-Z][_A-Z]*.)" . expand("<cword>") . "' ."

相关帮助主题:

:help :map-<expr>
:help matchstr()
:help getline()
:help col()