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

时间:2015-02-11 00:22:00

标签: c++ regex vim

我目前正在研究一些通过宏定义许多内容的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>以便我以后可以插入它?

(另外,我猜这种方法可以使用一些改进。我已经看到一个特殊的窗口显示编译器错误,之前打开作为分割缓冲区,当我点击输入时它跳转到那个位置。这样也非常有帮助。)

1 个答案:

答案 0 :(得分:1)

您可以使用<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()