私の使っている Emacs のバージョンは 19 と古いので,最近の新しい Emacs にはお役に立てないかも知れません.また,かつては Meadow をよく使っていましたので記事が多いですが,最近はほとんど使っていません.
さすがに3単現のsとか受動態とかはチェックしてくれませんので,最終的には Word のほうが優秀ですが,M-x ispell よりは気軽に使えると思います.
あるいは
flyspell
[010808] 普段は文章を mule で書いて,英文を書く時だけ MS Word 使うという方は多いと思います.そういう人はたいてい,mule にも逐次英文チェッカがあったらいいのに...と思っていたりします.そういうものを見つけてインストールしましたので報告します.
mule を起動して,M-x flyspell-mode にします.英文を書いてみましょう.間違えると,即座に赤線が引かれます.中央クリックすると,修正候補や辞書登録などのメニューが出て来ます.
(autoload 'flyspell-mode "flyspell" "On-the-fly spelling checking" t)
と書きます.さらに,TeX のコマンドをいちいちチェックするなーといいたい人は
(setq ispell-parser 'tex)
も書きます.
ブラケットチェッカ
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 で使えるようにします.ここも参照.
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にしました.
ちなみに 旧 mule for windows では set-ime-toggle-key で制御すればよい.
Meadow は,default-input-method 以外は,UNIX の Emacs 20 と一緒だそうだ.燃熊猫氏に多謝.
◆[011220] インクリメンタルではないけど,>tt>M-x occur で日本語がサーチできます.一覧表示してくれる偉い子です.
◆[010819] C-s RET でまずサーチし,その後もう二度 C-s すると,ヒストリ機能でさっき入れた日本語がインクリメンタルサーチできます.
◆[010816] Meadow になって今一番困るのは,日本語のインクリメンタルサーチができないということです(SKKを入れればできるらしいが).で,ローマ字のまま日本語がサーチできるというmigemo をインストールすることにしました.
LEIM というものをインストールすると,いろんな言語が扱えるようになって,日本語インクリメンタルサーチもできるようなのですが,SKKベースで,起動も面倒そうなので,やめました.
◆[011226] WinXP インストールメモ.下に書き忘れてたことも含む.まず,辞書ファイルのコードセットは euc-japan-unix にしておく.WinXP で SDIC をインストールする際には,Meadow95 でなく MeadowNT でもなく MeadowNT.bat を使う.さらに MeadowNT.bat の中身の g:\release\i386 とかいうのを c:\ かなんかに書き換えておく.辞書が万が一インストールされなかったら,contrib/ 以下の perl スクリプトで書き換えること.
◆[011204] ついでにクイックリファレンス.
◆[011204] UNIX の GNU Emacs 19.34.1 にも入れてみました.もはやこれがないと生きて行けなくなり,UNIX で文章を書くときにも必需品になって来たので.
◆[011127] さらに さらにコンピュータ用語辞書 TERM95 も入れる.ここから GENE 形式のものをとってきて解凍し,文字コードを euc-japan-unix にして,SDIC についていた contrib/gene.perl で
◆[011030] autolookup が新しくなって eldoc になった(というか旧 eldoc と autolookup が統合された)そうです.機能的には,辞書だけでなくプログラムソースに対してもカーソル脇のキーワードに関する情報をミニバッファに表示するというもので,emacs lisp,perl,postscript,dired,c に対応,さらに sdic,lookup,memo に対応しています.ここから入手できます.燃猫熊氏に感謝.
◆[011010]詳細はここ.
◆[011207] Mew では確かデフォルトで Netscape かなんかが立ち上がると思いますが,重いので,軽い w3m を使いたいと言うことで.ここを参考にしました.
◆[011220] ユニマガに載っていた ChangeLog モードは非常に便利です.C-x 4 a で使えます.
◆[051126] Mozilla/5.0 が作成して Excel ファイルを添付したメールの場合,添付ファイルが OE から開けないという話が報告されています (これは SoW と関係なく,単に eml 形式のメールを OE で開くと生じます).私の手元でも再現しました.
◆[051008] OE のエラーが出る場合,sleep する秒数を増やしてみてください.
◆[041207] Mew はすごくいい MUA (メーラ) なのですが,UNIX 上で使っていると,例えば HTML メールだったりとか,UTF-8 で書かれてたりとか (最近の mew だと大丈夫だそうですが),添付ファイルがあったりとか,そういう場合に Windows 上の MUA で読みたい時というのがあったりします.Meadow での IME トグルキーの変更
[010810]たとえば,かんなライクにしたければ,
(global-set-key "\C-o" 'toggle-input-method)
でOK.
日本語インクリメンタルサーチ
◆[020121] 前に Meadow に入れようとして失敗した Migemo ですが,Solaris の Mule 2.3 に入れたらあっさり動いてしまいました(インストールメモはどっかにあります).w3m-img 上でまだ動かせていないのが残念ですが.
というわけで,修論終わったら,Meadow にも再チャレンジしようと思います.
これで動くかと思ったら,なぜか一文字受け付けて止まってしまいます:P
ただの ./configure だと怒られます.
(setq migemo-coding-system 'euc-japan-dos)を加えたりとか,辞書をEUCにしてみたりとかしてみたけどダメでした.
今日は実は忙しいので,原因究明は後回しにします.
ずっと前,IROSで知り合って,今度のロボット学会のセンサフュージョンのセッションで発表するという知人が migemo のMLに現れまくっているので,今度会ったら聞いてみようと思います(ぉ
set-file-coding-system の代わり
[010817] Meadow では C-x C-k f の代わりに C-k C-m f とします.
mhc
[010910] Mew と連動したスケジューラを UNIX のほうの Mule に入れてみました.
基本的には紙のカレンダで十分なので,スケジュール管理が二度手間なのですが,メールとの連関をとるのが目的なので.
入れて一日経ったら忘れてきてしまいましたが,インストールメモ.
あとは,会合などのメールがきたら C-| で登録するだけ.
(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"))
とかする.
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 のほうに入れることにしました.
ちなみに,本来の目的の, Meadow 内で bib を使う,というのはまだ達成されていません...
./configure --with-emacs=MeadowNT --with-lispdir=c:/Meadow/1.14/site-lisp/w3m
を実行します.README を鵜呑みにしてただの configure だけではいけません.Win98,95,Meの場合はMeadow95とするそうです.詳しくはこちら.
某フォント
[011010]なんとなく某フォントを入れて見ようと.
しかしもったいないのでさらに某ブラウザを入れて泥沼に...
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 で常時動いています.素晴らしい! これで無敵!
C-c w で単語入力(デフォルトでカーソル位置の単語が入る).
デフォルトは完全一致,*で前方・後方一致,/をつけると全文検索
o で元ウィンドウに戻る.
q で quit.
本当に快適ですね〜♪
具体的には,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 を本当はこんなところに入れちゃいけないのだけどね).
perl gene.perl TERM95.TXT > term95ej.sdic
で英和 SDIC にします.和英は jgene.perl を使えそうなのですが,なぜかエラーが出るので諦めました(そのうち自分で perl で書きますか).
.emacs.el は LSD 辞書と同様に書き換えます.
ていうか,ちゃんと公開していないので,web で調べてもまったく情報が入手できません.ちょっと困る.
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.
URL の中クリックで w3m を呼び出す
◆[020108] kterm なのになぜか画像が表示できるようになった w3m-img を使ってみました.素晴らしいです.もう netscape はほとんど使わなくて済みます.
(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 を使うふりをするのである.
#!/bin/sh
cd $HOME
/usr/X11R6/bin/kterm -km euc -e w3m $1
と書き込んでセーブし,実行可能にする.
キーバインドの上書き
[011212] 例えば,YaTeX では C-c w が YaTeX-switch-mode-menu に,SDIC では同じく C-c w が sdic-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))
他にも使えるのではないでしょうか.中島様に感謝.
メニューバーを消す
◆[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-hook で mhc-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 あたりのようだ.で,実験.
(setq default-major-mode 'indented-text-mode)
すると mew でもインデントが効くようになる.さらに 19 でも 20 に近いインデントが実現できる.ただし 19 では「-」は bullet としては認識してくれない.認識させるには 19 で 20 用 regexp をオーバーライドすればよい.つまり,
(setq adaptive-fill-regexp "[ ]*\\([-|#;>*]+ *\\|(?[0-9]+[.)] *\\)*")
とかしておく.
(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 と同等のインデントが実現できるようになる.
(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 で入力) なのでコピペされる場合はご注意下さい.
そんなとき,Windows 上の MUA が使っているアカウントにメールを転送したりしてる人は少なからずいたと思いますが,UNIX ファイルシステム内に保存されている MH 形式のメールを直接 Windows MUA で開くことができれば,楽だと思いませんか.しかも,Mew 上からキーを打つだけで.
ちなみに,以下の条件が必要.
想定してる環境は,Windows 上から VMware,VNC,Cygwin,TTSSH 等を使って UNIX にログインして Mew を使っているような状況です.
ちなみに,OE の場合,Windows のコマンドプロンプトや「ファイル名を指定して実行」などで
ちなみに,start.pl は環境変数 $REMOTEHOST を Windows 機だと思い込んで接続しようとします.なので,他のホストを経由してたり,X を ssh で飛ばしてたり,VMware 使ってたりすると $REMOTEHOST が Windows 機を指さなくなり,うまくいきません.そういうときは,start.pl を書き換えて $SoP_hostname に Windows 機のホスト名を指定してやります.最初の if 文が終わったあたりに
$SoP_hostname = "ホスト名";
とでも書いておけばよいでしょう.
#!/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 は全部読み換えて下さい.
(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 としていますが,好きにしてください.
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]