vimで2スペースのインデントを4スペースに変更


91

2スペースのインデントが設定されているインターネットからコピーしたコードがいくつかあり、4スペースのインデントに変更したいと考えています。vimスクリプトを記述せずにタスクを実行する短いvimルーチンはあるのでしょうか。これが私が現在HTMLファイルでそれをやっている方法です:

  • マクロを記録する
  • 行頭に移動
  • 「<」が最初に現れるまですべての空白を視覚的に選択
  • すべての空白をヤンクして貼り付けます(基本的に空白を2倍にします)
  • ファイルの最後までマクロを再生します

要するに qa0vt<yp<esc>jq

落とし穴:

マクロは、空白行または「<」で始まらない行に対して失敗します。そして、私はこのソリューションを非HTMLファイルに拡張する方法を知りません。

回答:


170

インデントを変更する一般的な方法は、タブストップを変更することです。

ファイルを空のバッファに貼り付けて、次のようにします。

:set ts=2 sts=2 noet
:retab!

これにより、2つのスペースごとにタブ文字に変更されます。

:set ts=4 sts=4 et
:retab

これにより、すべてのタブが4つのスペースに変更されます。

この方法の利点は、逆に使用して、たとえば4から2スペースに変換できることです。


16
@XavierT。私は実際にこの答えはかなり理解しやすいと思います。また、短いコマンド名をフルネームで置き換えたほうが明確になる場合がありますts::= tabstopsts:= softtabstop[no]et:= [no]expandtab
YaOzI 2014年

retabの引数はどのような状況で役立ちますか。また、このタスクに使用できないのはなぜですか。
joeytwiddle 2016年

@joeytwiddle私はそれを理解し、あなたは可能性があることを利用して使用することで、この答えと同じ効果を達成:set sts=2 noetし、:retab! 2方法は、(おそらく読みにくくはあるが)、それは少し短くなるようにします。
Daan Bakker

このメソッドは、行の最初だけでなく、文字列リテラルやその他の場所で2スペースを4スペースに変更します。
nacitar sevaht

2
それらすべてをまとめて、異なるファイルで:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!使用@:して、同じアクションをすばやく適用します。
L__ 2016年

58

それはで可能かもしれない:set shiftwidth=4gg=G


これが機能しない場合は、インデントに他の影響を与えるモードが有効になっている可能性があります。
Dav Clark 2013

1
問題は一般的な解決策に関するものではありませんが、特にpythonコードでは、これが常に機能するわけではないことに注意してください。
0xc0de 2013

5
gg=Gexatly はどういう意味ですか?私はそれを理解するgg手段「1,1への移行」、およびG手段「最後の行への移行を」。
Jonathon Reinhart、

5
@JonathonReinhart =はインデントを行うため、テキストの最初から最後までインデントすることを意味します
アレックス

%retab文字列リテラル内に埋め込まれたスペースを誤って変換するよりも優れていました。
アルニタク

33

私がしていることはesneiderやcforbishのアプローチとよく似ていますが、タイプするのが少し速いです:

:%s/^\s*/&&

先行スペース(スペースまたはタブ)を2倍の先行スペースに&置換するだけです(一致した式で置き換えられます)。


2
これは視覚的な選択(V)で機能するので便利%です。
Trevor Robinson

1
私はこれも好きですb / cコメントなどで手作業でテーブルを調整することで混乱しない
stephenmm

@TrevorRobinson上位2つの回答は範囲でも機能します。
Brian McCutchon、2015

また、これは持っている追加の利点あなたが使用するためにそれを展開することができsed、ディレクトリ内のすべてのファイルに適用superuser.com/a/159286/41494
icc97

3

これは非常に古い質問ですが、すべての答えは...間違っています... Vimにはファイル全体を再インデントする非常に簡単な方法があります。私はそれを行うために自分の関数を書いた後でこれを学びました、それで私は同じ無知の船にいます;)

タイプ

gg=G

これは、タブストップを好きなように設定していることを前提としています(したがって、OPの場合はts = 4になります)。

私がこのことを学んだhttp://vim.wikia.com/wiki/Fix_indentation言及しています、

通常モードでgg = Gと入力すると、ファイル全体がインデントされます。これは特殊なケースです。=は演算子です。dやyと同様に、カーソル移動コマンドで移動したテキストに作用します。この場合、ggはカーソルを最初の行に配置し、= Gは現在のカーソル位置からバッファーの最後までインデントします。


2
1.一番下までスクロールすると、gg = Gと記載された回答が表示されます。2.常に機能するとは限りません。
Lim H.

2

私はこの正規表現を使用しました(先行スペースの数を2倍にします):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

%s/\s\+/&&/同じことをしませんか?ところで、gフラグは不要だと思います(1 ^pattern
つには

「&」を指摘していただきありがとうございます。主に '^' %s/^\s\+/&&/gが近いことを忘れたので、主に少し修正しました。
cforbish 2013年

これはsproの回答に似ていますが、少し複雑なことをする必要がある場合に簡単にテストできるため、回答に感謝します。
2015年

1

cforbishの答えに似ていますが(やや単純)、この正規表現は先頭のスペースを複製します

:%s/^\( \+\)/\1\1

または、この別の正規表現を使用して、2つのスペースを4つのスペースに変換し、単一のスペース(および一般的には奇数)を保持することができます

:%s/^\(\(  \)\+\)/\1\1

あれは、

  • 1スペース⇢1スペース
  • 2スペース⇢4スペース
  • 3スペース⇢5スペース
  • 4スペース⇢8スペース

0

これは、正規表現ベースの回答の変形です。

行の先頭にある空白の量を2倍にするbashスクリプトがローカルのbinディレクトリにあります。入力はstdinまたはファイルです。

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

これをvim内で使用するには、視覚的に行を選択して次のコマンドを発行します。

:'<,'>!dblsp

これにより、正規表現を入力する(または覚える)必要がなくなります。

次のようなマップでも使用します。

nnoremap <leader>] `[V`]!dblsp<CR>

これは、最近貼り付けられたテキストのブロックに適用されます。私は通常、貼り付けるのではなく次のマップを使用します:set paste

nnoremap <leader>p :r !xclip -o<CR>

私の通常のワークフローは:

  • コードスニペットを選択します(例:このページのサンプルコードは2スペースですが、4が必要です)
  • コードスニペット(、p)を貼り付け
  • 間隔を変更(、])

または、別のバッファから貼り付けられたヤンクブロックのインデントを変更するだけです。


0

@sproの回答に加えて、これを私の .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

入力するだけです:Format

ビジュアル選択では、これは選択された行のみをフォーマットします。

視覚的な選択なしでは、これはファイル全体をフォーマットします。

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