3

VIM を使用して 500 個の個別のファイルを操作し、値の 1 つを一意にしました。それは完全なクラッジなので、貼り付けません:)

1 つの要素を一意にすると、500 レコードが空白行で区切られた 1 つのファイルができます。

行 1 をマークし、空白を見つけて前の行をマークし、@b を 1 ずつ増やしてそのブロックをファイルに書き込むマクロを記録しました。

ファイルの書き込み中に @a をインクリメントする方法がわからなかったため、貼り付けてインクリメントし、 @a にヤンクします。

   "ap0:let @a="""^MAywdd

これはすべて正常に機能しましたが、7 つの数字ごとにインクリメント コマンドが 3 つスキップするため、XML0001.xml から XML0500.XML への代わりに、XML001.xml から XML0763.xml などを取得します。

8 回目の呼び出しごとに 3 つの数字がスキップされるのはなぜですか?

ファイル名が一意である限り、番号が付けられているかどうかは関係ありませんが、最終的には出力名を @b の値と一致させる必要があるので、私はただ興味があります。

編集 0 から 9 のレジスターがトラックを失うことに関係があると思いますか?

@a を挿入モードでインクリメントする方法はありますか

    :'a,'b w XML"Increment @A".xml 
4

1 に答える 1

4

増加の謎

数字の前に が付け0られているため、Vim はそれらを8 進数と見なすため、インクリメント (と思われます) は からに<C-a>ジャンプします。これを修正するには、その (今日ではかなりあいまいな) 数値形式を削除できます。0710

:set nrformats-=octal

レジスタを直接インクリメントする

レジスターに数字だけが含まれている場合は、次のことができます。

:let @a = @a + 1

(注:+=レジスタは文字列型であるため、機能しません。)

レジスタに完全なファイル名が含まれている場合は:help sub-replace-expression、最初の番号を一致させてインクリメントするために使用する必要があります。

:let @a = substitute(@a, '\d\+', '\=submatch(0) + 1', '')

プラグインのおすすめ

私のEditSimilar プラグインは、存在しないオフセットを検索し、それに (バッファーの一部) を書き込むコマンドを提供します。

:file XML0000.xml   " Name the original buffer
:9999WritePlus      " Writes XML0001.xml, XML0002.xml, etc.
于 2014-06-20T06:49:04.193 に答える