39067


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

**Before**

[code]

    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    {
        bbbbbbbbbbbbbb
        bbbbbbbbbbbbbb
        cccccccccccccc
        cccccccccccccc
        cccccccccccccc
        bbbbbbbbbbbbbb
    }
    
[/code]

**After**

[code]

    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    aaaaaaaaaaaaaa
    cccccccccccccc
    cccccccccccccc
    cccccccccccccc
    {
        bbbbbbbbbbbbbb
        bbbbbbbbbbbbbb
        bbbbbbbbbbbbbb
    }
    
[/code]

**工夫なしの手順**

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

* * *

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

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


CC BY-SA 3.0
2017-10-27T01:55:18.450
39060
2019-11-07T11:24:05.730
19759
question
vim
Vimで、複数の行を別の場所へ移動後、インデントを修正する方法


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

[code]

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

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


CC BY-SA 3.0
2017-10-27T02:04:49.917
39061
2017-10-27T02:04:49.917
2541
39060
answer


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


CC BY-SA 3.0
2017-10-27T03:53:10.000
39067
2017-11-04T14:56:21.313
2017-11-04T14:56:21.313
25936
25936
39060
answer


泥臭い方法ですが、

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

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


CC BY-SA 4.0
2019-11-07T11:24:05.730
60328
2019-11-07T11:24:05.730
35558
39060
answer