我几乎总是在 Vim 中使用 搜索/
,然后继续使用 向前n
和向后搜索N
。然而,有时我?
会跳到比我当前所在行高几行的项目,在这种情况下,如果我想向前搜索相同的项目,我必须使用N
而不是n
,一个烦人的心理速度撞。
所以我的问题是:是否有可能n
总是向前和N
向后?
PS文档似乎暗示这是不可能的,因为n
只是“重复最新的“/”或“?”[count]次”,但谁知道。
这取自ZyX在 vim邮件列表上的帖子。
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')
事情就是这样,尽管在开发人员的邮件列表上有一些争论......
您可以执行以下操作:
:noremap n /<CR>
:noremap N ?<CR>
包含更多有趣信息的相关邮件列表线程:https ://groups.google.com/d/msg/vim_dev/8jSoA931P2Y/JklYtxFOiAYJ