まず第一に、これらの#define
行はすべて継続していると仮定します。つまり、間に空行や他の行はありません。たとえば、このケースは存在しません:
#define foo
#define bar
whatever
#define another
* この回答の最後に、このケースの解決策を追加しました *
次に、2 つの異なる状況が考えられます。最初の 1 つはより単純で、#define block
ファイルの先頭にあります。これは#define
、1 行目の 1 番目を意味します。
この場合、あなたはただすることができます
:%s/^#define.*/\=submatch(0)." ".line(".")/g
#define
各ステートメントの最後に行番号を追加するだけです。
もう 1 つの状況は、#define statement block
ファイルのどこかの真ん中に座っていることです。
このソリューションはより一般的で、最初のシナリオでも機能します。
マッピングを追加できます
:nnoremap <leader>do :let x=line(".")<cr>:%s/^#define.*/\=submatch(0)." ".(line(".")-x+1)/g<cr>
次に、カーソルを最初の#define
ステートメントに移動し、 を押し<leader>do
ます。これで作業が行われます。このように、手動で「1」を挿入する必要はなく、マクロを記録する必要もありません。
次のように機能します。
vimの外部コマンド(awk)
awk はテキスト処理の核兵器であり、この場合にも awk を使用するのは良い方法です。たとえば、これらの分離された #define ステートメントを処理できます。ファイルは次のようになります。
/*
comments
*/
#define ONE
//comment
#define TWO
//empty lines
#define THREE
#define FOUR
あなたがvimタイプの場合:
:%!awk '/^\#define/{$0= $0" "++x}1'
ファイルは次のようになります。
/*
comments
*/
#define ONE 1
//comment
#define TWO 2
//empty lines
#define THREE 3
#define FOUR 4