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
を取得するまで .プロセスを自動化する方法はまだ思いつきません。ただし、そうする場合:
`[email protected]:`
おそらく完了です。このコマンドは、最後の検索/置換を 10 回繰り返します。プログラムにそれほど多くのインデントがある可能性は低いです。ある場合は、もう一度繰り返してください @@
.
さて、答えを完成させるだけです。反対のことを要求したことは知っていますが、いつ元に戻す必要があるかわかりません。
2 - タブがあり、スペースが必要。
まず、タブを変換するスペースの数を決定します。各タブを 2 つのスペースにしたいとしましょう。次に、次のことを行います:
:set ts=2
:set et
:%retab!
これは、文字列でも同じ問題を抱えています。しかし、文字列内でハード タブを使用しないほうが良いプログラミング スタイルであるため、ここでは実際に良いことをしています。文字列内にタブが本当に必要な場合は、 \t
を使用してください .
Vim を使用してすべての 主要 を展開する スペース ('tabstop'
より広い) )、retab
を使用するのは正しかった ただし、最初に 'expandtab'
を確認してください リセットされます (:verbose set ts? et?
あなたの友達です)。 retab
範囲を取る なので、通常は %
を指定します 「ファイル全体」を意味します。
:set tabstop=2 " To match the sample file
:set noexpandtab " Use tabs, not spaces
:%retab! " Retabulate the whole file
このようなことを行う前に (特に Python ファイルで!)、通常は 'list'
を設定します。 、見えるように 空白と変更。
.vimrc
に次のマッピングがあります このため:
nnoremap <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>