2012-07-22 6 views
5

多くの人がタブではなくスペースを使用します。私は両方を使います。空白文字以外の最初の行と空白のタブ。新しい文書を作成しても何の問題もありません。また、書式を使用するのに適しています。とにかくスペースの問題を修正する必要がある場合もあります。先頭のスペースをタブに変換するにはどうすればよいですか?

Search and replaceによると、私はちょうど:%s/spaces_for_tab/tab/gを行うことができます。それは単純で多くの場合に有効です。とにかく、私はラインの始めにスペースだけをリファクタリングしたい。

+2

':set noet'、変換するブロックを選択'、retab! ' – ninjalj

+0

@ninjaljはい、動作しますが、変換するブロックを選択することが時々難しい場合があります。 –

+0

[VimやLinuxでスペースをタブに変換する方法は?](http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or) -linux) –

答えて

2

私は単純な関数を書いています。とにかくそれは4つのスペースのタブのためだけに働くでしょう。

fu! Fixspaces() 
     while search('^\t* \{4}') != 0 
       execute ':%s/^\t*\zs \{4}/\t/g' 
     endwhile 
endfu 

存在する場合は、より良い解決策を提案でき、私はそれを喜んで使用します。 このfuncは文字列のスペースも置き換えるという問題があります。

+0

私は自分の答えをマークするのは初めてです。とにかくこれは大きな仕事です(複数行の文字列やhtmlタグなどのスペースを変更しないようにしてください)。私の実装はやや単純です。 –

+0

これは良い解決策ではありません。代わりに 'noexpandtab'と組み合わせてvimの組み込みコマンドを' noexpandtab'と組み合わせて使用​​してください。 –

+0

@sg私が正しく理解すれば、 'retab'だけが期待通りに動作せず、' retab! 'スペースを、行のタブ*どこにでも*(文字列リテラルの内部でさえ)に変換します。先頭の空白だけがタブに変換されるのが本当により適切です。 –

5

これはの正規表現の問題です。ラインの先頭にアンカーするには、キャレットを使用します。

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 doesn't handle this well(私は他の編集者が何をしているのかわかりません)ので、私はたいてい:set expandtabを使用しています(:set softtabstop参照)。

+0

通常は、 'retab'ではなく' retab! 'が必要です。 –

+1

問題は、あなたが書いたように、VIMはこれをうまく処理しません(VIMのいくつかの機能が欠けている可能性が高いですが、VIMはいつも素敵です)。 –

-1

誰もが興味を持っていた場合、私は少しマーティンの答えを取り、それを改善:

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 

この関数はexpandtabtabstop設定の値に応じて適切なものを行い、また、カーソルがどこにあるか覚えています。

関連する問題