このところ、「Emacsテクニック・バイブル」の本を読んでました。この本はひとことで言って、Emacsの設定集です。標準機能と、非標準機能の両方について、これでもか!というぐらいの便利設定が満載されています。
言わずと知れたエディタの中のエディタにして、エディタの定義の範疇を越える歴史的エディタの一つであるところのEmacs(GNU Emacs)ですが、私が使いはじめたころ(20ウン年まえ)と比べて、根本は変っていないのですが、大きくその機能が拡張されてきています。
今ではどうかわからないですが、理系の大学では、研究室とかに入るとEmacs(とあとTeX)が伝統として教え伝えられているものですよね。
この本をお勧めしたいのは、大学時代など結構な昔にEmacsを使いはじめ(させられ)て、ある程度使いこんでいたものの、ここ数年〜10数年は新機能のインストールやチェックを怠って来た人です。具体的には、Emacs 22と23の違いはよくわからないぐらいな人。手がEmacsになってしまってはいるけれども、追っ掛けはしてらんなかったという人。
基本的な使い方についても要点を押えて書いてありますが、Emacsそのものの入門本ではありませんので、Emacsを初めて使う人向けではないでしょう。cmigemoとかskkとかの設定はある程度スキルは必要でしょう。
あ、でもEmacs Lispの知識はこの本の設定を試す範囲では(たぶん)不要です。
私は、基本的にはEmacs派でして、anything,org-modeとかmigemoとか名前は知っていたのですが、何しろEmacsですので、設定とかインストールとかが面倒でした。一個一個やれなくはないのですが、ネットであつめる情報は、ほんとに正しいのか良くわからないし、だんだん.emacsが複雑怪奇化陳腐化していくし、正直全部試すのは辛すぎます。この本を買えば、現時点でおすすめの設定集が手に入るわけです。ちなみに著者のるびきち氏(ブログ)はanythingの現時点での開発者です。
私はこの本を、毎日の通勤電車で読んでおり、「おお!この設定や機能はいい!」と思ったところには、ページに折り目をつけていたのですが、2ー3ページごとに折り目がつくことになりました。以下、ちょっとわかりにくいですが写真です。いや本当に安いわ。
私とEmacsの付き合いもそろそろ20年とかを結構越えてきているわけですが、まあ一生使い続けるんだろうな、という覚悟を決めさせてくれた本です。
内容として具体的に気に入っているのは、
- org-mode全般
- anithing
- bm-*
- ヒストリの保存やrecentf
- open-junk-file
- color-moccur,moccur-edit
- point-undo
- migemo
- yasnippet
- text-translator
- uniquify
- ffap
- sequential-command
らへんです。おすすめ。
あと、前後して出ていた、WEB+DB PRESS Vol.58の記事「思考を直感的にコード化し,開発を加速するEmacs活用∞(無限大)」も、併せて読みたいです(著者の方のブログ)。内容的にはバイブル本とかぶるところもありますが、さらなるエッセンスとして抽出されています。確かcmigemoのインストールはこちらを見てやりました。
P.S. 勢いに乗って、今、SKKにチャレンジ中ですが、これは万人向けではないな…。この記事もSKKで書いています。
P.P.S. 要望としていうと、書籍中の設定のマシンリーダブルな設定ファイルがどこかからダウンロードできると良かったなぁ。まあ設定ファイル書くだけでは済まないところも当然多いのですが。
P.P.P.S.
sequential-commandで、「カーソル前の単語をupcase/downcase/capitalize」の設定は合理的で良いんだけれど、単語の途中で M-c してキャメルケース名を作りたいときにうまくいかないので、以下のように設定してみました。数引数をつけると今までどおりの動作になります(代償として、n単語をupcase/downcase/capitalizeすることはできなくなります)。
(when (require 'sequential-command-config) (sequential-command-setup-keys) (defun seq-upcase-backward-word-1 (arg) (interactive "p") (if (not (= arg 1)) (upcase-word 1) (seq-upcase-backward-word))) (defun seq-capitalize-backward-word-1 (arg) (interactive "p") (if (not (= arg 1)) (capitalize-word 1) (seq-capitalize-backward-word))) (defun seq-downcase-backward-word-1 (arg) (interactive "p") (if (not (= arg 1)) (downcase-word 1) (seq-downcase-backward-word))) (global-set-key "\M-u" 'seq-upcase-backward-word-1) (global-set-key "\M-c" 'seq-capitalize-backward-word-1) (global-set-key "\M-l" 'seq-downcase-backward-word-1) )