88

タブVsに関しては、Vimは非常に親切です。スペース設定。私が理解しているように、tabstop設定はタブ文字の幅を示しています。この設定は、およびコマンドshiftwidthを使用するときにインクリメント/デクリメントする列の数を指定しますが、この設定は、挿入モードでキーを押したときに挿入される空白の量に影響します。オンの場合、タブキーはスペース文字の数を挿入します。スイッチをオフにした状態でキーを押すと、に一致するタブ+スペース文字の数が可能な限り少なくなります。(間違っている場合は訂正してください。)<<>>softtabstopTabexpandtabsofttabstopexpandtabTabsofttabstop

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

:set stab=4

これは、実行するのと同じです。

:set tabstop=4 softtabstop=4 shiftwidth=4 

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


アップデート

あまりにも多くのphphobbskaiser.seからの返信に感謝します。それぞれに個別に返信するのではなく、ここで質問を更新しています。

ExpandtabがオフになっているSofttabstop

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

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

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

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

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

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

Expandtabをオフにして作業している場合、softtabstopをtabstopとは異なる値に設定することで実現できる、よりきめ細かい制御が必要だとは思えません。を1つのコマンドで同じ値に設定できると、それでも便利ですtabstopsofttabstopshiftwidth

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

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

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

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

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

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

ショートカットはまだ役に立ちます

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

ですから、私の提案したようなものについての提案は、:set stab=4まだ私には良いと思います。

4

7 に答える 7

57

Vim 自体でオプションを作成するのはstab簡単ではありませんが、このコマンド/関数を作成しまし.vimrcた。を使用する:Stabと、インデント レベルと使用するかどうかを尋ねられますexpandtab。新しいインデント レベルを指定せずに Enter キーを押すと、現在の設定が出力されます。

" これらすべてを .vimrc またはプラグイン ファイルに入れます
指図!-nargs=* Stab 呼び出し Stab()
関数!刺す()
  let l:tabstop = 1 * input('set shiftwidth=')

  l:タブストップ > 0 の場合
    " expandtab も必要ですか?
    let l:expandtab = confirm('set expandtab?', "&Yes\n&No\n&Cancel")
    l:expandtab == 3 の場合
      「中絶?
      戻る
    終了

    let &l:sts = l:タブストップ
    let &l:ts = l:タブストップ
    let &l:sw = l:tabstop

    l:expandtab == 1 の場合
      setlocal expandtab
    そうしないと
      setlocal noexpandtab
    終了
  終了

  " 選択したオプションを表示
  試す
    echohl ModeMsg
    echon 'set tabstop='
    エコールの質問
    エコーン &l:ts
    echohl ModeMsg
    echon 'shiftwidth='
    エコールの質問
    エコーン &l:sw
    echohl ModeMsg
    echon 'sts='
    エコールの質問
    &l:sts をエコーし​​ます。' ' . (&l:et ? ' ': 'いいえ')
    echohl ModeMsg
    echon 'expandtab'
  最後に
    エコーなし
  めんどくさい
終了機能
于 2009-10-23T00:09:03.433 に答える
9

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 ポイントの報奨金を出しましたが、今では自分で半分解決しました。自分の答えを受け入れることができるかどうかわからない...

于 2009-10-20T19:44:24.887 に答える
7

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

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

于 2009-10-22T19:15:02.117 に答える
3

が設定されている場合expandtab(あまりにも多くの php が指摘しているように)、softtabstop冗長になります。shiftwidth設定を変更する唯一の理由はtabstop、奇妙な習慣に対応するためです。たとえば、4 つのスペースのインデントを使用しているが、tab8 つのスペースを挿入することを好むとします。

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

于 2009-10-15T11:59:51.040 に答える
2

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

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

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

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

于 2009-10-14T00:09:40.900 に答える
2

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

常に同じ値を stab に渡す予定がある場合は、グローバル設定を編集してみませんか? ヴィムで:

:e $MYVIMRC

以下を追加します。

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

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

于 2009-10-21T18:33:49.877 に答える