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
誰もこれをどのように行うことができるか提案できますか?
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とは異なる値に設定することで実現できる追加のきめ細かい制御を望んでいるのを見ることができません。 tabstop
、softtabstop
、およびshiftwidth
を1つのコマンドで同じ値に設定できると便利です。
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
挿入モードでは、タブキーを押すと4つのスペースが挿入されます。削除キーを押すと、1つのスペースが削除されます。そのため、誤ってタブキーを押した場合、バックスペースを4回押す必要があります。
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
挿入モードでは、タブキーを押すと4つのスペースが挿入されます。バックスペースキーを押すと、4つのスペースが削除されます。
expandtab
スイッチをオンにして作業している場合、削除キーを使用して、タブキーの挿入と同じ量の空白を削除することをお勧めします。したがって、この場合も、tabstop
、softtabstop
、およびshiftwidth
に同じ値を同時に割り当てることができれば便利だと思います。
Vimが非常に高い柔軟性を提供するのは素晴らしいことですが、私はそれを必要としているとは思いません。タブの幅と、「ハード」タブ(タブ文字を使用)または「ソフト」タブ(スペースで構成)のいずれかを選択できるようにしたいだけです。ハードタブとソフトタブの切り替えは簡単です(:set expandtab!
)が、3つの異なるパラメーターをいじる必要なく、タブの幅を設定する方が簡単だったと思います。
したがって、:set stab=4
のようなものに対する提案された提案は、今でも私にとって良いことです。
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
これは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ポイントの報奨金を出しました、そして今私はそれを半分自分で解決しました。自分の答えを受け入れることができるかどうかはわかりません...
編集モードでも使用できます Ctrl-T インデントする Ctrl-D shiftwidth
、tabstop
、またはsofttabstop
の設定に関係なく、expandtab
で設定された次のインデントレベルにインデントを解除します。 Vimは自動的にスペースまたはタブを追加/削除して、正しい列に移動します。
これらのコマンドを使用してインデントを制御する場合、代わりに Tab/Backspace これらすべてのタブ設定が一致することを心配する必要はなく、常に正しいインデントレベルに到達します。
expandtab
が設定されている場合(PHPの指摘が多すぎるため)、softtabstop
は冗長になります。 shiftwidth
をtabstop
と異なる方法で設定できる唯一の理由は、奇妙な習慣に対応するためです。たとえば、4スペースのインデントを使用しますが、好みです tab 8つのスペースを挿入します。
expandtab
が設定されていない場合、ファジーになります。 cat
および非vimエディターでvimと同じようにコードを表示したい場合、tabstop
は常に8に設定する必要があります。この場合、softtabstop
とshiftwidth
の両方を好みのインデントレベルに設定します。代わりに、ファイル内のすべての「物理タブ」が1つのインデントレベルを表すようにする場合は、tabstop
およびshiftwidth
を好みのインデントレベルに設定し、softtabstop
をゼロのままにします( tabstop
に等しく設定することは、tabstop
を変更すると同期が取れなくなることを除いて同等です。ゼロは「無視してください」を意味します)。
ホワイトスペースの設定を頻繁に変更するので、それを管理する機能が本当に必要ですか? 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のセットアップ方法です。
softtabstop
とexpandtab
の理解が間違っているため、提案するstab
オプションはあまり役に立ちません。
expandtab
は、everythingのタブの代わりにスペースを使用する場合に使用します。 expandtab
を設定すると、Vimはsofttabstop
オプションを無視し、tabstop
とshiftwidth
を使用して、挿入するスペースの数を計算します。
softtabstop
は、タブとスペースのmixを使用する場合にのみ使用します。これにより、細かな制御(2つまたは4つのスペース)でインデントできます。タブの幅をより高い値(通常は8)に保ち、テキストが他のアプリケーションに表示されるようにします。設定softtabstop=tabstop
は何も達成しません。Vimは常にインデントにタブを使用するからです。
更新:kaizer.se が指摘しているように、expandtab
を使用している場合は、softtabstop
を設定する必要があります。複数のスペースをタブのようにバックスペースするVim。
便利なオプションの1つはsofttabstop=-1
これは、shiftwidth
の値に設定します。shiftwidth
を0に設定することもできます。その場合、tabstop
値が使用されます。