最適な選択は非常変換の実際の状況 に依存...常にあります。 実装に影響を与える少なくとも2点のバリエーションがあります。
上で動作する行がファイル内の唯一のものであるかどうか?そうでない場合、 は、文脈によって規定される線の範囲である(すなわち、それは段落のように、ブランク 行により分離)、またはそれは任意であり、 ユーザによって指定されなければなりませんか?
それらのラインが既に変更またはタクト内の行のテキストを残し、新しいものを挿入することが必要である しなければならない数字が含まれていますか?
たちは柔軟なソリューションを構築 にしようと下に、これらの質問に答えるための情報がないので。
一般的な解決策は、ユーザによって指定された範囲内の行 の始まりで動作置換です。ビジュアルモードでは、おそらくラインの任意の範囲を選択する最も簡単な方法 あるので、我々は 範囲の境界が視覚的に選択することによって定義されていることを、ここで想定しています。バッファ内のすべての行に番号を付ける必要がある場合は、次のよう
:'<,'>s/^\d\+/\=line(".")-line("''")+1/
、コマンドが を簡素化することができます。
いずれの場合においても
:%s/^\d\+/\=line('.')/
、数は単に(既に存在するものを変更することなく) 行の始まりに挿入する必要がある場合、一方が^\d\+
から^
に パターンを変更し、必要に応じて追加することができセパレータ:
:'<,'>s/^\d\+/\=(line(".")-line("''")+1).' '/
又は
:%s/^/\=line('.').' '/
それぞれ。
コマンドラインツールを使用したソリューションの場合は、Sedのようなストリーム や、AWKなどのテキスト抽出およびレポートツールを使用することを検討できます。
、セッドを使用して、ファイル内の各行に番号をAWKで同じことを行うためには、コマンド
$ sed = filename | sed 'N;s/\n/ /'
を実行し、コマンドに
簡単modfiedすることができ
$ awk '{print NR " " $0}' filename
を使用するには特定の条件を満たす行の特定の範囲に番号を付けることを制限してください。 たとえば、次のコマンドは、 行を2〜8行に番号付けします。 質問文の中でリンクされたスクリプトからのもののようなコマンドをどのように興味を持っ
$ awk '{print (2<=NR && NR<=8 ? ++n " " : "") $0}' filename
1が 参考に、次のコマンドを使用することができ、実装されています。
vnoremap <leader>i :call EnumVisualBlock()<cr>
function! EnumVisualBlock() range
if visualmode() != "\<c-v>"
return
endif
let [l, r] = [virtcol("'<"), virtcol("'>")]
let [l, r] = [min([l, r]), max([l, r])]
let start = matchstr(getline("'<"), '^\d\+', col("'<")-1)
let off = start - line("'<")
let w = max(map([start, line("'>") + off], 'len("".v:val)'))
exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./'.
\ '\=printf("%'.w.'d",line(".")+off).repeat(" ",r-l+1-w)'
endfunction
答えは、操作の範囲によって異なります。この列は唯一のコンテンツであるかどうかファイルで?それとも、段落か、任意の範囲の行ですか?また、これらの行には元々いくつかの数字(上記の例では '1'など)または追加のテキスト(またはその両方)が含まれていますか?番号を挿入するか既存のものを変更する必要がありますか? –
回答が解決する必要があるタスクを正確に記述してください。どのような具体的な要件がありますか?リンクされたスクリプト(またはその機能の特定の部分、それを指定する)を最初から再実装することをお勧めしますか? –
私が提案した関数は、参照スクリプトの動作(列方向のビジュアル選択の使用を含む)に従います。なぜならあなたはどんな振る舞いを正式に*定式化することを拒否しているからですか? –