#1 楼
首先,您不需要拉动和删除;后者还将删除的内容放入(默认或指定的)寄存器中。因此,ddp
/ ddkP
是使线上下移动的常见命令。这不会破坏寄存器,您也可以移动整个范围。您可以轻松定义键映射以缩短此时间。 如果您不介意插件(以及它们通常带来的额外舒适度),那么Tim Pope的无损插件和我的LineJuggler插件都提供
:move
/ :move +1
映射来移动线(还有其他一些; Tim的对于多种用途,我的重点是处理线。#2 楼
最简单的是::m+
或:m-2
,是Ingo建议的:move
的缩写。将光标移到粘贴之前的正确位置之后(总之为Vxp / Vdp)。在可视模式下移动多行时,则必须使用
:m '>+1
(移动向下移动一行)或:m '<-2
(向上移动一行)。以下是有用的示例映射(Shift +↑/ Shift +↓):
/>
,类似于Sublime Text(Win / OSX)。
vim wikia上建议以下内容:
nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>
在普通模式或插入模式下,按Alt-j向下移动当前行,或按Alt-k向上移动当前行。
在视觉上选择一个块之后行(例如,通过按V然后向下移动光标),按Alt-j将整个块向下移动,或按Alt-k将块u移动p。
另请参见:
在SO的Vim中上下移动整个行
在vim Wikia上上下移动行
评论
不知道为什么,但是它们在Gvim中工作得很好,但是在终端vim中却没有按预期的方式工作。
–CodyChan
19年7月10日在6:26
注意:在Wikia示例中,“ ==”和“ gv =”用于“修复”标识。当vim不能“修复”身份时,我感到非常愉快,也许您也是。
– Erik Lievaart
20年8月14日在13:02
#3 楼
如果我想与上面的一行交换一行,我通常会执行以下操作行并将其添加到默认寄存器中。
k将向上移动一行(j将向下移动一行)
P将粘贴到当前行上方
评论
要向下移动当前行,请使用ddp
–秦杰
18年1月12日在8:02
#4 楼
FWIW,这是我多年使用的东西。在自动调整缩进的同时,它可以在正常模式下或在可视模式下上下移动当前行。#5 楼
使用:move
的其他答案未考虑边缘情况,即您位于缓冲区的第一行或最后一行并按快捷键,您将看到错误消息,指出地址无效。为避免出现此错误消息,我编写了一个简单的函数来处理极端情况:fun SwitchLine(src_line_idx, direction)
if a:direction ==# 'up'
if a:src_line_idx == 1
return
endif
move-2
elseif a:direction ==# 'down'
if a:src_line_idx == line('$')
return
endif
move+1
endif
endf
使用此函数的映射:
nnoremap <silent> <A-k> :call SwitchLine(line('.'), 'up')<CR>
nnoremap <silent> <A-j> :call SwitchLine(line('.'), 'down')<CR>
如果使用上述映射,当您在缓冲区的第一行或最后一行时,您不会看到不愉快的错误消息。
#6 楼
如果您想简单一些,这对我有用:" Move selection up
xmap <kMinus> :move '<-2<CR>gv
" Move selection down
xmap <kPlus> :move '>+1<CR>gv
评论
由于删除实际上是剪切,因此可以跳过猛拉:ddkP,向下移动更容易:ddp。另请参阅:vi.stackexchange.com/questions/598/…
github.com/matze/vim-move