Vim, CTRL-A, 番号付き箇条書きを作成する


悩み

以下のような行ごとに数字が増えていくものを書く場面があるかと思います.

No.1
No.2
No.3
No.4
No.5
No.6

やり方

やり方は大きく分けて2つあり、{Visual}g [count] CTRL-Aを使うものとregisterCTRL-Aを組み合わせるものがあります.

{Visual} [count] g CTRL-Aを使うもの

1,以下のように必要な行数分用意し、

No.1
No.1
No.1
No.1
No.1
No.1

2, visualモードで二行目以下を選択し、g CTRL-Aとするとそれぞれの行が
インクリメントされます。 今回のように[count]を省略した場合はcountは1となり1ずつインクリメントされます。

No.1
No.2
No.3
No.4
No.5
No.6

registerCTRL-Aを組み合わせるもの

1, 一行目を用意します.

No.1

2, qaをする.register 'a'の記録を開始する.
3, Yで行をyank
4, pで下の行にput

No.1
No.1

5, CTRL-A, 追加した行の数字をインクリメント.

No.1
No.2

6, qregisterの記録を終了.
7, <count>@a<count>の回数register 'a'を実行する.今回の場合は4.

No.1
No.2
No.3
No.4
No.5
No.6

もう少し詳しく

CTRL-A(CTRL-X)は[count]をカーソル以降のnumber or alphabetic characterに足す
挙動のようです。
alphabetic characterに足すってどういうことや」
って感じですが、a->b, y -> zという風に次のアルファベットになるようです。
このあたりのどの文字列がCTRL-Aの対象かみたいな設定はnrformatsにあり、
デフォルトではbin,octal,hexでアルファベットalphaは入っていないようです。
アルファベットを設定に加える際は
:set nrformats+=alphaとします。
nrformatsCTRL-Aコマンドが数値として扱う基数を定義している変数のようです。

また, デフォルトでoctalが入っているため、0から始まる箇条書きなどを作成しようとする場合は

No.001
No.002
...
No.007
No.010

上記のように007010へと8進数表記のインクリメントがされるので、そういう際は
:set nrformats-=octal
とすると良いです。

options.txt
							*'nrformats'* *'nf'*
'nrformats' 'nf'	string	(default "bin,octal,hex",
					   set to "bin,hex" in |defaults.vim|)
			local to buffer
	This defines what bases Vim will consider for numbers when using the
	CTRL-A and CTRL-X commands for adding to and subtracting from a number
	respectively; see |CTRL-A| for more info on these commands.
	alpha	If included, single alphabetical characters will be
		incremented or decremented.  This is useful for a list with a
		letter index a), b), etc.		*octal-nrformats*
	octal	If included, numbers that start with a zero will be considered
		to be octal.  Example: Using CTRL-A on "007" results in "010".
	hex	If included, numbers starting with "0x" or "0X" will be
		considered to be hexadecimal.  Example: Using CTRL-X on
		"0x100" results in "0x0ff".
	bin	If included, numbers starting with "0b" or "0B" will be
		considered to be binary.  Example: Using CTRL-X on
		"0b1000" subtracts one, resulting in "0b0111".
	Numbers which simply begin with a digit in the range 1-9 are always
	considered decimal.  This also happens for numbers that are not
	recognized as octal or hex.