在vim中向上或向下移动一行的命令(或快捷方式)是什么?我当前的工作流程是提取(复制)该行,然后删除该行,然后粘贴(粘贴)该行。

评论

由于删除实际上是剪切,因此可以跳过猛拉:ddkP,向下移动更容易:ddp。

另请参阅:vi.stackexchange.com/questions/598/…

github.com/matze/vim-move

#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