Skip to content

Update usr_30.{txt,jax} #2090

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 174 additions & 77 deletions doc/usr_30.jax
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
*usr_30.txt* For Vim バージョン 9.1. Last change: 2024 Apr 29
*usr_30.txt* For Vim バージョン 9.1. Last change: 2025 May 30

VIM USER MANUAL - by Bram Moolenaar

Expand Down Expand Up @@ -398,102 +398,199 @@ Vim が使っている名前を確認できます: >
==============================================================================
*30.5* タブとスペース

'tabstop' の初期設定は 8 です。変更することはできますが、それはトラブルの元に
なります。他のプログラムはあなたが使用しているタブ幅を知ることができません。そ
のようなプログラムでは、恐らくタブの幅は 8 であると仮定されているので、テキス
トが崩れて表示されてしまいます。また、ほとんどのプリンタはタブ幅を 8 で固定し
ています。したがって、'tabstop' を変更するのはお勧めしません。(他のタブ幅設定
で書かれたテキストを修正したい場合は |25.3| を参照してください。)
プログラムをインデントする場合、8 桁単位でインデントするとすぐに画面が埋まって
しまいます。しかしスペースが一つだけではインデントが目立ちません。多くのプログ
ラマは (折衷して) 4 桁を好んで使います。
<Tab> の幅は 8 桁で、インデントを 4 桁にしたいということは、<Tab> 文字を使って
インデントすることはできないということです。そのようなインデントには二つの方法
があります:

1. <Tab> とスペースを混在させる。<Tab> は 1 つでスペース 8 個分の幅になるので
ファイルサイズの節約になります。スペース 8 個より <Tab> の方が入力も削除も
簡単です。

2. スペースだけを使う。違うタブ幅を使う他のプログラムでもトラブルが起きませ
ん。

Vim はどちらの方法もサポートしています。


☆タブとスペースを混在させる

タブとスペースを混在させる場合は特別な設定は必要ありません。初期設定でうまくい
きます。
'softtabstop' オプションを設定すると編集が少し楽になります。このオプションが設
定されると、タブ幅が 'softtabstop' の値に設定されたかのように、<Tab> キーが動
作します。しかし実際にはタブとスペースが混在して使われます。
次のコマンドを実行すると、<Tab> キーでカーソルが 4 桁ごとに進むようになります:
>
:set softtabstop=4
☆タブ導入の背景の簡単な歴史

(Vim の祖先である) `vi `は Bill Joy によって開発されました。当時、彼はメモリと
I/O 操作能力が限られた PDP-11 を使用していました。当時は、次のようなトリックを
使ってソースコードのサイズを最適化するのが一般的でした。
ASCII テーブルは、もともとテレプリンターを遠隔制御するために設計されました。
制御文字 9 (水平タブ、キャレット表記: ^I) をテレプリンターに送信すると、キャ
リッジは次のタブストップに移動します。タブストップが 8 桁 (一般的な標準) で区
切られていると仮定すると、1 つの制御文字で最大 8 つのスペース文字と同じ視覚効
果を生み出すことができます。例えば、次の 2 行は同じように表示されます >

1234^I9
1234 9

<Tab> キーを使用する方が、<Space> キーを複数回入力するよりも高速でした。<BS>
キーの場合も同様です。


☆タブとインデントの問題

Vimでは、2 つの (仮想的な) 水平タブストップ間の列数は 'tabstop' で制御され、デ
フォルトでは 8 に設定されています。この値は変更できますが、後ですぐに問題に遭
遇します。他のプログラムは、あなたが設定したタブストップ値を認識できないからで
す。おそらくデフォルト値の 8 が使用されるため、テキストの見た目が突然大きく変
わってしまいます。また、ほとんどのプリンタは固定のタブストップ値 8 を使用しま
す。したがって、'tabstop' はそのままにしておくのが最善です。異なるタブストップ
設定で作成されたファイルを編集する場合は、|25.3| を参照して修正してください。
プログラム内の行をインデントする場合、8 桁の倍数を使用するとすぐにウィンド
ウの右端にぶつかってしまいます。スペース 1 つでは見た目の違いが十分に出ません。
多くの人は、妥協案として4桁のスペースを使うことを好みます。
行の先頭のタブ文字は視覚的に 8 つのスペースとして表され、4 つのスペースのイ
ンデントを使用したいので、タブ文字を使用してインデントを作成することはできませ
ん。
これを改善するために、`vi` には 'shiftwidth' オプションがありました。これを
4 に設定すると、挿入モードで新しい行に <C-t> を押すと行が 4 スペース分インデン
トされます。これは、<Tab> キーと 'tabstop' を 8 に設定しただけでは実現できない
結果です。
スペースを最適化するために、`vi` は暗黙的にスペースの塊を削除し、タブ文字に置
き換えます。以下は、<C-t> を数回押したときに何が起こるかを示しています。
"." はスペース文字を表し、"------->" はタブ文字を表します。

