16

次のようなファイルがあります。

dog{{{
blah blah blah
}}}
cat{{{
blah blah
}}}
aardvark{{{
blah blah blah blah
}}}

私のvimrcにはset foldmethod=marker、ファイルの内容がすべて中括弧で折りたたまれているように、があります。私の質問は、foldヘッダーに基づいてファイルを並べ替えるにはどうすればよいですか?セクションを最初に、次に、次にaarvaark来るようにします。catdog

一部の折りたたまれたセクションには、他の折り目があります。私はそれらの低いフォールドレベルをソートしたくありません。ファイルはレベル1の折り畳みのみでソートする必要があります。

4

4 に答える 4

5

すべての折り目を閉じた状態 (zMまたは:set foldlevel=0) で、削除ddと貼り付けを使用pして、折り畳まれたブロックを手動で移動できます。これは、少量のテキストには問題ありません。

巨大なテキストの場合、Vim はそのような機能を提供していないため、ソート関数を自分で作成する必要があります。次のアルゴリズムを使用できます。

  1. テキストに存在しない区切り文字 (例: <Nul>) を使用して、折り畳まれたすべての行を結合します。
  2. コマンドを実行し:sortます。
  3. 特殊区切り文字の範囲を結合解除します。

エラー処理と特殊なケースがあるため、実際にはかなりの実装作業が必要です。私はここで試みました: https://gist.github.com/4145501

于 2012-11-25T19:24:43.647 に答える
1

Vim マクロの機能を使用します。

ファイル内にレコード以外に譜表がなく、最初のレコードが最初の行から始まるとします。また、レベル 1 の開始と終了が同じ行にないこと。そして、すべての {} がよく一致します。

最初のエントリに移動し、マクロを記録して a を登録します ( qa- 記録の開始q- 停止)

/{^MV%k:s/\n/EEEEEE/^Mj^

私のものをコピーするか、自分で記録してください: (^M - 文字入力を表します)

  • /{^M 次を検索 {
  • V%k は、レベル 1 の終わりまでラインバイスを選択しますが、}}} の終了行は選択しません
  • :s/\n/EEEEEE/^M シンボル「行末」を選択範囲内の一意の文字列に変更します
  • j^ 前のレコードの先頭にスペースがある場合は、1 行下に移動して行頭に移動します。

2 行目からマクロを実行します (最初の行は、マクロを記録したときに既に処理されていると仮定します)。通常モードでは、100000@a - レコードの数よりも大きい任意の数を使用します。最初のレコードがファイルの最初の行にある場合、マクロはすべての行が処理されると停止します。副作用として、最初の行が視覚的に選択されます-選択解除されます。

ファイルを並べ替える

:sort

行末を復元: :%s/EEEEEE/^M/g

注 ^M は文字どおりの入力である必要があります。入力するには、Ctrl-V Enter を使用します。

% は一致する終了 } にジャンプするため、ネストされたレベルで機能します。そのため、すべての {} を適切に一致させることが重要です。

kマクロは、最初の行に最初のレコードが必要な理由で、上がれなかったときに停止します。空行またはレコード間のレコードではないものは、マクロによって無視されます。

上記の方法は、ファイルに対してうまく機能するはずです。折り畳みでより一般的なアプローチが必要な場合は、/{ と % の代わりにマクロで次のコマンドを使用します。

最初にすべての折り目を開きます

zj - 次の開いている折り畳みの先頭に移動します

]z - 現在の折り畳みの最後に移動します。

残りのマクロは同じです。この方法はより一般的ですが、開いているすべての折り畳み、折り畳みの有効化などに依存するため、信頼性が低いことがわかりました。

于 2012-11-25T19:56:13.777 に答える
1

1 つのアプローチは次のようになります。

  1. レベル 1 の折り畳みがそれぞれ 1 行になるように、行末を検索して置き換えます (つまり、行末を、ファイルのどこにも現れない固有の文字列に置き換えます)。

  2. :sort通常どおり、ファイル内の行をソートするために使用します。

  3. ステップ 1 の検索と置換を逆にして、行末を再導入します。

これはすべて Vim マクロとして記録できます。

ステップ 1 と 3 は、折り畳みがネストされていない場合、またはトップレベルの折り畳みとネストされた折り畳みを区別する簡単な方法があれば (たとえば、レベル 1 の {{{ と }}} 行が左揃えで、他のものには先行スペースがあります)。そうでない場合でも、おそらく可能ですが、はるかに困難です。

于 2012-11-25T19:50:56.363 に答える
0

このために特別に作成されたように見えるvim-sort-foldsプラグインがあります。

于 2019-10-25T15:26:54.867 に答える