所以我按照这里的说明进行操作: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教程期望我看到不同的行为。另外,我想得到我想要的行为。
答案 0 :(得分:3)
这些映射完美无缺。
如果我们采用<C-j>
视觉模式映射:
x
删除视觉选择,将光标放在删除行正下方的行上。
p
将删除的行置于当前行下,这是预期的效果。
`[
将光标移动到已更改文本的第一个字符,此处它是您移动的行的第一个字符。
V
启动视觉线选择
`]
将选择范围扩展到移动文本的最后一个字符,以便进一步移动。
根据您的描述,我认为您的问题有两个方面:
您似乎在映射的右侧使用命令序列而不是映射本身。
您正在使用v
(视觉模式,小写v
,字符方式)而不是V
(视线模式,大写v
,行-明智的)。这些映射的目的是“冒泡”线条,而不是单词,如果你真的想要所需的效果,你必须使用正确的视觉模式。
正确的命令序列是:
Vj<C-j>
或者,如果你坚持不使用Drew Neil的映射:
Vjxp`[V`]