10

我几乎总是在 Vim 中使用 搜索/,然后继续使用 向前n和向后搜索N。然而,有时我?会跳到比我当前所在行高几行的项目,在这种情况下,如果我想向前搜索相同的项目,我必须使用N而不是n,一个烦人的心理速度撞。

所以我的问题是:是否有可能n总是向前和N向后?

PS文档似乎暗示这是不可能的,因为n只是“重复最新的“/”或“?”[count]次”,但谁知道。

4

2 回答 2

12

这取自ZyX在 vi​​m邮件列表上的帖子。

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

它通过索引为两个元素的列表,映射n到基于变量的原始 N 或 n 。这仅适用于映射是非递归的。如果它是递归的,则将其称为 self 并且您将处于无限循环中。v:searchforward'Nn'

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')
于 2013-08-30T01:12:43.603 回答
6

事情就是这样,尽管在开发人员的邮件列表上有一些争论......

您可以执行以下操作:

:noremap n /<CR>
:noremap N ?<CR>

包含更多有趣信息的相关邮件列表线程:https ://groups.google.com/d/msg/vim_dev/8jSoA931P2Y/JklYtxFOiAYJ

于 2013-08-30T00:46:02.367 回答