2009-10-18 33 views
4

当vim在单词之间缠绕长行时,像j和k这样的常规运动将从一条物理线路跳到另一条物理线路。像建议here那样的映射“nnoremap j gj”将执行通过显示线而不是物理线来移动光标的技巧。vim:删除显示行而不是物理行

尽管这种方法至少有一个问题。例如,dj将删除两条物理线路,而不是两条显示线路。

有没有办法解决这个问题?

回答

5

是的。只需使用

:noremap j gj 

而不是其带有两个“n”-s的版本。除非你想在视觉模式映射工作,以及,你可以用两个映射实现所需的行为:模拟

:nnoremap j gj 
:onoremap j gj 

dd行为是相当棘手的,我不能这样做。这个命令的意思是“删除当前行linewise并把它放在一个linewise寄存器”。下面是我最亲近的尝试,但它需要很多棘手的文本处理:

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

(再次,这不起作用,但可能指向你一个有用的方向)。

您还可能有兴趣在相关帮助部分:

:h map-modes 
+0

'noremap'部分解决了这个问题。光标移动显示行,甚至'dj'按我的预期工作。问题仍然存在,诸如'dd'或'yy'这样的命令会删除或抽出整条物理线路而不是显示线路。 – Pablo 2009-10-19 00:25:05

2

如果你想ddyy上显示行唯一的工作,你需要使用下面的映射:

:nnoremap dd dg$ 
:nnoremap yy yg$ 
:nnoremap D dg$ 
:nnoremap Y 0yg$ 
+0

它工作正常,但如果光标位于显示行的第一列,映射只会模拟“dd”行为。否则它将表现为'd $'。 – Pablo 2009-10-19 13:44:53

6

dd和yy:

:nnoremap dd g0dg$ 
:nnoremap yy g0yg$ 
+0

太棒了!它的工作恰到好处。 – Pablo 2009-11-16 18:02:47

相关问题