6

コーディング中にいつも迷う操作なのですが、
ある複数の行を別の場所に移動した後にインデントを修正したい場合に、
効率のよい方法はありますでしょうか。

Before

aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
{
    bbbbbbbbbbbbbb
    bbbbbbbbbbbbbb
    cccccccccccccc
    cccccccccccccc
    cccccccccccccc
    bbbbbbbbbbbbbb
}

After

aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
cccccccccccccc
cccccccccccccc
cccccccccccccc
{
    bbbbbbbbbbbbbb
    bbbbbbbbbbbbbb
    bbbbbbbbbbbbbb
}

工夫なしの手順

移動元のcccの3行をビジュアル行モードで選択してカットし、
移動先にプットして、
プットした3行を再び選択し直してインデントを修正する。


思いついたのは、最初にビジュアル行モードで選択する操作をマクロに記録し、
プット後に選択する操作をマクロでやらせる、
という方法です。

ただ、インデントを修正しないといけないと気付くのは大抵はプット後なので、
事前にマクロに記録するというのは無理があるかなと思います。
よい方法があればお教えください。

andou
  • 689
  • 1
  • 4
  • 14
  • 編集後のインデント修正はどのような方法で行っていますか。<<でずらす、不要な空白をブロック選択して削除、indentで自動フォーマットさせる、等があるかと思います。 – cubick Oct 27 '17 at 02:09
  • @cubick インデント修正は、 <= でやっています。 – andou Oct 27 '17 at 02:20

3 Answers3

5

前後の文脈とインデントを合わせたいということなら、一旦アンドゥして]pで貼り付けるというのはどうでしょうか?

伽語蓮弥
  • 1,482
  • 1
  • 8
  • 20
  • し、知りませんでした…。プットする前にインデント修正が必要なことに気付いていれば、この方法がシンプルですね。ちなみに「一旦アンドゥして」は必要でしょうか? – andou Oct 27 '17 at 04:38
  • @andou 「プットする前にインデント修正が必要なことに気付いていれば」アンドゥは不必要ですが、一度プットしてしまった後、というご質問なので、まずそのプットを取り消さないといけないのでは? – mjy Oct 27 '17 at 04:48
  • @mjy なるほど!自分で質問しておいてそこまで考えが及びませんでした。 – andou Oct 27 '17 at 04:50
3

私がよく使っているのは以下の設定です。

nnoremap <expr> gc '`[' . getregtype()[0] . '`]'

これは最後に変更した範囲をビジュアルモードで選択します。つまり、p で貼り付けた後に gc を入力すると、貼り付けた範囲をビジュアルモードで選択できます。あとは =< でインデントを調節します。

thinca
  • 1,232
  • 6
  • 8
  • なるほど出来ました。実は同じことを gv でやろうとして無理だったので諦めたのですが、これで実現できるのですね。 – andou Oct 27 '17 at 02:24
  • 頂いたコマンドの中のジャンプを見て思ったのですが、プット直後にv`]と手動でやってもよいですね(少し面倒ですが)。 – andou Oct 27 '17 at 04:44
1

泥臭い方法ですが、

  • シフトする先頭行まで移動して、行数<<でシフトする。
  • シフトする先頭行まで移動して、<<でシフトする。あとはj.でシフトを繰り返す。
  • :でexになって、開始行,終了行<でシフトする。

ソースコードの場合は、整形ツールをかけて:e!で読み直します。

akira ejiri
  • 5,066
  • 2
  • 9
  • 28