我几乎总是用/搜索Vim,然后继续向前搜索n和向后搜索N.有时候,我使用?跳到我目前所在线上方几行的一个项目,在这种情况下,如果我想向前搜索相同的项目,我必须使用N代替n,这是一个恼人的心理减速带.
所以我的问题是:是否有可能让n总是向前走,N向后走?
附:文档似乎暗示它是不可能的,因为n只是“重复最新的”/“或”?“[计数]次”,但谁知道.
这是从
vim邮件列表上的
ZyX’s post中获取的.
noremap <expr> n 'Nn'[v:searchforward] noremap <expr> N 'nN'[v:searchforward]
它通过将’Nn’索引为两个元素的列表,将n映射到基于变量v:searchforward的原始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 pending模式.
我可能会这样写. (虽然我不确定这是否更清楚)
noremap <expr> n (v:searchforward ? 'n' : 'N') noremap <expr> N (v:searchforward ? 'N' : 'n')