Next: , Previous: , Up: 目次   [Index]


折り疊み

*usr_28.txt*	For Vim バージョン 8.1.  Last change: 2008 Jun 14

		     VIM USER MANUAL - by Bram Moolenaar

				   折り疊み

構造化されたテキストはいくつかのセクションから構成され、セクションはさらにサブセクションに分かれてゐます。折り疊みを使ふとセクションを 1 行で表示できます。折り疊まれた行にはセクションの槪要が表示されます。この章では折り疊みの使ひ方を說明します。

|28.1|折り疊みとは
|28.2|手動で折り疊む
|28.3|折り疊みを使つて作業する
|28.4|折り疊みの保存と復元
|28.5|インデントで折り疊む
|28.6|マーカーで折り疊む
|28.7|構文で折り疊む
|28.8|スクリプトで折り疊む
|28.9|變更のない行を折り疊む
|28.10|どれを使へばいいの?

折り疊みとは

折り疊みとは、バッファ中の複數の行を畫面上で 1 行に表示するための機能です。紙を折り疊んで短くするやうな感じです。

+------------------------+
| line 1                 |
| line 2                 |
| line 3                 |
|_______________________ |
\                        \
 \________________________\
 / folded lines           /
/________________________/
| line 12                |
| line 13                |
| line 14                |
+------------------------+

バッファ內のテキストが消えるわけではありません。折り疊みが影響するのは畫面の表示だけです。

折り疊みを使ふと文章構成を把握するのが簡單になります。折り疊まれたセクションは 1 行で表示され、その行にはセクションの槪要が表示されます。

手動で折り疊む

實際に試してみませう。どこかの段落にカーソルを動かして次のやうに入力します:

zfap

段落が、ハイライトされた一行に置き換はります。それが折り疊みです。|zf| はオペレータです。|ap| はテキストオブジェクトによる範圍指定です。|zf| はどのカーソル移動コマンドとも組み合はせることができます。カーソルが移動した範圍が折り疊みの對象になります。|zf| はビジュアルモードでも使へます。

再びテキストを表示するには、次のコマンドで折り疊みを開きます:

zo

次のコマンドで折り疊みを閉ぢることができます:

zc

折り疊み關聯のコマンドはすべて "z" で始まります。この文字は、紙を折り疊んで橫から見た圖に見えますよね。"z" の後ろにはコマンドが聯想しやすいやうな文字が割り當てられてゐます。

zf折り疊む (Fold)
zo折り疊みを開く (Open)
zc折り疊みを閉ぢる (Close)

折り疊みは入れ子にできます。折り疊まれた行を含んだ範圍をさらに折り疊むことができます。例へば、このセクションの段落をそれぞれ折り疊み、そして、この章のセクション全體を折り疊むといふことができます。實際に試してください。折り疊みを開いたとき、その中にある折り疊みは、閉ぢたときと同じ開閉狀態のままになつてゐます。

いくつかの折り疊みを作つたときに、すべての折り疊みを開きたくなつた場合、それぞれの折り疊みを "zo" で開いていくこともできますが、次のコマンドでもつと簡單にできます:

zr

折り疊みが減少 (Reduce) します。その逆は "zm" です:

zm

折り疊みが增加 (More) します。"zr" と "zm" は入れ子になつた折り疊みを一階層ずつ開閉できます。

入れ子になつた折り疊みをいっぺんに開きたい場合は次のコマンドを使ひます:

zR

すべての折り疊みが開くまで、折り疊みが減少 (Reduce) します。すべての折り疊みを閉ぢるには:

zM

折り疊みが次々と (More and More) 閉ぢます。

|zn| コマンドで折り疊みを無效にできます。無效になつた折り疊みは |zN| で元に戾ります。|zi| で無效と有效を交互に切り替へられます。次のやうに使ふと便利です:

手作業で折り疊みを作成するための詳しい說明はリファレンスマニュアルを參照してください: |fold-manual|

折り疊みを使つて作業する

