1-スペースがあり、タブが必要な場合。
最初に、1つのタブを持つスペースの数を決定する必要があります。つまり、先頭に4つのスペース、つまり8つの行があるとします。タブを4つのスペースにしたいと思うかもしれません。今その情報で、あなたはします:
:set ts=4
:set noet
:%retab!
ここに問題があります!この一連のコマンドは、行頭のスペースだけでなく、すべてのテキストを検索します。それは次のような文字列を意味します:"Hey,␣this␣␣␣␣is␣4␣spaces"
になります"Hey,␣this⇥is␣4␣spaces"
が、そのありません!そのタブ!
この小さな問題を解決するにはsearch
、代わりにをお勧めしますretab
ます。
:%s/^\(^I*\)␣␣␣␣/\1^I/g
この検索では、ファイル全体で任意の数のタブで始まり4つのスペースが続く行を探し、見つかったタブの数に1を加えたものに置き換えます。
残念ながら、これはすぐには実行されません。
最初、ファイルにはスペースで始まる行があります。検索では、最初の4つのスペースのみがタブに変換され、次のようになります...
コマンドを繰り返す必要があります。何回?あなたが得るまでpattern not found
。プロセスを自動化する方法はまだ考えられません。しかし、そうした場合:
`10@:`
おそらく完了です。このコマンドは、最後の検索/置換を10回繰り返します。あなたのプログラムがそれほど多くのインデントを持つことはおそらくありません。あれば、もう一度繰り返します@@
ます。
さて、答えを完成させるために。私はあなたが反対を求めたのを知っています、しかしあなたが物事を元に戻す必要がある時をあなたは決して知りません。
2-タブがあり、スペースが必要です。
まず、タブを変換するスペースの数を決定します。各タブを2つのスペースにしたいとします。次に行います:
:set ts=2
:set et
:%retab!
これは文字列でも同じ問題を抱えています。しかし、文字列内でハードタブを使用しないほうがプログラミングスタイルが優れているため、実際にはここで良いことをしています。文字列内にタブが本当に必要な場合は、を使用してください\t
。
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
)は、先頭のスペースだけでなく、すべてのスペースを変換するように表示されます。2番目の例(sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
)では、各行の最初のスペースのみがタブに置き換えられ、残りは残されます。