Emacs 風キーバインド

先日、久しぶりに勉強会のようなところへ出かけてみました。そこで会の主要なテーマとは直接関係のない Mac のキーバインドの話を聞きました。私は Mac にはほとんど触れたことがないので知りませんでしたが、おやこれは「Emacs風キーバインド」ではないかと思いました。起源はもう忘れられているかもしれません。

さて、そこで Debian をデスクトップで使っているという自分の環境を思い返してみました。エディターは主に Emacs なので、いろいろなところを「Emacs風キーバインド」にしたいと思いながら、ウィンドウマネージャーを変更したりブラウザーがバージョンアップして拡張機能が効かなくなっていたり、と、いつの間にか不便な状態になっていて、まあそのうち、と思いながら過ごしていたのです。

これを機会に、ちょっと探してみました。ほとんど自分用メモですが、Mac から Linux に乗り換えたい人への情報になるかもしれません。

Xfce4

以前 Gnome を使っていた頃はどこかで設定していたのですが、数年前に Xfce4 に切り替えてから、どうすればいいのか調べてもおらず、そのままになっていました。

「設定」→「設定エディター」で、「チャネル」の一番下の xsettings を開き、Gtk のグループの中のプロパティ KeyThemeName の値に Emacs と入力します。

これで、Xfce4 上で開く多くのアプリケーションで、C-aC-eC-k などが有効になりました。ただし C-y で取り出せるバッファが C-k と連動していないところが Emacs や次の bash と違う挙動で、ときどき混乱してしまいます。

Bash

ターミナル内のシェル は bash です。これは元々「Emacs風キーバインド」のようで、入力行で C-aC-eC-k が使えて、C-k したものを C-y で貼り付けることができます。C-pC-n で履歴をたどれるなど、かなり多くのキーバインドが使えます

Firefox

以前は、拡張機能でそういうのがあったのですが、ブラウザー本体のバージョンアップで使えなくなっていました。

上述の Xfce4 の設定で、いくらかのキーが使えるようになりました。しかし、上下に動かしたいときについ C-pC-n と打って「印刷」「新しいウィンドウを開く」になってしまったり、ページ内検索のつもりでつい C-s と打って「ファイルに保存」になってしまうことがしょっちゅうなので、この辺りを補ってくれるものはないかなあと思っています。

GhostText

Firefox の入力欄 (textarea) で、好きな外部エディターを使えます。以前は別の拡張機能を使っていたのですが、やはりブラウザー本体のバージョンアップで使えなくなってしまい、また別の拡張機能も WordPress の新しい入力画面 Gutenberg との相性が悪そうなので、現在は GhostText を使っています[1]

Emacs 側でも準備が必要で、atomic-chrome パッケージをインストールして、設定しておきます。

  1. GhostText という拡張機能は Firefox にも Chrome にもあり、元々 Emacs 以外のエディターを使うものだったので、それらのどの組み合わせでも使えます。

Mew のサマリに表示される本文の部分が変わった

Web のフォームによって送られる次のような書式のメールをしょっちゅう受け取ります。冒頭から

[氏名] ...
[よみかな] ...
[郵便番号] ...
[住所] ...
     ... 

のように、 [ ] ではじまる行があります(「氏名」や「住所」というのはあくまで例です)。

メールリーダーには Mew を使っているのですが、そのサマリ表示に上記の部分がばっさりカットされて、どうでもいいところからの本文の一部が現れるようになりました。

さて検索してみると、“[” ではじまる行を引用部分とみなし無視する、という変更が行われたようです。自分の手元でこのような変化がつい最近起こったのは Debian のパッケージの更新の時期によるものでしょう。

この部分(mew-scan.el の mew-regex-ignore-scan-body-list 定義部分)を元に戻しながら、~/.mew.el に setq

(setq mew-regex-ignore-scan-body-list
  '("^[ \t]*$"
    "^[ \t]*[-a-zA-Z0-9]+: "
;;    "^[ \t]*[[>:|#;/_}]" ;; https://github.com/kazu-yamamoto/Mew/commit/98d4fd7be3216792824e2c737006921b3b49b4b0 で加えられた変更
    "^[ \t]*[>:|#;/_}]" ;; を戻す。すなわち、"[" で始まる行を引用とはみなさない
    "^[ \t]*\\w+\\(['._-]+\\w+\\)*>"
    "^[ \t]*[[</(.-]+ *\\(snip\\|\\.\\.\\)"
    "^   "
    "^--"
    "^- --"
    "^=2D"
    "^.\\{1,100\\}\\(:\\|;\\|/\\)[ \t]*$"
    "^.\\{1,100\\}\\(wrote\\|writes?\\|said\\|says?\\)[^.!\n]?[ \t]*$"
    "^[ \t]*\\(On\\|At\\) .*[^.! \t\n][ \t]*$"
    "^[ \t]*In \\(message\\|article\\|mail\\|news\\|<\\|\"\\|\\[\\|(\\)"))

と書くことで、以前の状態にすることができました。

psvn でのパスワードの入力

自分のためのメモ。 Emacs の subversion のためのインターフェース psvn.el の先頭のほうで、コメントの形の FAQ に書かれていた。
;; Q3: How do I enter a username and password?
;; A3: In the *svn-status* buffer press "s", switch to the
;;     *svn-process* buffer and press enter. You will be prompted for
;;     username and password.

Emacs で subversion のコミットログ