折り疊みが閉ぢてゐるとき、"j" や "k" などのコマンドでその上を移動できます。閉ぢた折り疊みは 1 行の空行のやうに扱はれます。つまり折り疊まれたテキストの上を素早く移動できます。

折り疊まれたテキストは、それが 1 つの行であるかのやうに、ヤンクしたり削除したりできます。これは例へばプログラムの函數を竝べ替へたりするときに便利です。まづ ’foldmethod’ を正しく設定し、それぞれの函數が適切に折り疊まれるやうにします。そして、"dd" で函數を削除し、カーソルを移動して、"p" でプットします。函數の一部が折り疊みからはみ出してゐる場合はビジュアルモードを使ひます:

折り疊みを設定した場所 (つまり |zo| コマンドが機能する場所) を覺えておくのは大變です。次のコマンドで折り疊みの場所を確認できます:

:set foldcolumn=4

ウィンドウの左側に折り疊みの場所が表示されます。閉ぢた折り疊みは "+" で表示されます。開いた折り疊みは、1 行目が "-" で表示され、それ以降は "|" で表示されます。

マウスで "+" の部分をクリックすると折り疊みが開きます。"-" や "|" の部分をクリックすると折り疊みが閉ぢます。

插入モードでは現在行の折り疊みは絕對に閉ぢません。入力した文字は必ず表示されます。

カーソルをジャンプさせたり左右に動かしたりしたとき、折り疊みは自動的に開きます。例へば "0" コマンドを使ふと現在行の折り疊みが開きます (’foldopen’ に "hor" が含まれてゐる場合のみ。初期設定では含まれてゐます)。どのコマンドを使ふと折り疊みが開くかは ’foldopen’ オプションで設定できます。カーソルが乘つてゐる行の折り疊みを常に開いておきたい場合は次のやうに設定します:

:set foldopen=all

警告:
閉ぢた折り疊みの上に移動することはできなくなります。この設定を一時的に使ひ、元に戾したくなつたら次のやうにします:

:set foldopen&

折り疊みを自動的に閉ぢたい場合は次のやうにします:

:set foldclose=all

カーソルが乘つてゐないすべての折り疊みに ’foldlevel’ が適用されます。このやうな動作は好き嫌ひがあるので實際に試してみてください。折り疊みを增加させたい場合は |zm| を、減少させたい場合は |zr| を使つてください。

折り疊みはウィンドウローカルな設定です。同じファイルを 2 つのウィンドウで表示して、片方では折り疊みを使ひ、もう片方では普通に表示するといふことができます。あるいは、片方ですべての折り疊みを閉ぢ、もう片方ですべての折り疊みを開くこともできます。

折り疊みの保存と復元

ファイルを破毀すると折り疊みの情報は失はれてしまひます。後で同じファイルを開いたとき、折り疊みの開閉狀態は初期狀態に戾つてゐます。手動で作成した折り疊みは失はれます。折り疊みを保存するには |:mkview| コマンドを使ひます:

:mkview

ファイルの表示に關する設定が保存されます。保存される情報の種類は ’viewoptions’ オプションで設定できます。後で同じファイルを開いたときに保存したビューを復元できます:

:loadview

1 つのファイルにつき 10 個までのビューを保存できます。例へば、現在の設定を 3 番に保存して 2 番の設定をロードするには次のやうにします:

:mkview 3
:loadview 2

Note:
行を插入したり削除したりすると保存していたビューが使へなくなるかもしれません。ビューの保存場所は ’viewdir’ オプションで決まります。必要な場合は自分でビューを削除してください。

インデントで折り疊む

|zf| を使つて折り疊みを定義するのは大變です。テキストが階層的にインデントされてゐる場合は、それを使つて折り疊むことができます。インデントの深さにしたがつて折り疊みが作成され、大きくインデントされた部分は折り疊みが入れ子になります。この方法は多くのプログラミング言語で使ふことができます。

foldmethod’ オプションを次のやうに設定してください:

:set foldmethod=indent

|zm| や |zr| を使つて折り疊みを增減できるやうになりました。以下の例文を使ふと簡單に確認できます:

