プログラミング マイブーム

Unixを使っている人たちはどのエディタを使うかで二つに分かれます。
vi派とemacs派です。
私の感じではvi派の方が多いように思います。
viはエディタとしてはシンプルですがかなり深いです。
私も長年使っていますが、全ての機能は使っていないと思います。
そしてemacs派はかなりマニアックな人が使っています。

私はエディタとしてはどちらも使っていましたが、emacsはエディタ以上の機能があります。
しかしemacs lispという取っ付きにくい言語が使えるようにならないと全ての機能にアクセスできません。
ほとんどの人がlispemacs嫌いになってしまいます。
設定ファイルまでlispで書かせるのでなんでエディタ使うだけでこんな言語覚えなければいけないのかと思うようです。
私は何でも変わったもの好きなのでいつかlispを書けるようになりたいと思っていました。
しかし、どの解説本もいまいちわかりにくく取っ付きにくかったです。
しかし「やさしいEmacs Lisp講座」という本はとても実践的でわかりやすかったです。
Emacs Lispの本というとリファレンス的なものかLisp言語にフォーカスしたものが多かったのですが、この本はemacsを拡張することにフォーカスしています。
なのでこういう機能がほしいなと思われるようなことを例にあげているのでイメージがしやすいですね。

ということではじめて簡単なlispプログラムを書いてみました。
箇条書きを簡単にするためのちょっとしたプログラムですが、動いたときはうれしかったですね。
文章を書いていると箇条書きで書くことが多いですが、いちいち自分で番号ふるのが面倒くさいので自動でふってくれるプログラムです。
こんな感じです。


; Utility function
(defun inc (linen)
(+ linen 1))

(defun dec (linen)
(- linen 1)
)

; list-numbering
(defun list-numbering (beg end)
(interactive "r")
(if (mark)
(save-excursion
( let *1 ; line number
(goto-char cur_pos)
(setq line_num (count-lines beg end))
(while (< (dec line_count) line_num)
(if (string= "\n" (char-to-string (char-after cur_pos)))
(progn
(setq cur_pos (inc cur_pos))
(goto-char cur_pos)
(setq line_count (inc line_count)))
(progn
(setq lnumber (inc lnumber))
(insert (format "%d " lnumber))
(setq line_count (inc line_count))
(goto-line line_count)
(move-to-column 0)
(setq cur_pos (point)))
))
(message "list-numbering: %d lines numbering" lnumber)
; (message "begin = %d end = %d" beg end)
)
)
)
nil
)

;list unnumbering
(defun list-unnumbering (beg end)
(interactive "r")
(if (mark)
(save-excursion
( let (
(count 0))
(narrow-to-region beg end)
(goto-char (point-min))
(while (re-search-forward "^[0-9]\s*" nil t)
(replace-match "")
(setq count (+ count 1))
)
(message "list-unnumbering: %d lines unnumbering" count)
)
)
)
nil
)

マークを設定してリージョンを作ってlist-numberingという関数を実行すると行の先頭に番号をふってくれます。
このプログラムのみそは空行は無視してくれることです。
list-unnumberingはつけた番号を消してくれる関数です。
まだそんなにわかっていないのでもっといい書き方があるかもしれません。
しかし、いままで壁だったemacs lispがわかるようになってきたのでなんか楽しいですね。
しばらくはemacs lispがマイブームになりそうです。

やさしいEmacs‐Lisp講座やさしいEmacs‐Lisp講座
広瀬 雄二

カットシステム 1999-01
売り上げランキング : 203323
おすすめ平均

Amazonで詳しく見る
by G-Tools

*1:cur_pos beg) (line_num 0) ; total line num in region (line_count 1) ; counter (lnumber 0