日本語入力システムにWnn7を使うために環境変数 LANG を ja_JP.eucJP にしなければならないのだが、いくつか問題が出てきた。 そのうちのひとつ、emacs で subversion のコミットをする際のログを日本語で書こうとするとエラーを起こす。しばらく放っておいたのだが、やはりログは日本語で書いたほうがささっと書ける[1]。 .emacs に [lisp] (add-hook ‘svn-log-edit-mode-hook ‘(lambda () (set-buffer-file-coding-system ‘euc-jp))) [/lisp] を加えて解決した。
  1. 諸説あるが、何しろここでは自分ひとりで使っているリポジトリのものなので自分流である。

emacs22 と wnn7-elisp パッケージ

Debian sid に emacs22 (とその GTK版emacs22-gtk) が降りてきた。さっそく入れようと思ったがいくつかのパッケージが対応していない。特に wnn7-elisp は Debian 公式のものではなく、商用(しかも5,6年も前)なので対応パッケージが出るとも思われない。自分で修正することとした。
--- wnn7-elisp.orig/DEBIAN/control	2002-05-22 18:42:05.000000000 +0900
+++ wnn7-elisp/DEBIAN/control	2007-07-09 15:02:36.000000000 +0900
@@ -1,13 +1,13 @@
 Priority: extra
 Architecture: all
-Depends: emacs20 | emacs20-dl | xemacs21-mule | xemacs21-mule-canna-wnn
+Depends: emacs22 | emacs-snapshot | emacs21 | emacs20 | emacs20-dl | xemacs21-mule | xemacs21-mule-canna-wnn
 Installed-Size: 587
 Maintainer: OMRON SOFTWARE Co.,Ltd. <wnn-info@omronsoft.co.jp>
 Description: A package of Japanese input method 'Wnn7' elisp client.
diff -u -r wnn7-elisp.orig/usr/lib/emacsen-common/packages/install/wnn7-elisp wnn7-elisp/usr/lib/emacsen-common/packages/install/wnn7-elisp
--- wnn7-elisp.orig/usr/lib/emacsen-common/packages/install/wnn7-elisp	2002-05-22 18:41:59.000000000 +0900
+++ wnn7-elisp/usr/lib/emacsen-common/packages/install/wnn7-elisp	2007-07-10 21:50:47.818091867 +0900
@@ -37,7 +37,7 @@
     emacs)
     ;;
 
-    emacs20|xemacs21)
+    emacs22|emacs-snapshot|emacs21|emacs20|xemacs21)
     install -m 755 -d ${ELCDIR}
     (cd ${ELDIR}
 
diff -u -r wnn7-elisp.orig/usr/lib/emacsen-common/packages/remove/wnn7-elisp wnn7-elisp/usr/lib/emacsen-common/packages/remove/wnn7-elisp
--- wnn7-elisp.orig/usr/lib/emacsen-common/packages/remove/wnn7-elisp	2002-05-22 18:41:59.000000000 +0900
+++ wnn7-elisp/usr/lib/emacsen-common/packages/remove/wnn7-elisp	2007-07-10 21:51:17.472192301 +0900
@@ -10,7 +10,7 @@
 case "${FLAVOR}" in
     emacs)
     ;;
-    emacs20|xemacs21)
+    emacs22|emacs-snapshot|emacs21|emacs20|xemacs21)
     echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
     rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
     rm -f ${STARTDIR}/50${STARTFILE}*;
wnn7-elisp の他にも auctex, gnus も同様に修正すればいますぐ使える。これらは公式パッケージなのでしばらく待てば emacs22 対応版が出るだろう。

subversion

ようやく CVSからsubversionに移行した。自分一人の環境だし、滅多にコードも書かないので何のために?というところだが、まあいろいろとファイルの管理などを。出遅れた分あちこちに情報があるので割とスムーズに移行できそうだ。 しかしいくつかの不満はある(使い手が慣れていないからかもしれないが)。ひとつは、パーミッションが保存されないこと。CVSでは作業スペースでパーミッションを変更しておいた状態で update しても(内容はupdateされても)パーミッションが変わることはなかった。subversionでは、いったんファイルを消してから新たに作ったかのように、元のパーミッション(その時点の umaskにしたがって)になってしまう。group の変更も元に戻ってしまう。webページのように、webサーバから見えるようにしてチェックしつつ作業をしている場面では面倒くさい。tarを使うときのようにパーミッションなどが保存されるといいのだが。 もうひとつの問題は日本語の文字化け。CVSより格段によくなっているけれども。 まず、ここの環境では /etc/environment で LANG=ja_JP.EUC-JP となっているしその中の自分の環境でも LANG=ja_JP.EUC-JP としている。普段使いのエディタ Emacs も (set-default-coding-systems ‘euc-japan) だ。そこで /var/lib/trac/(リポジトリ)/conf/trac.ini で
  [trac]
  default_charset = euc-jp
とした。 ファイルの中身がeuc-jpなら何の問題もないのだが、だんだんutf-8のものも出てきた。するとTracで閲覧するときに化けてしまう。これは TracJaの説明にもあるように、
Subversion リポジトリに格納しているファイルのエンコードが、ファイルごとに違う場合、 Subversion 側で各ファイルの svn:mime-types 属性にcharset を正しく設定することで解消します (trac-0.8.2 以降):
で解決した。phpだからといって mime-typeを application/phpとするのはやりすぎで、閲覧することを考えると text/* にしておくのが吉。text/x-php としてみた。text/plain がもっとも無難だとは思うが。 Emacsでは[[psvn.elを使う。編集中に差分を見たいとき = (差分)とすると、euc-jpのバッファにutf-8を表示しようとして文字化けしてしまう。E (Ediff)だと化けずに表示できるので、こちらで見ることにしよう。