xyzzyを使ってみないか?

※今回のエントリはちょっといつもと違う感じなので興味ない人は読み飛ばしちゃってくださいというかそんなこと言われなくてもそうするか。

※※知り合いに向けたxyzzyの紹介のたたき台として。誰か詳しい人の目に留まってコメントなどをいただけないかという希望のもとに公開。

テキストエディタはプログラマのものです

えーと、なんでしたっけ、そうそう、テキストエディタの話なんですよ。

まず最初に言っておくとですね、僕はエディタに凝るなんてえのは基本的にプログラマの人だけで十分だと思っています。そりゃあ一日じゅうキーボードを打って飯を食ってるわけですから、とうぜんその環境というものはそのグラウンド、下地、ベース、これであって、それをよりよいものにすることは当然のことと言えましょう。常に開発環境をよりよくしようとしない奴は巻グソになり損ねたただの野グソにも劣る!などと、かのdankogaiも言っています。いや、知りませんけど。たぶん言ってると思います。うーん、思ってくらいいるんじゃないかな。

まあ、とにかくテキストエディタってのはそういうもんじゃないかと思うのです。

僕はプログラマじゃない

で、打って変わって僕という人間の話なんですが、僕はプログラミングなぞ小指の先ほどもやりませんから、つまりテキストエディタなんてものに凝ってる暇があったらお天道様の光を浴びて健康的な生活をしていればいいわけです。

とはいえ、そんなプログラミングの闇から遠く離れたところでアルプスの少女ハイジのように牧歌的に暮らしているはずの僕も、たまにそういうことを考えなければならない状況に置かれてしまうことがあります。というかまあ主にLaTeXを扱わなければいけない状況なんですが。これは困る。だもんだからテキストエディタ探しの旅に出る。てきとうなエディタでしこしこ書いてコマンドラインでコンパイルするなんてめんどくさいこと出来るわけありませんし、だからといってそのためだけに専用のエディタを導入するのもなんだかしゃくに障ります。だから必然エディタ+マクロの組み合わせで探すことになる。

でもこれが案外ないのよね。実はそれまでは秀丸をごにょごにょして使っていたのだけど、やっぱり有料だというのが気になって仕方がなくてやめた。Unix系のエディタって選択肢もあるのかもしれないが、LaTeXごときでそこまでしたくないしそもそも手に負えない。

そしたら結局xyzzyという選択肢しか残されていませんでした。

xyzzyはすごくいい

後で書くけど、このなんて読むかよくわからんエディタは、まあそれなりにとっつきにくい。何よりキーボードショートカットが全然ちがう。月とスッポンほどとは言わないけれど、ゾウガメとミドリガメくらいの違いはある。だけれども、僕はそれに慣れてよかったと思う。理由はたった一つ。

ホームポジションから手を動かさなくてすむのがすげえ楽

みんなここの部分をあまり強調してくれないからいかん。この理由がなければわざわざ慣れないキーボードショートカットを使おうと思うわけがないのだ。

だからお前も使ってみろよ

というわけで、とりあえずここのQuickTourを参考に見よう見まねで導入する。めんどくさいけどまあ、しゃあない。ミニバッファとかモードのところくらいまでは我慢して読んでほしい。
http://xyzzy.s53.xrea.com/wiki/
そしたら次はキーバインドだ。

というわけでがんばってキーバインドを覚えよう

まずはここにすごくいいことが書いてある。「挫折した人の為の為のxyzzy」だけでも一通り読んでおくといい。
http://himadatanode.qp.land.to/pukiwiki/index.php?XyzzyApocrypha
実は僕も昔一回挫折したことがある。だからこのことは本当に骨身に沁みて分かる。がんばって慣れよう。3日もかからんから。

というわけで「文章を書く途中で手をホームポジションの外に移動しないことを目指すための最低限のキーバインド」。これから君たちはカーソルキーを捨てる。BackspaceもDeleteも捨てる。HomeもEndも捨てる。すべてCtrlキーを使うのだ。*1