この行はインデントされてゐない
        この行は一段インデントされてゐる
                この行は二段インデントされてゐる
                この行は二段インデントされてゐる
        この行は一段インデントされてゐる
この行はインデントされてゐない
        この行は一段インデントされてゐる
        この行は一段インデントされてゐる

Note:
インデントの量と折り疊みの深さの對應は ’shiftwidth’ オプションで決まります。’shiftwidth’ の幅を單位としてインデントが深くなると折り疊みが深くなります。これを折り疊みレベルと呼びます。

|zr| や |zm| コマンドを使つたとき、實際には ’foldlevel’ の値を增減させてゐるのです。自分で設定することもできます:

:set foldlevel=3

shiftwidth’ の幅を單位として、インデントが三段より深い階層の折り疊みが閉ぢます。設定した値より深い階層の折り疊みが閉ぢる仕組みです。’foldlevel’ を 0 に設定するとすべての折り疊みが閉ぢます。|zM| を使ふと ’foldlevel’ が 0 に設定されます。|zR| を使ふと ’foldlevel’ がファイル內の最も深い折り疊みレベルに設定されます。

つまり、折り疊みを開閉する方法は 2 つあります

(A) 折り疊みレベルを設定する方法。

この方法は、テキストを "ズームアウト" して文章の構成を眺め、カーソルを動かし、テキストに "ズームイン" するやうな使ひ方ができます。

(B) |zo| や |zc| を使つて個々の折り疊みを開閉する方法。

他の折り疊みは閉ぢたままで、必要な折り疊みだけを開くことができます。

2 つの方法を組み合はせることもできます。|zm| で全體的に折り疊みを閉ぢてから |zo| で特定の折り疊みだけを開く。あるいは、|zR| ですべての折り疊みを開いてから |zc| で特定の折り疊みを閉ぢるなど。

foldmethod’ が "indent" に設定されてゐる場合は手動で折り疊みを定義できません。インデントと折り疊みレベルの關係を保つためです。

インデントによる折り疊みの詳しい說明はリファレンスマニュアルを參照してください: |fold-indent|

マーカーで折り疊む

テキストにマーカーを書いて、折り疊みの始點と終點を指定できます。この方法を使ふと折り疊みの範圍を明示的に指定できます。ただし、テキストに變更を加へる必要があります。

次のやうに設定してください:

:set foldmethod=marker

C 言語を使つた例文:

/* foobar () {{{ */
int foobar()
{
        /* return a value {{{ */
        return 42;
        /* }}} */
}
/* }}} */

マーカーの直前に書かれたテキストが折り疊まれた行に表示されるので、折り疊まれたテキストがどのやうな內容なのかを知ることができます。

テキストを移動したときなどにマーカーの對應がずれてしまふと面倒です。番號付きマーカーを使ふと手閒が省けます。例:

/* global variables {{{1 */
int varA, varB;

/* functions {{{1 */
/* funcA() {{{2 */
void funcA() {}

/* funcB() {{{2 */
void funcB() {}
/* }}}1 */

番號付きマーカーを書いた場所から指定レベルの折り疊みが開始します。指定レベルより高いレベルの折り疊みをその場所で區切るといふ效果もあります。番號付きマーカーは開始マーカーを指定するだけで折り疊みを定義できます。折り疊みを明示的に止めたい場合は終了マーカーを設定する必要があります。

マーカーによる折り疊みの詳しい說明はリファレンスマニュアルを參照してください: |fold-marker|

構文で折り疊む

ファイルを表示するとき、ファイルの種類に應じた構文ファイルが使はれます。構文ファイルにはファイルをカラー表示するための定義が書かれてゐます。例へばこのヘルプファイルは "help" 構文ファイルを使つてカラー表示されてゐます (カラー端末を使つてゐるなら)。

構文ファイルで構文を定義するときに "fold" 屬性を指定して折り疊み領域を定義することができます。構文ファイルを書くのは大變ですが、一度作つてしまへば、後は自動的に折り疊みが作成されるやうになります。

