Emacsで連番を挿入する方法

連番テキストを生成する機会というのはけっこうあると思う。Emacsにおいて連番を入力する方法を考える。シェルコマンドを使う方法は他のエディタにも応用できる。

ここでは3つの連番だが、多くなっても対応できる方法を挙げる。

(1)〜(3)を入力する

(1)
(2)
(3)

(require 'cl)した状態でloopマクロを使う。loopマクロはいろいろなループを表現する強力なLispマクロだ。書式が複雑化しても対応できる。

M-: (loop for i from 1 to 3 do (insert (format "(%d)\n" i)))

シェルコマンドのseqコマンドとprintfコマンドを使う。seqコマンドで1〜3を各行に出力する。printfコマンドで引数を多く与えた場合は書式文字列が再利用される性質を利用している。zshの場合は後者も使える。

C-u M-! printf '(%d)\n' `seq 3`
C-u M-! printf '(%d)\n' {1..3}

Rubyワンライナーを使う。

C-u M-! ruby -e '(1..3).each{|i| printf "(%d)\n", i}'

この場合は seq + printf が一番簡単なようだ。

他にもレジスタをインクリメントする方法もあるけど、レジスタの使い勝手がいまいちだからなぁ…

(a)〜(c)を入力する

(a)
(b)
(c)

loopマクロを使う。「?a」は文字リテラルで数値である。

M-: (loop for i from ?a to ?c do (insert(format "(%c)\n" i)))

seqコマンドは英字の連番には対応していないので使えない。残念。

Rubyワンライナーを使う。

C-u M-! ruby -e '("a".."c").each{|i| printf "(%s)\n", i}'

独立したループ変数が複数個ある場合。

a-1
b-1
c-1
a-2
b-2
c-2
a-3
b-3
c-3

loopマクロをネストする。

M-: (loop for i from 1 to 3 do (loop for j from ?a to ?c do (insert (format "%c-%d\n" j i))))

Rubyでも。

C-u M-! ruby -e '(1..3).each{|i|("a".."c").each{|j| printf "%s-%d\n",j,i}}'

このテの処理を多用するRubyistは、Rubyワンライナーの出力結果を挿入するEmacs Lispでも書けばいいと思う。

複数個のループ変数が連動して変動する場合

a-1
b-2
c-3

やっぱloopがつえええ。

M-: (loop for i from 1 to 3 for j from ?a to ?c do (insert (format "%c-%d\n" j i)))

その他の方法は瞬時には思い付かない。