web-dev-qa-db-ja.com

vi-数列の生成方法

Vi(m)で数列を生成する方法はありますか?

たとえば、ファイル内のランダムな行(vimで開かれます)から、Row-i-と言います-iからRow-jに1から始まり、j-i + 1に始まり、ステップ増分が1になりますか?

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

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、10である必要があります。つまり、ステップカウントは2です。

ご注意ください:

この SO post は似ていますが、同じではありません。

41

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

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

タイプ:help sub-replace-expression続きを読む。

47
kev

複雑な構造の代わりに、単にマクロを使用して 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-a 一度だけではなくこれで、このマクロを連続した行に適用できます。次に例を示します。

:.,$norm @q

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

27
hochl

Vim 8.0で使用できます g Ctrl-a:help v_g_CTRL-Aを参照

4行目に移動して、 Ctrl-v 最初の文字をブロックごとに選択するには、4行で完了を押します Shift i0(これは 、 に続く Space)および Esc 挿入モードを終了します。

使用する gv 以前に選択した領域を再選択します。押す g Ctrl-a シーケンスを作成します。

ここで0で始まるので、再選択することができます gv1で開始する場合、最初の1を省略して、手動で再選択する必要があります。

使用する 2g Ctrl-a ステップ数2を使用します。


screen capture demonstrating how to generate a number sequence

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

あなたがしたいことをします

count = 2が必要な場合:

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

これにより、2,4,6,8,10が得られます

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

9
Kent

ビジュアルモードでターゲット行を選択し、Exコマンドを実行します

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
2
ib.

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

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

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

2
Noufal Ibrahim

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

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

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

let s2 = Series(0, 2)

2番目の要求を満たす2ステップのオブジェクトを作成します(収量:2、4、6、8 ...)

1
dahu

提案されたソリューションはすべて覚えるのが難しすぎると思います。一度使用すればよいのですが、使用するたびにすべての詳細を確認する必要があります(1日に1回程度しか使用しない場合)。

visual incrementing script はインストールと使用が本当に簡単だとわかりました。 vimにインストールしたら、0の列を生成し、Ctrl-Vでそれを選択してコマンド:Iを書くだけです。その後、各行で増加する数値が自動的に生成されます。他の機能もあります。

  • 0以外の数字で始まる
  • 左または右の0のパッド番号(001、...、015など)
  • 数字の増減
  • 1を超える増加
  • 日付(ただし、追加のプラグインが必要)、アルファベット文字、曜日名

これは、列0とは異なる位置でも機能するため、より一般的な問題を解決します。列はCtrl-Vで選択可能である必要があります。

プラグインのvimballは here または here です。

1
Gismo Ranas

(vimがPerlをサポートしている場合-多くのLinuxディストリビューションでデフォルト):ビジュアルモード(V)で行を選択し、実行します

:perldo s/^/++$z . " "/e
0
JJoao