web-dev-qa-db-ja.com

VimまたはLinuxでスペースをタブに変換するにはどうすればよいですか?

必要なものを見つけずにスペースをタブに変換する方法について、Stack Overflowでいくつかの質問を見てきました。タブをスペースに変換する方法についてはさらに質問があるようですが、反対のことをしようとしています。

Vimでは、:retab:retab!を運よく試しましたが、実際にはタブからスペースに移動するためのものだと思います。

コマンドプロンプトで、expandunexpandの両方を試してみました。

問題のファイルは次のとおりです。

http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

Vimまたはシェルを使用して、leadingスペースをタブに変換するにはどうすればよいですか?

165
cwd

Vimを使用してすべてのleadingスペース( 'tabstop' よりも広い)を展開すると、 retab を使用する権利がありますが、最初に確認してください- 'expandtab' はリセットされます(:verbose set ts? et?はあなたの友達です)。 retabrangeを取るため、通常は % を「ファイル全体」を意味するように指定します。

:set tabstop=2      " To match the sample file
:set noexpandtab    " Use tabs, not spaces
:%retab!            " Retabulate the whole file

このようなことを行う前に(特にPythonファイルを使用して!)、通常は 'list' を設定し、see空白と変更。

このために my .vimrc に次のマッピングがあります:

nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>
274
Johnsyweb

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を使用します。

30
Dr Beco
:%s/\(^\s*\)\@<=    /\t/g

翻訳:4つの連続したスペース(=文字の後)のすべてのインスタンスを検索しますが、そのポイントまでの行全体が空白である場合のみです(これはゼロ幅の後ろ読みアサーション、\@<=を使用します)。見つかった各インスタンスをタブ文字に置き換えます。

11

すべてのスペースをタブに変更します:%s/\ s/\ t/g

3
murat budak

GNU coreutilsをインストールしている場合は、%!unexpand --first-onlyを検討するか、4スペースタブの場合は、%!unexpand -t 4 --first-only--first-onlyは、誤ってunexpand with --all)。

これは、所定のタブストップの前のスペースのみを置き換えることに注意してください。not後続のスペース。タブを文字通り表示しない限り、vimに視覚的な違いはありません。たとえば、私の~/.vimrcにはset list listchars=tab:▸┈が含まれています(これが、unexpandが機能しないと思った理由だと思います)。

0
Adam Katz

4-spacesインデント(スクリプトには2つの{4}があります)を、.pyフォルダー内のすべての./appファイル内のタブに(再帰的に)置き換えるためのbashスニペット:

find ./app -iname '*.py' -type f \
    -exec awk -i inplace \
    '{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "\t", arr[1]) }; { print arr[1] arr[3] }' {} \; 

中央または末尾の4スペースを変更しません。

Ubuntu 16.0xおよびLinux Mint 18でテスト済み

0
maxkoryukov

私の場合、タブに置き換える複数のスペースがありました(フィールドは1つ以上のスペースで区切られていました)。以下はそれをしました:

:% s/\s\+/\t/g
0
zee