このようなテキストファイルがあります(WindowsでgVimを使用)
foo bar baz quux corge grault garply waldo fred plugh [...150 more lines...] xyzzy thud
ファイルの各行に番号を追加したいと思います。 :set number
を使用しませんが、次のように各行の前にテキストとして番号を追加するため、番号はファイルの一部になります。
1. foo bar baz quux 2. corge grault garply 3. waldo fred plugh [...~150 more lines...] 155. xyzzy thud
コメント
Windowsで一般的に利用可能です(OPがawk
に関するコメントから示しているように)。上位2つのソリューションは純粋なVimです。最後に、すべての行と1つのパラは、範囲の選択の問題です。明らかに大きな問題ではありません。
回答
純粋なVim形式:
:%s/^/\=line(".").". "
説明:
:%s/^/ " the substitution will be applied to the beginning of every line \= " the rest of the replacement part is an expression line(".").". " " the expression returns the current line number concatenated with a dot and a space
:help \=
および:help line()
。
置換パーツで式を使用することは非常に強力であり、FWIWはvimscriptへの非常に良いエントリポイントです。
コメント
- この非常に便利なコマンドをvimrcのキーマップに追加するにはどうすればよいですか?
- 置換のためにvimヘルプトピックにアクセスするには:
:help sub-replace-expression
回答
Vimマクロの優れた点の1つは、再帰できることです(自分で呼び出すことができます)。 ):
- レジスタqをクリアします:
qqq
- 最初の行に番号を追加します:
ggI1.
(スペースを忘れないでください!) - 行の先頭に戻り、マクロの記録を開始します:
0qq
- 番号をコピーします:
- 行を下に移動して番号を貼り付けます:
+P
- 行の先頭に戻ります数値をインクリメントします:
0<c-a>
- 行の先頭に戻ります(2桁になってもマクロが壊れないようにします):
0
- マクロを1回呼び出して、再帰的にします。この時点では、レジスタqにはまだ何もないため、何も起こりません:
@q
。 - マクロを保存します:
q
- もう一度マクロを呼び出して、火花が飛ぶのを見てください!:
@@
マクロは次に、ファイルの最後に到達するまで自分自身を呼び出し続けます。
再帰マクロトリックは他の多くの同様の問題に使用できるため、「注意するのがよいでしょう。
何らかの理由で再帰マクロを使用したくない場合は、手順1と8を省略し、 count を使用してマクロを複数回実行できます。 100@q
はマクロq
を100回実行します。
コメント
- 強力なもの、私はあなたの習得に頭を下げます。マクロは私にとって黒魔術のようなものです…
- @ropata、マクロは(ほとんど)通常モードのコマンドのシーケンスにすぎません。
- @romainl私はそれを’はキーストロークのシーケンスと考える方がよいでしょう。
- @ Rich、exコマンドを含む多くのシーケンスである可能性があります。
- @romainlはい、それが’それがキーストロークと考えるのが最善だと思う理由です’。キーボードで入力した内容(言うまでもなく、exコマンドを含む)を、すべて手動で入力したかのように正確に再生します。
回答
vimグローバルコマンドを使用してこのようなタスクを実行するのが好きです。これは、行の先頭に反復を追加したり、テキスト内の記号を変更したりする場合に適用されます。他のソリューションよりも複雑に見えますが、手元にあるときに使用できる非常に柔軟なパターンであり、あまり考えなくても簡単に変更できます。
まず、範囲を選択します(これを適用したい)。私は通常マークを使用します(例:1行目にma
、2行目にmb
ですが、行番号や視覚的な選択を使用することもできます)、次のコマンド(現在、ユースケースに合わせて調整されています)
:let i=1|"a,"bg/^/s/^/\=i.". "/|let i=i+1
分解
:let i=1
これにより、変数i
に開始値が設定されます。通常、リストは1で始まるので、iを1に設定します。
|
バーが新しいコマンドを開始します
"a,"b
これは次のコマンドの範囲を設定します。マークa
からマークb
に移動します、リストの最初の行と最後の行に設定されます。
g/^/
これはグローバルコマンドです。ファイル(または範囲)で特定の正規表現を検索し、一致した各行で残りのコマンドラインを 実行します。 「行の始まり」を検索して、すべての行を照合します。
Item some txt other text Item second item whatever Item third
のようなテキストがあり、これらのラベルを
で他の行を無視し、代わりにg/Item/
またはg/^Item/
を実行します(文字通りのアイテムテキストを想定) )
s/^/\=i.". "/
これにより、正規表現が実行され、行の先頭がi
の値と連結されて置き換えられます。 a .
。通常、これは何に対しても実行できます(たとえば、ラベルItem
を番号に置き換えます)。
|let i=i+1
バーは新しいコマンドを開始しますが、グローバルが完了した後ではなく、グローバルコマンド内で実行する2番目のコマンドを設定します。結果として ここにもう1つの柔軟性の場所があります。iの変更は何でもかまいません(増分) 2で、フィボナッチ数列の次の要素を生成する関数を呼び出します。
回答
番号を追加するすべての行
:%!nl -ba
または :%!cat -n
コマンド。すべての行に行番号を追加します。
Windowsでは、 「Cygwin / MSYS / SUAをインストールする必要があります。
選択した行に番号を追加する
選択した行にのみ番号を追加するには、で番号を選択してください。ビジュアルモード( v とカーソル)、終了したら-次のコマンドを実行します::%!nl
(空白行を無視)または:%!cat -n
(空白行を含む)。
フォーマット
余分なスペースを削除するには、ビジュアルブロックでスペースを選択します( Ctrl + v )そしてそれらを削除します( x )。
いくつかの文字を追加するには(.
、:
、)番号の後に、ビジュアルブロック( Ctrl + v )で番号を選択し、文字( A )を追加します。 、文字を入力してから、 Esc で終了します。
コメント
- これは、指定されたものと同じフォーマットにはなりません。質問で。ただし、ソリューションのシンプルさが気に入っています。
- @KarlYngveLerv å gありがとうございます。回答に含めてください。
回答
:%s/^\(\d\+\. \)\?/\=line(".").". "
これは、行番号を追加するだけでなく、既存の行番号を置換します。途中で行を挿入した場合は、期待どおりにすべての番号が付け直されます。
これは、任意の番号の後に。と行の先頭のスペースを新しい番号に置き換えることで機能します。 。すでにこのパターンで始まる行がある場合、これは明らかに壊れます。考えて使用してください。
追加された部分:
-
^
-行の開始 -
\(
-新しいサブグループを開始 -
\d\+
-数字を1回以上一致させる -
\.
-ドットを一致させる(
.
)とスペース。
-
\)
-サブグループの終了 -
\?
-グループをオプションにして、この行にまだ番号がない場合でも以前と同じように機能するようにします。
ボーナスヒント:
行番号を削除するには、repalce部分を空にして同じパターンを使用できます:
:%s/^\(\d\+\. \)\?//
回答
I1. <esc>^qqyWjP^<C-a>q
これは最初の2行に番号を付け、@q
を使用して、後続の行に番号を付けます(またはexと入力します。 18@q
合計20行に番号を付ける場合)。
説明:
I1. <esc> Number the first line hqq Go back to the start of the line and start recording a macro yWjP Copy the line number to the next line ^<C-a> Increment the next line"s line number q Finish recording
これの利点は、外部コマンドを必要としないことです。これは、次の場合に役立ちます。たとえば、WindowsでVimを操作します。
コメント
-
1. <esc>h
と入力すると、最初の列ではなく、2番目の列。h
を0
に置き換えます。その後、ソリューションは非常に優れているはずです。 - @KarlYngveLerv å gおっと、それはタイプミスでした。ありがとう、修正しました。
- 問題ありません。ただし、まだ説明を更新していません。また、多くのキーボードでは、
^a -> â
のような組み合わせを入力できるようにするために、^
は2番目の文字を待ちます。私はまだその最善の解決策に同意しますが、これについても言及する必要があると思います。
回答
I選択した答えが最善だと思いますが、さまざまな点で、外部プログラムを使用して別の方法を提供します。
:%!cat -n
これにより、全体がフィルタリングされます。外部プログラムcat
を介したバッファ(%
で示される)。ここで、-n
flagは、入力の各行の前に行番号を付けます。
もちろん、これにはcat
がインストールされている必要があります。これは、(おそらく)すべてのUnixに当てはまります。 -likeシステム。
外部プログラムによるフィルタリングの詳細については、:help :range!
を確認してください。
コメント
回答
少しハックな解決策は次のようになります(<と>は、 Ctrl + v )を押した後に挿入されます:
:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd
分解
:%normal {commands}
範囲で指定された各行、この場合はすべての行で通常モードコマンドを実行します
:redir @"
exコマンドによって行われたすべての出力を名前のないバッファにリダイレクトします。
:.=
は、現在の行を出力するexコマンドです。数(残念ながら、前に改行があります)
:redir END
名前のないバッファへのリダイレクトを停止します
I<C-R>".<Tab><Esc>
名前のないバッファの内容を。で挿入します。タブを各行の前に移動し、挿入モードを終了します。
kdd
1行上に移動し、:の結果である改行を削除します。 =コマンド。
awk
はおそらくこの仕事のツールです。しかし、私は’ Windowsを使用しています(ため息)。永続的” otは、バッファが変更されること、および番号が変更されないことを示します’純粋に視覚的なもの(あなたと同じ)。 Windowsでgvimを指定する理由は、
cat
やnl
のような数直線を実行できるが