1

問題はありません。ただ興味があるだけです。

これが私の .vimrc の一部です。

set tabstop=4
set shiftwidth=4
set expandtab

notabテキスト内をすべて置き換えたい <-here is a tab

したがって、コマンドは次のようになります。

:%s/notab/^I<-here is a tab/

これで実際のタブが表示されるので、それを 4 つのスペースに置き換えるには、呼び出す必要があります :retab

1 回の呼び出しで同じ結果になります (4 つのスペースを直接追加します):

:%s/notab/ <-here is a tab/

しかし、これは便利ではありません。この最初のバージョンには、テキストに実際のタブが含まれているため、再度タブを付ける必要があり、2 番目のバージョンは、1 つのタブとして定義されたスペースの数に依存します。

それを行う一般的な方法はありますか?

4

2 に答える 2

4

これはあなたが望むことを正確に行うべきだと思います:

:%s/notab/\=repeat(" ", &tabstop)/ge
于 2012-06-29T13:45:09.590 に答える
1

@seheの答えnotabは、が行の先頭に配置されている場合にうまく機能します((col-1)%&tabstop == 0の場合、ただし変数&tabstopを使用すると、col == 1の場合にのみ発生することが保証されます)。うまくいかない場合%s/notab/\t/ge | retab(つまり、バリアントがバー記号を使用して1行に結合されている場合)(おそらく、再タブ付けされないタブがすでに存在するため、他の理由はわかりません)、@seheの回答でも問題ありません。はるかに複雑なコードを使用します。

function ToExpTab(pat)
    for lnr in range(1, line('$'))
        let line=''
        let chunks=split(getline(lnr), a:pat, 1)
        if len(chunks)<=1
            continue
        endif
        for chunk in chunks[:-2]
            let line.=chunk
            let line.=repeat(' ', &tabstop-(strdisplaywidth(line))%&tabstop)
        endfor
        let line.=chunks[-1]
        call setline(lnr, line)
    endfor
endfunction
call ToExpTab('notab')
于 2012-06-29T17:20:55.847 に答える