如何将选择的行1行向下移动?

时间:2014-04-25 15:11:29

标签: vim

我尝试创建用于向上或向下移动选区的地图。将所有选定的行排成1行很容易:

vnoremap <silent> <M-k> :m--<CR>gv

但向下移动线条并不容易。移动命令需要相同数量的&#34; +&#34;随着行数的移动。如果我选择了10行,我必须写:m++++++++++将其移动一次。

或者我可以写:m line("'>")+1或换句话说,&#34;将选择移动到选择&#34;中最后一行下面的行。不幸的是,它只会导致&#34; E14:地址无效&#34;出于某种原因。

我无法使用:exec ...来构建命令,因为我得到了#34; E481:不允许范围&#34;因为当我点击冒号时Vim会自动插入:'<,'>而我不知道如何防止这种情况发生。

有什么想法吗?我只想要一张地图将选定的行向下移动一次。


编辑:感谢接受的答案中的:<C-u>技巧,我现在有了这4个关键的绑定,看起来效果很好:

" Move lines
nnoremap <silent> <M-j> :m+<CR>
nnoremap <silent> <M-k> :m--<CR>
vnoremap <silent> <M-j> :<C-u>exec "'<,'>m " . (line("'>") + 1)<CR>gv
vnoremap <silent> <M-k> :m--<CR>gv

1 个答案:

答案 0 :(得分:2)

首先,您不需要自己实现这一点,Vim Tips Wiki上的Transposing页面涵盖了这一点,并且还提供了几个提供此类映射的插件的链接。

在可视模式下处理向下移动的关键确实是使用'>标记。但是,您确实需要使用:execute将结果传递给:move命令。

可以通过使用'<,'>启动右侧来清除可视模式映射中:<C-u>execute ...添加的范围;这是一个众所周知的习语。

如果您想了解更多信息,请查看一些插件的实现。