Vimの各ブロックの最初の行でテキストの複数のブロックを並べ替える方法を教えてください。


11

テキストの複数のブロック、つまり、次のような複数の関数があります。

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

関数を関数シグネチャでアルファベット順に並べ替えたい。Vimでこれを最も簡単に行うにはどうすればよいですか?


関数のシグネチャで何を意味するかを定義してください。これらはどのような機能ですか?また、OS、ディストリビューション、およびバージョン番号の下で作業しているプラ​​ットフォームは、非常に役立ちます。
mdpc 2014年

1
これはなぜVIMで行わなければならないのですか?これらの種類のものを簡単に組み合わせることができる優れた組み込みのUNIX / Linuxユーティリティがあります.... awkが思い浮かびます。
mdpc 2014年

@mdpc:関数のシグネチャとは、を含む行を意味しdef ...ます。私はLinuxを使用しているので、これらのユーティリティはどれでも機能します。
Hubro 2014年

回答:


12

比較的シンプルです(そして、ジェイソンが考えていたものに近いと思います)。

  1. すべての改行をいくつかの派手な文字に置き換えることにより、すべての関数を1つのライナーに変えます。

    :g/def/,/end/s/\n/§
    
  2. これらの1つのライナーを次のように並べ替えます。

    :%sort
    
  3. すべての機能を初期の個々の状態に拡張します。

    :g/def/s/§/\r
    

1
同様に、空白行を一意のセパレータと見なすことができる場合は:g/./,/^$/-s/\n/§/g:%sorts/§/\r/g
、、

3

AdvancedSortersプラグインを作成して、@ romainlの回答で与えられた3つの個別のステップを1つのコマンドに簡略化しました。

:SortRangesByRange /^def\>/,/^end\>\_s*\zs$/

ここのパターンはやや複雑で、分離する空の行も適切に含まれています。


注:現在、そのためのかなり新しいVim 7.4.218が必要です。古いVimバージョンもサポートするアップデートを間もなく提供します。
Ingo Karkat 2014年

2

定義を解析する関数を記述せずにこれを行うと考えられる最良の方法は、前に付いていない行区切り文字endを別の一意の区切り文字(+ EOL +?)に:sort置き換えてから、行区切り文字を再代入することです。おそらくマクロに記録できます。

ただし、ビジュアル選択を使用する場合は、関数の方が優れている場合があります。


2

vissortプラグインを試してください。それはブロック分類機能をサポートします:

  • : '<'> BS nextblock endblock findtag tagpat tagsub
  • :[range] call BlockSort(nextblock、endblock、findtag、tagpat、tagsub)

不足している引数がある場合、BlockSort()はそれらを照会します。nextblock / endblockパターンはブロックを区切ります。findtagパターンは、ソートに使用される「タグ」を含む行を見つけるために使用されます。tagpatとtabsubは、タグを含む行からソートタグを抽出するために代わりに使用されます。

vissort.vimはhttp://www.drchip.org/astronaut/vim/index.html#VISSORTから入手できます。

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