vim-users.jp

Hack #186: テキストを折り畳む – 自作編

Posted at 2010/12/02
このエントリーをはてなブックマークに追加

'foldmethod' に “expr” を指定すると、折り畳みの定義を式で指定することができます。

設定方法

'foldmethod' が “expr” の場合、'foldexpr' オプションに折り畳みレベルを計算するための式を設定します。 この式の中では v:lnum に行番号が格納されているので、その行の折り畳みレベルを計算します。

大抵の場合、関数を定義してその関数を呼び出すような式を設定します。

setlocal foldexpr=MyFold(v:lnum)

式の返す値

式は、その行の折り畳みレベルを以下のうちの1つの形式で返す必要があります。

意味
数字 0, 1, 2 折り畳みレベルです。0 の場合、その行は折り畳みに含まれません。
-1 -1 直前か直後の行のうち低い方の行のレベルを使います。
“=” “=” 直前の行と同じレベルを使います。
“a” + 数字 / “s” + 数字 “a1″, “a2″, “s1″, “s2″ 直前の行のレベルからの相対値でレベルを指定します。a が + で s が – です。
“<” + 数字 “<1″, “<2″ 指定したレベルの折り畳みを終了します。
“>” + 数字 “>1″, “>2″ 指定したレベルの折り畳みを開始します。

式の評価中に副作用があってはいけません。また、この式の評価はバッファ内の各行に対して行われるので、なるべく軽い処理で済ませる必要があります。

具体例

ここでは簡単な具体例を紹介します。

setlocal foldmethod=expr foldexpr=MyHelpFold(v:lnum)

function! MyHelpFold(lnum)
  let line = getline(a:lnum)
  let next = getline(a:lnum + 1)
  if line =~ '^=\{78}$'
    return 1
  elseif next =~ '^=\{78}$'
    return '<1'
  elseif line =~ '^-\{78}$'
    return 2
  elseif next =~ '^-\{78}$'
    return '<2'
  endif
  return '='
endfunction

これは Vim の help を折り畳む設定の例です。

“=” が 78 個並ぶ行を目印として、その行以降をレベル 1、同じように “-” が 78 個並ぶ行以降をレベル 2 として定義しています。 また、同じレベルが連続した場合に別々の折り畳みになるように、次の行が新しい目印の行だった場合はその行で折り畳みを終了するようにしています。

thinca

もどる
blog comments powered by Disqus