実録!org-modeをパソコン初心者に使わせて感激させたぜ


おひさしぶりです。

急に冷え込んできましたが、風邪
などには気をつけてくださいね。

今日は、実話を通して我々技術者にとって「価値を
提供する」とはどういうことかについて書きます。

どうしても見落してしまいがちな視点
なので、しっかり読んでください。


僕はパソコン初級者Rさんとスカイプをしていました。

Rさんは、もちろんEmacs使いではなくて、健気にもメモ帳
で3000行ものテキストを苦しんで作成していました。

Rさんは、

「あまりに長すぎてまとまってないな」

と言いました。

僕はテキスト処理のエキスパートとして長年ス
キルを磨いているので、これは目次をつけて箇
条書きにすれば見やすくなると提案しました。

ふつうのテキストファイルを箇条書き
にして目次をつくるといえば、Emacs
ユーザならばおなじみのorg-modeです。

C-c C-e Aでorg-modeのバッファを目
次つきテキストに落としてくれます。

なので、僕はRさんにこう言いました。

「Rさん、これから僕の言う通
りの書式で編集してください。

目次にする項目においては、行頭を半角のア
スタリスクとスペースで始め、その後に箇条
書きの項目を書いて僕にメールしてください。

全角にならないように気をつけてくださいね。

あとは僕が一瞬で目次を作成します。」

Rさんは必死に目次を書く作業をしていました。

作業は思ったよりも長引いてしまったため、再びスカ
イプをつけ、リアルタイムにやりとりしていました。

やっと完成したので、メールを送ってもらいました。

僕はメールの本文をキルリングに入れ、test.org
というファイルを作成し、貼り付けました。

Rさんは、タイトルに統一感がとれてないと言って
いたので、その辺の編集作業は僕がやりました。

もちろんorg-modeのOVERVIEWモードで「*」
の行だけを表示してサクッと編集です。

愛用キーボードRealforceの音がスカイプ
に響き、作業の速さが相手に伝わって、

「速いですね」

と言いました。

そして、細かい編集が終わると、奥義発動!

C-c C-e A

「*Org ASCII Export*」というバッファ
が開き、見事なまでに目次付きで整形
されたテキストが表示されています。

それをMewで相手にメールを送りました。

Rさんは、あまりの早業でびっく
りして言葉を失っていました。

初めて、テキスト処理の威力を目の当たりにしたのです。

「す、すごいです。るびきちさん。
本当にありがとうございます!!」

Rさんは、めちゃくちゃ喜んでいました。

項目数は150を超えているため、メモ帳で目次作成をし
ていると、丸一日かかってもおかしくないレベルです。

番号のミスが起こり得るし、目次行とその箇所
のタイトルを一致させないといけませんし、編
集箇所と目次を行ったり来たりする必要があり、
スキルなしで手作業すると発狂する作業です。

それを、org-modeを使えば0.3秒でできてしまいます。

召喚獣「るびきち」で相手の一日分の
時間をセーブすることができました。


この話で、重要なことは、相手の望みと自分の
スキルの交差点を見付けることなんですね。

相手の悩みを聞き、解決策を考え、それが自分の持っ
ているスキルを使えば解決することを伝えること。

そして、説明をする際には専門用語を使わず、
相手にとって行動しやすい形で教えることです。

Rさんへの説明においては、Emacsだの
org-modeだのそんな言葉は使っていません。

ただ、
「『* 』から項目タイトルを始めて、メールせよ」
と伝えただけです。

我々技術者や専門家というのは、つい
専門用語を使って、簡単な事柄をわか
りづらく言ってしまう傾向にあります。

それだと相手に伝わりませんよね。

これでは
「あなたの話、難しすぎてわかんない」
となって価値を感じてもらえません。

専門家には、専門技術を見せびらかしたいとい
うエゴにとらわれている人がたくさんいます。

かつての自分もそうでした。

相手に価値を感じてもらうには、その専
門技術をどう使うか、どう役立ってもら
うか、そういう視点が必要なんですね。

価値を提供するとは、そういうことなんです。

そして、人間の価値というのは、世の中にどれ
だけの価値を提供できたかで決まるのです。

P.S.
Emacsメルマガの読者数が100人を超えました。

本当にありがとうございます。

読者の疑問を解決し、読者が喜ぶ価値を配信し
ていきますので、是非とも登録してください。

あなたをEmacsハッカーに進化させます。

【メルマガ登録】

集中力5倍!小よく大を制するミニマリストEmacs


この記事は Emacs Advent Calendar jp: 2011 の11日目です.

昨日はta2_o2p さん、明日は id:handlename さんです。

去年、一昨年とインストーラ系を連続して紹介してきましたが、
今年はうってかわって身近な例を取り上げたいと思います。

僕は最近、Windows XPネットブック
使っていることが多いです。

あれだけ忌み嫌っていたWindowsの方が自宅の
Linuxマシンよりも稼働率が高いのです。

数年前の自分が聞いたらびっくりしてることでしょう。

この前はネットブックにEmacsをインストール
する話をしましたが、今回は小さい画面で
Emacsを使うノウハウをお送りします。

最近はパソコンといえばノートパソコンが普通の
ようなので、これからする話は役立つと思います。

とにかく、小さいパソコンでEmacsを使う場合、
最大の問題点となるのが、画面表示です。

画面が小さいので、1画面に表示
できる情報量が少ないです。

その状態で画面分割をしてしまうと表示領域が
狹くなり、とてもストレスがたまります。

上下分割だと行数が少なすぎるし、
左右分割だと桁数が足りなくて、
折り返されてしまいます。

では、桁数確保のためにフォントを小さくすると
今度は目が疲れてしまい、現実的ではありません。

小さい画面でEmacsを有効に使う秘訣は、
画面分割をせずに、原則的に1フレームにつき
1ウィンドウで使うことです。

そういうと、他のバッファが見られないじゃないかと
言う人がいるんですが、それは運用でカバーします。

僕の長い経験上、分割された2つのバッファにおいて
両方を同時に編集することはほとんどありませんでした。

どちらか一方のバッファを閲覧しながら、
他方のバッファを編集する形がほとんどでした。

