mode-line めぬー のカスタマイズ


xemacs の マニュアル (info) を見ると, 窓の上の方に出て来るメニューのカスタマイズは 掲載されているのだが, modeline をクリックして出て来るメニューの カスタマイズは載ってない. modeline 右クリックで出て来るメニューは, 触る場所によって, いろいろ異なる 機能が出て来てなかなか便利なのだ. こいつをもうちょっと強化できないものか? そこで, ちょっと捜してみた.

modeline-menuという変数がある. これを見ると,

が書いてある array のリストになっている. これを好きなように setq (あるいは aset) すればいいようだ. そこで, 次のようにして menu-bar を toggle するのと, 新しい frame を開くのを 追加してみた.

(setq modeline-menu
      (nconc
       modeline-menu
       '(
         ["New Frame" make-frame t]
         ["Show Menu Bar"
          menu-bar-mode 
          :style toggle
          :selected (specifier-instance menubar-visible-p)]
	 )))
  
最後に追加したアイテムである, メニューバーを toggle する項目に関する設定を説明すると, 順に 上記 menu-bar-mode という関数は XEmacs-21 には無くて, なんとなく GNU-Emacs-19.x の振舞に 合わせてわしが勝手に作った関数. こんな感じ. ".emacs" に書いてあって, 起動時に読み込まれるように なっています.
(defun menu-bar-mode (&optional flag)
  "toggle visibility of manubar"
  (interactive)
  (if (null flag)
      (if (specifier-instance menubar-visible-p)
	  (set-specifier menubar-visible-p nil)
	(set-specifier menubar-visible-p t))
    (set-specifier menubar-visible-p t)))

でたらめなんすけどね. 動作としては, 引数が "t" ならメニューバーを出し, nil とか 無しなら トグルする, というものです.

modeline は, クリックする場所によって出るメニューやらが 違うわけで, 例えばバッファ名のところではバッファ一覧などが出る. modeline 一般のメニューは一応カスタマイズ可能な実装になっているが, バッファ名をクリックして出て来るメニューは, あんまりそうなってない. もっとも, 当り前だが関数ごと書き変えればカスタマイズは可能だ. というわけで, こっちにも 当該バッファを閉じるのを追加してみたが, まあ, ちょっとナニかも. まあそういうわけで, 今回の話については, 詳しくは modeline.el 及び, XEmacs 付属 info の Lispref > Menu > Menu Format を見てくれっす.

ただね, ワシとしてはめぬーなインターフェースってあんまり好かんのです. 違うものを click したりするし, 長いと画面に収まらんし 順に捜して行くのはウザいし, 階層になってたらどこにあったか忘れるし. たまに使うものが目立たないメニューに入ってるのは, 憶える手間が無くて悪くないと思いますが. だから, メニューバーは普段は引っ込めてあります. 古いマシンで画面も狭いしね. それでも, ファイルマネージャからファイルを閲覧するみたいな用途にも emacs が使えるというのは悪くない. 何でもそうだが, キーボードだけでなく マウスも使えると便利だねえ.

それに, 複数のウィンドウ (Emacsen では frame という) やら メニューやらの GUI 周りは, たまに挙動不審で, この辺のカスタマイズは わりと楽しめるかも.

XEmacs の batch モード

多分 GNU-Emacs でもだいたい同じだと思いますが, 窓とか出さずに, コマンドから評価させたい LISP式を与えてナニさせる ことができるようになっています.

info とかみるとけっこう丁寧に解説してあるんで, 私がええかげんなことを書くまでもないのですが, だいたいコマンドの書式はこんな感じ.

emacs -batch -eval LISP 式

コマンド自体は簡単ですわ. ところが, LISP式の与え方は, メタキャラクタ絡みでわりとややこしい. 基本的に, メタキャラクタは全部 "\" でエスケープした方がいいっす. つまり, シェルならスペースとか, カッコとか引用とかダブルクォートとかです.

というのは, こういうのを使いたい時というのは, LISP 式の中に シェル変数なんかを登場させたいわけっす. あるいは, Makefile 中で変数を使いたいわけっすよ. 複数のファイルを byte-compile するとかね. ところが, LISP 式をそのまま引用符で括ったら, もう, その中でそれ以上引用符が使えない. つまり, 文字列とかが LISP 式の中で使えない. だから, 引用符号は shell に使わせずに "\" で エスケープして emacs に送り込もう. こうして, 各種変数がちゃんと展開されて LISP 式が完成された状態で emacs に送られるようにしよう.

Buffer-menu-mode

沢山バッファを開いてあれこれやってて, ひと区切りついて要らなくなったバッファがいっぱい出来たときに, バッファメニューで "d" でマークして "x" で まとめて消す, というのを私はわりと使います.

ところが, gnuclient で開いたファイルについては, これが いちいち消すときに「hoge しますか?」と訊いて来て極めてウザい. 普通に開いたバッファと同様に, ズバっと抹殺して欲しい!

と思った人は 関数 Buffer-menu-execute をこういう風に改造しましょう. パッチになっていますが, 多分パッチとしては使えなくて, こういうふうに改造した関数を ".emacs" に書いておくことになるのかな?

emacs とケソキュウ

原稿書くのにしか使ってませんが, まあ, それでも十分役立ってますが... 新しく作ってる数理システムの計算なんか, 結局人がやった方が速いもんなあ. つうか, プログラム作れる程判ってりゃ, もう研究は終わってるとも言える. 定理かどうかを判定して, 定理なら証明を付けてくれる, というのは 夢じゃのう.
記事リストへ