我几乎总是使用/
在Vim中搜索,然后继续使用n
向前搜索,向后搜索N
。但是,有时候,我会使用?
跳转到我当前所在行上方几行的项目,在这种情况下,如果我想向前搜索同一项目,我必须使用N
代替n
,这是一种恼人的心理速度障碍。
所以我的问题是:是否可以让n
始终向前,N
向后?
P.S。文档似乎暗示它不可能,因为n
只是"重复最新的" /"或"?" [count]次",但谁知道。
答案 0 :(得分:9)
这是从vim邮件列表上的ZyX's post获取的。
noremap <expr> n 'Nn'[v:searchforward]
noremap <expr> N 'nN'[v:searchforward]
通过将n
索引为两个元素的列表,将v:searchforward
映射到基于变量'Nn'
的原始N或n。这只能起作用,因为映射是非递归的。如果它是递归的,那么它会称之为自我,你将处于无限循环中。
当v:searchforward == 1
(向前搜索)时,映射等同于
noremap <expr> n n
noremap <expr> N N
当v:searchfoward == 0
(向后搜索)时,映射等同于
noremap <expr> n N
noremap <expr> N n
此映射适用于Normal,Visual和Operator挂起模式。
我可能会这样写。 (虽然我不确定这是否更清楚)
noremap <expr> n (v:searchforward ? 'n' : 'N')
noremap <expr> N (v:searchforward ? 'N' : 'n')
答案 1 :(得分:6)
这就是它的方式,尽管在开发者的邮件列表上有一些争论......
以下是您可以采取的措施:
:noremap n /<CR>
:noremap N ?<CR>
相关的邮件列表主题,其中包含更多有趣的信息:https://groups.google.com/d/msg/vim_dev/8jSoA931P2Y/JklYtxFOiAYJ