もしどうしても複数のバッファを同時に編集したい
ならば、そのときはやむをえず画面分割します。

でも、基本的には1フレーム1ウィンドウで
十分間に合っています。

この方式でEmacsを使うことによって
かつてないほどの集中力が得られました!

大画面を使うよりも効率的に作業ができてしまいます。

もちろん画像編集などでは困りますが、
文章やプログラムを書くことにおいては
小さい画面でこのノウハウを使う方が
集中力が出ました。

それでは、どのようにして実現するのかというと、
以下のステップになります。

1. 変数を設定する
2. 直前のバッファに切り換えるコマンドを定義する
3. display-bufferで表示されるバッファをview-modeにする

それでは、小よく大を制する
ミニマリストEmacsの世界へご案内します。

変数を設定する


画面分割を抑止するには、
次の変数を設定するだけです。

(setq pop-up-windows nil)

なお、popwin.elなどでdisplay-buffer-functionを
設定している場合は一時的にnilにしてください。

(setq display-buffer-function nil)

この状態でC-x 1で1ウィンドウにして
以下の式を評価してください。

(display-buffer (other-buffer))

すると、画面分割されずにバッファが切り替わります。

「はい、これで終わりです」
と言うと、物を投げられそうなので、
もう少し時間をください。

直前のバッファに切り換えるコマンド


単にpop-up-windowsを設定しただけでは、
まだ使い勝手がよくありません。

なぜなら、直前のバッファに切り換える
動作がすぐにできないからです。

1フレーム1ウィンドウで効率よく作業するには
どうしても直前のバッファに瞬時に切り換える
ことができないと話になりません。

逆に、このコマンドさえ使えれば、
十分に使いやすくなるのです。

僕は自宅では24インチの巨大なディスプレイで
作業をしているのですが、そのディスプレイ
全体を見るということがそんなになかったのです。

視力が悪いので作業中はメガネが必要です。

そして、メガネをかけていると、
曇ったりして気になるのです。

こういうちょっとしたことでも
集中力は途切れてしまいます。

主にネットブックで作業するようになると、
画面全体をメガネなしで見られるようになり、
この1フレーム1ウィンドウのノウハウを活用して
効率よく作業することができるようになりました。

おまけに、1つのバッファしか表示されていない状態だと、
そのバッファでの作業に集中できることがわかりました。

余計な情報が表示されていることでも
ついそれが気になってしまって、
集中力が奪われることに気付きました。

今ではすっかりシンプルな使い方になっています。

それでは、1フレーム1ウィンドウのキーとなる
「直前のバッファに切り換えるコマンド」を紹介します。

一番安直な実装はこうなります。