自分で構文ファイルを作成することはほとんどないと思ふので、詳しい說明は省きます。折り疊みを開いたり閉ぢたりする方法は他と變はりません。ファイルを開くと自動的に折り疊みが作成されます。

構文による折り疊みの詳しい說明はリファレンスマニュアルを參照してください: |fold-syntax|

スクリプトで折り疊む

これはインデントによる折り疊みと似てゐますが、インデントではなくユーザーが定義した函數を使つて折り疊みレベルを計算します。テキストの內容から折り疊みレベルを判斷するやうなことができます。例へば、メールでは引用したテキストの前に ">" を付けます。それを折り疊むには次のやうにします:

:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))

次のやうなテキストが折り疊まれます。試してみてください:

> 相手が書いた文章
> 相手が書いた文章
> > 相手が引用した私の文章
> > 相手が引用した私の文章

上記の ’foldexpr’ の設定を說明します (呼び出しの深い順番):

getline(v:lnum)現在行を取得
substitute(...,’\\s’,”,’g’)行から空白を削除
substitute(...,’[^>].*’,”,”)先頭の ’>’ 以降を全て削除
strlen(...)文字の長さ(’>’ の數)を數へる

Note:
":set" コマンドでは、空白とダブルクォートとバックスラッシュのすべてに對してバックスラッシュを前置する必要があります。よくわからないときは:

:set foldexpr

このコマンドで實際に設定された値を確認してください。複雜な式を書いてゐてそれを修正したい場合は、コマンドライン補完を使つてください:

:set foldexpr=<Tab>

<Tab> は實際の Tab キーです。現在の設定値が入力されるので、それを編輯できます。

複雜な式を使ひたい場合はその處理を函數にして、’foldexpr’ からはその函數を呼ぶように設定してください。

スクリプトにより折り疊みの詳しい說明はリファレンスマニュアルを參照してください: |fold-expr|

變更のない行を折り疊む

diff’ オプションと合はせて使ふと便利です。|vimdiff| コマンドを使つたときもこの設定が適用されます。例:

:setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1

同じファイルの別バージョンを表示してゐるすべてのウィンドウでこの設定を實行してください。同じ部分は折り疊まれ、違ひのある行だけが表示されるやうになります。

詳細は |fold-diff| 參照。

どれを使へばいいの?

いろんな方法があるのでどれを使へばいいか惱んでしまひますね。殘念ながら完璧な答へはありません。いくつかヒントを示します。

編輯したい言語の構文ファイルが折り疊みに對應してゐる場合は、それを使ふのがおそらくベストです。あるいは自分で書いてみるのもいいかもしれません。構文ファイルの作成には檢索パターンの詳しい智識が必要です。簡單な仕事ではありませんが、それが動作するやうになれば、手動で折り疊みを定義する必要がなくなります。

テキストのフォーマットが不定な場合は手動で折り疊みを定義してください。|:mkview| を使へば折り疊みを保存したり復元したりできます。

マーカーを使ふ方法はファイルにマーカーを書き込む必要があります。他の人とファイルを共有したり、社內のコーディング規約に從ふ必要がある場合は使へないかもしれません。

マーカーの利點は折り疊みを明示的に設置できることです。折り疊みをカット&ペーストしたときに前後の不要な行が變更されたりしません。折り疊まれた行に表示されるコメントを指定することもできます。

インデントによる折り疊みはたいていのファイルで機能しますが、うまく機能しない場合もあります。他の方法が使へない場合に使つてください。しかしアウトラインを表示する方法としては非常に便利です。’shiftwidth’ の幅ずつインデントを付けて折り疊みレベルを指定します。

スクリプトを使つた方法はほとんどの構造化されたテキストを折り疊むことができます。設定方法もシンプルです。折り疊みの開始と終了を認識するのが容易な場合は特に簡單です。

この方法で折り疊みを定義したときに思つたとほりの折り疊みが作成されなかつた場合は "manual" に切り替へてみてください。設定を變更しても折り疊みは削除されないので、そのまま手動で折り疊みを削除したり追加したりできます。


Next: , Previous: , Up: 目次   [Index]