67

vi または Vim で数列を生成する方法はありますか?

たとえば、Vim で開いたファイル の行i  から j (ここでi  <  j ) の任意の範囲について、行iの番号 1 から番号 ( j  − <em >i + 1) 行 j ?

ファイルに次の行があるとします。

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

4 行目から 8 行目までの数列の前に 1 から 5 の数字を付けたいと思います。操作後、結果のファイルは次のようになります。

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

これが可能な場合、生成されたシーケンスに異なるステップ サイズを使用する方法はありますか? たとえば、結果のシーケンスが 2、4、6、8 などになるように、代わりにステップ サイズに 2 を使用できますか?

注:「<a href="https://stackoverflow.com/questions/252766/add-line-numbers-in-vim">Vim の行の範囲に行番号を追加する方法は?」という質問 同様の問題が発生しますが、同じではありません。

4

10 に答える 10

61

(Shift-v) で複数の行を選択しV、次のコマンドを入力します。

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

:help sub-replace-expression詳細を読むために入力してください。

于 2012-03-28T08:29:32.887 に答える
31

複雑な構成の代わりにCTRL-a、先頭の数値をインクリメントする関数でマクロを使用するだけです。サンプルデータ:

aaa
bbb
ccc

最初に開始番号とスペースを挿入します:

1 aaa
bbb
ccc

次に、このマクロを 1 行目に記録します (押す<C-a>ことを意味します):CTRL-a

qq0yf 0j0P0<C-a>q

説明:

  1. qq: マクロをレジスタに記録するq
  2. 0: 最初の列に移動します。
  3. yf: 最初のスペースまで、最初のスペースを含むすべてをヤンクします (最初の行には1と スペースがあることに注意してください)。
  4. 0jP: 下に移動して、行の先頭にパターンを貼り付けます。
  5. 0<C-a>: 最初の列に移動し、番号を 1 つ増やします。
  6. q: マクロの記録を終了します。

これは与える:

1 aaa
2 bbb
ccc

これで、必要なだけこのマクロを適用できます@q。2 つ増やす必要がある場合は、CTRL-aCTRL-a1 回だけではなく使用してください。これで、このマクロを連続する行に適用できます。たとえば、次のようになります。

:.,$norm @q

ファイルの残りの先頭行番号を追加します。

于 2012-03-28T08:32:39.247 に答える
11
:4,8s/^/\=line(".")-3." "    

あなたが望むことをします

count = 2が必要な場合:

:4,8s/^/\=2*(line(".")-3)." " 

これはあなたに2,4,6,8,10を与えるでしょう

私の例では、行番号はハードコーディングされています。Vを使用して、変更する行を選択できます。

于 2012-03-28T08:36:29.040 に答える
5

これは汚いトリックですが、人生はこれらで構成されています。:)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

クロスプラットフォームではありません。

于 2012-03-28T08:29:36.013 に答える
2

ビジュアルモードで目的の行を選択し、Ex コマンドを実行します

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
于 2012-03-28T08:28:07.653 に答える
1

Nexuss1プラグインは Series タイプと、次のように使用されるそのタイプのオブジェクト を提供します。

:4,8s/^/\=s1.next().' '/

Nexus には、最初の結果s0として 0 を返す Series オブジェクトも付属しています。.next()と の両方で1 ステップの増分s0を使用します。s1すべての Series オブジェクトには.reset()、初期化された値に戻すメソッドがあります。新しい Series オブジェクトは、次の呼び出しのように作成できます。

let s2 = Series(0, 2)

これにより、2 番目の要求を満たす 2 ステップのオブジェクトが作成されます (生成: 2、4、6、8 など)。

于 2012-03-28T11:31:20.630 に答える
-1

柔軟性は劣りますが覚えやすい方法は、Renumber.vim http://www.vim.org/scripts/script.php?script_id=189のような再番号付けプラグインを使用することです。

OPのようにまだ数字がない場合は、その場所に数字を挿入する必要があります。Renumber は実際の順序付けを処理でき、最初の番号だけに基づいてそれを行います。

この例では<C-v>、番号を付けたいすべての行に開始番号を挿入するために使用しています。

4G<C-v>4jGI1 <Esc>gv:Renumber

2 ステップを使用するには

:Renumber s2

于 2012-03-28T10:08:06.397 に答える