4

今のところ、私は次の.hファイルに次のものがあります:

#define ONE 
#define TWO
#define THREE
#define FOUR
..
.
#define FIFTY

を使用vi[m]して、マクロの置換テキストを次のように生成するにはどうすればよいですか。

#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
..
.
#define FIFTY 50

問題の説明:下限(1)、上限(50)、およびステップ(つまり、一度に1、2、または3ずつインクリメント)が与えられた場合-vi上記のマクロで値を自動的に生成するコマンドは何ですか?

更新:を使用するオプションはありませんenum

4

3 に答える 3

2

行選択 ( C-V) すべての行とタイプ

:r !awk '{print $0, NR}'
于 2013-02-01T08:41:41.700 に答える
2

まず第一に、これらの#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
于 2013-02-01T10:17:45.583 に答える