在notepad++中,我可以使用Ctrl + Shift + Up / Down来上下移动当前行。在Vim中有类似的命令吗?我翻遍了无数的指南,但一无所获。
如果没有,我如何将动作绑定到该键组合?
编辑:Mykola的答案适用于所有行,除了缓冲区的开头和结尾。向上移动第一行或向下移动一行会删除该行,当向上移动一行时,它最初会跳跃两个空格,就像棋子一样!谁能提供一些改进吗?
在notepad++中,我可以使用Ctrl + Shift + Up / Down来上下移动当前行。在Vim中有类似的命令吗?我翻遍了无数的指南,但一无所获。
如果没有,我如何将动作绑定到该键组合?
编辑:Mykola的答案适用于所有行,除了缓冲区的开头和结尾。向上移动第一行或向下移动一行会删除该行,当向上移动一行时,它最初会跳跃两个空格,就像棋子一样!谁能提供一些改进吗?
当前回答
一个简单的解决方案是在你的.vimrc中加入这些行:
nmap <C-UP> :m-2<CR>
nmap <C-DOWN> :m+1<CR>
其他回答
一个简单的解决方案是在你的.vimrc中加入这些行:
nmap <C-UP> :m-2<CR>
nmap <C-DOWN> :m+1<CR>
向上移动一行:ddkP
向下移动一行:ddp
这招对我很管用:
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 8.1的MacBook Pro
这些命令不会删除缓冲区顶部或底部的行。
使用Alt-J和Alt-K输出的实际符号是一种变通方法,因为它们的键代码在我的环境中映射不正确。
把这个放在旧的.vimrc中,看看是否适合你。
" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap ∆ :m .+1<CR>==
nnoremap ˚ :m .-2<CR>==
inoremap ∆ <Esc>:m .+1<CR>==gi
inoremap ˚ <Esc>:m .-2<CR>==gi
vnoremap ∆ :m '>+1<CR>gv=gv
vnoremap ˚ :m '<-2<CR>gv=gv
将以下文件放到.vimrc中来完成这项工作
noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
行消失看起来像一个Vim错误。我装了个黑客来避免。也许有更精确的解决方法。
更新
仅仅使用Vim组合就有很多无法解释的困难。这些是行缺失和额外的行跳转。
这里是脚本解决方案,可以放在.vimrc或~/.vim/plugin/swap_lines.vim中
function! s:swap_lines(n1, n2)
let line1 = getline(a:n1)
let line2 = getline(a:n2)
call setline(a:n1, line2)
call setline(a:n2, line1)
endfunction
function! s:swap_up()
let n = line('.')
if n == 1
return
endif
call s:swap_lines(n, n - 1)
exec n - 1
endfunction
function! s:swap_down()
let n = line('.')
if n == line('$')
return
endif
call s:swap_lines(n, n + 1)
exec n + 1
endfunction
noremap <silent> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>