多くの人はタブではなくスペースを使用します。私は両方を使用します。行頭のタブと最初の非空白文字からのスペース。新しいドキュメントを開始するのに問題はなく、フォーマットの使用により適したドキュメントを変更する必要がある場合に備えて。それでも時々私はとにかくスペースの問題を修正する必要があります。
検索と置換によると、私はただ行うことができます:%s/spaces_for_tab/tab/g
。シンプルで多くの場合に機能します。とにかく、行頭のスペースだけをリファクタリングしたいと思います。
これは、より多くの正規表現の問題です。行の先頭に固定するには、キャレットを使用します。例:
s/^ /\t/
または、vimの組み込み機能を使用してそれを行います:
:set tabstop=4 "four spaces will make up for one tab
:set noexpandtab "tell vim to keep tabs instead of inserting spaces
:retab "let vim handle your case
ちなみに、私もインデント用のタブと位置合わせ用のスペースが好きです。残念ながら、vimはこれをうまく処理しません(そして私は他のエディターが何をするのかわかりません)ので、私は主に使用します:set expandtab
(多分参照してください:set softtabstop
)。
私はそれのために簡単な関数を書きました。とにかく、それは4スペースタブでのみ機能します。
fu! Fixspaces()
while search('^\t* \{4}') != 0
execute ':%s/^\t*\zs \{4}/\t/g'
endwhile
endfu
存在する場合は、より良い解決策を提案することができます。喜んで使用します。問題は、この関数が文字列のスペースも置き換えることです。
私はマーティンの答えを受け取り、誰かが興味を持っているならそれを少し改善しました:
function Fixspaces()
let ts = &tabstop
let pos = getpos('.')
if &expandtab
while search('^ *\t') != 0
silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g'
endwhile
echo 'Changed tabs to spaces'
else
while search('^\t* \{'.ts.'}') != 0
silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g'
endwhile
echo 'Changed spaces to tabs'
endif
call setpos('.', pos)
endfunction
expandtab
この関数は、と設定の値に応じて適切な処理を実行しtabstop
、カーソルの位置も記憶します。