パーソナルツール

マーカー文字列を埋め込んで、ソースコードを折り畳み表示する

作者: 小見 拓 最終変更 2012年01月08日 11時59分

vimエディタの折り畳み機能をコードに埋め込んだマーカー文字列で コントロールする方法を説明します。 vimエディタには、コードの中にある目印となるマーカー (デフォルトでは「{{{」と「}}}」) を書いておくことで、そのマーカーに囲まれた範囲を折り畳む機能があります。 このマーカー文字列による折り畳み機能は、vimエディタの「foldmethod」オプションが 「marker」に設定されている時のみ、使用できます。 (Windows, Mac)

概要

vimエディタの折り畳み機能をコードに埋め込んだマーカー文字列で コントロールする方法を説明します。
vimエディタには、コードの中にある目印となるマーカー (デフォルトでは「{{{」と「}}}」)
を書いておくことで、そのマーカーに囲まれた範囲を折り畳む機能があります。
このマーカー文字列による折り畳み機能は、vimエディタの「foldmethod」オプションが 「marker」に設定されている時のみ、使用できます。

:set foldmethod=marker
折り畳みの範囲をマーカーで指定する。

↓ マーカーで囲んだエリアが折り畳まれます。

指定した箇所が折り畳まれた。

マーカー埋め込みによる折り畳み機能の基本的な使い方

モードラインで「foldmethod=marker」を指定する

マーカー埋め込みによる折り畳み機能を使用する場合は、 まず、モードラインで「foldmethod」オプションに「marker」と設定することを検討してください。
折り畳み箇所の目印となるマーカーをコードに埋め込んでも、 「foldmethod」オプションに「marker」を設定しない限り、埋め込んだマーカーでの折り畳みはできません。 しかし、モードラインを使用すれば、設定が変わっても、他の人が開いても、設定した折り畳みを有効にできます。

モードラインで「foldmethod」を指定するには、次のようなコードをファイルの上か下に追加します。

モードラインの例 その1(C言語風コメント)
/* vim:set foldmethod=marker: */

モードラインの例 その2(vimスクリプト風コメント)
" vim:set foldmethod=marker:

モードラインの例 その3(シェルスクリプト風コメント)
# vim:set foldmethod=marker:

参考: モードラインを使って、ファイルごとにvimエディタのオプションを指定する。

折り畳みを行う箇所にマーカーを埋め込む

折り畳みを行いたい範囲の開始行の位置に「{{{」を、終わりの行に「}}}」の文字列を埋め込みます。

package test.hello;

public class HelloWorld {

    public HelloWorld() {}

    public void hello() { {{{
        System.out.println("Hello World");
    } }}}

    public static void main(String[] argv) {
        HelloWorld instance = new HelloWorld();
        instance.hello();
    }

}
/* vim:set foldmethod=marker: */ 

プログラムのコードにマーカー文字列を埋め込む場合、 単純にマーカーを書いただけではプログラムが文法的にエラーになることが多いので、 通常はマーカーをコメントで囲みます。

package test.hello;

public class HelloWorld {

    public HelloWorld() {}

    public void hello() { /* {{{ */
        System.out.println("Hello World");
    } /* }}} */

    public static void main(String[] argv) {
        HelloWorld instance = new HelloWorld();
        instance.hello();
    }

}
/* vim:set foldmethod=marker: */ 

埋め込んだマーカーで正しくフォールディングが行われるかを確認するには、 ファイルを読み込みなおすか、次のコマンドを実行します。

:%foldclose
折り畳み箇所の確認。

コマンドでマーカーを埋め込む、取り除く

{Visual}zf

「foldmethod」に「marker」を設定している場合、 ビジュアルモードで範囲を指定して zf と入力すると、
選択した範囲の最初と最後の行に折り畳みのマーカーを埋め込めます。

折り畳みを行いたい範囲をビジュアルモードで選択

