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

vim:删除显示行而不是物理行,vim,Vim,当vim在单词之间缠绕长线时,像j和k这样的规则动作将从一条物理线跳到下一条物理线。建议的“nnoremap j gj”之类的映射将通过显示行而不是物理行来移动光标 不过,这种方法至少有一个问题。例如,dj将删除两个物理行,而不是两个显示行 有办法解决这个问题吗?有。只用 :noremap j gj 而不是它的版本有两个“n”-s。除非您也希望映射在可视模式下工作,否则可以通过两个映射实现所需的行为: :nnoremap j gj :onoremap j gj :nnoremap dd dg

当vim在单词之间缠绕长线时,像j和k这样的规则动作将从一条物理线跳到下一条物理线。建议的“nnoremap j gj”之类的映射将通过显示行而不是物理行来移动光标

不过,这种方法至少有一个问题。例如,dj将删除两个物理行,而不是两个显示行

有办法解决这个问题吗?

有。只用

:noremap j gj
而不是它的版本有两个“n”-s。除非您也希望映射在可视模式下工作,否则可以通过两个映射实现所需的行为:

:nnoremap j gj
:onoremap j gj
:nnoremap dd dg$
:nnoremap yy yg$
:nnoremap D dg$
:nnoremap Y 0yg$
dd行为的模拟是相当棘手的,我无法做到这一点。此命令表示“删除当前行并将其放入行寄存器”。以下是我最近的尝试,但它需要更复杂的文本处理:

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

如果希望
dd
yy
仅在显示行上工作,则需要使用以下映射:

:nnoremap j gj
:onoremap j gj
:nnoremap dd dg$
:nnoremap yy yg$
:nnoremap D dg$
:nnoremap Y 0yg$
年月日:

:nnoremap dd g0dg$
:nnoremap yy g0yg$

noremap
部分解决了问题。光标按显示行移动,甚至
dj
也能像我预期的那样工作。剩下的问题是像
dd
yy
这样的命令删除或拖动整个物理行,而不是显示行。它工作正常,但只有当光标位于显示行的第一列时,映射才会模拟
dd
行为。否则,它将表现为
d$