vimで2行を交換するにはどうすればよいですか?


94

私はこれを持っています:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

そして私はこれを手に入れたい:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

キーボードショートカットを使用してこれをすばやく行う方法はありますか?


vimに慣れていない場合は、別のエディターの使用を検討してください。のいずれかを使用してのみgit config --global core.editor <whatever>、またはを含めることで一度に多くのこと(gitを含む)に対してエディターをgit用に構成できexport EDITOR=<whatever>ます.bashrc
Sven Marnach 2015年

回答:


159

現在の行を次の行と交換するにはddp、コマンドモードで入力します。

  • dd-行を削除し(実際には他のエディターではカットと呼ばれます)、レジスターに保存します
  • p-レジスタから行を貼り付けます

3
カーソルを最初の行に移動してから、と入力しddpます。まだコマンドモードになっていない場合は、を押してコマンドモードEscに入ります。
Sven Marnach 2015年

32
dd現在の行を「レジスタ」にコピーした後、削除します。pレジスタの内容を現在の行のにバッファコピー(「配置」)します。同様に、2つの文字xpdwwP。と、または2つの単語を。と交換できます。
キーストンプソン

@KeithThompson残念ながら、2つの単語を交換するほど簡単ではありません。
CS

@CS dwwP2つの単語が行末にある場合、同じように機能しないという事実に言及していますか?(そして、ある行の最後の単語を次の行の最初の単語と交換するのはさらに難しいです。)
キーストンプソン

1
@KeithThompsonええ、それは文字通りのエッジケースであるため、コメントをした後は少し気分が悪くなりました;)
CS

52

dd現在の行を削除し、削除した行をp。を使用して貼り付けることができます。を使用する別の方法がありますmmあなたと一緒に線を動かすことができますすなわち

:m 1 行1の後に現在の行を移動します

:m 0 現在の行を上に移動します

:m $ 現在の行を下に移動します

あなたの例では、最初の行にカーソルを置き、次のように入力します :m $

詳細:http//vim.wikia.com/wiki/Moving_lines_up_or_down


1
非vim「ネイティブ」の説明をありがとう:
Bruno Bieri 2017年

1
これは、vimの知識を広げるためにも私が探していた答えです。
Phemelo Khetho

ありがとう!これが私が探していた答えです。これは、ビジュアルモードを使用して複数の行を同時にスワイプするときにさらに便利になります。
カリームジェイロウディ

8

質問はかなり古いと答えとしてマークされているという事実にもかかわらず、私はあなたが提供されたノーマルモードのコマンド、使用することができると言って答えを拡張したいと思いますスヴェンMarnachnnoremapそうように:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

これにより、ファイル内でCtrl+UpおよびCtrl+を使用して行を移動できDownます。ただし@"、これにより、最後にコピーされた文字列/単語/文字などを格納するレジスタが上書きされます。したがって、「(reg)before」コマンドddpコマンドを追加することで、これを修正できます。

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

ここでは、"a削除および貼り付けコマンドの前に追加して、行を@aレジスタに格納します。これにより、デフォルトのコピーレジスタが上書きされません。ただし、@aレジスタの内容を上書きする可能性があります(誰が知っていますが、ユースケースで重要な目的で使用できますが、このステップは少し妄想的です。必要に応じてスキップできます)、それも修正しましょう:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

<silent>コマンドが下部のメッセージ行にエコーされないようにするために必要です。)

これで、キーボードショートカットを使用してファイル内の行を移動できる2つのマッピングができました。あなたは、ボタンを再定義することができ、私が使用Alt+ j/kされるであろう、<A-j>そして<A-k>それらのコマンドのために。ただし、すべてのターミナルエミュレータがAltキーマッピングAFAIKをサポートしているわけではありません。



0

Vimウィキアで提案されたマッピングページで実際には、Sublimeや他のエディターがこの機能を実装する方法をエミュレートするキーの組み合わせをマッピングするための最良の方法です。

これには、移動後のインデントアクションが含まれます。これも素晴らしいです(これは2倍に等しいです) ==場合です)。

また、ビジュアルモードと挿入モードもサポートしているため、編集中またはフルブロックを使用して行を移動できます。

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

私は個人的にそれらをマッピングされた<D-J><D-K>の代わりに、私のMac上<A-にマッピングされたAltキー。そうすれば、私はCmd+ Shift+ j/を使用しますk。これは、指先でより自然に感じます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.