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


87

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

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

: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

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

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

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

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

エキスパンドタブをオフにして作業している場合、ソフトタブストップをタブストップとは異なる値に設定することで実現できる、よりきめ細かい制御が必要だとは思えません。それはまだ私が設定できるようにするために有用であろうtabstopsofttabstopshiftwidth1つのコマンドで同じ値に設定します。

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スイッチをオンにして作業している場合は、削除キーを使用して、タブキーが挿入するのと同じ量の空白を削除することをお勧めします。したがって、この場合には、あまりにも、私は同じ値を割り当てられることは有用であろうと感じtabstopsofttabstopそしてshiftwidth同時に。

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

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

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


ここには2つの異なる質問があるように見えます。おそらく、質問を2つに分割する必要があります。
Greg Hewgill

あなたが正しい!2番目の質問を独自のトピックに移動しました。
nelstrom 2009年

1
これは質問というよりはRFEのようです。そのため、おそらくVIMコミュニティにvim.org/community.phpを提案するか、単にパッチを作成する必要があります。それ以外に、VIMには新しい操作を定義できる広範なマクロ機能があるため、必要なことを実行するマクロを簡単に作成できる可能性が非常に高くなります。
kdgregory 2009年

@nelstromあなたの質問に関してis there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?、Vim自身のソースコードはを使用していset shiftwidth=4 tabstop=8 noexpandtabます。はい、通常は必要ですがshiftwidth == softtabstop、それは値tabstopが何であるかとは無関係です。
jamessan 2014

回答:


56

stabVim自体でオプションを作成するのは簡単ではありませんが、私はあなたがドロップできるこのコマンド/関数.vimrc(またはあなたが超組織化されている場合はプラグインファイル)を作り上げました。を使用する:Stabと、インデントレベルと、を使用するかどうかの入力を求められますexpandtab。新しいインデントレベルを指定せずにEnterキーを押すと、現在の設定が出力されます。

「これをすべて.vimrcまたはプラグインファイルに入れてください
コマンド!-nargs = * Stab呼び出しStab()
関数!刺す()
  l:tabstop = 1 * input( 'set shiftwidth =')

  l:tabstop> 0の場合
    「expandtabも必要ですか?
    let l:expandtab = firm( 'setexpandtab?'、 "&Yes \ n&No \ n&Cancel")
    l:expandtab == 3の場合
      「中絶?
      戻る
    endif

    &l:sts = l:tabstopとします
    &l:ts = l:tabstopとします
    &l:sw = l:tabstopとします

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

  "選択したオプションを表示
  試してみてください
    echohl ModeMsg
    echon 'タブストップを設定='
    echohl質問
    エコーン&l:ts
    echohl ModeMsg
    echon'shiftwidth = '
    echohl質問
    echon&l:sw
    echohl ModeMsg
    echon'sts = '
    echohl質問
    echon&l:sts。''。(&l:et? '': 'no')
    echohl ModeMsg
    echon'expandtab '
  最後に
    echohlなし
  endtry
エンドファンクション

3
スクリプトをありがとう!それは私が要求した以上のことをします-私はexpandtabをそれから遠ざけたいと思います-しかし私はそれを私の好みに合わせて簡単にカスタマイズすることができます。Vimscriptで小さなクラッシュコースを提供してくれたので、とても感謝しています。100ポイントの賞金はあなたのものです!
nelstrom 2009年

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


+1ええ、でもこれが本当に欲しいものなら、それでも大丈夫です。
DaveParillo 2009年

2
ローカルバージョンを設定するには、let&l:shiftwidthなどを使用することをお勧めします。
SystemParadox 2012

7

あなたは、編集モードでも使用することができますCtrl-TインデントにとCtrl-Dによって設定されるように次のインデントレベルにdeindentにshiftwidthかかわらずの、tabstopsofttabstopまたはexpandtab設定。Vimはスペースやタブを自動的に追加/削除して、正しい列に移動します。

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


3

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

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


3
これは間違っていると思います。softtabstop正しい値に設定した場合にのみ、間隔を空けたインデントがタブであるかのようにバックスペースで削除されるためです。これは正気の使用のための必需品です。
u0b34a0f6ae 2009年

2

あなたの理解softtabstopexpandtab間違っている-それでstabあなたが提案するオプションはあまり役に立たないでしょう。

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

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

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


あなたはその通りでtabstop、設定するsofttabstopと1つの変数になりすぎextpandtabますが、優先順位については間違っていると思います。試してみてくださいts=8 sts=4 et。タブを設定して押します。カーソルは5列目にあり、設定した場合と同じように4つのスペースが挿入されts=4 sts=0 etます。
hobbs

5
これは間違っていると思います。softtabstop正しい値に設定した場合にのみ、間隔を空けたインデントがタブであるかのようにバックスペースで削除されるためです。これは正気の使用のための必需品です。
u0b34a0f6ae 2009年

2

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

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

:e $MYVIMRC

そして、以下を追加します。

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

これが私の.vimrcの設定方法です。


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.