在notepad++中,我可以使用Ctrl + Shift + Up / Down来上下移动当前行。在Vim中有类似的命令吗?我翻遍了无数的指南,但一无所获。

如果没有,我如何将动作绑定到该键组合?

编辑:Mykola的答案适用于所有行,除了缓冲区的开头和结尾。向上移动第一行或向下移动一行会删除该行,当向上移动一行时,它最初会跳跃两个空格,就像棋子一样!谁能提供一些改进吗?


当前回答

我在.vimrc文件的末尾放了以下内容:

noremap H ddkkp
noremap N ddp

现在H和N分别上下移动电流线。

其他回答

以下是MacVim的简化版本,使用了Wikia文章中的例子(参见gun的评论链接)。

" Move selection up/down (add =gv to reindent after move)
:vmap <D-S-Up> :m-2<CR>gv
:vmap <D-S-Down> :m'>+<CR>gv

我只使用块选择变量,因为它所需要的是Shift-V来选择当前行,并可选地向上/向下游标来选择更多的行。

根据上面的快捷方式,按Cmd-Shift-Up/Down将移动块的选择向上/向下。“D”是命令键在MacVim, Windows尝试“C”(控制),或“A”(Alt)(例如。<C-A-f>将是Control Alt f)。

Wikia文章添加了“=gv”,它可以根据周围的文本在移动后调整块的缩进。这是令人困惑的,所以我删除了它,并添加快捷方式快速缩进选择代替。

" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching)
:vmap <D-A-Left> <gv
:vmap <D-A-Right> >gv

注意,<<和>>也可以做到同样的事情,但选择会丢失,所以上面的这些快捷键允许多次缩进,仍然可以移动块,因为选择是保持的。

我的MacVim配置为用cmd - shift -左/右切换选项卡,所以我使用了cmd - alt -左/右。

下面是MacVim的Tab切换(把.gvimrc和上面的其他内容放在一起):

:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>

可以使用命令:

:g/^/move 0

参考:https://vi.stackexchange.com/questions/2105/how-to-reverse-the-order-of-lines

这招对我很管用:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

顺便说一句,如果你想使用ALT+some_key,而你的终端(urxvt这样做)拒绝遵守,你应该在你的.vimrc中输入如下内容:

" For moving lines (^] is a special character; use <M-k> and <M-j> if it works)
nnoremap ^]k mz:m-2<CR>`z==
inoremap ^]j <Esc>:m+<CR>==gi
inoremap ^]k <Esc>:m-2<CR>==gi
vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z
nnoremap ^]j mz:m+<CR>`z==
vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z

其中^]是代表ALT键的单个字符。 要输入该字符,在Vim中使用C+v, Esc(在Windows中使用C+q, Esc)。

Vim插件未受损。Vim [e]e

: m。+1或m。如果只移动一条线,则是-2。下面是移动多行的脚本。在可视模式下,Alt-up/Alt-down将包含可视选择的行向上/向下移动一行。在插入模式或普通模式下,如果没有给定计数前缀,Alt-up/Alt-down将移动当前行。如果有一个计数前缀,Alt-up/Alt-down将从当前行开始向上/向下移动一行。

function! MoveLines(offset) range
    let l:col = virtcol('.')
    let l:offset = str2nr(a:offset)
    exe 'silent! :' . a:firstline . ',' . a:lastline . 'm'
        \ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset)
    exe 'normal ' . l:col . '|'
endf

imap <silent> <M-up> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>:call MoveLines('+1')<CR>
nmap <silent> <M-up> :call MoveLines('-2')<CR>
nmap <silent> <M-down> :call MoveLines('+1')<CR>
vmap <silent> <M-up> :call MoveLines('-2')<CR>gv
vmap <silent> <M-down> :call MoveLines('+1')<CR>gv