web-dev-qa-db-ja.com

Vimのタブとスペースの設定

Vimは、タブVsに関して非常に順応性があります。スペース設定。私が理解しているように、tabstop設定はタブ文字の幅を示します。 shiftwidth設定は、使用するときにインクリメント/デクリメントする列の数を指定します << そして >> コマンド。softtabstop設定は、を押したときに挿入される空白の量に影響します。 Tab 挿入モードのキー。 expandtabがオンの場合、タブキーはsofttabstop個のスペース文字を挿入します。一方、expandtabをオフにすると、 Tab keyは、softtabstopに一致するタブ+スペース文字の最小数を挿入します。 (私が間違っている場合は修正してください。)

この最後のポイントは私に不思議にさせます:shiftwidth == tabstop && tabstop == softtabstopを望まない実用的なケースはありますか?考えられません。私の知る限り、これら3つすべてを同じ値に1回の割り当てで設定できれば、最も便利です。例えば呼び出し:

:set stab=4

これは次の実行と同等です:

:set tabstop=4 softtabstop=4 shiftwidth=4 

誰もこれをどのように行うことができるか提案できますか?


[〜#〜] update [〜#〜]

too much phpからの返信に感謝、hobbsおよびkaiser.se。それぞれ個別に返信するのではなく、ここで質問を更新しています。

展開タブをオフにしたソフトタブストップ

Expandtabをオフにした状態で、Tabキーを押すと、softtabstopに一致する可能な限り少ない数のタブ+スペース文字が挿入されます。私はそれを支持しますが、私が意味することを説明する必要があると思います。いくつかの例を挙げて説明します。従うには、:set listを実行して、タブ文字が見えるようにします。

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

挿入モードでは、Tabキーを押すと2つのスペース文字が挿入されます。タブキーをもう一度押すと、さらに2つのスペース文字(合計4つのスペース文字)を挿入する代わりに、前の2つのスペースが1つのタブ文字に置き換えられます。 Tabstopは4に設定されているため、1つのタブ文字の幅は4つのスペースと同じです。

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

挿入モードでは、タブキーを押すと、1つのタブ文字と2つのスペースが挿入されます。タブ文字の幅は4なので、合計幅は6で、これは3文字を使用して実現されます。タブキーをもう一度押すと、2つのタブ文字が挿入され、以前に挿入された2つのスペースが削除されます。合計幅は12で、これは3文字を使用して実現されます。

これらの例の両方で、Vimはsofttabstopに一致する最小限のタブ+スペース文字を挿入します。

Expandtabをオフにした状態で作業している場合、softtabstopをtabstopとは異なる値に設定することで実現できる追加のきめ細かい制御を望んでいるのを見ることができません。 tabstopsofttabstop、およびshiftwidthを1つのコマンドで同じ値に設定できると便利です。

Expandtabはsofttabstopを冗長にしますか?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

挿入モードでは、タブキーを押すと4つのスペースが挿入されます。削除キーを押すと、1つのスペースが削除されます。そのため、誤ってタブキーを押した場合、バックスペースを4回押す必要があります。

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

挿入モードでは、タブキーを押すと4つのスペースが挿入されます。バックスペースキーを押すと、4つのスペースが削除されます。

expandtabスイッチをオンにして作業している場合、削除キーを使用して、タブキーの挿入と同じ量の空白を削除することをお勧めします。したがって、この場合も、tabstopsofttabstop、およびshiftwidthに同じ値を同時に割り当てることができれば便利だと思います。

それでもショートカットは便利です

Vimが非常に高い柔軟性を提供するのは素晴らしいことですが、私はそれを必要としているとは思いません。タブの幅と、「ハード」タブ(タブ文字を使用)または「ソフト」タブ(スペースで構成)のいずれかを選択できるようにしたいだけです。ハードタブとソフトタブの切り替えは簡単です(:set expandtab!)が、3つの異なるパラメーターをいじる必要なく、タブの幅を設定する方が簡単だったと思います。

したがって、:set stab=4のようなものに対する提案された提案は、今でも私にとって良いことです。

86
nelstrom

Vimでstabオプションを作成するのは簡単ではありませんが、このコマンド/関数を作成して、.vimrc(または非常に組織化されている場合はプラグインファイル)。使用する :Stabそして、インデントレベルとexpandtabを使用するかどうかのプロンプトが表示されます。新しいインデントレベルを指定せずにEnterキーを押すと、現在の設定が印刷されます。

 "これをすべて.vimrcまたはプラグインファイル
 command!に入れてください!-nargs = * Stab call Stab()
 function!Stab()
 let l :tabstop = 1 * input( 'set shiftwidth =')
 
 if l:tabstop> 0 
 "expandtabも必要ですか?
 let l: expandtab = confirm( 'set expandtab?'、 "&Yes\n&No\n&Cancel")
 if l:expandtab == 3 
 "abort?
 return 
 endif 
 
 let&l:sts = l:tabstop 
 let&l:ts = l:tabstop 
 let&l:sw = l:tabstop 
 
 if l:expandtab == 1 
 setlocal expandtab 
 else 
 setlocal noexpandtab 
 endif 
 endif 
 
 "選択したオプションを表示
 try 
 echohl ModeMsg 
 echon 'set tabstop =' 
 echohl Question 
 echon&l:ts 
 echohl ModeMsg 
 echon 'shiftwidth =' 
 echohl Question 
 echon&l:sw 
 echohl ModeMsg 
 echon 's ts = '
 echohl Question 
 echon&l:sts。 ''。 (&l:et? '': 'no')
 echohl ModeMsg 
 echon 'expandtab' 
 finally 
 echohlなし
 endtry 
 endfunction 
55
too much php

これはVimScriptを書く最初の試みですが、ここに行きます:

_function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc
_

これを.vimrcファイルに入れると、:call Stab(X)を実行して呼び出すことができます(Xは目的のタブ幅です)。これは今のところ適切な解決策ですが、だれかがより簡単に電話をかける方法を提案できるなら、私は感謝するでしょう。

また、現在の設定をすばやく要約する関数を作成しました。これをctrl-Tabにマッピングしました。

_nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc
_

まあ、私はこの答えに100ポイントの報奨金を出しました、そして今私はそれを半分自分で解決しました。自分の答えを受け入れることができるかどうかはわかりません...

9
nelstrom

編集モードでも使用できます Ctrl-T インデントする Ctrl-D shiftwidthtabstop、またはsofttabstopの設定に関係なく、expandtabで設定された次のインデントレベルにインデントを解除します。 Vimは自動的にスペースまたはタブを追加/削除して、正しい列に移動します。

これらのコマンドを使用してインデントを制御する場合、代わりに Tab/Backspace これらすべてのタブ設定が一致することを心配する必要はなく、常に正しいインデントレベルに到達します。

7
sth

expandtabが設定されている場合(PHPの指摘が多すぎるため)、softtabstopは冗長になります。 shiftwidthtabstopと異なる方法で設定できる唯一の理由は、奇妙な習慣に対応するためです。たとえば、4スペースのインデントを使用しますが、好みです tab 8つのスペースを挿入します。

expandtabが設定されていない場合、ファジーになります。 catおよび非vimエディターでvimと同じようにコードを表示したい場合、tabstopは常に8に設定する必要があります。この場合、softtabstopshiftwidthの両方を好みのインデントレベルに設定します。代わりに、ファイル内のすべての「物理タブ」が1つのインデントレベルを表すようにする場合は、tabstopおよびshiftwidthを好みのインデントレベルに設定し、softtabstopをゼロのままにします( tabstopに等しく設定することは、tabstopを変更すると同期が取れなくなることを除いて同等です。ゼロは「無視してください」を意味します)。

3
hobbs

ホワイトスペースの設定を頻繁に変更するので、それを管理する機能が本当に必要ですか? tabstopをいじり、expandtabを設定している場合、stabに渡される異なる値を持つファイルを変更すると、時間の経過とともに混乱する可能性があります。今日は:call stab (4)を使用し、明日は:call stab (2)で、先週は:call stab (8)でした。たとえそれを書いても、すぐに使用をやめるように聞こえます。

常に同じ値をスタブに渡す予定がある場合は、グローバル設定を編集するだけではどうですか? vimで:

:e $MYVIMRC

以下を追加します。

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

これが私の.vimrcのセットアップ方法です。

2
DaveParillo

softtabstopexpandtabの理解が間違っているため、提案するstabオプションはあまり役に立ちません。

expandtabは、everythingのタブの代わりにスペースを使用する場合に使用します。 expandtabを設定すると、Vimはsofttabstopオプションを無視し、tabstopshiftwidthを使用して、挿入するスペースの数を計算します。

softtabstopは、タブとスペースのmixを使用する場合にのみ使用します。これにより、細かな制御(2つまたは4つのスペース)でインデントできます。タブの幅をより高い値(通常は8)に保ち、テキストが他のアプリケーションに表示されるようにします。設定softtabstop=tabstopは何も達成しません。Vimは常にインデントにタブを使用するからです。

更新:kaizer.se が指摘しているように、expandtabを使用している場合は、softtabstopを設定する必要があります。複数のスペースをタブのようにバックスペースするVim。

2
too much php

便利なオプションの1つはsofttabstop=-1これは、shiftwidthの値に設定します。
shiftwidthを0に設定することもできます。その場合、tabstop値が使用されます。

1
pauloue