web-dev-qa-db-ja.com

Vimで行全体を上下に移動する

Notepad ++では、次を使用できます Ctrl + Shift + Up / Down 現在の行を上下に移動します。 Vimにはこれと同様のコマンドがありますか?私は無限のガイドに目を通しましたが、何も見つかりませんでした。

ない場合、アクションをそのキーの組み合わせにバインドするにはどうすればよいですか?

編集:Mykolaの答えは、バッファーの最初と最後の行を除き、すべての行で機能します。最初の行を上または下の行を下に移動すると行が削除され、下の行を上に移動すると最初にポーンのように2つのスペースがジャンプします!誰でも改善を提供できますか?

295
user4812

.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>
78
Mykola Golubyev

1行を上の行と交換したい場合は、通常次のようにします

ddkP

説明

  • ddは行を削除し、デフォルトのレジスタに追加します。
  • kは1行上に移動します(jは1行下に移動します)
  • Pは現在の行の上に貼り付けます
544
JaredPar

カーソルが移動したい行にあると仮定します。

上下に移動: :m 移動

:m +1-1行下に移動します

:m -2-1行上に移動

(+1を上下に移動する行数に応じて任意の数字に置き換えることができます。つまり、+ 2は2行下に移動し、-3は2行上に移動します)

特定の行に移動するには

:set number -番号の行を表示します(移動先を簡単に確認できます)

:m 3-3行目の後に行を移動します(3を任意の行に置き換えます)

複数行の移動:

V (つまり、 Shift-V)そして、コースャーを上下に動かして、VIMで複数の行を選択します

一度選択したヒット : 上記のコマンドを実行します、m +1など

211
Serg

行を上に移動:ddkP

行を下に移動:ddp

70
jacobsimeon

これは私のために働いた:

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キーを表す単一の文字です。その文字を入力するには、使用します C+v, Esc Vim(C+q, Esc Windowsで)。

15
emil.p.stanchev

〜/ .vimrcファイルに次を追加します(n、mのマッピングがないことを確認してください)

nmap n :m +1<CR>
nmap m :m -2<CR>

現在、nキーを押すと、行が下に移動し、mが行を上に移動します。

12
Gajendra Jena

コマンドモードで、下に移動する行にカーソルを置き、

ddp

説明:ddは現在の行を削除して一般バッファーpに戻し、カーソル位置の後に戻します。行全体の場合は1行下に戻します。

多くのドキュメントでコマンドpおよびPに関して混乱があります。実際には、pはカーソルの後に貼り付け、P ATカーソルを貼り付けます。

11
szg

このコードを.vimrc(または.gvimrc)に追加するだけです

nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv
7
alexkv

単純な解決策は、これらの行を.vimrcに入れることです:

nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>

まさにこの素晴らしいプラグインで探しているものhttps://github.com/vim-scripts/upAndDown

5
timoxley

.vimrcファイルの最後に次を追加します。

noremap H ddkkp
noremap N ddp

したがって、「H」および「N」はそれぞれ現在の行を上下に移動します。

2

vimでコマンド:help moveを押すと、結果は次のようになります。

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

例:現在の行を1行下に移動=>:m+1

例:番号100の行を番号80の行の下に移動する=>:100 m 80

例:番号100の行を番号200の行の下に移動します=>:100 m 200

例:番号が200の行の下の[100、120]以内の番号の行を移動=>:100,120 m 200

1
ako

私にとっては、ddkkpがそれを行いました(大文字のPを持つddkPの代わりに、これも機能します)。

1

これは、Wikiaの記事の例を使用したMacVimの簡易バージョンです(参照: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」(Control)または「A」(Alt)を試してください(例:<C-A-f>はControl Alt f)。

ウィキアの記事はこれらに「= 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-Left/Rightでタブを切り替えるように構成されているため、Cmd-Alt-Left/Rightを使用しました。

MacVimのタブスイッチングを次に示します(上記の残りを.gvimrcに入れます)。

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

vimプラグインunimpaired.vim [eおよび] e

0
Baranina

特定の検索に一致する複数の行でこれを実行する場合:

  • Up::g/Your query/ normal ddpまたは:g/Your query/ m -1
  • :g/Your query/ normal ddpまたは:g/Your query/ m +1ダウン
0

これは私のマシンで動作するソリューションです: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
0
Nick Sugar

:m。+ 1または:m.-2は、単一の行を移動する場合に使用します。複数行を移動するためのスクリプトを次に示します。ビジュアルモードでは、Alt-up/Alt-downは、ビジュアル選択を含む行を1行上/下に移動します。挿入モードまたは通常モードでは、カウントのプレフィックスが指定されていない場合、Alt-up/Alt-downは現在の行を移動します。カウントプレフィックスがある場合、Alt-up/Alt-downは、現在の行から始まる行を上下に1行移動します。

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
0
Ji Han