1

所以我按照这里的说明操作: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 专家教程希望我看到不同的行为。另外,我想得到我想要的行为。

4

1 回答 1

3

这些映射完美地工作。

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

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

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

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

  • V开始视觉线选择

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

根据您的描述,我认为您的问题是双重的:

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

  2. 您正在使用v(visual mode, lowercase v, character-wise) 而不是V(visual-line mode, capital v, line-wise)。这些映射的目的是“冒泡”线条,而不是文字,所以如果你真的想要想要的效果,你必须使用正确的视觉模式。

正确的命令顺序是:

Vj<C-j>

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

Vjxp`[V`]
于 2012-10-24T19:30:25.007 回答