次のコマンドを試すことができます。
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
最初に変数c
(let c=0
)を初期化し、次にg
パターン^*
(行の先頭にアスタリスクとスペースが続く)を探すグローバルコマンドを実行します。
このパターンを含む行が見つかると、グローバルコマンドはコマンドを実行し
let c+=1 | s//\=c.'. '
ます。変数c
(let c+=1
)をインクリメントし、次に(|
)s
前の検索パターン(//
)を式の評価に置き換えます(\=
):連結された
変数の内容c
(.
)文字列付き'. '
バッファーのすべての行を変更するのではなく、特定の段落のみを変更する場合は、グローバルコマンドに範囲を渡すことができます。たとえば、番号が5〜10の行のみを変更するには:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
変換したいいくつかの同様のリストを含むファイルがある場合、たとえば次のようになります:
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
some other random stuff some other random stuff
==>
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
* qux 4. qux
some other random stuff some other random stuff
次のコマンドで実行できます。
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
これは前のコマンドの単なる変形であり、c
別のリストに切り替えると変数をリセットします。別のリストにいるかどうかを検出するには、変数d
を使用して、置換が行われた最後の行の番号を格納します。
globalコマンドは、現在の行番号(line('.')
)とを比較しd+1
ます。それらが同じである場合、前と同じリストにあることを意味するためc
、インクリメント(c+1
)、そうでない場合は異なるリストにあることを意味するためc
、リセット(1
)します。
関数内では、コマンドlet [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
を次のように書き換えることができます。
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
またはこのように:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
キーストロークを保存するために:NumberedLists
、デフォルト値が1,$
(-range=%
)である範囲を受け入れるカスタムコマンドを定義することもできます。
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
ときは:NumberedLists
実行され、<line1>
そして<line2>
自動的にあなたが使用範囲に置き換えられます。
したがって、バッファ内のすべてのリストを変換するには、次のように入力します。 :NumberedLists
10行目と20行目の間のリストのみ: :10,20NumberedLists
視覚的な選択のみ: :'<,'>NumberedLists
詳細については、以下を参照してください。
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command