入力 結果 ~
<C-t> ....
<C-t><C-t> ------->
<C-t><C-t><C-t> ------->....

同様に、挿入モードで <C-d> を押すとインデントが減ります。したがって、
`set tabstop=8 shiftwidth=2` とすると、以下のようになります

入力 結果 ~
<C-t><Tab><C-t> ..----->..
<C-t><Tab><C-t><C-d> ------->

`vi` で設定できる 3 つ目のオプションは 'autoindent' です。これは前の行のイン
デントレベルをコピーします

入力 結果 ~
<Space><Tab>hello .------>hello
<Space><Tab>hello<Enter> .------>hello
------->

ただし、新しい行は、使用される文字数を最適化することによって生成されます。


☆スペースだけ

しかし、タブストップを 8 桁で区切るという方法は普遍的ではありませんでした。IBM
では 10 桁が標準であり、今日では Go 開発者の中には `tabstop=4` でコードを記述
する人もいます。テキストが毎回異なる 'tabstop' 値で表示されると、特にファイル
を共有して別のマシンで開いた場合、テキストの位置がずれる危険性があります。
その間にコンピュータの性能は飛躍的に向上し、タブ文字の使用によって節約された
数オクテットはもはや実質的な効果を持たなくなっていました。スペースのみを使用す
ることで、どこでも同じ結果のテキストを保証できるようになりました。しかし、`vi`
では機能を犠牲にすることなくスペースのみを使用することは不可能でし
た。'autoindent' は、可能な場合はタブ文字を体系的に入力しようとしていたことを
思い出してください。
Vim 4.0 では、'expandtab' オプションが導入され、スペースのみの操作がタブのみ
(またはタブとスペースの混合) の操作と同じくらい便利になりました。このオプショ
ンを有効にすると、Vim は通常挿入する水平タブ文字を同数のスペースに置き換え、視
覚効果を同じにします。<BS> は、これまでと同様に一度に 1 文字のみを削除します。

入力 結果 ~
<Tab> ........
<Tab><BS> .......


☆タブをスペースに変換 (およびその逆)

'expandtab' を設定しても、既存のタブ文字にはすぐには影響しません。ファイル内の
水平タブ文字をすべて削除するには、Vim 5.3 で |:retab| コマンドが導入されまし
た。以下のコマンドを使用してください: >

行頭で <Tab> を押すと、スペースが 4 個挿入されます。次に <Tab> を押すと、最初
のスペース 4 個が削除されて <Tab> 文字が挿入されます (つまりカーソルは 8 列
目)。このように、スペースは可能な限り <Tab> 文字で置き換えられます。
バックスペースはその反対の動作になります。<BS> を押すと、'softtabstop' の幅だ
け削除されます。可能な限り <Tab> が使われ、余りはスペースになります。
次の図は、<Tab> をいくつか入力してから <BS> を使ったときの様子を示しています。
"." はスペースで "------->" は <Tab> です。
:set expandtab
:retab

入力 結果 ~
<Tab> ....
<Tab><Tab> ------->
<Tab><Tab><Tab> ------->....
<Tab><Tab><Tab><BS> ------->
<Tab><Tab><Tab><BS><BS> ....
これは少し危険です。文字列内のタブも変更されてしまう可能性があるからです。タブ
が存在するかどうかを確認するには、次のようにします: >

