1. ホーム
  2. vim

[解決済み] Vimで行全体を上下に移動させる

2022-03-16 17:56:58

質問

メモ帳++で Ctrl + シフト + / で現在の行を上下に移動させることができます。Vimでこれに似たコマンドはないのでしょうか? 私は無限のガイドに目を通しましたが、何も見つかりませんでした。

もしなかったら、どうすればそのキーの組み合わせにアクションをバインドできるでしょうか?

編集:Mykolaの答えは、バッファの最初と最後の行を除けば、すべての行で機能します。最初の行を上に、または下の行を下に動かすと、その行が削除され、下の行を上に動かすと、最初はポーンのように2スペース分ジャンプします。どなたか改善策をご提案いただけないでしょうか?

解決方法は?

.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>