sci

最果て風呂

Emacs に関するメモ書き

Emacs の menu bar(2012.06.26)

自分では使うことはないのだけど、メニューバーからコマンドを実行できると便利だということで実装してみた。実装した時にメモを書いてなかったので、忘れないうちに今メモをする。

最初はリファレンスマニュアルを読みながらやってみたのだけど、メニューの順番が逆になったりしてどうも上手くいかない。調べてみると easymenu というものがあるそうで、これを使うと簡単に実装できるそうだ。

テンプレート的なものは下記。モードに関係なく常に使うものと考えてグローバルマップを使った。マイナーモードなどの時にだけ現れるようにするには global-map をそのモードの名前にすれば良いらしい。

(require 'easymenu)                  ;easymenu を使うよ
(defvar homura-menu-spec             ;メニューの内容を定義
  '("Homura"                         ;メニューバーのトップに表示される文字列
    ["Replace madoka"                ;コマンドの説明
     repl-madoka t]                  ;実際のコマンド名。t は常に表示
    ["Replace madoka (in region)"
     repl-madoka-region mark-active] ;mard-active は文字列が選択されると表示
    "----"                           ;区切り線
    ["マミさんおきかえ"
     repl-mami t]
    ["マミさんおきかえ (選択範囲)"
     repl-mami-region mark-active]
    "----"
    ("kyu-be"                        ;サブメニューの名前
     ["Check keiyaku"                ;その内容
      chk-kyu t])
    ))

    (easy-menu-define homura-menu global-map "homura" homura-menu-spec)
    ;上で defvar した内容を実際に表示させる部分

(add-submenu nil homura-menu "Help")
;単に表示させるとメニューバーの一番左側に表示されてしまう。このコマンドで
;Help メニューの左側(Tools の右側)に表示させることが出来る。
;ただしこれはグローバルなので、メジャーモードやマイナーモードのメニューが
;表示されると、Help との間にそれらのメニューが割り込まれる。
;だから常に Help の左側に表示されるわけではない。

キーマップが設定されていると C-x C-c のような文字列が自動的に付加される。日本語も問題なく使えた。最後のメニューの場所を指定する方法は 2ch に書いてあった。UNIX 板とかは無くさないで欲しいなぁ。

emacs-w3m にまつわる etc(2012.06.25)

seijiseikana-ryakuji-region では問題が出ず、seijiseikana-seiji-region をするとエラーになっていた件が解決した。

WindowsEmacs 23 および 24 では問題が出ず、MacOSXEmacs 22 および 23 で問題が出ていた。その際に表示されるエラーは下記の通り。

Args out of range: #&256"^@^@^@^@^@^@^@^@^@^@", 21578

同じ Emacs 23 で挙動が異なっているので Emacs のバージョンが問題なのではない。また、MacOSX 上でも emacs -q で起動し、seijiseikana.el を eval した状態では問題が出ていなかったので、設定ファイルに問題があるのだと見当を付けた。

seijiseikana-ryakuji-region と seijiseikana-seiji-region の違いは、後者では seijiseikana-replace-string-by-alist を呼んでいる点。どうやら sgml-mode に依存する処理の部分に解決の糸口がりそうだ。

mewnavi2ch などを外しながら再起動を繰り返し、やっと emacs-w3m-1.4.4 が問題であることがわかった。これ 2005 年製だ。Carbon Emacs は 22 なのでこのバージョンで問題がないのだが、23 や 24 では開発版を使わないと問題があるそうな。

そういえば Windows では w3m が使えないので emacs-w3m を入れていなかったな。というか最近では素の w3m をターミナルで使っているので Emacs から使ってない。

ということなので、開発版を取得することにした。tarball は用意されておらず、CVS で取得せよとのこと。cvs コマンドは初めて使ったのではないだろうか?

http://emacs-w3m.namazu.orgに書かれている通りに作業をする。

% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot login
CVS password: # No password is set.  Just hit Enter/Return key.
% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co emacs-w3m

これでローカルにダウンロードされるので、ロードパスを通したディレクトリに放り込む(古い方は削除)。コンパイルなどしないで el のまま使う主義なので...。Emacs を再起動して問題が無いことを確認する。

ぬぉ〜、起動しない。w3m-load.el が無いだと...。結局 make することに。

autoconf
./configure
make (w3m-load.el が生成される。make install はしない)

これで万事 OK かと思われたのだが、今度は下記のようなエラーに。

Loading w3m...
and: `/emacs-w3m/w3m.elc' was compiled for Emacs 23 or later

結局、elc ファイルを削除して Carbon Emacs 22 で使えるようになった。

そういえば半年以上も前のことになるけど、twittering-mode でも問題が出ていて、emacs-w3m に含まれている xml.el を削除したら解決したのだった。そのようなわけで twittering-mode でも問題がないか確認してみる...どうやら投稿も問題が無いみたい。

いろいろあって All Green になった。結果的には emacs-w3m を最新のものに入れ替えただけなのだけど、この結論にたどりつくまでに相当の時間がかかってしまった(一週間といったところ)。できるだけ新しいものを使いましょうということですね。

カーソル行の文字数をモードラインに表示(2012.06.15)

カーソルのある行の先頭と末尾を取得する関数があることを知った。それぞれ「先頭: (point-at-eol)、末尾: (point-at-bol)」となっている。返り値は integer なので、これを使えば引き算で文字数計算できる。日本語のマルチバイトも大丈夫だった。これをモードラインに常に表示させるにはどうすれば良いのだろうか?

'default-mode-line-format に add-to-list で追加してやれば良いそうだ。これ、左側に表示されるようになるのだけど、桁が増えるとモードラインにある他の文字が移動してチカチカしてしまう。そのため format で 3 桁に固定することによって回避した。本当は右側に置きたかったのだけど、モードを複数読み込んでいたりするとウインドウから追い出されてしまうので、左側のままとした。

Emacs を再起動するとちゃんと左側に表示されているのだけど、後から起動する SKK の方がさらに左側に来てしまう。list に追加するのが後だからそうなっちゃうのか。これは仕方ないね。そこまで拘ってもしかたない。

わざわざ defun しなくてもそのまま入れてしまえば良いのだった。

(add-to-list 'default-mode-line-format
             '(:eval (format "-[%3d]" (- (point-at-eol) (point-at-bol)))))

もう少し調べてみると、今の画面で表示されている部分がバッファ全体の何 % なのかを表示する部分を、下記のように上書きしてしまえば良いことがわかった。

(setcar mode-line-position
        '(:eval (format "[%3d] %d" (- (point-at-eol) (point-at-bol))
                        (count-lines (point-max) (point-min)))))

これなら SKK のモード表示によるズレがなくなるので良いし、ポジションという情報が真ん中に集るので良い感じ。実際、パーセンテージで表示されても自分にとっては役に立っていなかったからね。

リージョン選択時に色付け(2012.06.07)

Carbon Emacs 22 だけど、Ctrl + space, space としてからカーソルを移動するとリージョン部分が青く色付けされることがわかった。疲れていたので長押しをしていたのだと思うけど、10 年使って気付くというのも妙に感慨深いものがある。

ミニバッファには下記のように表示されるので、機能としては標準で持っているということなんだね。

Mark set
Transient-mark-mode temporarily enabled

Windows 版は space が 1 回でも色付けされているので、最初からそういう設定にしているんだろうか。

と思っていたら、Version 23 からそうなってるみたいね。