他人の書いたソースコードを開くと、時々こんな感じで一部が折り畳まれていることがある。
自分の書いたコードでこれを再現するには、'foldmethod'
オプションをモードラインで使うといい。
モードラインとは?
ファイルタイプ別ではなくファイルごとにエディタの設定を変更したい場合、ファイルに vim エディタ特有の記述をしておくことで、そのファイルが vim エディタで開かれた時に特定の設定を有効にするモードラインという機能が役に立ちます。
http://nanasi.jp/articles/howto/file/modeline.html
つまり、ファイルごとに適用させたいオプションを、コメントの形式でファイルの末尾に付け足しておくのである。
#!/usr/bin/perl print "Hello, World!\n"; # vim: set foldmethod=marker :
alert( 'Hello, World!' ); // vim: set foldmethod=marker : /* vim: set foldmethod=marker : */ // ↑どちらでも認識する
折りたたみを設定するには、このように foldmethod=marker
というオプションを入れておく。
折りたたみ場所の指定
この状態で、折り畳みたい場所を {{{
と、}}}
で括る。
#!/usr/bin/perl sub greeting { # 関数定義 {{{ print "Hello, World!\n"; } # }}} sub goodbye { # 関数定義 {{{ print "Goodbye!\n"; } # }}} &greeting; &goodbye; # vim: set foldmethod=marker :
Perl では #
以降の文字列は無視されるので、{{{
、}}}
という記号は意味を持たない。このファイルを Vim で開いてみると……
このように、{{{
を含む行のみが表示されて、関数定義の内容が省かれて表示される。このように短いソースだと大した意味がないが、数千行に及ぶソースを効率よく眺めるときに便利だ。
折り畳みの操作
とはいえ、折り畳まれたままだと中身が見えなくて困る。折り畳みを開いたり閉じたりするときは次のコマンドを使う。
折り畳みを操作するコマンド
zo
- カーソル下の折り畳みを一段階開く。
zO
- カーソル下の折り畳みを全て開く。
zc
- カーソル下の折り畳みを一段階閉じる。
zC
- カーソル下の折り畳みを全て閉じる。
zm
- 折り畳み全てを一段階開く。
zM
- 折り畳み全てを開く。
zr
- 折り畳み全てを一段階閉じる。
zR
- 折り畳み全てを閉じる。
例えば、この状態で zo
と叩くと、
折り畳みが開く。閉じるときは zc
だ。
他にも様々なコマンドがある。:help fold.txt
でヘルプを参照してみよう。
多段階の折り畳み
コマンドの説明で書いたとおり、折り畳みには段階がある。{{{
、}}}
を単に入れ子にするか、あるいは数字を付け足すことで、折り畳みの段階を指定することが出来る。
{{{1 1段階目 {{{2 2段階目 {{{3 3段階目 }}}3 }}}2 }}}1
(function(){ // {{{1 function greeting( lang ) { // 関数定義 {{{2 if ( lang == 'en' ) { // 英語の場合 {{{3 alert( 'Hello, World!' ); // }}}3 } else if ( lang == 'ja' ) { // 日本語の場合 {{{3 alert( 'こんにちは、世界!' ); // }}}3 } else { // その他 {{{3 alert( 'nurupo' ); } // }}}3 } // }}}2 function main( lang ) { // メインルーチン {{{2 greeting( lang ); } // }}}2 main( 'ja' ); })(); // }}}1 // vim: set foldmethod=marker :
上に挙げたソースは Vim では次のように表示される。
この状態で、zo
などのコマンドを使って、必要な部分だけソースを眺めることが出来る。
便利な機能だけど……
とまあ、何かと便利な折り畳みなのだが、この機能を知らない人が Vim でファイルを開くと、折り畳みを開けずに中身が全く読めない、なんてこともあり得る。
自分で使うファイル以外はモードラインに何も設定せず、適宜 :set foldmethod=marker
とコマンドを打つことで制御した方が賢いかも知れないね。
> 自分で使うファイル以外はモードラインに何も設定せず、適宜 :set foldmethod=marker とコマンドを打つことで制御した方が賢いかも知れないね。
http://blog.livedoor.jp/tokuhirom/archives/50184930.html
が便利です。
これを~/.vim/after/ftplugin/perl.vimに書くと開いたとき自動的に折りたたんでくれます。
ただ最後の
set fdm=syntax
は
setlocal fdm=syntax
にして、~/.vim/after/ftplugin/perl.vimに書くのがいいです。
デフォルトでfdm=syntaxにしたいなら別に元のを.vimrcに書く形で構わないですが。
ふむふむ。perl.vim みたいに
シンタックス定義ファイルに折り畳みが定義されてれば、
:se fdm=syntax が使えるんですね。早速使ってみます。
他にこれに対応した言語はあるのかな?