同様の動作は 'smarttab' オプションを使っても実現できます。このオプションを設定
した場合、インデントの入力のために <Tab> を押すと 'shiftwidth' の幅が使われ、
何かの文字より後ろでは実際の <Tab> 文字が使われます。ただし、<BS> の動作は
'softtabstop' のときと同様にはなりません。
/"[^"\t]*\t[^"]*"

文字列内でタブ文字そのものを使用することは推奨されません。問題を回避するには、
タブ文字を "\t" に置き換えてください。

☆スペースだけを使う
逆の場合も同様に機能します: >

Tab 文字を一切使いたくない場合は 'expandtab' オプションを設定してください: >
:set noexpandtab
:retab!

:set expandtab

このオプションをオンにすると、<Tab> キーでスペースが入力されるようになります。
つまり、<Tab> 文字と同じ量のスペースが挿入され、<Tab> 文字は使われません。
バックスペースキーはスペースを一つずつ削除するので、<Tab> を押した後でそれを削
除するには <BS> を 8 回押さなければなりません。インデントの削除は CTRL-D を使
うと簡単です。
☆ソフトタブストップ

スペースだけを使用する場合、またはスペースと水平タブを組み合わせて使用する場
合、タブ文字だけを使用する場合のように、<Tab> キーと<BS> キーが対称的に動作し
ないという不快な感覚を覚えます。
Vim 5.4 では 'softtabstop' オプションが導入されました。テキスト内の水平タブ
文字を表示するために使われる (ハード) タブストップに加え、Vim はカーソル専用の
ソフトタブストップを追加します。'softtabstop' が正の値に設定されている場合、
<Tab> キーを押すとカーソルが次のソフトタブストップに移動します。Vim はタブ文字
とスペースの適切な組み合わせを挿入し、視覚的な効果を実現します。同様に <BS>
キーを押すと、カーソルは最も近いソフトタブストップに到達しようとします。以下の
例では、`:set softtabstop=4` を使用しています。

☆タブをスペースに変換する (あるいはその逆)
入力 結果 ~
<Tab> ....
<Tab><Tab>a ------->a
<Tab><Tab>a<Tab> ------->a...
<Tab><Tab>a<Tab><BS> ------->a

'expandtab' を設定しても、それ以前に入力されたタブ文字は影響を受けません。つま
り、文章中のタブ文字はタブ文字のままです。タブ文字をスペースに変換したい場合
は、":retab" コマンドを使ってください。次のように使います: >
全体的な一貫性を維持するために、`:set softtabstop=-1` を設定し
て、'shiftwidth' の値を 2 つのソフトタブストップ間の桁数として使用するようにす
ることができます。

:set expandtab
:%retab
'shiftwidth' と 'softtabstop' に異なる値を設定したい場合でも、'shiftwidth'
でインデントするには <C-t> を使用できます。あるいは Vim 5.6 で導入された
'smarttab' オプションを使うと、状況に応じて適切な動作をする統一された <Tab>
キーを実現できます。

すべてのインデントがスペースに変換されます。ただし、何かの文字より後ろにある
(インデント以外の) タブ文字はそのままです。それらのタブ文字も変換したい場合は
コマンドに ! を付けます: >

:%retab!
☆可変タブストップ

これは少し注意が必要です。なぜなら、文字列の中のタブ文字も変換されてしまうから
です。文字列の中でタブ文字が使われているかどうかは、次の検索パターンで確認でき
ます: >
前述の通り、ASCII テーブルはテレプリンターを遠隔制御するために設計されました。
特定のテレプリンターでは、物理的なタブストップの間隔を可変に設定できます。結局
のところ、制御文字 ^I は次のタブストップがどこであっても次のタブストップへ移動
するという指示を出すだけだったのです。
Vim 7.3では、同じ機能をエミュレートする 'vartabstop' が導入されました。例え
ば、Vim を `+vartabs` でコンパイルし、`:set vartabstop=2,4` とすると、以下のよ
うになります

/"[^"\t]*\t[^"]*"
実際の文字 結果 ~
^I ->
^I^I ->--->
^I^I^I ->--->--->

文字列の中でタブ文字を使うのはお勧めしません。トラブルを避けるためにも "\t" を
使ってください
同様に、可変間隔のソフトタブストップを設定するための 'varsofttabstop' も導入
されました。`:set varsofttabstop=2,4` とすると、以下のようになります

同様に、スペースをタブ文字に変換できます: >
入力 結果 ~
<Tab> ..
<Tab><Tab> ......
<Tab><Tab><Tab> ------->....


☆構成例

デフォルトでは、Vim はタブのみを使用するように設定されています: >

:set tabstop=8
:set shiftwidth=8
:set noexpandtab
:%retab!
:set softtabstop=0
:set nosmarttab
<
C コードを Python のように記述したい場合 (スペースのみ、インデントは 4 スペー
ス)、以下のように記述します: >

:set shiftwidth=4
:set softtabstop=-1
:set expandtab
<
同じ動作をしたいが、配置をより適切に制御したい場合 (例えば、パラメータまたは
コメントを 2 の倍数のスペースで整列させる) は、以下のようにします: >

:set shiftwidth=4
:set softtabstop=2
:set expandtab
:set smarttab
<
代わりに、Bram Moolenaar のような C コード (タブとスペースの組み合わせを使用)
を記述したい場合は、以下のようにします >

:set shiftwidth=4
:set softtabstop=-1
<

==============================================================================
*30.6* コメントの整形
Expand Down
Loading