行のインデントを特定の値にシフトするにはどうすればよいですか?


11

行が適切にインデントされていない状況に何度も出くわします。貼り付けによるイーサ、悪い/推奨されないインデントプラグイン、またはほとんどの場合、インデント値をオフセットする余分なスペース。私は通常、これを修正するために、<<または>>ラインで数回修正します。余分なスペースがある場合は、実際に必要なインデントレベルごとに100<<a >>を実行します。

問題は、|番号で列を設定できるモーションのように10|、カーソルを10番目の列に送ることです。インデントレベルを指定するにはどうすればよいですか?

の例(これは機能しません)shiftwidth=4 expandtab

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

この場合、私は現在、最後の行(2)3<<のインデントレベルをカウントし、余分なスペースに1を追加してから、入力したインデントレベルをカウントする1>>必要があります(またはautoindent==コマンドを使用します)。

1==インデントをレベル1に強制するようなものを求めています。または、場合によって0==は、インデントをすべて一緒に削除する必要があります。

上記の例は、1行または0行で(それぞれ)自動インデントを実行しているので、希望どおりに機能しませんが、問題をよりわかりやすく説明できると期待しています。

回答:


18

:left次のコマンドを使用できます。

:[range]le[ft] [indent]
で行を左揃えにし[range]ます。行のインデントを[indent](デフォルト0)に設定します。{Viにはない}

:leftインデントをn個のスペースに設定し、shiftwidthまたはを認識しないことに注意してください。tabstopしたがって、:left 8を使用すると8個のスペースが使用されます。

インデントレベルを設定する場合は、コマンドを簡単に定義できます。

command! -nargs=1 Left execute 'left ' . &sw * <args>

使用する:Left 2と、インデントが8スペースに設定されます。

これをにマッピングするには<Leader>=、次を使用できます。

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

これが最善の方法かどうかはわかりませんが、これが私が管理できる唯一の方法です... \=2現在の行を8スペースに5\=3インデントし、次の5行を12スペースにインデントします。


問題を解決するための関連するヒントは、shiftroundオプションの設定です。から:help 'shiftround'

インデントをの倍数に丸め'shiftwidth'ます。>および< コマンドに適用されます。挿入モードのCTRL-TおよびCTRL-Dは、常にインデントを倍数に丸めます'shiftwidth'(これはVi互換です)。

あなたの例では、最初<<は8つのスペースに「丸め」ます。だからあなたの問題(を使用3<<してから>>)が解決されます。また、ヘルプページにあるように、<C-d>挿入モードからも使用できます。


驚くばかり!これらのソリューションは完璧に機能します。
スキマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.