39

#include多くの場合、ソース ファイルとヘッダー ファイルの先頭にあるすべての を長さで並べ替えたいだけです。

vimと同様の方法で英数字順に並べ替えることができます:{range} sort u

ではvim、行の長さによって行の範囲をどのように並べ替えますか? 短い行の後に長い行が続くようにします。

インターネットで検索したところ、次のようなものを見つけました。

:% s/.*/\=printf("%03d", len(submatch(0)))."|".submatch(0)/ | sor n | %s/..../

しかし、それはファイル全体をソートするためにのみ機能し、とにかく私にとって黒魔術です. :4,18 s/...Do you have any idea? のように、4 行目から 18 行目までの範囲で同じ並べ替えを行う方法を見つけようとしています。

4

3 に答える 3

37

Awk を使用してビジュアル選択をフィルタリングする

vim でこれを行う 1 つの方法は、並べ替えの前に awk の length() 関数を使用して視覚的な選択をフィルタリングすることです。例えば:

:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\  -f2-" }'
于 2012-07-17T22:35:15.787 に答える
7

エレガントでも効率的でもありませんが、うまくいきます:

次の関数をファイルに追加しvimrcます。各行の先頭にその文字数を挿入し、それらを数値順に並べ替え、数字を削除します。

function! SortLines() range
    execute a:firstline . "," . a:lastline . 's/^\(.*\)$/\=strdisplaywidth( submatch(0) ) . " " . submatch(0)/'
    execute a:firstline . "," . a:lastline . 'sort n'
    execute a:firstline . "," . a:lastline . 's/^\d\+\s//'
endfunction

次のように、一連の番号で呼び出します

:4,18call SortLines()

または、次のように を使用してビジュアル モードVで:

:'<,'>call SortLines()

編集:Ops、今、私はこの解決策があなたのものと非常に似ていることに気付きました. それは問題ありませんでしたが、それは%代わりに完全なバッファを意味する:4,18:'<,:'>、特定の行を選択することを意味します。

于 2012-07-17T22:19:53.193 に答える