Vim:删除显示行而不是物理行

4
当vim在单词之间换行时,常规移动如j和k将从一行物理跳到下一行。像这里建议的“nnoremap j gj”映射将通过显示行而不是物理行移动光标。
然而,这种方法至少存在一个问题。例如,dj将删除两个物理行而不是两个显示行。
有没有办法解决这个问题?
3个回答

6

dd和yy:

:nnoremap dd g0dg$
:nnoremap yy g0yg$

5
是的。只需要使用。
:noremap j gj

使用两个“n”而不是一个来代替它的版本。除非你希望在可视模式下进行映射工作,否则可以通过两个映射实现所需的行为:

:nnoremap j gj
:onoremap j gj

模拟 dd 的行为相当棘手,我无法做到这一点。这个命令的意思是“将当前行按行删除并放入按行寄存器中”。以下是我最接近的尝试,但它需要更加棘手的文本处理:

:nnoremap dd g^dg$:call setreg(v:register,'','al')<BR>

再次强调,这并不起作用,但可能会指向一个有帮助的方向。

您可能还对相关的帮助部分感兴趣:

:h map-modes

noremap 部分解决了问题。光标按照显示行移动,甚至 dj 的效果也和我预期的一样。但仍然存在一个问题,就是像 ddyy 这样的命令会删除或复制整个物理行而不是显示行。 - Pablo

2
如果您希望ddyy仅在显示行上工作,您需要使用以下映射:
:nnoremap dd dg$
:nnoremap yy yg$
:nnoremap D dg$
:nnoremap Y 0yg$

它可以正常工作,但是只有在光标位于显示行的第一列时,映射才会模拟 dd 的行为。否则它将表现为 d$ - Pablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接