vimテクニック:tabstop、softtabstop、expandtabの3つのオプションの違いを詳しく理解する

6349 ワード

vimではtab文字のデフォルトの表示幅は8つのスペースです.端末でvimを開き、Tabキーを何度も押すと、端末の表示幅を超えやすくなります.良好な符号化体験のためにtab文字の表示幅を調整する必要がある.tab文字を挿入したくない場合は、tab文字をスペースに置き換える必要があります.
tabstopオプション、softtabstopオプション、expandtabオプションを設定することで、tab文字の表示およびTabキーを押す動作を変更できます.
  • tabstopオプションtab文字の表示幅のみを変更し、Tabキーを押す動作
  • は変更しない.
  • softtabstopオプションTabキーを押す動作を変更し、tab文字の表示幅を変更しません.具体的な動作はtabstopオプション値に関連する
  • expandtabオプションは、挿入したtab文字を特定の数のスペースに置き換えます.具体的なスペースの数はtabstopオプション値に関連する
  • tabstopオプション
    vimでは、:help tabstopコマンドを使用してtabstopオプションを表示する手順は、次のとおりです.
    'tabstop' 'ts' number (default 8)
    Number of spaces that a in the file counts for.
    Note: Setting 'tabstop' to any other value than 8 can make your file appear wrong in many places (e.g., when printing it).
    すなわち、tabstopオプションは、tab文字の表示幅をスペース数、デフォルト値は8に設定します.次のコマンドを使用して、このオプションの値を4に変更できます.
    :set tabstop=4

    tabstopオプションは、ts、:set tabstop=4コマンド、および:set ts=4コマンドと略記することができ、等価である.
    上記の説明では、tabstopオプションを8以外の値に設定すると、印刷時など多くの場所でファイルにエラーが表示される可能性があります.
    たとえばtabstopオプション値を4に設定し、vimでtab文字を使用して列揃えを行い、レイアウトが正常に見えるようにしてファイルを保存します.しかし、tab文字が8つのスペースを表示する他のソフトウェアでこのファイルを表示すると、もともと位置合わせされていた列が錯乱し、位置合わせされていない可能性があります.
    vimヘルプドキュメントの各セクション、例えば:help usr_30のTabs and spacesセクション、:help usr_25のIndents and tabsセクションでは、tabstopオプション値を8に維持することを何度も推奨しています.:help tabstopコマンドの説明では、expandtabオプションを設定し、tab文字をスペースに置き換えた場合にのみ、tabstopオプションを他の値に変更することを推奨します.このときvimの挿入モードでTabキーを押すと、tab文字ではなくスペースが挿入されます.ファイルを保存した後、他のソフトウェアでこのファイルを開くと、tab文字が見えなくなり、tab文字の表示幅が異なるためにレイアウトが異常になることはありません.
    注意:tabstopオプションは、vimでのtab文字の表示幅のみを変更し、挿入モードでTabキーを押すか、vimがtab文字を挿入するか、特定の数のスペースを挿入するかを変更しません.
    软tabstopオプション
    vimでは、:help softtabstopコマンドを使用してsofttabstopオプションを表示する手順は、次のとおりです.
    'softtabstop' 'sts' number (default 0)
    Number of spaces that a counts for while performing editing operations, like inserting a or using . It "feels"like s are being inserted, while in fact a mix of spaces and s is used.
    When 'sts' is zero, this feature is off.
    When 'sts' is negative, the value of 'shiftwidth' is used.
    すなわち、softtabstopオプション(stsと略記可能)は、vimが挿入モードでTabキーを押して実際に得た文字に影響し、特定の数のスペースを挿入したり、tab文字を挿入したりする可能性があります.
    具体的に使用するとtabstopオプションとexpandtabオプションの影響を受けます.次のコマンドを使用して、このオプションの値を4に変更できます.
    :set softtabstop=4

    設定後、tabstopオプション値が8でexpandtabオプションが設定されていない場合、最初にTabキーを押すと、vimはtab文字ではなく4つのスペースを挿入します.
    その後、2回目にTabキーを押すとvimは前の4つのスペースを削除し、tab文字を挿入します.tabstopオプションの値が8のため、インタフェースではカーソルが4つの空白文字を前に移動し続け、4つのスペースが挿入されたように見えますが、実際には2回Tabキーを押して、1つのtab文字しか挿入されません.
    書き込みファイルの文字とバイト数から言えば、最初にTabキーを押して4つのスペース、つまり4つのバイトを書き込み、2回目にTabキーを押すと、前に書き込まれた4つのスペースが削除され、もう1つのtab文字が書き込まれ、1つのバイトしかなく、書き込みファイルのバイト数が少なくなります.
    インタフェースから見ると8文字の空白文字が表示されていますが、これはtab文字の表示幅にすぎません.次のコマンドを実行して、スペースとtab文字を表示し、テストを行うと、この点が明確に表示されます.
    :set list
    :set listchars=tab:>~,space=.

    また、softtabstopオプションは、Backspaceキーの連続する複数のスペースの削除やtab文字の削除にも影響します.
    上のシーンでは、最初にTabキーを押すとvimが4つのスペースを挿入し、このときBackspaceキーで4つのスペースを一度に削除できます.つまり、Backspaceキーを1回押すだけで、この4つのスペースを削除できます.
    Tabキーを2回押してtab文字を挿入した後、Backspaceキーを押すと、実はこのtab文字を4つのスペースに置き換えます.
    インタフェースから見ると,カーソルは4文字前に移動したが,ファイルのバイト数は実際に多くなった.
    特に、挿入モードでは4つのスペースを手動で入力し、Backspaceキーを押すと1つのスペースしか削除できません.ただし、4つのスペースを手動で入力した後、挿入モードを終了し、挿入モードに入ると、Backspaceキーでこの4つのスペースを一度に削除できます.
    tabstopオプション値が4、softtabstopオプション値が4であり、expandtabオプションが設定されていない場合、Tabキーを押すたびにtab文字が挿入され、スペースは挿入されません.
    前述したようにvimは、tab文字をTabキーで挿入して整列インデントしないように設定することをお勧めします.他のソフトウェアでファイルを表示すると、レイアウト異常が発生する可能性があります.
    softtabstopオプションの値が0未満の場合、実際の値はshiftwidthオプションの値に設定されます.このプロパティは、自動インデントのレイアウトと一致するようにします.後で具体的に説明します.
    注意:softtabstopオプションは、vimが挿入モードでTabキーを押して実際に得た文字に影響します.vimでのtab文字の表示幅は変更されず、tab文字は常にtabstopで指定した幅で表示されます.
    softtabstopオプションの値がtabstopオプションの値より小さい場合、最初にTabキーを押すと、softtabstopオプションの値に対応する複数のスペースが挿入され、挿入されたスペースの数がtabstopで指定された幅に達すると、挿入されたスペースが削除され、tab文字に置き換えられます.
    expandtabオプション
    vimでは、:help expandtabコマンドを使用してexpandtabオプションを表示する手順は、次のとおりです.
    'expandtab' 'et' boolean (default off)
    In Insert mode: Use the appropriate number of spaces to insert a .
    To insert a real tab when 'expandtab' is on, use CTRL-V.
    すなわち、expandtabオプションを設定すると、挿入モードでTabキーを押して挿入したtab文字が適切な数のスペースに置き換えられます.tab文字を挿入する場合は、CTRL-Vキーを押してからTabキーを押す必要があります.
    このオプションをオンにするには、次のコマンドを使用します.
    :set expandtab

    設定すると、tab文字がtabstopオプション値に対応する複数のスペースに置き換えられます.たとえば、tabstopオプションの値が8の場合、tab文字を挿入すると、8つのスペースに置き換えられます.
    なお、softtabstopオプション値が4、tabstopオプション値が8、expandtabオプションが設定されていないシーンでは、初めてTabキーを押すと4つのスペースが挿入され、tab文字が挿入されず、置換tab文字がスペースになっていない場合は、softtabstopオプション値が4に設定されているわけではありません.expandtabオプションはsofttabstopオプション値に基づいてtab文字を4つのスペースに置き換えます.
    Tabキーを2回押してtab文字を挿入すると、expandtabオプションはtabstopオプション値に基づいてtab文字を8つのスペースに置き換えます.
    注意:expandtabオプションを設定すると、新しく挿入したtab文字を特定の数のスペースに置き換えるだけで、ファイルに既存のtab文字には影響しません.すなわち、ファイルの既存のtab文字は変わらない.
    tab文字の挿入時に自動的にスペースに置換するように設定
    前述の説明に基づいて、挿入されたtab文字を自動的にスペースに置き換える場合は、~/.vimrcファイルに次の構成を追加できます.
    "      ,     4
    set shiftwidth=4
    "   Tab   ,       
    set expandtab
    " softtabstop     ,   shiftwidth  ,      ,      .
    set softtabstop=-1

    ここでtabstopオプション値は設定されておらず、この値をデフォルトの8に維持します.expandtabオプションが設定されており、Tabキーを押すと挿入されたtab文字が8つのスペースに置き換えられます.
    shiftwidthオプションの値は4で、自動インデントのスペース数を設定します.同時にsofttabstopオプション値を-1に設定すると、このオプション値はshiftwidthオプション値に等しく、4になります.
    最初にTabキーを押すと、4つのスペースが挿入され、自動インデントのスペース数と一致し、インデントを統一するのに便利で、自動インデントが8つのスペースを挿入することはありませんが、手動でTabキーを押すと4つのスペースしか挿入されず、インデントが整列していない場合があります.
    すなわち、整列インデントを一致させるために、手動でTabキーを押して挿入したスペースの数は、自動インデントのスペースの数と同じである.すなわち、softtabstopオプション値はshiftwidthオプション値と等しい.
    softabstopオプションの値を負数に設定すると、この要件を満たすことができます.その後、インデントされたスペースの数を調整するには、shiftwidthオプションの値だけを変更します.:help tabstopコマンドの説明に従って、expandtabオプションを設定した後、tabstopオプション値を4に変更することができ、Tabキーを押してtab文字を挿入した後、4つのスペースに置き換えることもできます.
    ここではこの方式ではなく、softtabstopオプション値の構成を選択し、softtabstopオプション値を構成した後、Backspaceキーで一度に4つのスペースを削除できるようにするのが便利です.またsofttabstopオプション値を負数に設定することで、shiftwidthオプション値と自動的に一致し、変更が容易になります.:help usr_30のTabs and spacesセクションと:help usr_25のIndents and tabsセクションを参照して、より多くのヘルプ情報を取得できます.