↓ 折り畳みを行いたい範囲をビジュアルモードで選択し、 zf で最初の行、最後の行にマーカーを埋め込める。

選択範囲の最初の行、最後の行にマーカーが埋め込まれた

zd

同じく、「foldmethod」に「marker」を設定している場合、 削除したい折り畳みのマーカーの位置にカーソルを持って行き、 zd でコード中に埋め込まれたマーカーを除去できます。

折り畳みのマーカーの範囲内にカーソルを持って行く

↓ 削除したい折り畳みの範囲にカーソルを移動し、 zd でマーカーを削除できる。

折り畳みのマーカーが削除された

埋め込まれるマーカーを囲むコメントの形式を変更する

zf でマーカーを埋め込むと、マーカーはコメントで囲まれた形でコードに追加されます。 このコメントの形式を変更するには、vimエディタの「commentstring」オプションでコメントの形式を指定します。

" コメントの形式をスラッシュ2つの形式に変更
:set commentstring=//%s

この「commentstring」オプションの設定も「foldmethod」の設定と同じく、 ユーザの設定が異なると折り畳みが機能しなくなってしまう類の設定なので、 変更する場合はモードラインでオプションを指定するのが良いでしょう。

モードラインの例 その1(C言語風コメント)
/* vim:set foldmethod=marker commentstring=//%s : */

モードラインの例 その2(vimスクリプト風コメント)
" vim:set foldmethod=marker commentstring=//%s :

モードラインの例 その3(シェルスクリプト風コメント)
# vim:set foldmethod=marker commentstring=//%s :

参考: モードラインを使って、ファイルごとにvimエディタのオプションを指定する。

折り畳みのマーカー文字列を変更する

折り畳みを使用するコードに文法的な問題などがあり、 デフォルトの折り畳みのマーカー「{{{」「}}}」が使用できない場合には、 「foldmarker」オプションでマーカーとして使用する文字列を変更できます。 「foldmarker」オプションに、カンマで区切って、前後のマーカー文字列を指定します。

" カンマで区切って、マーカー文字列の対を指定する
:set foldmarker=[[[,]]]

この「foldmarker」の設定も、vimエディタの設定が異なれば、折り畳みが全く機能しなくなるので、 変更する場合は、やはり、モードラインで指定しておくのが良いと考えられます。

モードラインの例 その1(C言語風コメント)
/* vim:set foldmethod=marker foldmarker=[[[,]]] : */

モードラインの例 その2(vimスクリプト風コメント)
" vim:set foldmethod=marker foldmarker=[[[,]]] :

モードラインの例 その3(シェルスクリプト風コメント)
# vim:set foldmethod=marker foldmarker=[[[,]]] :

参考: モードラインを使って、ファイルごとにvimエディタのオプションを指定する。

折り畳まれた時の見え方と、マーカーの埋め込み位置についての考慮

コードを折り畳むと、当然、折り畳まれた範囲のコードの大半が読めなくなりますが、 しかし、折り畳まれた一行目の文字列に関してはいくらか見ることができます。

折り畳まれた箇所のズーム

そこで、折り畳み範囲の最初の行には、折り畳まれた場所がどんなコードがわかる内容を含めると、 コードの保守性が高くなります。
具体例としては、

  • メソッド名の宣言を1行目に持ってくる
    public void hello() { /* {{{ */
        System.out.println("Hello World");
    }
    /* }}} */ 
  • コメントを最初の行として、その行に簡易な説明を書く
    /* これはhello()メソッドです。 {{{ */
    public void hello() {
        System.out.println("Hello World");
    }
    /* }}} */ 

などがあります。

注意事項など

このドキュメントの中では、モードラインで「foldmethod」を設定することを推奨していますが、 それ以外の方法だと、

  • ファイルタイププラグインで設定する。
  • vimエディタの設定ファイルで設定する。
  • 毎回、 :set foldmethod=marker を指定する。

といった手段もとれます。

ドキュメントアクション
コメント
blog comments powered by Disqus