我尝试创建用于向上或向下移动选区的地图。将所有选定的行排成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
答案 0 :(得分:2)
首先,您不需要自己实现这一点,Vim Tips Wiki上的Transposing页面涵盖了这一点,并且还提供了几个提供此类映射的插件的链接。
在可视模式下处理向下移动的关键确实是使用'>
标记。但是,您确实需要使用:execute
将结果传递给:move
命令。
可以通过使用'<,'>
启动右侧来清除可视模式映射中:<C-u>execute ...
添加的范围;这是一个众所周知的习语。
如果您想了解更多信息,请查看一些插件的实现。