为什么这个冒泡文本的Vim映射不能按预期工作?

时间:2012-10-24 18:53:54

标签: vim

所以我按照这里的说明进行操作:http://vimcasts.org/episodes/bubbling-text/

我的想法是进入视觉模式并选择几行文字。然后我按CTRL-k或CTRL-j在我的文件中向上或向下移动选定的文本。我的.vimrc文件中的映射如下:

nmap <C-k> ddkP
nmap <C-j> ddp
vmap <C-k> xkP`[V`]
vmap <C-j> xp`[V`]

前两个映射用于普通模式(nmap),它们按预期工作。对于下降,dd命令删除一行,p命令将光标向下移动并插入该行。为了上升,dd命令删除该行,k命令将光标向上移动一行,然后P命令插入上面的行。

然而,在视觉模式下,它不起作用。以移动几行选定文本为例。选择文本后,x命令将删除它。但是p命令将文本插入光标的确切位置。所以,如果我有一个包含以下内容的文件:

one
two
three

并且光标位于其中的“o”上。我点击vj$选择前两行。然后我点击x删除它们。然后我点击p将它们插入下方。结果如下:

tone
two
hree

在我点击p之前,文件中有一行,光标位于“三”中的“t”。所以这种行为对我有意义。我不明白的是为什么专家VimCast教程期望我看到不同的行为。另外,我想得到我想要的行为。

1 个答案:

答案 0 :(得分:3)

这些映射完美无缺。

如果我们采用<C-j>视觉模式映射:

  • x删除视觉选择,将光标放在删除行正下方的行上。

  • p将删除的行置于当前行下,这是预期的效果。

  • `[将光标移动到已更改文本的第一个字符,此处它是您移动的行的第一个字符。

  • V启动视觉线选择

  • `]将选择范围扩展到移动文本的最后一个字符,以便进一步移动。

根据您的描述,我认为您的问题有两个方面:

  1. 您似乎在映射的右侧使用命令序列而不是映射本身。

  2. 您正在使用v(视觉模式,小写v,字符方式)而不是V(视线模式,大写v,行-明智的)。这些映射的目的是“冒泡”线条,而不是单词,如果你真的想要所需的效果,你必须使用正确的视觉模式。

  3. 正确的命令序列是:

    Vj<C-j>
    

    或者,如果你坚持不使用Drew Neil的映射:

    Vjxp`[V`]