C-b
左移動 (backwardだ)
C-f
右移動 (forwardだ)
C-p
前の行へ (previousだ)
C-n
次の行へ (nextだ)
C-a
行の先頭へ (Homeと同じやね)
C-e
行の最後へ (Endと同じやね)
C-h
Backspace
C-d
Delete
C-m
Enter ()
C-\
元に戻す
C-x C-s
上書き保存
C-g
ミニバッファが開いたりなんかへんな事になったら押す。

はじめのうち、これ以外の操作はメニューバーからやれ!どうせ今までだってそうしてきただろう!絶対にカーソルキーとか使うんじゃないぞ!絶対にだ!ミニバッファも最初は使わなくていい!な!

そして、コピペについて。

これから君たちは「選択」を捨てる。「リージョン」を使うのだ。今はこの違いをあまり気にする必要はない。以下のことをやってみよう、
1. ツール→共通設定→さまざま、にある「削除バッファとクリップボードを中途半端に同期する」にチェックを入れておく。
2. 選択開始は"C-SPC"、そしておもむろにカーソルを移動。(ここで反転しないことに動揺しない。)選択範囲の終わりに着いたら以下の動作を行う。

C-w
切り取り
M-w
コピー

3. 貼り付けたいところに移動して以下の操作を行う。

C-y
貼り付け (同上)

これでがんばってコピペを実践すべし。

2,3日して慣れてきたら、やはり上記wikiの「XyzzyKeyGuide」や「挫折しない為のxyzzy」などがすごく参考になるからこれを使って少しずつ出来ることを増やしていけばいいと思う。(僕もお世話になりました。id:himadatanode氏ありがとう。)

howmを使う

これのためだけにxyzzy使っていいと思う。
(あとでかく)

ついでに特にお世話になる拡張lispの一覧を

katex-mode
clickable-uri
howm
outline-tree2
info-modoki-mode
minor-view-mode *2
migemo *3
complete+ *4
surround
iswitchb *5

global-set-keyのいちぶ

;;アンドゥをC-/に
(global-set-key #\C-/ 'undo)

;;バッファの最初と最後の移動をもっと楽に
(global-set-key '(#\ESC #\,) 'beginning-of-buffer)
(global-set-key '(#\ESC #\.) 'end-of-buffer)

;;カーソルキーをかっこよく使う、
(setq *next-buffer-in-tab-order* t)
(global-set-key #\Right 'next-buffer)
(global-set-key #\Left 'previous-buffer)
(global-set-key #\Up 'move-previous-window)
(global-set-key #\Down 'other-window)

;;ウィンドウの分割とか
(global-set-key #\C-Right 'split-window-vertically)
(global-set-key #\C-Left 'delete-other-windows)
(global-set-key #\C-Up 'delete-other-windows)
(global-set-key #\C-Down 'split-window)

;;ウィンドウを広げたり狭めたり
(global-set-key #\S-Right 'enlarge-window-horizontally)
(global-set-key #\S-Left 'shrink-window-horizontally)
(global-set-key #\S-Up 'shrink-window)
(global-set-key #\S-Down 'enlarge-window)

;;dabbrevを簡単に
(require "dabbrev")
(global-set-key #\C-\, 'dabbrev-expand)
(global-set-key #\C-. 'dabbrev-popup)
(setq *popup-completion-list-default* :always)

;;他のウィンドウの操作
(global-set-key #\C-\: 'scroll-down-other-window)
(global-set-key #\C-] 'scroll-up-other-window)

;;いまのウィンドウを閉じちゃう
(global-set-key #\C-Delete 'kill-selected-buffer)

*1:ちなみに、このテのemacs系のエディタを使うときにはCtrlキーをCapsLockのところに割り当てるってのが普通らしいんだけど(検索すればやり方がざくざく出てくる。僕もそうしている。)それがアレだったら左小指の付け根でCtrlを押すという裏技もあるらしいので、環境を変えすぎるのはやだなーという人は試してみるといいと思う。僕はいちどやってったことがあるけれど案外悪くなかった。

*2:C-;にtoggle-read-onlyをバインドし、このとき背景色も変更するようにちょっといじってる。これ最高。

*3:filer+migemoも使うとなおよい

*4:スキップマッチングが便利

*5:便利そうなんだけどelisp.lの関係なのかkatex-modeのタイプセットとぶつかる。どうしたらいいんだろうか。