即使我开始搜索“”,我怎么也可以继续前进?要么 '#'?


19

Vim有(至少)两组在相反方向上搜索的命令。键入/然后使用模式将在文档中向前搜索该模式;键入?,然后模式将向后搜索。*#命令之间存在相同的关系。

我不喜欢这些命令还设置了nand N命令的搜索方向。使用后/n向前浏览文档并向N后浏览;使用后?n向后N前进。(换句话说,n始终与原始搜索方向相同,而N始终与另一个方向相同。)

我怎样才能获得n前进通过文档,N向后走,不管我开始寻找哪个方向的?

Answers:


29

您可以使用以下方法来更改的行为,n并向N下/向上连续搜索:

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

更新:它是如何工作的?

这使用表达式映射,每次遇到lhs时,它将映射的lhs映射到将要评估的表达式。请参阅:h map-expression帮助。

发生的事情是,将v:searchforward变量(它确定最后一次搜索的方向的内部状态,请参阅参考资料:h v:searchforward)用作其前面字符串的索引。因此,在第一个地图的情况下,如果最后一个搜索方向是向前,则n将被映射到'n'(索引为1,表示返回第二个字符),如果它是向后的,则'n'将被映射到'N'(因为v:searchforward变量为0,因此将返回'N'。

编写这些映射的另一种方法是(可能更清楚):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

也有一些插件可以做到这一点(即SearchRepeat插件,也可能还有其他插件)。


感谢您提及我的插件;我只是建议您选择一种替代方法:-)
Ingo Karkat 2015年

2
巧妙使用下标!
wchargin 2015年

6
你能补充一个解释吗?我以前没有看过这种语法,我想知道它是如何工作的。
EvergreenTree'3

1
@EvergreenTree:添加了更多说明
Christian Brabandt 2015年

2
@ChristianBrabandt这很聪明。我从没想过您会使用它v:searchforward作为索引。
EvergreenTree'3

1

根据克里斯蒂安·布拉班德的解决方案,我想到了

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

这些映射也服从foldopen设置


0

我正在使用SearchIndex插件。要使用Christian Brabandt的答案,但要保持插件的功能,即每次输入n或时都显示匹配号N,因此请将其放在vimrc中:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.