我启用了相对数字,经常按 25k 或 7j 等键导航到特定行。问题是,在更改行之后,我经常发现自己想回到移动之前的位置。因此我按 CTRL-O,但失败了,因为 j/k 移动未添加到移动历史记录中。相反,我似乎向后移动了两次。
理想的情况是,每当我使用乘数执行 j/k 运算时,Vim 都会将其添加到移动历史记录中。这可能吗?
答案1
j
以下是实现此目的的/映射k
:
:nnoremap <silent> k :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'k'<CR>
:nnoremap <silent> j :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'j'<CR>
图片来源:我第一次看到这个这里。
答案2
我不相信 Vim 提供了任何方式来向跳转列表添加动作,但如果你真的希望能够跳回''
并将动作视为跳跃,你可以执行以下操作:
function! MarkJ()
mark '
return "j"
endfunction
nnoremap <expr> j MarkJ()
MarkJ()
手动设置'
标记,将该行添加到跳转列表(但始终位于第 0 列),然后返回j
到映射。不幸的是,您必须对每个动作都执行相同的操作。
我想不出任何方法可以轻易地将其限制为具有乘数的运动,但按照getchar()
下面的示例:help map-expr
,理论上可以定义一组函数和映射,只有MarkX()
当运动遵循乘数时才会调用。不过,这是相当做作的,而且可能会变得非常昂贵,从而降低性能。