In English
Highlight the search pattern register in Vim.
实现的目的
有的时候会遇到这样一个场景. 在当前文件中调用了一个函数, 而这个函数在另一个文件中被定义. 如果有 jedi 之类的神器帮助跳转当然再好不过, 不过如果项目足够复杂, 有的时候 jedi 还是力不从心的. 当这时, 我们的目标可能就变成:
将光标下的单词能在另一个文件下通过最简单的方式定位到.
简单做法
最简单的做法, 当然是在 normal mode 下使用 *
把搜索寄存器中的内容更新为光标下的单词. 但是这么做的问题是, 如果该页还有其他匹配项, 就会发生一次跳转. 需要使用 <c-o>
跳转回刚刚的位置.
然后 :b#
切换到另一个文件 (希望你和我一样设置了映射, 我的是 <leader-b>
). 文件切换我们这里不做展开.
这样的做法比较简单, 但是不够优雅.
存储到搜索寄存器
那么问题就简单了 – 怎样可以更新搜索寄存器.
通过 :h registers
可以了解到:
1 | 10. Last search pattern register "/ *quote_/* *quote/* |
这里可以看到搜索寄存器是可以通过 :let
来修改的. 那具体该怎么修改呢? 参见 :h let-register
1 | :let @{reg-name} = {expr1} *:let-register* *:let-@* |
那就好办了, 手动处理的话用两种方法:
:let @/ <C-r><C-w>
.:let @/='\<'.expand("<cword>").'\>'
将指令保存在 macro 中来调用
建议可以存到 macro 中. 这里也不特意展开了, 给一个例子, 设置 @m
为寄存动作:
1 | qm # 打开 m macro 的记录功能 |
之后只要调用 @m
就可以将当前光标下的文字存储到搜索寄存器中. 一个直观的测试方式, :set hlsearch
打开你的搜索高亮, 用 @m
试试吧!
使用 nmap
映射为永久可用的快捷键
但是 macro 有一个问题就是随时可能被替代, 那 map 或许是一个好的解决方式.
1 | :nnoremap <Leader>m :let @/='\<'.expand("<cword>").'\>'<CR> |