2011-03-02 3 views
7

私はVimのretabスペースのみ

:set noet|retab! 

を使用してcurrentlingが、私はに実行している問題は、それがファイル全体を通じてタブに4つのスペースのすべてのインスタンスを置き換えていますです。 私は、行の先頭にある4つのスペースのインスタンスだけを置き換えるためにvimが必要です。

!リタブの終わりに、スペースはどこにも置き換えられません。

私は誰かが作成したカスタム関数を使用して試してみた:

" Retab spaced file, but only indentation 
command! RetabIndents call RetabIndents() 

" Retab spaced file, but only indentation 
func! RetabIndents() 
    let saved_view = winsaveview() 
    execute '%[email protected]^\(\{'.&ts.'}\)\[email protected]\=repeat("\t", len(submatch(0))/'.&ts.')@' 
    call winrestview(saved_view) 
endfunc 

が、私は実行したときに、私はちょっといいエラーメッセージが表示されます:関数RetabIndentsの処理中に

:RetabIndents 

エラーが検出されました:

2行目:

E486:パターンが見つかりません:^({4})+

+0

は、あなたはすでに、タブで始まるスペースのすべてを交換していない特定のか?元のファイル、またはすでに ':set noet | retab!'を実行した修正されたファイル(またはバッファ)を使用していますか? – gotgenes

+0

これは問題なので、置き換えるスペースがありません。一致するものが見つからない場合は、無視する修飾語はありませんか? –

+1

も参照してください。http://stackoverflow.com/questions/5144284/force-vi-vim-to-use-leading-tabs-only-on-retab – wimh

答えて

9

これについて他の人と話した後、私はサイレントを追加する必要がありました!コマンドを実行する前に これは私が今働いているものです:

autocmd BufWritePre * :RetabIndents 
command! RetabIndents call RetabIndents() 

func! RetabIndents() 
    let saved_view = winsaveview() 
    execute '%[email protected]^\(\ \{'.&ts.'\}\)\[email protected]\=repeat("\t", len(submatch(0))/'.&ts.')@e' 
    call winrestview(saved_view) 
endfunc 

だから今、この機能は自動的にのみ、各行の先頭にあるタブとスペースに置き換えられます。

+2

':substitute'の最後に' e'フラグを使用できますコマンド 'silent!'の代わりに ':h s_flags'を参照してください。 – ZyX

+0

これは私が探していたものです!ありがとう! eフラグを追加して、サイレントを削除しました! –

0

別の方法を使用して、シェルスクリプトの先頭でスペースをタブに変更します。私はコマンドラインからsedを使うだけです。 BSDを使用して

はsedを:

sed -i "" -e ':loop' -e "s/^\([ ]*\) /\1 /" -e 't loop' somefile.sh 

を*注:(I)角括弧内の文字はタブ文字である(II)/ \ 1 aftger文字もタブ文字です。両方のタブcgharactersは、Ctrl + v + Tabキーの組み合わせを使用して端末に入力されます。 GNUを使用して

はsedを:

sed -i -e ':loop' -e 's/^\([\t]*\) /\1\t/' -e 't loop' somefile.sh