正規表現検索パターンによる折りたたみ


13

空白で区切られた値の列を含むプレーンテキストファイルを取得しました。このような:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

また、最初の列の同じ値を持つ隣接する行と一致するこの正規表現を取得しました(ファイルが最初の列でソートされていると仮定します)最後を除いて:

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(または「毛むくじゃら」を少なくする):

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

一致しなかった行の上に行を折り返すことは可能ですか?この結果を持つ:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

回答:


14

折り畳みの開始点を定義するvimスクリプト式を設定しset foldmethod=exprて使用'foldexpr'します。

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

でスペースを簡単に使用することはできません:setが、スペースと改行または2を使用すると、次のようになります。

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

概要

基本的に、これは各行の最初の単語を前の行と比較します。単語が異なる場合、行はフォールドの始まりです>1。それ以外の場合、同じ折り畳みレベルを維持します=

詳細の栄光

  • set foldmethod=expr Vimにvimスクリプト式を使用して折りたたみを決定するように指示する
  • 'foldexpr' オプションはvimスクリプト式を保持します
  • >1折り畳みを開始する=タイミングと折り畳みレベルを継続するタイミングを返す3項で条件を評価する
  • v:lnum'foldexpr'折り畳みを更新するために実行されている現在の行です
  • 現在の行(v:lnum)と前の行(v:lnum - 1)の内容を取得しますgetline()
  • を介して各行を単語に分割します split()
  • get()新たに分割された単語の最初のインデックスを取得するために使用します
  • ''空白行の場合は、デフォルト値を使用します。例えばget(words, 0, '')
  • 現在の行の最初の単語を、三項の条件部分の前の行の最初の単語と比較します

注:この方法では、非常に大きなドキュメントでパフォーマンスの問題が発生する場合があります

詳細については、以下を参照してください。

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.