人気ブログランキング | 話題のタグを見る

[lisp] emacsのtoggle、xyzzyのプレフィクスコマンド

emacs と xyzzy の設定とかの話を2件。

[emacs] togge-read-only を設定


Linux 上で、バージョン管理に CVS を使っている。

emacs でファイルを開いて
read-only にするつもりで C-x C-q と入力すると、
vc-toggle-read-only が動いてしまう。
これはただの toggle ではなくて、
CVS サーバ上のファイルと差分がある時は、
commit してねってな感じで、
更新の説明を入れろと言われる。

私は commit や update は、
間違えないように、コマンドラインから実行することにしているので、
ただ read-only にしてくれれば良いんだってば!という時は、
こういうのはただ邪魔なだけ。
M-x toggle-read-only とするのも面倒くさい。

なわけで、C-x C-q を普通に read-only にしたいなら、
以下を、.emacs に書いておくと良いよ。
(global-set-key "¥C-x¥C-q" 'toggle-read-only)


xyzzy でプレフィクスコマンドを設定


emacs では、C-x a がプレフィクスコマンドになっていて、
私はこれに色々な関数をバインドしている。
xyzzy では、C-x a は set-variable がバインドされているのだが、
同じキーアサインで動かせるようにしたい。
それには、C-x a をプレフィクスコマンドにしなくては。

意味のわからない方のために書きますと、
emacs では C-x a の次にもう1つキーを押して、
コマンドを実行できるようになっていますが、
xyzzy では、C-x a でコマンドが完結しています。
なので、xyzzy で C-x a に割り振ってあるコマンドをつぶして、
C-x a プラス1でコマンドを実行できるようにしたい、という話。

というわけで、C-x a をプレフィクスコマンドにする方法。
C-x a に新しく作ったキーマップを入れちゃう。
元の C-x a set-variable は C-x a a に入れ直す。

キーマップの作り方はあちこちに出ているんだけど、
新規に major-mode や minor-mode を作成するときの例ばかり。
現在あるプレフィクスの中に、さらにプレフィクスを指定するってのは、
見当たらなかったので、メモってみる。
やり方は以下。
1: (defvar my-xa-map (make-keymap))
2: (setf (symbol-function 'my-xa-prefix) my-xa-map)
3: (define-key ctl-x-map #¥a 'my-xa-prefix)
4: (define-key my-xa-map #¥a 'set-variable)
5: (define-key my-xa-map #¥l 'goto-line)

1: キーマップのベクターをとりあえず新規作成
  my-xa-map という名前にしてみる
2: 1で作ったキーマップを、my-xa-prefix という関数の中身に入れる
  この関数も私が勝手につくったもの
3: C-x a が押されたら、2で作った関数が呼ばれるようにする
  C-x のキーマップであるところの ctl-x-map は既存のもの
  (C-x のキーアサインは、ctl-x-map に入っているので、
   この中の a のアサインを変えると、C-x a が変わる)
4: 元々 C-x a にアサインされていた set-variable を C-x a a に入れる
5: C-x a l が押されたら goto-line 関数が呼ばれるようにする

複数ストロークは
(global-set-key '(#¥C-x #¥r #¥w) 'copy-rectangle)

こんな風にも設定できるんだけど、
上のように指定すると、
キーバインドの入れ子の様子がわかって、おもしろいなーと思って。

define-key のところで、
(define-key ed::my-xa-map #¥a 'set-variable)

こんな感じにパッケージ指定をしておくべきなのかな?
そのあたりがまだよくわからない。

goto-line はよく使うんですよ。
デバッガに「○行目がおかしいよー」と言われたときに、
すぐその行に飛びたいでしょ。
キーバインドしておくと、
いちいち M-x goto-line って打たなくても良いんで、
ラクチンです。

vi は苦手だから普段使わないんだけど、
考えてみると、こういうところは vi は便利にできてるなぁ。
さすが。
by xiaoxia | 2007-09-18 18:08 | プログラム言語
<< [perl] GD モジュール... [java] JNI移植 wi... >>