回答:
この:retab
コマンドを使用できます。から
:help :retab
<Tab>
指定された新しいtabstop値を使用して、a を含むすべての空白のシーケンスを新しい空白の文字列に置き換えます。新しいタブストップサイズを指定しない場合、またはゼロの場合、Vimはの現在の値を使用します'tabstop'
。[...]'expandtab'
onにすると、Vimはすべてのタブを適切な数のスペースに置き換えます。
このコマンドは範囲を受け入れるため、視覚的に選択してから:retab
、選択した行だけを選択できることに注意してください。
前述のよう:retab
にを使用できますが、これにより、行の先頭のタブだけでなく、すべてのタブがスペースに変更されます
したがって、これは(⇥
タブ文字です):
if :; do
⇥echo "⇥hello"
end
に変更されます(␣
スペース文字は):
if :; do
␣␣echo "␣␣hello"
end
これは、いくつかのシナリオで予期しない副作用を引き起こす可能性があり、スペースをタブに変更する場合はさらに問題になります!
そのため、行の先頭でタブ/スペースのみを変更する小さな関数を作成しました。
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
このバージョンでexpandtab
は、関数呼び出しで手動で指定する(つまり:call Retab(1)
、タブをスペースに変更する)必要がありますが、現在の値を取得するように変更することもできます&expandtab
(既に同様に&tabstop
):retab
。(たまたま手動で指定することを好みます)。
a
にif a:expandtab
意味ですか?
set expandtab
、あなたの.vimrcにし、その後autocmd BufWritePre * :call Retab(&expandtab)
-インデントはスペースの代わりに、タブに変更されます。
Vimは、指定された新しいタブストップ(たとえば)の値を使用して、!retab
すべてのシーケンスを<Tab>
空白の新しい文字列に置き換えるコマンドを提供しますが、文字列内のすべてのタブは変更できます(たとえば、Cプログラムでは、これを避けるために使用する必要があります)!:set tabstop=2
\t
そのため、次のコマンドを使用して、すべてのタブをスペースに変更することもできます。
:%s/\t/ /g
:%s/^\t\+/ g
そのため、インデントで使用されるタブのみが変換されます。
説明:
%
バッファ/ファイル全体を表します(:help :%
)s
代替(:help sub-replace-special
)の略\t
、または^I
タブの略
-タブごとに必要な数のスペースを使用しますg
-グローバルの略で、同じ行で複数のタブの出現を変換します次に、ファイル全体のインデントを修正するには、次を試してくださいgg=G。チェック:詳細については、ひどくインデントされたコードを再度インデントしてください。
タブの代わりにデフォルトでスペースを使用するには、次の設定を.vimrc
ファイルに追加する必要があります。
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
別の解決策は、使用することです tidy
関連する:
%s/^\t\+/ g
、インデントで使用されるタブのみが変換されるようにします。また、gg=G
Pythonのような言語では壊滅的です。
使用してみてください:
expand -t 4 input_filename output_filename
expand
は、タブをスペースに変換するコマンドラインツールです。これは、シェルから、またはで実行できます:!expand
。
それはだPOSIXで、それはほとんどのシステムで利用可能であるべきであるようにします。unexpand
ところで、逆になります。
expand
?
:%!expand -t 4
vimの内部で行うこともできます。さらに良いことに、現在のシフト幅オプションを使用することもできます :exe '%!expand -t ' . &shiftwidth
完全を=
期すために、タブをスペースに置き換えることを指定した後、インデントを修正するためにも使用できます。通常モードでは、を入力してこれを行うことができます:set expandtab
。次に=
、2つの方法で使用できます。
=
、選択したコードブロックのインデントが修正されます。gg=G
は、ファイル全体を修正しgg
、カーソルをファイルの先頭に移動してから=
適用し、G
カーソルをファイルの末尾に移動します。参照:リンク
:h vim-faq
および検索/tab characters
。覚えにくいタグは:h faq-14.16
です。