Mule/Meadow Tips

Tipsというよりインストールメモですね.

私の使っている Emacs のバージョンは 19 と古いので,最近の新しい Emacs にはお役に立てないかも知れません.また,かつては Meadow をよく使っていましたので記事が多いですが,最近はほとんど使っていません.

Index

flyspell

[010808] 普段は文章を mule で書いて,英文を書く時だけ MS Word 使うという方は多いと思います.そういう人はたいてい,mule にも逐次英文チェッカがあったらいいのに...と思っていたりします.そういうものを見つけてインストールしましたので報告します.
  1. flyspell.el を入手します.ここにあります.Meadow ユーザの人は,もとから持っていますので入りません.
  2. ispell はインストールされていますか? なければ,インストールして下さい(ダウンロードメモはこちら).
  3. .emacs に
    (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checking" t)
    
    と書きます.さらに,TeX のコマンドをいちいちチェックするなーといいたい人は
    (setq ispell-parser 'tex)
    
    も書きます.
mule を起動して,M-x flyspell-mode にします.英文を書いてみましょう.間違えると,即座に赤線が引かれます.中央クリックすると,修正候補や辞書登録などのメニューが出て来ます.

さすがに3単現のsとか受動態とかはチェックしてくれませんので,最終的には Word のほうが優秀ですが,M-x ispell よりは気軽に使えると思います.

ブラケットチェッカ

Meadow の場合,
(show-paren-mode t)
でよし.

あるいは

(defun match-paren (arg)
  "Go to the matching parenthesis if on parenthesis otherwise insert %."
  (interactive "p")
  (cond 
    ((looking-at "[([{]") (forward-sexp 1) (backward-char))
    ((looking-at "[])}]") (forward-char) (backward-sexp 1))
    (t (self-insert-command (or arg 1)))))
(global-set-key "%" 'match-paren)

BDF Fonts for Meadow

[010807] BDF フォントというのは X Window で使われているフォントです.これを Meadow で使えるようにします.
ここも参照.
  1. intlfonts をダウンロードする.場所は Meadow の dot.emacs.ja に書いてある.c:/Meadow/intlfonts-1.2 以下に展開.
  2. .emacs のコメントアウトを外す.
  3. Meadow を再起動して,Shift-左クリック でフォントを選ぶ.

BDF font の行間を無理やり制御する

[010807] BDF フォントに限らず,Meadow はどうも行間がつまっていて読みにくいのですが,従来の Mule と違って line-space で制御できません.
そこで,
ここに出ていた手法で開けます.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; フォント設定用の補助関数

(defun my-define-font (prefix font-param logfont-charset-list)
  (let (charset-font-list logfont-list charset-alist)
    (while logfont-charset-list
      (setq logfont-list (nth 0 (car logfont-charset-list)))
      (setq charset-alist (nth 1 (car logfont-charset-list)))
      (while charset-alist
        (let* ((charset (caar charset-alist))
               (encoding (cdar charset-alist))
               (font-name (concat prefix (symbol-name charset))))
          (create-font-from-logfont-list font-name
                                         logfont-list encoding font-param)
          (setq charset-font-list
                (cons (cons charset font-name) charset-font-list)))
        (setq charset-alist (cdr charset-alist)))
      (setq logfont-charset-list (cdr logfont-charset-list)))
    charset-font-list))

;;; bdf フォントのパス
(let ((bdf-dir "c:/Meadow/intlfonts-1.2/")
      charset-font-list logfont-charset-list font-param)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TrueType16 フォントの設定

  (setq font-param
        '((overhang     . 0)
          (base         . 14)
          (height       . 16)
          (width        . 8)))
  ;; 論理フォントと、対応する文字集合のリスト
  (setq logfont-charset-list
	`((((bdf-font ,(concat bdf-dir "European/lt1-16-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16b-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16i-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16bi-etl.bdf")))
	   ;; 文字集合と、フォントのコーディング方法の連想リスト
           ((ascii              . 0)
            (latin-iso8859-1    . 1)))
	  ;; 日本語フォント
          (((w32-logfont "MSゴシック" 0 -16 400 0 nil nil nil 128 1 3 49)
	    (w32-logfont "MSゴシック" 0 -16 700 0 nil nil nil 128 1 3 49)
            (w32-logfont "MSゴシック" 0 -16 400 0 t nil nil 128 1 3 49)
            (w32-logfont "MSゴシック" 0 -16 700 0 t nil nil 128 1 3 49))
           ((latin-jisx0201     . 0)
            (katakana-jisx0201  . 4)
            (japanese-jisx0208  . 4)))))

  ;; フォントの作成(結果は文字集合と、作成したフォントの連想リスト)
  (setq charset-font-list
        (my-define-font "w16-" font-param logfont-charset-list))

  ;; ビットマップフォントの作成(x-face, Gnus 用)
  (let ((font-file (expand-file-name "bmp16-etl.bdf" bdf-dir)))
    (when (and (locate-library "bitmap") (file-exists-p font-file))
      (require 'bitmap)
      (setq logfont-charset-list
            `((((bdf-font ,font-file))
               ((bitmap . 0)))))
      (setq charset-font-list
            (append (my-define-font "bdf16-" font-param logfont-charset-list)
                    charset-font-list))))

  ;; フォントセットの作成
  (new-fontset "w16-fontset" charset-font-list)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 山尾さんの設定

  (setq font-param
	'((overhang     . 0)
	  (base         . 14)
	  (height       . 17)
	  (width        . 8)))
  ;; 英字フォントと、対応する文字集合のリスト
  (setq logfont-charset-list
	`((((bdf-font ,(concat bdf-dir "European/lt1-16-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16b-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16i-etl.bdf"))
	    (bdf-font ,(concat bdf-dir "European/lt1-16bi-etl.bdf")))
	   ;; 文字集合と、フォントのコーディング方法の連想リスト
	   ((ascii              . 0)
	    (latin-jisx0201     . 0)))

	  ;; 日本語フォントと、対応する文字集合のリスト
	  (((w32-logfont "MSP ゴシック" 0 -14 400 0 nil nil nil 128 1 3 49)
	    (w32-logfont "MSP ゴシック" 0 -14 700 0 nil nil nil 128 1 3 49)
	    (w32-logfont "MSP 明朝"     0 -14 400 0 nil nil nil 128 1 3 17)
	    (w32-logfont "MSP 明朝"     0 -14 700 0 nil nil nil 128 1 3 17))
	   ;; 文字集合と、フォントのコーディング方法の連想リスト
	   ((latin-iso8859-1    . 1)
	    (katakana-jisx0201  . 4)
	    (japanese-jisx0208  . 4)))))

  ;; フォントの作成(結果は文字集合と、作成したフォントの連想リスト)
  (setq charset-font-list
	(my-define-font "yamao-" font-param logfont-charset-list))

  ;; ビットマップフォントの作成(x-face, Gnus 用)
  (let ((font "bdf16-bitmap"))
    (if (member font (w32-font-list))
 	(setq charset-font-list
 	      (cons (cons 'bitmap font) charset-font-list))))

  ;; fontset の作成
  (new-fontset "yamao-fontset" charset-font-list)

;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; BDF フォントの設定
    (setq font-param
          '((overhang   . 0)
            (base       . 14)
            (height     . 16)
            (width      . 8)))
    (setq logfont-charset-list
          `((((bdf-font ,(concat bdf-dir "European/lt1-16-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16b-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16i-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16bi-etl.bdf")))
             ((ascii                    . 0)
              (latin-iso8859-1  . 1)))
            (((bdf-font ,(concat bdf-dir "Japanese.X/8x16rk.bdf")))
             ((latin-jisx0201           . 0)
              (katakana-jisx0201        . 1)))
            (((bdf-font ,(concat bdf-dir "Japanese.X/jiskan16.bdf")))
             ((japanese-jisx0208        . 0)))))

    ;; フォントの作成(結果は文字集合と、作成したフォントの連想リスト)
    (setq charset-font-list
          (my-define-font "bdf16-" font-param logfont-charset-list))

    ;; ビットマップフォントの作成(x-face, Gnus 用)
    (let ((font "bdf16-bitmap"))
      (if (member font (w32-font-list))
          (setq charset-font-list
                (cons (cons 'bitmap font) charset-font-list))))

    ;; fontset の作成
    (new-fontset "bdf2-fontset" charset-font-list)

;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; BDF Line-Space フォントの設定 
    (setq font-param
          '((overhang   . 0)
            (base       . 14)
            (height     . 16)
            (width      . 8)))
    (setq logfont-charset-list
          `((((bdf-font ,(concat bdf-dir "European/lt1-16-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16b-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16i-etl.bdf"))
              (bdf-font ,(concat bdf-dir "European/lt1-16bi-etl.bdf")))
             ((ascii                    . 0)
              (latin-iso8859-1  . 1)))
            (((bdf-font ,(concat bdf-dir "Japanese.X/8x16rk.bdf")))
             ((latin-jisx0201           . 0)
              (katakana-jisx0201        . 1)))
            (((bdf-font ,(concat bdf-dir "Japanese.X/jiskan16.bdf")))
             ((japanese-jisx0208        . 0)))))

    ;; フォントの作成(結果は文字集合と、作成したフォントの連想リスト)
    (setq charset-font-list
          (my-define-font "bdf16-linespace-" font-param logfont-charset-list))

    ;; ビットマップフォントの作成(x-face, Gnus 用)
    (let ((font "bdf16-bitmap"))
      (if (member font (w32-font-list))
          (setq charset-font-list
                (cons (cons 'bitmap font) charset-font-list))))

    ;; fontset の作成
    (new-fontset "bdf-linespace" charset-font-list))

;;; フレームの設定

(setq default-frame-alist
      (append 
       '((foreground-color   . "black")  ; 前景色
         (background-color   . "snow") ; 背景色
         (cursor-color       . "black")   ; カーソル色
         (width              . 80)	; フレーム幅(文字数)
         (height             . 45)	; フレーム高(文字数)
         (top                . 0)	; フレームの Y 位置(ピクセル数)
         (left               . 450)	; フレームの X 位置(ピクセル数)
	 (cursor-type        . box)	; カーソルタイプ 1.13b2-test, 1.14 用
	                                ; box bar caret から選ぶ
					; SKK を使う場合、box でないと
					; カーソルの色が変わらない。
         (ime-font           . "w16-japanese-jisx0208") ; IME 用のフォント
;;	 (vertical-scroll-bars . nil)	;スクロールバーを表示しない
         (font               . "bdf-linespace"));デフォルトのフォントセット
 default-frame-alist))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; change line-space

 (let* ((fontset "bdf-linespace")
        (info (fontset-info fontset))
        (font (nth 1 (assq 'ascii (aref info 2))))
        (alis (w32-get-font-info font))
        (old-height (aref info 1)))
   (setcdr (assq 'height alis) 20)	; 行間を広げる height + 広げる dot 数
					; 16 + 2 => 18
   (w32-change-font-attribute font alis)
   (set-fontset-font fontset 'ascii font))
私はさらに2ドット広げて20にしました.

Meadow での IME トグルキーの変更

[010810]たとえば,かんなライクにしたければ,
(global-set-key "\C-o" 'toggle-input-method)
でOK.

ちなみに 旧 mule for windows では set-ime-toggle-key で制御すればよい.

Meadow は,default-input-method 以外は,UNIX の Emacs 20 と一緒だそうだ.燃熊猫氏に多謝.

日本語インクリメンタルサーチ

◆[020121] 前に Meadow に入れようとして失敗した Migemo ですが,Solaris の Mule 2.3 に入れたらあっさり動いてしまいました(インストールメモはどっかにあります).w3m-img 上でまだ動かせていないのが残念ですが.
というわけで,修論終わったら,Meadow にも再チャレンジしようと思います.

◆[011220] インクリメンタルではないけど,>tt>M-x occur で日本語がサーチできます.一覧表示してくれる偉い子です.

◆[010819] C-s RET でまずサーチし,その後もう二度 C-s すると,ヒストリ機能でさっき入れた日本語がインクリメンタルサーチできます.

◆[010816] Meadow になって今一番困るのは,日本語のインクリメンタルサーチができないということです(SKKを入れればできるらしいが).で,ローマ字のまま日本語がサーチできるというmigemo をインストールすることにしました.

  1. まず migemo-0.22.tar.gz を取って来ます.これは最後の Perl 版で,これより後のバージョンは Ruby を使っていますので,Ruby のない人は cvs で最新版を取って来たりしてはいけません.
  2. C:\ 以下に展開して,展開先の c:\migemo-0.22\ に移ります.
  3. cd Lingua-Romkan
  4. bash を起動します.
  5. あらかじめ,/usr/lib 以下に Perl5 があることを確認します.私の場合,/lib 以下にあったので,/usr/lib に /lib からシンボリックリンクを張りました.
  6. perl Makefile.PL
  7. make
  8. make install
  9. cd ..
  10. ./configure --with-emacs=meadownt --with-lispdir=c:/meadow/site-lisp
    ただの ./configure だと怒られます.
  11. SKK オープンラボからSKK-JISYO.L をとってきてカレントに置きます.
  12. make
  13. make install
  14. .emacs に (load "migemo.el") を追加する
これで動くかと思ったら,なぜか一文字受け付けて止まってしまいます:P
(setq migemo-coding-system 'euc-japan-dos)を加えたりとか,辞書をEUCにしてみたりとかしてみたけどダメでした.
今日は実は忙しいので,原因究明は後回しにします.
ずっと前,IROSで知り合って,今度のロボット学会のセンサフュージョンのセッションで発表するという知人が migemo のMLに現れまくっているので,今度会ったら聞いてみようと思います(ぉ

LEIM というものをインストールすると,いろんな言語が扱えるようになって,日本語インクリメンタルサーチもできるようなのですが,SKKベースで,起動も面倒そうなので,やめました.

set-file-coding-system の代わり

[010817] Meadow では C-x C-k f の代わりに C-k C-m f とします.

mhc

[010910] Mew と連動したスケジューラを UNIX のほうの Mule に入れてみました.
基本的には紙のカレンダで十分なので,スケジュール管理が二度手間なのですが,メールとの連関をとるのが目的なので.
入れて一日経ったら忘れてきてしまいましたが,インストールメモ.
  1. MHCのページから安定版をダウンロードして解凍(開発版はいろいろ便利そうなのだが,入れてみたら Mew がおかしくなったのでやめ).
  2. *.el をパスの通ったところにおく.
  3.       (setq mhc-mailer-package 'mew)
          (autoload 'mhc-mode "mhc" nil t)
          (add-hook 'mew-summary-mode-hook 'mhc-mode)
          (add-hook 'mew-virtual-mode-hook 'mhc-mode)
          (add-hook 'mew-message-hook      'mhc-misc-hdr-decode)
          (setq mhc-base-folder "+schedule")
          (setq mhc-mail-path   (expand-file-name "/home/nao/Mail"))
    
    とかする.
あとは,会合などのメールがきたら C-| で登録するだけ.

namazu

[010910] namazu はずっと前に導入して,もうインストールの仕方も忘れたのだけど,Mule から使う方法.
(autoload 'namazu "namazu" nil t)
(setq namazu-default-dir
      "~/namazu/Mail/ ~namazu/html ~namazu/doc") ; ここは適当に変える
私の場合, ~/.html/ 以下から TeX や PowerPoint ファイルの置場にシムリンクを張ってたのが災いして,TeX の log やら EPS やらをデータベースに加えられてしまい,失敗.

uniquify.el

[011010] Buffer Menu やモード行で,同じファイル名のものが file<1>,file<2> などと表示されてわけがわからなくなるので,導入しました.これを使うと,パス名も一緒に表示してくれます.
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward)
で,ファイル名|パス名 と表示されます.2行目を色々変えると,表示の仕方も変わります.
Emacs 20 以降じゃないとだめなのでしょうか,UNIX の Mule ではエラーが出ました.Meadow で使っているのですが,どちらかというと UNIX のほうで使いたかった.

w3m.el

[011010] なんで入れようと思ったかと言いますと,ふつうのw3mではテキストの扱いが面倒なのですね.とくに,bib でつらい.それで,UNIX のほうに入れようとして,poe がないと怒られて失敗.やはり Emacs 20 でないとだめらしい.
ということで,あきらめて Windows のほうに入れることにしました.
  1. まず,w3m-0.1.9-CYGWIN.i686-baby-ja.tar.gz (Cygwin用バイナリ)をとってきて,中の w3m.exe をパスが通る所に入れます.
  2. ここで,DOS窓でsamba経由でD0に移り,DOSプロンプトからbibdos(bibのパス設定を変え,perlコマンドの前に perl と書いたもの)が実行できることを確認しました.ただし,日本語処理がうまくできていないらしい...
  3. w3m.el-1.0 をとってきて,Meadow/1.14/site-lisp/ に置き,
    ./configure --with-emacs=MeadowNT --with-lispdir=c:/Meadow/1.14/site-lisp/w3m 
    
    を実行します.README を鵜呑みにしてただの configure だけではいけません.Win98,95,Meの場合はMeadow95とするそうです.詳しくは
    こちら
  4. make;make install
  5. (autoload 'w3m "w3m" "*Interface for w3m on Emacs." t) を .emacs.el に書いてバイトコンパイル.
  6. E-x w3m で動いた.中クリックでジャンプ.
ちなみに,本来の目的の, Meadow 内で bib を使う,というのはまだ達成されていません...

某フォント

[011010]なんとなく某フォントを入れて見ようと.
  1. ダウンロードして展開.
  2. Windows 環境には X1186 関連がないので,UNIX のほうでコンパイルする.まずは Makefile の X1186 関連のパスを書き換え,またフォントのインストール先をホームディレクトリ内に置く.
  3. make.数分.
  4. make install
  5. できた pcf ファイルは無視し,BDF ファイルをさっそく Meadow に読み込ませてみたものの...どうやら記号の一部や半角カナが化けている.width 情報が入っていないのだから当り前かも知れない.というわけで断念.
    しかしもったいないのでさらに某ブラウザを入れて泥沼に...

SDIC/Autolookup

◆[020510] 英辞郎の CD-ROM をついに入手.これで辞書環境は完璧!!
事前準備として,SUFARY をインストールしておきます(英辞郎は巨大すぎて,grep では無理があるのです).取って来て make イッパツです.そして array と mkary をパスの通った所に入れときます.次に CD-ROM の中の辞書(PDIC 形式でなく,オリジナルの方)を解凍し,EUC に変換してから,SDIC の contrib/ 以下についていた eijirou.perl で変換.英和と略語はそのまま,和英と音は --waei オプションをつけて変換します.それから,これを mkary にかけて ary ファイルを作ります.あとはできた辞書と ary ファイルを辞書置場に置き,.emacs を編集すれば OK.念のため,.emacs には (sdicf-client "c:/Meadow/site-lisp/sdic/eijirou.sdic" (strategy array)) などとしておきます.
Cygwin,Solaris,FreeBSD で常時動いています.素晴らしい! これで無敵!

◆[011226] WinXP インストールメモ.下に書き忘れてたことも含む.まず,辞書ファイルのコードセットは euc-japan-unix にしておく.WinXP で SDIC をインストールする際には,Meadow95 でなく MeadowNT でもなく MeadowNT.bat を使う.さらに MeadowNT.bat の中身の g:\release\i386 とかいうのを c:\ かなんかに書き換えておく.辞書が万が一インストールされなかったら,contrib/ 以下の perl スクリプトで書き換えること.

◆[011204] ついでにクイックリファレンス.
C-c w で単語入力(デフォルトでカーソル位置の単語が入る).
デフォルトは完全一致,*で前方・後方一致,/をつけると全文検索
o で元ウィンドウに戻る.
q で quit.

◆[011204] UNIX の GNU Emacs 19.34.1 にも入れてみました.もはやこれがないと生きて行けなくなり,UNIX で文章を書くときにも必需品になって来たので.

  1. 基本的には Meadow と同様にインストールします.同梱の INSTALL を見ると,UNIX 用の設定は ./configure; make; make install とお決まりのコースなのですが,root 権限がないとダメらしく,Makefile のパスをあちこち書き換えてみたのですがダメでした.そこで,
  2. INSTALL の「Windows 環境の場合」にしたがって UNIX にインストールします(激ぉ
    具体的には,Emacs Lisp のインストーラを使ってやります.
    mule -batch -q -l install.el -f make-sdic --with-lispdir=~/hoge/elisp --with-dictdir=~/hoge/elisp/sdic --infodir=~/hoge/elisp/info
    とかいった感じでやりますと1回でOKです( info を本当はこんなところに入れちゃいけないのだけどね).
  3. あとは Meadow と同様に .emacs を書き換え,辞書を追加すれば終了.
本当に快適ですね〜♪

◆[011127] さらに さらにコンピュータ用語辞書 TERM95 も入れる.ここから GENE 形式のものをとってきて解凍し,文字コードを euc-japan-unix にして,SDIC についていた contrib/gene.perl で

perl gene.perl TERM95.TXT > term95ej.sdic
で英和 SDIC にします.和英は jgene.perl を使えそうなのですが,なぜかエラーが出るので諦めました(そのうち自分で perl で書きますか).
.emacs.el は LSD 辞書と同様に書き換えます.

◆[011030] autolookup が新しくなって eldoc になった(というか旧 eldoc と autolookup が統合された)そうです.機能的には,辞書だけでなくプログラムソースに対してもカーソル脇のキーワードに関する情報をミニバッファに表示するというもので,emacs lisp,perl,postscript,dired,c に対応,さらに sdic,lookup,memo に対応しています.ここから入手できます.燃猫熊氏に感謝.
ていうか,ちゃんと公開していないので,web で調べてもまったく情報が入手できません.ちょっと困る.

◆[011010]詳細はここ

  1. SDICをとってきて展開.
  2. GENE95とEDICTという2つの辞書をとって来て,SDICを展開した所に置く.
  3. Meadow95 -batch -q -l install.el -f make-sdic -n でインストール先を確認し,Meadow95 -batch -q -l install.el -f make-sdic でインストール.(実は最初にインストールした時はエラー連発だったのですが,なぜかやり直したら一発でOK)
  4. ついでにライフサイエンス辞書 lsd も入れる.ここから EDIC 形式のものをとって来て,文字コードを euc-japan-unix にして(これが重要!),SDIC についていた contrib/edict.perl で,
    perl edict.perl EDICLSD3.TXT >lsd3je.sdic
    
    で和英 SDIC に,
    perl edict.perl --reverse EDICLSD3.TXT >lsd3ej.sdic
    
    で英和 SDIC に変換する.最後に,
    (setq sdic-waei-dictionary-list '((sdicf-client "c:/Meadow/site-lisp/sdic/jedict.sdic")(sdicf-client "c:/Meadow/site-lisp/sdic/lsd3je.sdic")
    ))
    (setq sdic-eiwa-dictionary-list '((sdicf-client "c:/Meadow/site-lisp/sdic/gene.sdic")(sdicf-client "c:/Meadow/site-lisp/sdic/lsd3ej.sdic")))
    
    としてOK.
  5. C-c w でカーソル位置の単語を調べてくれます.
  6. さらにここから autolookup.el をとってきてパスの通ったところに置き,ここに書いてる通りに .emacs に書きます.M-x auto-lookup-mode で autolookup が起動し,カーソル位置の単語の訳がミニバッファに自動的に出ます.

URL の中クリックで w3m を呼び出す

◆[020108] kterm なのになぜか画像が表示できるようになった w3m-img を使ってみました.素晴らしいです.もう netscape はほとんど使わなくて済みます.

◆[011207] Mew では確かデフォルトで Netscape かなんかが立ち上がると思いますが,重いので,軽い w3m を使いたいと言うことで.ここを参考にしました.

  1. .emacs に
    (autoload 'browse-url-at-mouse "browse-url"
              "Ask a WWW browser to load a URL clicked with the mouse." t)
    
            (add-hook 'mew-message-mode-hook
                  (function
                   (lambda ()
                   (local-set-key [mouse-2] 'browse-url-at-mouse)
                     )))
    
            (setq browse-url-browser-function 'browse-url-mosaic)
            (setq browse-url-mosaic-program "~hoge/bin/kw3m")
    と書いておく.つまり,Mosaic を使うふりをするのである.
  2. ~hoge/bin/kw3m というファイルをつくって
    #!/bin/sh
    cd $HOME
    /usr/X11R6/bin/kterm -km euc -e w3m $1
    と書き込んでセーブし,実行可能にする.

キーバインドの上書き

[011212] 例えば,YaTeX では C-c wYaTeX-switch-mode-menu に,SDIC では同じく C-c wsdic-describe-word に割り当てられているため,YaTeX mode で SDIC を使いたい時に困るということがあります.そんなとき,例えば,
(add-hook 'yatex-mode-load-hook
(function
(lambda ()
(YaTeX-define-key "w" 'sdic-describe-word)
(YaTeX-define-key "\C-w" 'YaTeX-switch-mode-menu))))
とかすると,C-c w で SDIC が,C-c C-w で YaTeX のトグルが起動してくれるようになります.YaTeX の prefix を逆手にとっているのがミソです.教えて下さった kimura 様に感謝.
ただ,実は,
GNU Emacs lisp リファレンスマニュアルによると,C-c 英数字 というのはユーザ向けに予約されており,メジャーモードで規定するのは本来の書き方に違反しているのだそうです.
本来の Emacs lisp の書き方にしたがって,SDIC の「ユーザ設定」に C-c w を割り当て,YaTeX モードの「C-c 英数字」系のキーバインドをすべて「C-c C-英数字」にしてしまうには,
(setq YaTeX-inhibit-prefix-letter t)
とすればよいです.今後,ユーザ独自のキーバインドを追加していくことが予想される場合,このように YaTeX の設定を替えてしまって,それに慣れた方がよいのかも知れません.ご指摘下さった燃猫熊様に感謝.

リージョン内の語数カウント

[011217] 話は単純で,要するに,リージョン(あるいはバッファ)内の英文を wc にかけたいときにどうするかということです.
リージョンを選択して,M-| とやると選択領域を UNIX のコマンドに引き渡せるのを使います.Shell command on region: とか訊いてくるので,wc といれてやれば見事にカウントしてくれます.
cygwin が入ってれば Meadow でもつかえます.
他にも応用が効くと思います.

ChangeLog

◆[011226] ChangeLog を書いたあと,C-c q で自動的に ChangeLog をセーブし,そのバッファを消すには...
(defun test ()
(interactive)
(let ((buf (current-buffer)))
 (save-buffer)
  (condition-case nil
   (delete-window))
  (kill-buffer buf)))
(eval-after-load "add-log"
 '(define-key change-log-mode-map "\C-cq" 'test))
他にも使えるのではないでしょうか.中島様に感謝.

◆[011220] ユニマガに載っていた ChangeLog モードは非常に便利です.C-x 4 a で使えます.

メニューバーを消す

◆[020510] (menu-bar-mode -1) これだけです.画面の小さいモバイル PC で重宝します.

Linux Zaurus で mhc

◆[040222] Zaurus には embeddedkonsole-ja と Emacs21 がインストールされているものとします.
MHCのページから開発版を取って来て,tar で展開します.Elisp ファイルを Emacs のパスの通った所に置きます (必要なら .emacs からパスを通します).
さて,私は Zaurus でメールは読まないけど mhc は使いたいので,mew を形だけインストールします.メールの設定は適当にやっておいて,さらに起動時に inc しないようにしておくと,mew がメールを取りにいくこともなくサマリモードになるので便利です.ついでに Zaurus の場合,mew-summary-mode-hookmhc-goto-this-month を add-hook してやっておいて,さらに .bashrc で alias m="emacs -e mew -nw" とでも alias を作っておきましょう.そうすると,ターミナルから m [RET] だけで今月のスケジュールが見えるようになります (ちょっと遅いのが難点).場合によってはアイコンを割り当てて Qt から起動できるようにするとさらに便利かも.
さて,肝心のスケジュールですが,メールを読まないのにどうやってスケジュールを管理するのかと言うと,PC のほうではすでにメールを読んだりスケジュールを管理したりしてるので,このスケジュール部分だけ Zaurus にコピーしてしまおうと言う魂胆です.通信カードさえあればいつでもどこでも最新のスケジュールが得られるよう,rsync と ssh で逆バックアップ (PC→Zaurus) します (本当は TCP/IP で通信もしたかったが,なぜか私の環境とは相性が悪い).なお,ssh での通信の際にパスワードを訊かれるので自動化は無理です.毎日手動で rsync してください (公開鍵暗号でパスフレーズなしにすれば自動化できますが,PDA という性格上,危険なのでお勧めしません).alias を作っておくとよいでしょう.差分だけをとってくるので,時間はあまり掛かりませんが,-z オプションで圧縮して送ると若干早い気がします.
…とまあ,非常にはしょって書いてしまいました.また時間があるときにちゃんと書きますが,ここに書いてある要素はウェブでけっこう見つかります.

賢いインデントあれこれ

◆[040804] 最近の Emacs では,テキストを書いていて M-q すると,行頭のインデントを前の行に合わせてくれたりしますね.「*」や「-」などの bullet もちゃんと認識して,bullet だけがテキストの左端から飛び出ているようになります.さらにコメントを表す「#」なんかは各行に自動的に補完してくれたりします.
しかし私の使っている Emacs 20.7.2 とか Emacs 19.34.1 とか化石のような Emacs では,このあたりの機能が不完全だったりします.特に Mew 1.94 ではまったく使えていませんでした.そこを何とかしようというのがこの企画です.
(読まなくていいです) 現状把握:どうもいくつかのパターンが存在するらしい.
インデントについて
(A1) いっさいインデントしない
(A2) インデントする.ただし bullet は無視 (テキストと同様に扱う)
(A3) 行頭に bullet があれば,bullet 補完の余地を残してインデント
(A4) (行頭に限らず) bullet があれば,bullet 補完の余地を残してインデント
bullet 「-」の認識について
(B1) テキストとして扱い,bullet として扱わない
(B2) bullet として扱い,テキストと区別する
bullet を新しい行頭に補完するかどうか
(C1) bullet の補完をいっさいしない
(C2) bullet が行頭にあるときに限り,bullet を常に補完
(C3) bullet を常に補完
で.Emacs 20 ではデフォルトで (A4)(B2)(C1),Emacs 19 ではデフォルトで (A3)(B1)(C2),Emacs 20 上の Mew の draft-mode では (A1)(B1)(C1) となっていた.
どうやら効いて来るのは adaptive-fill-mode まわりと indented-text-mode あたりのようだ.で,実験.
  • adaptive-fill-mode はもともと t になっているらしいので,いまさら指定しても変わらない.
  • indented-text-mode は,19 に適用すると (A4)(B1)(C3) と改善する.つまり,bullet が行頭でなくても大丈夫になる.しかし「-」は認識できない.20 では変化なく,mew に適用すると 20 のレベル (A4)(B2)(C1) に追い付く.
  • adaptive-fill-regexp が 19 と 20 で違うので,まず 19 を 20 に合わせてみる.(A4)(B2)(C3) となる.つまり「-」は認識できるようになり,行頭の制限もなくなるが,常に bullet を補完してしまう.逆に 20 を 19 に合わせると (A4)(B1)(C1) と,単に「-」が見えなくなる.これは regexp の中身をみれば自明.
  • 20 だけに存在する adaptive-fill-first-line-regexp を nil にしてみると,(A4)(B2)(C3) となり,常に補完してしまうようになる.
  • これでだいたいの挙動はわかってきた.
  • まず,20 の mew でインデント制御が効かないのは,[mew-dist:05485]以下のスレッドに答えがあった.ここのパッチをあててもよいけど,安易な解決策としては,かずさん同様に
    (setq default-major-mode 'indented-text-mode)
    
    すると mew でもインデントが効くようになる.さらに 19 でも 20 に近いインデントが実現できる.ただし 19 では「-」は bullet としては認識してくれない.認識させるには 19 で 20 用 regexp をオーバーライドすればよい.つまり,
    (setq adaptive-fill-regexp "[ 	]*\\([-|#;>*]+ *\\|(?[0-9]+[.)] *\\)*")
    
    とかしておく.
  • つぎに,19 には adaptive-fill-first-line-regexp がないので,各行に bullet をつけてしまう.これを何とかするには 20 の fill.el からそれらしいところをとってきて読ませることになる.今回は
    (defconst adaptive-fill-first-line-regexp "\\`[ \t]*\\'"
      "*Regexp specifying whether to set fill prefix from a one-line paragraph.
    When a paragraph has just one line, then after `adaptive-fill-regexp'
    finds the prefix at the beginning of the line, if it doesn't
    match this regexp, it is replaced with whitespace.
    
    By default, this regexp matches sequences of just spaces and tabs.
    
    However, we never use a prefix from a one-line paragraph
    if it would act as a paragraph-starter on the second line.")
    ;  :type 'regexp
    ;  :group 'fill)
    
    (defun fill-context-prefix (from to &optional first-line-regexp)
      "Compute a fill prefix from the text between FROM and TO.
    This uses the variables `adaptive-fill-prefix' and `adaptive-fill-function'
    and `adaptive-fill-first-line-regexp'.  `paragraph-start' also plays a role;
    we reject a prefix based on a one-line paragraph if that prefix would
    act as a paragraph-separator."
      (or first-line-regexp
          (setq first-line-regexp adaptive-fill-first-line-regexp))
      (save-excursion
        (goto-char from)
        (if (eolp) (forward-line 1))
        ;; Move to the second line unless there is just one.
        (let ((firstline (point))
    	  first-line-prefix
    	  ;; Non-nil if we are on the second line.
    	  at-second
    	  second-line-prefix
    	  start)
          (move-to-left-margin)
          (setq start (point))
          (setq first-line-prefix
    	    (cond ((looking-at paragraph-start) nil)
    		  ((and adaptive-fill-regexp (looking-at adaptive-fill-regexp))
    		   (buffer-substring-no-properties start (match-end 0)))
    		  (adaptive-fill-function (funcall adaptive-fill-function))))
          (forward-line 1)
          (if (>= (point) to)
    	  (goto-char firstline)
    	(setq at-second t)
    	(move-to-left-margin)
    	(setq start (point))
    	(setq second-line-prefix
    	      (cond ((looking-at paragraph-start) nil)
    		    ((and adaptive-fill-regexp (looking-at adaptive-fill-regexp))
    		     (buffer-substring-no-properties start (match-end 0)))
    		    (adaptive-fill-function (funcall adaptive-fill-function)))))
          (if at-second
    	  ;; If we get a fill prefix from the second line,
    	  ;; make sure it or something compatible is on the first line too.
    	  (and second-line-prefix first-line-prefix
    	       ;; If the first line has the second line prefix too, use it.
    	       (if (or (string-match (concat "\\`"
    					     (regexp-quote second-line-prefix)
    					     "\\(\\'\\|[ \t]\\)")
    				     first-line-prefix)
    		       ;; If the second line prefix is whitespace, use it.
    		       (string-match "\\`[ \t]+\\'" second-line-prefix))
    		   second-line-prefix
    		 ;; If the second line has the first line prefix,
    		 ;; plus whitespace, use the part that the first line shares.
    		 (if (string-match (concat "\\`"
    					     (regexp-quote first-line-prefix)
    					     "[ \t]*\\'")
    				   second-line-prefix)
    		     first-line-prefix)))
    	;; If we get a fill prefix from a one-line paragraph,
    	;; maybe change it to whitespace,
    	;; and check that it isn't a paragraph starter.
    	(if first-line-prefix
    	    (let ((result
    		   ;; If first-line-prefix comes from the first line,
    		   ;; see if it seems reasonable to use for all lines.
    		   ;; If not, replace it with whitespace.
    		   (if (or (and first-line-regexp
    				(string-match first-line-regexp
    					      first-line-prefix))
    			   (and comment-start-skip
    				(string-match comment-start-skip
    					      first-line-prefix)))
    		       first-line-prefix
    		     (make-string (string-width first-line-prefix) ?\ ))))
    	      ;; But either way, reject it if it indicates the start
    	      ;; of a paragraph when text follows it.
    	      (if (not (eq 0 (string-match paragraph-start
    					   (concat result "a"))))
    		  result)))))))
    
    みたいな内容のファイルをつくって,load する.これで,20 と同等のインデントが実現できるようになる.
  • さて,20 では常に bullet は補完されない.しかし,個人的には 19 で実現されていた,# の補完が欲しいなあと思った.そこで,
    (setq adaptive-fill-first-line-regexp "\\`[ 	#]*\\'")
    
    とする.具体的には,[] の間に # を加えている.C のコードを書くとかで * も補完したいとかいう人は,ここに * も加えればよい.19 で上の長いコードを load してる場合は,それより後で設定すること.でなければ load するコードを書き換えてもよいかも.

    Mew が取って来た UNIX 上のメールを Outlook (や Outlook Express) で開く

    ◆[051128] 下記の件,解決しました.Mew が CRLF→LF にしてメール保存してるのと,OE が LF の直前の文字を CR かどうか調べずに切り落としてるのと,Excel にとってファイル末尾が critical であるという 3 点が影響していたようです.ご指摘下さった swk さん,ありがとうごさいました. というわけで,以前公開した oe.pl を修正しました.行末に CR をつける機能を追加..
    #!/usr/local/bin/perl
    
    $file = $ARGV[0];
    open(COPY, ">$file.eml");
    while( <> ){
        s/$/^M/;
        print COPY;
    }
    close(COPY);
    system("start.pl $file.eml");
    
    sleep(7);
    unlink("$file.eml");
    
    例によって例外処理とか一切してません(ぉ.sleep の秒数が 7 に増加してるのは,◆[051008] を受けてです.コード中の「^M」は CR (0x0d.Emacs では C-q RET で入力) なのでコピペされる場合はご注意下さい.

    ◆[051126] Mozilla/5.0 が作成して Excel ファイルを添付したメールの場合,添付ファイルが OE から開けないという話が報告されています (これは SoW と関係なく,単に eml 形式のメールを OE で開くと生じます).私の手元でも再現しました.

    ◆[051008] OE のエラーが出る場合,sleep する秒数を増やしてみてください.

    ◆[041207] Mew はすごくいい MUA (メーラ) なのですが,UNIX 上で使っていると,例えば HTML メールだったりとか,UTF-8 で書かれてたりとか (最近の mew だと大丈夫だそうですが),添付ファイルがあったりとか,そういう場合に Windows 上の MUA で読みたい時というのがあったりします.
    そんなとき,Windows 上の MUA が使っているアカウントにメールを転送したりしてる人は少なからずいたと思いますが,UNIX ファイルシステム内に保存されている MH 形式のメールを直接 Windows MUA で開くことができれば,楽だと思いませんか.しかも,Mew 上からキーを打つだけで.
    ちなみに,以下の条件が必要.

    想定してる環境は,Windows 上から VMware,VNC,Cygwin,TTSSH 等を使って UNIX にログインして Mew を使っているような状況です.
    1. まず,SoW を取って来て解凍します.
    2. readme に従い,Windows 上で SoW.exe を実行します.-pw オプション,-r オプション,+ オプション等を適切に設定しておきます.
    3. readme に従い,UNIX 上で start.pl を適当に使ってみて,うまくいくことを確認します.バイナリのパスなどは readme のとおりに設定して下さい.そして,start.pl はパスの通ったところに置いておきましょう.
      ちなみに,start.pl は環境変数 $REMOTEHOST を Windows 機だと思い込んで接続しようとします.なので,他のホストを経由してたり,X を ssh で飛ばしてたり,VMware 使ってたりすると $REMOTEHOST が Windows 機を指さなくなり,うまくいきません.そういうときは,start.pl を書き換えて $SoP_hostname に Windows 機のホスト名を指定してやります.最初の if 文が終わったあたりに
      	$SoP_hostname = "ホスト名";    
      
      とでも書いておけばよいでしょう.
    4. wrapper を作ります.以下の内容を oe.pl としてパスの通ったところに保存します.1 行目の Perl のパスは適宜修正してください.
      #!/usr/local/bin/perl -w
      
      $file = $ARGV[0];
      $slink = "$file.eml";
      symlink($file,$slink);
      system("start.pl $slink");
      
      sleep(3);
      unlink($slink);
      
      exit;
      
      要するに,Windows は拡張子が eml じゃないと開いてくれないので,一瞬 symlink を作って start.pl に渡し,3 秒くらいたって symlink を消しています (すぐに消すと間に合わない).
      あと,これはまあ好みですが,
      ln -s oe.pl oe	    
      
      としておきます.
      ちなみに oe という名前は,私が Outlook Express を Windows 側 MUA として使ってることによるので,適当に好きな名前にしてかまいません.その場合,以下の文章の oe は全部読み換えて下さい.
    5. .emacs に,
      (defun mew-prog-oe ()
         (interactive)
         (setq fld (substring (mew-summary-folder-name) 1 nil))
         (setq path (concat (expand-file-name mew-mail-path)))
         (setq arg (concat path "/" fld "/" (mew-summary-message-number)))
         (message (concat arg " is sent to OE"))
         (shell-command (concat "oe " arg))
      )
      
      (add-hook 'mew-summary-mode-hook '(lambda ()
      				    (local-set-key "\C-co" 'mew-prog-oe)))
      
      と書いておきます.キーバインドはここでは C-c o としていますが,好きにしてください.
    6. Mew の Summary で C-c o すると,Windows 側でメールが開かれるはずです.
    ちなみに,OE の場合,Windows のコマンドプロンプトや「ファイル名を指定して実行」などで
    msimn.exe /eml:メールのファイル名
    
    とすると (メールのファイル名は,Samba 経由等で UNIX システムをみたときのもの.\\hostname\username\Mail\inbox\1234 とかそんな感じ),UNIX のメールが開けます.この場合は eml 拡張子をつけなくても OK です.最初はこれを UNIX からやりたくて SoW を入れたのですが…,SoW.exe って「/」をことごとく「\」に変換してくれちゃうんですね.だから /eml: の部分が \eml: になってしまって,せっかく命令を受け取った OE が何もできない,ということになってしまいました.なので,無理やり eml 拡張子をつけてるんですね.Windows 側に wrapper を作ることも考えましたが,SoW.exe が ShellExecute の第 5 引数以下を捨ててしまうので,引数が渡せないという罠.
    最後に,間違ってもウイルスメールをこれで Outlook 等に渡さないようにしましょうw.

    utf-8 on emcws

    http://nao.s164.xrea.com/td/2005-07-08.html#p03

    Emacs21 インストール (FreeBSD 編)

    http://nao.s164.xrea.com/td/2005-10-04.html#p01

    Emacs21 インストール (Solaris 編)

    http://nao.s164.xrea.com/td/2005-10-05.html#p02

    mew-4.2 で RPOP 認証

    http://nao.s164.xrea.com/td/2005-10-05.html#p03

    Mew-4.2 の summary のカスタマイズ

    http://nao.s164.xrea.com/td/2005-10-06.html#p01

    Mule-UCS の高速化

    http://nao.s164.xrea.com/td/2005-10-06.html#p02

    mhc の conflict に priority

    http://nao.s164.xrea.com/td/2005-07-17.html#p03
    http://nao.s164.xrea.com/td/2005-07-19.html#p01

    Emacs でミョーン

    http://nao.s164.xrea.com/td/2005-09-10.html#p02
    [TeX][UNIXized Windows][VMware][blog][back]