(defun switch-to-last-buffer ()
(interactive)
(switch-to-buffer (other-buffer)))
(global-set-key (kbd "C-t") 'switch-to-last-buffer)

ついでにC-tに割り当てておきました。

これにより、直前のバッファに「一瞬で」
切り換えられるようになりました。

直前のバッファを一瞥してから、
元のバッファに戻るということが
簡単にできるようになりました。

でも、これだとほんの細かい
ところで不便なんですよね。

・ bury-buffer等でbuffer-listの最後に
なったバッファが選択できない
・ *Completions*など選択したく
ないバッファが選択される

これらの欠点を改良し、除外バッファを
選択しないようにし、かつ、確実に直前の
バッファに切り換えられるようにしました。

;;; last-buffer
(defvar last-buffer-saved nil)
;; last-bufferで選択しないバッファを設定
(defvar last-buffer-exclude-name-regexp
(rx (or "*mplayer*" "*Completions*" "*Org Export/Publishing Help*"
(regexp "^ "))))
(defun record-last-buffer ()
(when (and (one-window-p)
(not (eq (window-buffer) (car last-buffer-saved)))
(not (string-match last-buffer-exclude-name-regexp
(buffer-name (window-buffer)))))
(setq last-buffer-saved
(cons (window-buffer) (car last-buffer-saved)))))
(add-hook 'window-configuration-change-hook 'record-last-buffer)
(defun switch-to-last-buffer ()
(interactive)
(condition-case nil
(switch-to-buffer (cdr last-buffer-saved))
(error (switch-to-buffer (other-buffer)))))

last-buffer-exclude-name-regexpは適宜設定してください。

でも、たま〜にですが画面分割するときもあります。

そのために、画面分割しているときは、
次のウィンドウを選択するようにしました。

状況に応じて挙動を変えるコマンドを定義
するのは現代っ子の必須スキルです(笑)

(defun switch-to-last-buffer-or-other-window ()
(interactive)
(if (one-window-p t)
(switch-to-last-buffer)
(other-window 1)))
(global-set-key (kbd "C-t") 'switch-to-last-buffer-or-other-window)

これで大分使い勝手がよくなりました。

なお、このコマンドの他にもcycle-buffer.elも
導入しておいた方がよいです。

バッファをワンタッチで次々と切り換えるelispです。

これがあれば2つ以上前のバッファにも切り換えらます。

M-x install-elisp-from-emacswiki cycle-buffer.el

でインストールし、以下の設定をします。

(global-set-key (kbd "M-o") 'cycle-buffer)
(global-set-key (kbd "M-O") 'cycle-buffer-backward)

M-oとM-Oでバッファを次々と切り換えられます。

望みのバッファでなければ連打していきます。

view-modeも活用する


これだけでも十分便利なのですが、
さらに使い勝手を上げてみましょう。

display-bufferによって表示されるバッファは、
編集でなく、あくまでも閲覧を目的としています。

閲覧といえば、やっぱりview-modeですよね!

qを押せばあっさり元の画面に戻れます。

display-bufferを呼ぶ際、そのバッファを
view-modeにする設定を加えておきましょう。

ただ、バッファ作成時にview-modeにすると
read-onlyで書き込めなくなるので、その
バッファはinhibit-read-onlyをtにします。

これでview-modeでもバッファは編集可能になります。

この設定にするにはdisplay-buffer-functionを
設定する必要があります。

そのため、popwin.el等ウィンドウ表示の
elispとは相容れないものとなります。

僕のネットブックではpopwin.elは使っていません。

popwin.elではC-gを押したらそのウィンドウは消滅しますが、
この設定においてはC-tやqを押せば消滅します。

1フレーム1ウィンドウでは不要ですが、
大画面のLinux機においてはpopwin.elを
便利に使わせていただいております。

では、その設定を公開します。

;; view-modeにしないバッファ名
(defvar switch-to-view-buffer-except-names (rx (or "mew" "+draft/" "*Completions*" )))
;; view-modeにしないメジャーモード
(defvar switch-to-view-buffer-disable-view-mode '(Info-mode mew-draft-mode))
;; view-modeにしないコマンド
(defvar switch-to-view-buffer-except-commands (rx (or "mew")))
(defun switch-to-view-buffer (buf &optional ignore)
"BUFを1ウィンドウview-modeにして切り換える"
(if anything-in-persistent-action
;; anything.elのpersistent-actionのときは特別扱い
(let (display-buffer-function (pop-up-windows t))
(switch-to-buffer buf))
;; そうでないときは1ウィンドウでview-mode
(switch-to-buffer buf)
(delete-other-windows)
(unless (or (memq major-mode switch-to-view-buffer-disable-view-mode))
(view-mode 1)
(set (make-local-variable 'inhibit-read-only) t))
(selected-window)))
(defvar switch-to-view-buffer-maybe-winconf nil)
(defun switch-to-view-buffer-maybe (buf &optional ignore)
"1ウィンドウview-modeのためのdisplay-buffer-function設定用"
(setq switch-to-view-buffer-maybe-winconf
(current-window-configuration))
;; 除外条件にあてはまる場合はデフォルトのdisplay-buffer
(if (or (string-match switch-to-view-buffer-except-commands (format "%s" this-command))
(string-match switch-to-view-buffer-except-names (format "%s" buf)))
(let (display-buffer-function (pop-up-windows t))
(display-buffer buf))
;; あてはまらない場合は1ウィンドウview-modeで表示
(switch-to-view-buffer buf)))
(defun my-restore-window-configuration ()
"display-bufferを呼ぶ前のウィンドウ構成に戻す"
(interactive)
(if (not switch-to-view-buffer-maybe-winconf)
(bury-buffer)
(set-window-configuration switch-to-view-buffer-maybe-winconf)
(setq switch-to-view-buffer-maybe-winconf nil)))
(setq temp-buffer-show-function 'switch-to-view-buffer-maybe)
(setq display-buffer-function 'switch-to-view-buffer-maybe)
(setq pop-up-windows nil)
(require 'view)
;; view-modeでqを押すとウィンドウ構成を戻す
(defkey view-mode-map "q" 'my-restore-window-configuration)

おまけ


anything.elを使っていて、anythingの選択は画面分割
したい場合には、以下の設定を加えておきます。

(defun anything-display-function-1 (buf)
(let ((pop-up-windows t) display-buffer-function)
(display-buffer buf)))
(setq anything-display-function 'anything-display-function-1)

また、viewer.elでview-modeの使い勝手を
さらに高めることができます。

M-x install-elisp-from-emacswiki viewer.el

でインストールし、以下の設定を加えてください。

(require 'viewer)
;; 書き込めないファイルは常にview-mode
(viewer-stay-in-setup)
;; view-modeのときはモードラインの色を変える
(setq viewer-modeline-color-unwritable "tomato"
viewer-modeline-color-view "orange")
(viewer-change-modeline-color-setup)

おわりに


いかがだったでしょうか?

これで1フレーム1ウィンドウのための
view-modeの設定は終わります。

とりあえず、しばらく試してみてください。

今までとは全く違うEmacs像が見えてきたと思います。

特に文章を書くときには絶大な集中力が得らます。

僕はこれまで長年にわたり膨大な設定を書いてきたの
ですが、人間はひとつのことしか集中できないことを知り、
結局のところ、一番シンプルな解に到達しました。

書籍『Emacs Lispテクニックバイブル』はあなたが
すぐにelispが書けるようにするために書きました。

メルマガ『Emacsの鬼るびきちのココだけの話』は、
読者のリクエストに応じて僕が記事を書き、あなたを
Emacsハッカーに育て上げるために発行しています。

よろしくお願いします。

プロジェクトその2 メルマガ「Emacsの鬼るびきちのココだけの話」発行!

お待たせしました。

2大プロジェクトその2を発表します。

それは、まぐまぐでメルマガを発行することです!

題名は「Emacsの鬼るびきちのココだけの話」です。

僕はこれまでブログや書籍という
形で情報提供をしてきました。

僕の著書を買ってくださった皆様、
本当にありがとうございます。

本メルマガでは、Emacsを中心にRubyやLinuxなどの
コンピュータ関係の話題を初めとして、心構え等
僕の脳内をすべてさらけ出していきます。

まさに「ココだけの話」というの
に相応しい内容になっています。

本メルマガを定期購読することで、
あなたは立派なEmacsハッカーになります。

Emacsを手足のごとく、まるで身体の一部で
あるかのように使えるようになります。

そのためのサポートをさせていただきます。

なぜメルマガを発行するのかというと、
一番大きいのが書籍との住み分けです。

書籍執筆というのは、とても楽しい仕事です。

しかし、コンピュータ関係の情報はどんどん陳腐化していき、
執筆中においても情報が変化してしまうのが問題です。

それに対して、メルマガでは最新の情報を配信できる上、
あなたからのフィードバックがもらえるという強味があります。

フィードバックがもらえると、僕自身励みになりますし、
あなたが欲しい情報をダイレクトに提供できることで、
満足度が高くなります。

なんといっても読者と相互にやりとり
できる点がメルマガの強味です。

メルマガは読者とともに作っていくメディアなのです。

書籍や雑誌ではそうはいきません。

それでは本メルマガの内容の一部を紹介します。


・ elisp初中級者へ贈る勉強法とは? - この方法をシステマティックに行うこ
   とで頭一つ抜きん出ることができます。
・ 理想のインターフェースとは? - 今やキラーアプリとなったanything.elで
   すが、そこに至るまでの軌跡、そして人間に優しいインターフェースを最小
   の労力で構築する奥義を余すことなく公開。
・ いつでもどこでもEmacsできる理想のEmacsマシンとは? - こんな小さなマシ
   ンでもEmacsは動きます。小画面でも便利に活用する極秘ノウハウ。集中する
   ときはこのマシンを図書館へ持っていき朝から晩までコンテンツを作成して
   います。
・ 集中力を劇的に高める秘術とは? - 小学生でもできるこんな簡単なことでも
   集中力は倍増するのです。そして、それをサポートするためのツールをシェ
   ア。
・ EmacsをWiki化する小さなプログラムとは? - 僕が古くから使っているこの
   秘術により、Emacsで扱うすべてのものがハイパーテキスト化します。そして、
   ファイルの依存関係に悩むことが未来永劫なくなります。
・ マイナーなウィンドウマネージャーの知られざる秘密とは? - あなたは画面
   が狭くてイライラしていますか?そうですか、ではこのウィンドウマネー
   ジャーで画面いっぱいに情報を埋め尽くしてください。パソコン画面の使い
   方を根底から覆します。
・ 開発中のプログラムの情報 - 自作プログラムの価値を高めるために開発中の
   プログラムをメルマガ読者限定に先行公開!

等々…これまで語れなかった秘密を続々公開!

本メルマガは、読者のリクエストに
応える形で記事を配信していきます。

通常、メルマガという媒体は著者が好き勝手
書く媒体ですが、本メルマガは違います。

メルマガに何を書くか、それは
あなたが決めることです。

僕はエゴを捨てます。

あなたの成長にすべてを集中します。

日常的な操作法から、Emacs Lispの真髄まで
あなたが立派なEmacsハッカーになれるよう
全身全霊、本メルマガに捧げることにしました。

そのため、本メルマガは有料で
月々1000円にする予定でした。

しかし、書籍ではなくてデジタル情報に1000円も払うのに
抵抗がある人はそれなりにいると思うのです。

なので、月々512円とさせていただきます。

IT関係者に馴染み深い数字の512です。

IT系雑誌や某動画サイトのプレミアム料金より安いです。

とはいえ、お金をいただく以上、あなたの
フィードバックに積極的に応じますし、

「この情報を見ない奴はもう終わりだよ。」
「あっという間に取り残されるよ。」

と思わせるほどの情報を提供しますので、
どうか楽しみにしててください。

2012年1月7日に正式に創刊なので、
今登録しても12月と1月は無料です。

なので安心して登録してくださいね。

創刊前にメルマガを発行することは可能なので、
12月3日から毎週土曜日に配信していきます。

取りあえず、2ヶ月間試してこの情報の価値を体感してください。

あなたをEmacsハッカーに進化させます。

【次へ】

P.S.
まぐまぐ有料メルマガ講読には
クレジットカードあるいは
VISAデビットカードが必要です。

クレジットカードに嫌悪感がある人は
銀行残高の範囲内でしか使えない
VISAデビットカードのご利用をおすすめします。

カードの詳細については

クレジットカードVSデビットカードを徹底比較!!

がとても詳しいです。

P.P.S.
>id:motok5さんへ
コメントありがとうございます。
月々512円です。
ただし、12月と1月は無料で講読できます。

>knishiiさんへ
書籍購入&メルマガ講読ありがとうございます。
楽しみにしててくださいね^^

>nandaさんへ
週1(月4〜5回)で512円です。
httpsのURLに置き換えておきました。
これで大丈夫です。

対談音声の受け付けを終了しました


【特典付】『Emacs Lispテクニックバイブル』発売します - http://rubikitch.com/に移転しました
でのShougoさんとの対談音声プレゼントですが、
ただいまをもちまして終了させていただきます。

ご請求ありがとうございます。

新著の方、よろしくお願いします。

【特典付】『Emacs Lispテクニックバイブル』発売します


お久しぶりです。

この度、新著の
Emacs Lispテクニックバイブル 〜真髄を知るLispの掟〜』
を執筆しました。

この本は、すでにEmacsを使っている人が、
Emacsを手足の如く扱うことを目的にしています。

前著『Emacsテクニックバイブル 〜作業効率をカイゼンする200の技〜』
あらゆるEmacs Lispプログラムを活用して、快適な環境を構築するための
カタログ的な本でした。

紹介された様々なEmacs Lispプログラムによって、
あなたのEmacsは劇的な進化を遂げたことでしょう。

それでも、人間の欲というものは限りないものです。

「このEmacs Lispプログラムのココが気に食わない」
「このようなEmacs Lispプログラム欲しいけどないなー」
「世界でただ一つ、俺だけのEmacsを作りたいぜ」

みたいな欲が出てくるんですね。

もし、その感情が湧いたことが一度でもあるのならば、
本書は絶対に買わないといけないと断言できます。

そもそもEmacs上での課題を解決するには、
2通りの解決法しかありません。

こう書くと、探す方が圧倒的に楽であるかのように
思えてきますが、そう簡単な問題ではありません。

そこに立ち塞がる最大の壁が
「英語」
です。

我々日本人の多くは、英語を速読することができません。

Emacs Lispプログラムを探すにしても、
大量の英語の海に入らないといけないのです。

さらに、他人のプログラムというのは、
使い方を学ぶこともバカにならないコストです。

マニュアルはもちろん英語です。

丁寧に解説してあれば、なおさら長文の英語を読まないといけません。

そして、コマンドの使い方を覚える場合も、
あらゆる場面でテストをしないと、
予想外の挙動に悩まされることになります。

そのため、小さな問題は自分でEmacs Lispを書いた方が早いのです。

たとえば、F12キーを押すと特定のファイルが
開かれるようにしたいのですが、
ファイルが複数個にわたる場合は、
続けてF12を押して切り換えたい場合を考えます。

ファイルは、以下の3つとします。

  • ~/memo.org
  • ~/project.org
  • ~/gtd.org

これらのファイルは特に重要なので、
ワンタッチで開けるようにしたい
という目的を想定します。

この程度のプログラムならば、
わずか10行(設定込)で済みます。

(defvar file-ring nil)
(defun make-file-ring (files)
(setq file-ring (copy-sequence files))
(setf (cdr (last file-ring)) file-ring))
(defun open-file-ring ()
(interactive)
(find-file (car file-ring))
(setq file-ring (cdr file-ring)))

そして、以下のように設定すれば今すぐ使えます。

(make-file-ring '("~/memo.org" "~/project.org" "~/gtd.org"))
(global-set-key [f12] 'open-file-ring)

お好みのファイルに置き換えて試してみてください。

これくらいのプログラムならば、10分あれば書けます。

もし、これと同じ挙動をするEmacs Lispプログラムが
EmacsWikiにあるとしたら、それを探すのに何分かかりますか?

膨大な英語を掻き分けて、
いろいろな検索ワードを使って
調べないといけません。

当然、そのプログラムがある保証はありません。

存在しなかった場合は、その時間は無駄になってしまいます。

このように、自分で書けば解決する
問題というのは案外多いものです。

そのためには、Emacs Lispの知識が不可欠になります。

Emacs Lispの世界は広大なため、
どこから手をつければいいか
わからない人が多いと思います。

Emacs Lispマニュアルは膨大な情報が含まれていますし、
幸いなことに日本語訳も存在します。

しかし、情報が古い上に、普段使わない事柄も
多く載っているため、すべてを理解するのは
とてつもなく時間と労力がかかり、困難です。

マニュアルというのは、性質上全ての
事柄について説明してあります。

それに対して、本質的に必要となる知識は
20:80の法則が表すように2割程度に過ぎません。

めったに使わない知識については、
必要なときに調べれば済むことです。

マニュアルから学ぶということは、
かなり時間のロスになってしまいます。

あなたは、

Emacs Lisp学者になりたいわけではありませんよね?
自分が抱えている問題を解決したいのですよね?

そこで、本書では重要な事柄を330ページに凝縮し、
以下のステップでEmacs Lispを教えていきます。

1) プログラミング言語elispの基礎を知る
2) バッファとウィンドウによる表現方法を学ぶ
3) 関数を少しずつ覚えていく
4) オンラインヘルプの使い方を学ぶ
5) 応用的な知識をつける
6) Common Lispマクロを使ってエレガントに表現する
7) テスト、デバッグ方法を知る
8) 実際にelispで書いてみる

日常の作業を便利にする小さなコマンドくらいは、
2段階目が終わった段階で書けるようになります。

5、6段階目に入ったところで、本当の
Lispの楽しさを知ることになります。

どうせ学ぶなら、楽しい方がいいに決まっています。

なので、Lispを毛嫌いしている人も、
挫折した人も、もう一度Emacs Lisp
ひいてはEmacsの楽しさを再発見して
いただきたいです。

本書は僕の近著とは異なり、オーソドックスに
基礎から順番に解説していくスタイルです。

最初はとても易しく、徐々に高度な内容に
入っていく形をとっています。

ただ、これだけだと前に学んだ内容を
忘れてしまう問題があります。

そのため、各章末には「まとめ」を設け、
手軽に復習できるようにしています。

それでも学習していくうちに、
「こういう時には何を使うんだっけ?」
という疑問がわいてくるものです。

そこで、「逆引き目次」というのを作成しました。

たとえば、

「代入するには『setq』を使う p48[2-2-3]」
「コマンドを定義するには関数定義の最初に『interactive』を置く 78[2-10-1]」

といった具合で答えが書いてあるページ数と項番号を書いています。

よって本書は、オーソドックス+逆引きの
ハイブリッドスタイルとなっています。

頭から読んで基礎から応用までをマスターし、
その後で疑問に思ったときに辞書的に
活用できるようにしています。

本書には、以下の内容が含まれています。

  • あなたはなんでもかんでもelispで書きたいですか?そうですか、でもelispの特性を知らないと100倍動作が遅くなり、実用的ではありません。すべてelispで書いて使いものにならなかったプログラムの紹介。
  • 関数定義の本当の意味とは?一度この視点を持ってしまえば、あなたのコードは10倍綺麗になります。
  • Lispの括弧が嫌いですか?怖いですか?大丈夫です。今までいらついていた括弧と逆に親友になる魔法を教えます。
  • 新たなプログラミング言語がなかなか覚えられないで困っていますか?そうですか。elispのプログラムの実行の仕組みは1節に収まるほどとても簡単なのですぐに覚えられます。
  • あなたは*scratch*バッファにコードを書いていませんか?これほどもったいないことはありません。試行錯誤した経験を後で活かす方法をシェア。
  • 対話的にelispを実行するときはシェルのようなインターフェースが好きですか?それは最高のインターフェースではありません。テキストエディタの特性を活かし、一度に複数の式の評価結果を知る方法を教えます。
  • 正規表現を作成するのは苦手ですか?そうですか。では、このコマンドを使って正規表現を組み立ててください。初心者でも1分足らずで複雑な正規表現を作成できるようになります。
  • elisp正規表現はバックスラッシュの羅列で醜いですね。安心してください。実は人間にとって簡単に理解できる正規表現の記法があるのです。この記法に置き換えて、メンテナンス地獄から逃れてください。
  • コンスセルとリストの違いがわからない?それらをとあるものに例えれば5才児相手にも説明できるようになります。
  • whileループを使うのはやめてください。コードの意図をはっきりと表現する方法を学び、まわりのプログラマを一気に追い抜いてください。
  • バイトコンパイラはそのままではただの時間泥棒です。現状では、高速化の恩恵よりも、バイトコンパイル問題解決の方に時間を取られてしまうのです。とある仕掛けを施して悪魔を封印し、あなたのelispを常に2倍速で動かしてください。
  • ヘルプバッファを表示することでせっかく作り上げたウィンドウ構成が壊されていませんか?ウィンドウ表示方法を根底から覆し、邪魔されなくする方法をシェア。
  • オンラインヘルプを見るのに、複数のコマンドを使い分けていませんか?いまや、たった一つのコマンドを覚えれば検索もヘルプも定義もすべてがまかなえるのです。
  • 最新のEmacsではハッシュテーブルに大革新が起きたことを知っていますか?強力でありながら、これまで使いづらかったデータ構造でしたが、一気に市民権を得るようになりました。
  • Lispは参照と設定が別の関数(carとsetcarのように)になっていて覚えにくいですよね?この概念を使えば参照の関数のみで値を設定することができます。あなたの脳内メモリを解放してあげてください。
  • Common Lispの様々な機能がうらやましいですか?そうですか。実は、elispにはすでに多くのCommon Lispの機能が使えるようになっているのです。数々の便利機能を伝授。
  • 一連のデータの塊を名前でアクセスしたいですか?でもLispの構造体は複雑すぎて困る?いいえ、本質さえ理解すれば十分なのです。学んですぐに使えます。
  • loopマクロが覚えられなくて悩んでいませんか?loopマクロのコアさえしっかりとらえれば、決して難しくありません。1時間であなたもloopマスターになれます。
  • メジャーモードを作成することに抵抗がありますか?実はメジャーモードは最短1行で定義できます。初心者でもメジャーモードを作成できる方法を伝授。
  • あなたはメジャーモードを作成する必要がないかもしれません。多くの人が知らないたった一つの式を.emacsに入れるだけで、メジャーモードの数が20個以上増えます。
  • Emacsユーザにとっての理想的なシェル環境とは?この秘密を知ってしまえば、10年間使ってきたシェルにサヨナラを告げ、Emacsからあらゆるコマンドを起動してしまうようになります。
  • Emacsをマルチスレッド化する方法とは?これまで不可能と思われたelispによる並列プログラミングを可能にする秘技を伝授。
  • 実用的なアプリケーションを初心者でも作成できてしまう秘密とは? 最低限のコードを記述すれば、あとはEmacsに任せるだけです。
  • 関数の中に関数が書けることを知っていますか?方法は3つあるのですが、それぞれ全く異なる目的になります。その使い分けの基準を明確に教えます。
  • Rubyのブロック付きメソッドが羨しいですか?それに相当する機能はRubyが生まれるはるか昔から存在するのです。喜べ!Rubyistたちよ!!制御構造定義でもメタプログラミングでもなんでもやってしまってください。
  • 関数の途中で抜けることができなくて書きにくいですか?その方法はある秘密を使えば可能です。これで手続き型言語に慣れている人も安心です。
  • 我々が普段から使っている「同じ」という言葉には、2通りの意味があることを知っていますか?両者の違いを小学生でも理解できる言葉で解説!
  • 多種多様な制御構造が用意されている本当の理由とは?使い分けの基準を明確にします。
  • Emacsで音楽・動画を再生したいですか?elispはこういうことも可能なのです。
  • 気に入らない挙動の関数を正す最強の方法とは?行儀悪い関数はこの秘術で教育してください。
  • あなたのプログラムのファンに対して敬意を払う方法とは?これを守って開発しないと、あなたのプログラムのファンから不満を買い、使ってもらえなくなります。
  • Windowsコマンドプロンプトは劣悪でイライラしますよね?無理矢理Windowsを使わされているUnixウィザードにとっての救世主がココにいます。コマンドプロンプトを投げ捨て、コレに置き換えてください。
  • 小さなネットブックでウィンドウが分割されるとストレスですよね?この設定でウィンドウ分割が抑止し、快適にEmacsを使い倒してください。
  • 変数ひとつ変更するだけでプログラム全体に変化をもたらす「データ駆動プログラミング」の秘密とは?このテクニックを活用して、保守性を5倍に引き上げてください。
  • Lispだからこそできる強力なデバッガとは?一度これを使うと、プログラムのおかしい部分がすぐにわかり、あれだけ忌み嫌っていた括弧に惚れてしまうようになります。
  • 他にもここでは紹介しきれないまだまだ多くの秘密を公開...


本書は、初歩からEmacs Lispを活用できる
レベルまで一気に引き上げる内容です。

全体像をはっきり描き、基礎から最新技術まで
無理なく身に付けられるようになっています。

さらに「逆引き目次」により、
本書に書いてある事柄ならば
あらゆる質問の答えが書いてあります。

これで、あなたはEmacs Lispをマスターし、
Emacsを手足の如く操り、楽しいEmacsライフを
過ごすことから逃れられません。

これ読まずして、どうやってEmacs Lisp覚えるの?

これを読まないと、Emacsマスターにはなれません。

Emacsマスターの道へ歩む』→Amazonで買う 楽天で買う ビーケーワンで買う

プレゼント!

さらに、お買上の人には秘蔵の
音声ファイルをプレゼントします。

Vim界のanything.elといわれているunite.vimで
有名なShougoさんとの対談です。

タイトルは

「EmacsとVim〜二人の異端児による次世代エディタ裏話〜」

です。

EmacsとVim、世界は違えどやりたい放題で
お互い思い切り創造的破壊かましています。

この対談はディープでコアでかなりアブないです。

Emacs Lispを書く人はもちろん、
Vimスクリプトを書く人も必聴です。

プレゼントはすぐに締め切るので申請はお早めに。

秘蔵対談ファイルをゲット!

次回は、もう一つのプロジェクトを発表します。

お楽しみに!

ネットブックでEmacs環境を構築する


それではお待ちかね、ネットブックEmacsをインストールする話です。

この手順通りにやることで、あなたのネットブック
立派なEmacs専用機に大変身します。

古くから、モバイルギアリナザウによってUnix環境を
持ち歩き、そこの中でEmacsひきこもり生活を始めて
いる人がいますが、その環境構築には多大な手間が
かかりました。

しかし、この方法を使えば、OS換装の手間もなく、
単にEmacsをインストールするだけでよいのです。

OSはWindowsのままですが、Emacsにはeshellという
立派なシェルがありますので、各種Unixコマンドや
スクリプト言語の環境を整えておけばLinuxと何等
変わらない操作性を得ることができます。

あなたも、「物書きマシン」、「Emacsが動くpomera
というコンセプトでネットブックをとらえてみませんか?

僕は、愛用ネットブック
「パソコンの形をしたノート」
だと解釈しています。

あくまで文房具という位置付けです。

そういう視点でものを見ると、一般的に貧弱とか
使えないとか惨々な言われようのネットブックでも
いろいろなことができ、機能に恵まれています。

  • 安価
  • 軽い、小さい
  • さほど発熱しない
  • 使い慣れたEmacsの機能がフルに使える
  • 物書きマシンとしては超大容量ハードディスク(160GB〜)
  • 音楽や動画も再生できる
  • ゲームもできる
  • PDFを読む電子ブックリーダ
  • ネット接続できる

それでは始めましょう。

http://ftp.gnu.org/gnu/emacs/windows/
から最新のバイナリ(現時点ではemacs-23.3-bin-i386.zip)を
ダウンロードし、インストールします。

インストールは解凍するだけです。

適当なフォルダ(たとえばd:\emacs)を作成し、
そこにzipファイルを展開します。

すると、emacs-23.3というフォルダができて、
d:\emacs\emacs-23.3\bin\runemacs.exeが
Emacsの実行ファイルになります。

そこで、スタートメニューにEmacsという名前で
d:\emacs\emacs-23.3\bin\runemacs.exeへの
ショートカットを作成しておきます。


そうすることで、Windows→EでEmacsを立ち上げることができるからです。

また、そのEmacsショートカットはスタートアップにもコピーしておきます。

これでWindows起動時に自動的にEmacsが立ち上がります。

結論から言うと、僕の愛用ネットブックEeePC 1001HAでは
とても快適にEmacsを使うことができています。

Unix的環境を持ち歩いて快適に文章執筆をする夢がついに叶いました。

想像してみてください。

普段はSKKで快適に文章を書いています。

anything.elだってきっちり動きます。

必要に応じてEmacs Lispを書くことができます。

B5サイズで1kg少々の重さで、打ちやすいキーボード、
バッテリ持続時間(実働)は約3.5時間と申し分ありません。

CPUは省電力のAtomなので機体がひどく発熱することもありません。

発熱は夏場はとても不愉快ですが、これなら問題ないレベルです。

また、ハードディスクは熱に弱いのでハードディスクにも優しいです。

性能面は今の基準ではとても貧弱ですが、重いサイトを閲覧したり、
複雑な数値計算や大規模開発を行うわけではないので、問題ありません。

Emacs専用機だという位置付けをしっかり
しておけば、性能なんて無視できるのです。

他にもMPlayerをインストールして、
音楽や動画も楽しんだりしています。

これらももちろんEmacsから起動しています。

というか、デスクトップアイコンはひとつもないですし、
スタートメニューもめったに使いません。

ほぼすべてのプログラムはEmacsから
eshell経由で起動しています。

開いているウィンドウはだいたいEmacsだけです。

そのため、Emacsは常に最大化しており、タスクバーは隠しています。

いかがでしょうか?

ネットブックは快適なEmacs専用機になるのです。


さて、ネットブックEmacsを快適に使うには、
形状の制約と折り合いをつける必要があります。

そのためにネットブック専用のノウハウが出てきます。

まず、キーの数が少ない問題です。

たとえばEeePC 1001HAではHome/End/PageUp/PageDownがないです。

実際にはFnキーを押しながら矢印キーで
これらのキーコードを送ることができます。

これら特殊キーはワンタッチで押せるのが魅力なのであり、
わざわざそこまでして使うメリットは感じません。

実質ないに等しいです。

でもよく眺めてみると、右上にある
BackSpace/Delete/Insert/PrintScreen/Pauseは
Emacsユーザにとってほとんど使わないキーです。

これらのキーに活躍の場を与えてあげましょう。

僕はDeleteにC-v(scrollup)、
BackSpaceにM-v(scroll-down)、
Insertにscroll-other-window、
Pauseにscroll-other-window-downの
コマンドを割り当てました。

ネットブックはキーボードが小さいため、
これらの遠いキーにもすぐに手が届きます。

また、立ちながらでも右手親指でスクロールができます。

これによりまるで本を読むようにネットブック
持ち、テキストを読むことができます。

PDFはテキストに落としてEmacsのview-modeで読んで
いるので、電子ブックリーダーとかは不要です。

立ちながら携帯電話をいじるように、
ネットブックを操作できるんです。

デメリットと思われた点が、一点してメリットに様変わりです。

これを実現するのは以下の設定です。
.emacs (~/.emac.d/init.el)の
「最後」に入れています。

(defmacro defkey (keymap key command)
  `(define-key ,keymap ,(read-kbd-macro key) ,command))

(setq my-overriding-mode-map (make-sparse-keymap))
(defkey my-overriding-mode-map "<delete>" 'scroll-up)
(defkey my-overriding-mode-map "<backspace>" 'scroll-down)
(defkey my-overriding-mode-map "<insert>" 'scroll-other-window)
(defkey my-overriding-mode-map "<pause>" 'scroll-other-window-down)
(define-minor-mode my-overriding-mode
  "Overriding"
  :global t :init-value t)


global-mapに設定していないのは、これらのキーに
機能を割り当てているモードがあるからです。

最後に登録したマイナーモードにより、
強引にキーを割り当てているのです。


次にポインティングデバイスの問題です。

ネットブックに限らずノートパソコンの
ポインティングデバイスって本当に
使いづらくてイライラしますよね。

なかなかマウスカーソルが進まなかったり、
文字タイプ中にマウスクリックになったりと、
本当に困ったちゃんです。

Emacsに限らずノートパソコンを快適に使うためには、
マウスに頼らない操作を身に付けることが大事です。

幸いEeePC 1001HAではワンタッチでポインティングデバイス
無効にするスイッチがあるので、必要なとき以外は無効にします。

今度はマウスカーソルが邪魔になるので、
マウスカーソルを右下に完全においやります。

これを行うのが以下で定義するM-x banishです。


(defun banish ()
(interactive)
(set-mouse-position (selected-frame) 1000 1000))


一度実行したらマウスカーソルは右下端に
移動するため見えなくなります。

これでうっとうしいマウスとはおさらばです。


最後に、ネットブックの小さい画面では
Emacsは常に最大化して使うことになります。

Windowsの機能でWindowsを最大化するには、
M-x maximize-windowを定義します。


(defun maximize-window ()
(interactive)
(w32-send-sys-command 61472)
(w32-send-sys-command 61488))


そして、.emacsに (maximize-window) を入れる
と最大化されるはずなのですが、タイミングの
問題なのかうまく最大化されないので、以下のようにします。


(eshell)
(insert "maximize-window")


このようにするとEmacs起動時にeshell(Emacs上のシェル)で
maximize-windowと入力されるので、RETを押せばよいです。

なお、set-frame-fontでフォントを変更したら
ウィンドウの大きさが変わるので、フォント変更後は
M-x maximize-windowで再度最大化します。

僕は使うフォントごとにコマンドを作成し、
フォントを切り換えて最大化するようにしています。


(defun bigfont ()
(interactive)
(set-frame-font "Ricty-18:bold")
(maximize-window))
(defun mediumfont ()
(interactive)
(set-frame-font "Ricty-16")
(maximize-window))
(defun smallfont ()
(interactive)
(set-frame-font "Ricty-12")
(maximize-window))


あとは、msysgitをインストールすると、
gitと各種Unixコマンドが手に入ります。

これらは、VCやeshellで活躍しています。

http://code.google.com/p/msysgit/

さらにMPlayerRubyをインストールして
Linuxと変わらない使い勝手を手に入れています。

http://mplayerhq.hu/
http://www.ruby-lang.org/ja/

ネットブック」を「ポータブルEmacs専用機」と
再定義して使うお話、いかがだったでしょうか?

次回は、2大プロジェクトの1つめを公開します。
お楽しみに!


P.S.
ごめんなさい、僕はxyzzy使ったことないです。
でもこのコンセプトはxyzzyでも通用すると思います。

ネットブックと母艦を同期させる


それでは、ネットブックと母艦のデータを同期させる方法を説明します。

2つのパソコンのデータを一致させておくことで、
一方が他方のファイルを上書き保存してしまう
危険性がなくなります。

2台以上のパソコンを使っている人ならば
おそらく、上書き保存をしてしまって
途方に暮れたことがあると思います。

ここでお話する同期を取る方法さえしっかりやっておけば、
こんな問題とはおさらばすることができます。

パソコンのデータを同期させるにはunisonというツールを使います。

rsyncに似ているのですが、unisonは双方のパソコンで
データが更新されていても対応できる強味があります。

それではunisonを使って同期させるための手順を示します。

とりあえず母艦はLinuxネットブックWindowsだと想定しますが、
手順自体にはOSは関係ありません。

1. 母艦に同期用のネットワークカードを接続する
2. 母艦とネットブックをクロスLANケーブルで接続する
3. 母艦のIPアドレスを設定する(例:192.168.1.1)
4. ネットブックIPアドレスを設定する(例:192.168.1.4)
5. 母艦にsshd(sshサーバ)を立ち上げる
6. ネットブックsshクライアント(plink)をインストール・設定する
7. ネットブック側でpageantを使ってパスフレーズ入力なしでssh接続できるようにする
8. 母艦にunisonをインストールする
9. 母艦とネットブックそれぞれに同期させるディレクトリを作成する(例:~/sync, d:\sync)
10. ネットブック側にd:\sync\binディレクトリを作成し、PATHを通しておく
11. ネットブックにunisonをインストールする
12. ネットブックにunisonを動かすバッチファイル(シェルスクリプト)を作成し、d:\unison\bin\usync.batと保存する
13. ネットブックを立ち上げたら毎回sshパスフレーズを入力する
14. ネットブックからusyncを実行して母艦と同期する

この手順により、ネットブックからunisonを動かすことで、
母艦と同期することができるようになります。

母艦とネットブックを直接接続するには、LANカードと
クロスケーブルで接続することに注意してください。

LANケーブルといっても、見た目はストレート
ケーブルと変わらないので紛らわしいです。

そのため、LANケーブルを購入するときは
クロスと明記してあるものを選んでください。

クロスケーブルの場合は、端に「X」という
文字が書いてあることがあります。

IPアドレスの設定については、環境に
よって異なるので各自調べてください。

母艦側にはsshdを立ち上げておいてください。

なお、Windows用のsshクライアントとしては、
puttyコマンドライン版であるplinkを使うのが無難です。

puttyhttp://www.chiark.greenend.org.uk/~sgtatham/putty/ で入手できます。

http://net-newbie.com/putty.html を参考にして
putty(plink)をインストールして、公開鍵・秘密鍵
登録しておいてください。

そして、「"C:\Program Files\putty\pageant.exe" "C:\Program Files\putty\id_rsa.ppk"」を
実行するようにスタートアップフォルダにショートカットを
作っておいてください。

これでネットブックが立ち上がるたびにパスフレーズ
入力するようになり、同期のたびにパスフレーズを入力
する必要がなくなります。

ssh環境が整ったら、母艦・ネットブックともに
unisonをインストールします。

Linux側は「apt-get install unison」等で
インストールしてください。

Windows側は http://alan.petitepomme.net/unison/index.html から
unisonのバイナリをダウンロードします。

この際注意する必要があるのは、
母艦と同じバージョンでないと
unisonは動かない点です。

母艦がバージョン2.27.72ならば、
Windows側も2.27.72をインストール
する必要があるということです。

もしかしたら、TEENY(72の部分)は
一致していなくても動くかもしれません。

unisonの実行ファイルは
D:\sync\bin\unison.win32-textui.exe
に保存しておきます。

その後はWindows側に以下のバッチファイルを作成します。

http://www.rubyist.net/~rubikitch/archive/usync.bat.txt

これを d:\sync\bin\usync.bat として保存します。

以下の設定になっているので、
変数の値を適宜書き換えてください。


set UNISON_PATH="D:\sync\bin\unison.win32-textui.exe"
set PLINK_PATH="C:\Program Files\putty\plink.exe"
set SSH_USER=me
set SSH_HOST=192.168.1.1
set SSH_PORT=22
set SSH_KEYFILE="C:\Program Files\putty\id_rsa.ppk"
set LOCAL_ROOT=D:\sync
set REMOTE_ROOT=/home/me/sync


なお、sshは公開鍵を使っているので、
SSH_PASSWORDは無視してかまいません。

バッチファイルを修正したら、コマンドプロンプトからusyncと打つことで、
母艦の~/syncとネットブックのd:\syncの内容が一致します。

次は、ネットブックEmacs
インストールし、環境構築を行う話をします。