2008-12-23
■[emacs][ruby]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}
C-u M-! ruby -e '(1..3).each{|i| printf "(%d)\n", i}'
この場合は seq + printf が一番簡単なようだ。
他にもレジスタをインクリメントする方法もあるけど、レジスタの使い勝手がいまいちだからなぁ…
(a)〜(c)を入力する
(a) (b) (c)
M-: (loop for i from ?a to ?c do (insert(format "(%c)\n" i)))
seqコマンドは英字の連番には対応していないので使えない。残念。
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
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)))
その他の方法は瞬時には思い付かない。
トラックバック - http://d.hatena.ne.jp/rubikitch/20081223/seq
リンク元
- 145 http://d.hatena.ne.jp/
- 60 http://reader.livedoor.com/reader/
- 33 http://b.hatena.ne.jp/hotentry/it
- 22 http://www.rubyist.net/~kazu/samidare/
- 19 http://www.google.com/reader/view/
- 17 http://b.hatena.ne.jp/
- 17 http://b.hatena.ne.jp/entrylist
- 10 http://fastladder.com/reader/
- 10 http://www.google.co.jp/reader/view/
- 8 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&rls=org.mozilla:ja:official&q=rush+ruby&btnG=検索&lr=lang_ja
