1. ホーム
  2. vim

[解決済み] Vimのタブとスペースの設定

2023-05-15 13:18:27

質問

Vim はタブとスペースの選択に関して非常に親切です。私が理解しているように tabstop の設定はタブ文字の幅を示します。そのため shiftwidth を使用した場合に、何列分増加/減少させるかを指定します。 << >> コマンドに対して softtabstop を押したときに挿入される空白の量に影響します。 タブ キーを押したときに挿入される空白の量に影響します。もし expandtab がオンの場合、タブキーは softtabstop の数の空白文字を挿入する。一方 expandtab をオフにすると タブ を押すと、そのキーにマッチする最小の数のタブとスペースが挿入されます。 softtabstop . (間違っていたら訂正してください)。

この最後のポイントによって、私は不思議に思いました。 shiftwidth == tabstop && tabstop == softtabstop ? 思いつきませんね。私に関する限り、1回の割り当てでこれら3つをすべて同じ値に設定できれば、最も便利でしょう。

:set stab=4

というように、実行することと同じになる。

:set tabstop=4 softtabstop=4 shiftwidth=4 

どなたか、どのようにしたらこのようなことができるかを提案していただけませんか?


アップデイト

からのこれまでの返信に感謝します。 php が多すぎる , ホッブズ kaiser.se . それぞれに返信するよりも、ここで質問を更新しています。

expandtab をオフにした状態での Softtabstop

上で、expandtab をオフにした場合、Tab キーを押すと、以下の条件に一致する最小の数のタブとスペースが挿入されると述べました。 softtabstop . 私はそれを支持しますが、私が何を意味するのかを説明する必要があると思います。いくつかの例を使って説明しましょう。フォローするために、次のように実行します。 :set list を実行し、タブ文字を見ることができるようにしてください。

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

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

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

挿入モードでは、タブキーを押すと、タブ文字1文字とスペース2文字が挿入されます。タブ文字の幅は4なので、全体の幅は6となり、これを3文字で実現します。2回目にタブキーを押すと、タブ文字が2つ挿入され、前に挿入された2つのスペースが削除されます。合計の幅は12で、これは3文字で達成されます。

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

expandtab をオフにして作業している場合、softtabstop を tabstop と異なる値に設定することによって達成できるような、よりきめ細かい制御を望んでいるようには見えません。それでも、私が設定できるようにすることは有用でしょう。 tabstop , softtabstopshiftwidth を1つのコマンドで同じ値に変換します。

expandtab は softtabstop を冗長にしていますか?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

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

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

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

もし私が expandtab をオンにして作業している場合、delete キーが、tab キーが挿入するのと同じ量の空白を削除することを望みます。ですから、この場合も、同じ値を tabstop , softtabstopshiftwidth を同時に使用します。

ショートカットがあるとやはり便利

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

そこで、私が提案したのは、以下のようなものです。 :set stab=4 のようなものを提案しましたが、私にはまだ良いように聞こえます。

どのように解決するのですか?

を作成する stab オプションを作成するのは簡単ではありませんが、私はこのコマンド/関数を作成し、あなたの .vimrc (または超整理されている場合はプラグインファイル) にドロップすることができます。使用方法 :Stab を使用すると、インデントレベルと expandtab . もし、新しいインデントレベルを与えずにエンターキーを押すと、現在の設定がそのまま印刷されます。

.vimrcやプラグインファイルに書いてください。
コマンドを実行します! -nargs=* Stabを呼び出す Stab()
関数! Stab()
  let l:tabstop = 1 * input('set shiftwidth=')

  もしl:tabstop > 0なら
    expandtabも必要ですか?
    let l:expandtab = confirm('set expandtab?', "&Yes Filtern&No Filtern&Cancel")
    if l:expandtab == 3
      " 中止しますか?
      戻る
    endif

    let &l:sts = l:tabstop
    l:ts=l:tabstopとする。
    l:sw=l:tabstopとする。

    if l:expandtab == 1
      setlocal expandtab
    さもなければ
      setlocal noexpandtab
    endif
  endif

  選択されたオプションを表示する
  試す
    モードメッセージの表示
    set tabstop=' と入力します。
    質問
    をクリックします。
    モードメッセージ
    シフト幅
    質問
    echon &l:sw
    モードメッセージ
    echon ' sts='
    echohl Question
    echon &l:sts . ' ' . (&l:et ? ' : 'no')
    モードメッセージ
    エキスパンドタブ
  最後に
    なし
  エンドトライ
終了関数