2005年8月13日

Carbon EmacsでDrag'n Drop

というか、Wanderlust/Carbon EmacsでファイルをDnDで添付したいよね、という話。 といっても別に難しくはありません。

まず、mac-drag-N-dropをこのへんから入手して、.emacsには以下のように。

;
; drag-N-drop
;
(load "mac-drag-N-drop" nil t)
(global-set-key [drag-n-drop] 'mac-drag-N-drop)

で、Wanderlustの設定(人によっては.emacsでしょうが)には、 以下のように。

;
; drag-N-drop
;
(add-to-list 'mac-drag-N-drop-string-alist
    '(wl-draft-mode . (
       (".*" . (progn (mime-edit-insert-file (file-relative-name file) t) t)
       ))
    ))

ポイントは、最後にtを返すところかな。 ファイル名の正規表現に対応するアクションを記述するわけだけど、 アクションのstringpがnilの場合はevalするようになってるんだけど、 mac-drag-N-dropの仕様がいまいちで、 evalの返り値がnilだとfind-fileするらしい。 で、mime-edit-insert-fileはnilを返すようだ、と。

2005年11月14日

ElScreen 1.4.0(まだだけど)

Meadow的白井さんからパッチが飛んできたことを発端として、 今までやりたかったことをもろもろ片付けてみました。 思い返すと、

  • 1.0→1.2:multi frame support
  • 1.2→1.3:tab & menu support

と来たわけだけど、今回はどうかというとそれほど大きな変更はない感じ。 てか、若干の機能追加と大幅なリファクタリングですな。

そんなわけで、安定してることを確認したらさっさと出してしまいたいなあ。 絶賛人柱募集中。

(back-to-indentation)

うーん、 elisp漬いてますな。中山さんとこ経由、新堂さんで。 C-aに(beginning-of-line)と組み合わせるとさらに気持ちいいという話。

(defun toggle-beginning-or-indentation-of-line (arg)
  (interactive "p")
  (if (looking-at "^")
      (back-to-indentation)
    (beginning-of-line arg))))
(define-key global-map "\C-a" 'toggle-beginning-or-indentation-of-line)

2005年11月20日

ElScreen 1.4.0 & ElScreen-GF 1.4.0

というわけでリリースしました。 でもそもそも、ElScreenはElScreen-GFのために作ったので、 ElScreen-GFユーザも増えるといいんだけどなあ。 ほんと、手前味噌ですがhackのお供にいいと思うのです。

2005年11月25日

luna

elispのOOP kernelであるluna(flimで配布されてるのがなぞですが)の簡単な解説をみつけた。 独立して配布されてたらがんがんつかうんだけどなー。 というほどelisp書けないけどさ。

2005年11月28日

自動的にScreenを作りたい?

ElScreen的な話。

<prefix> C-nとか<prefix> C-pで移動しようとしたときに、 Screenが1枚しかなければ自動で作りたい、 というひとが世の中に少なくともふたりはいるみたい。 ということは、他にもいるのかなあ。

個人的にはやっぱり変則的でちょっと気持ち悪いので、 結局本体には取り込まなかったんだけど、 こういうのをどっかに書いておくといいかもしれないです。

(defmacro elscreen-create-automatically (ad-do-it)
  (` (if (not (elscreen-one-screen-p))
	 (, ad-do-it)
       (elscreen-create)
       (elscreen-notify-screen-modification 'force-immediately)
       (elscreen-message "New screen is automatically created"))))

(defadvice elscreen-next (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-previous (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-toggle (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

2005年12月19日

Error in post-command-hook: (error Selecting deleted buffer)

一時期、ElScreenで激しくpost-command-hookまわりのエラーが出ていたことがあって、 その所為でいまだにこれが出ると疑われたりします。まあ、やむをえず。

しかし、Wanderlustでメールを送信した直後に起こるエラーはこれではないようです。 詳しくはこのへんで。

2005年12月20日

flyspellの表示がおかしい

ながらくflyspellを使ってますが、最近どうも表示がおかしい。 これではさっぱり使い物にならないので、 少しばかりまじめに調べてみました。 具体的には、

hogeほげ

に対して、

hogeほげ

となる問題です。

再現条件は

  • aspellを使っていること
  • そのバージョンが0.60よりもあたらしいこと

のふたつです。 0.60以降のaspellはUTF-8をまじめにサポートしています。 flyspell(実際にはispell)でそれを検出して、 ispell-dictionary-alistにaspell用の辞書を追加しようとします。

さて、ここで追加される辞書は、

(nil "[[:alpha:]]" "[^[:alpha:]]" "'" t ("-d" "en" "--encoding=utf-8") nil utf-8)

こんなかんじ。 このうち、2番目と3番目の要素が単語を拾い出すのに使われています。 [:alpha:]は、

This matches any letter. (At present, for multibyte characters, it matches anything that has word syntax.)

なので、単語境界に空白のはいる言語であればかなりきれいに動きますが、 日本語のような言語だとうまく動かないのでした。

で、本質的な解決方法ですが、これがよくわかんない。 簡単な逃げとしては、自前の辞書を用意すればよくて、 ~/.emacs.d/init.el

(setq ispell-local-dictionary-alist
     '((nil "[a-zA-Z]" "[^a-zA-Z]" "'" t ("-d" "en" "--encoding=utf-8") nil utf-8)))

とでも書いておけばなんとかなります。

2006年2月15日

ElScreenが世に出たのは

08 Jan 1997 14:33:28 +0900らしいです。 もちろん、fj.sourcesで。 コードをばらまくと云えば、当時はまだNewsだった気がするな。 ちょうどWebへ移行し始めた時期かもしれない。

ElScreenはその半年前の1996年6月21日、あれは確か金曜日だったけど、 その夜にえいやで(Emacs Lispもろくに知らないのに)書き始めて、 次の日の午前中にとりあえず動くものができたのでした。 その日は少し仮眠して、すぐにElScreen-GFを書き始めたと。 そもそもそのころは、src/sys/netinetを読んでてどうも効率が悪いぜ、ってことで、 ElScreen-GFみたいなのが欲しくて書いたんだよな。

そういえば、(DX4 66MHzで)あまりに遅かったegg-mixの高速化をしたのもそのころだ。 そのコードは気にくわなくて、自分で使うだけでお蔵入り。

最近はいまいち体調もよろしくなくて時間もない(のか?)ので、 ElScreenもひと月ほど触ってない(正確には触ってるけどcommitしてない)けど、 もうちょっと1.4.xでやっときたいことがあるんだよなあ。

2006年2月21日

Carbon Emacs

久しぶりにCarbon Emacsを更新したら、いまいち調子が悪い。 WanderlustでPluggedなときにSuspendすると、 ResumeしたときにEmacsがささる。しくしく。

ちなみに、毎回コンパイルの仕方を探し出すのも大変なのでメモ。 使うパッチは以下の通り。

  • hide_menubar
  • inline-patch
  • transparency2

適当にパッチをあてたら、

$ CFLAGS="-DUSE_ATSUI" \
    ./configure --without-x \
    --enable-carbon-app=/Applications \
    --prefix=/Applications/Emacs.app/Contents/Resources
  …
$ make
  …
$ cd lisp
$ make recompile EMACS=../src/emacs
  …
$ cd ..
$ make
  …
$ sudo make install
  …
$

という感じで。

2006年2月26日

(equal-including-properties)

Emacs 22から(だと思う)、 equal-including-propertiesが新設されたんだけど、 仕様がよくわからん。

(equal-including-properties
 (propertize "hoge" :help-echo "hoge")
 (propertize "hoge" :help-echo "hoge"))
=> nil
(equal-including-properties
 (propertize "hoge" :help-echo 'hoge)
 (propertize "hoge" :help-echo 'hoge))
=> t

うーむ。

2006年2月28日

elscreen-screen-modified-hook-setup

…致命的にバグってました。よくこれで動いてるなあ。

2006年3月11日

choose_write_coding_system

save-bufferすると、自動的に適切なcoding systemが選択されます。 実際はwrite-regionがやっていて、 もっと正確にはfileio.cのchoose_write_coding_systemがこの作業をしています。 このことからもわかるように、 lispレベルでは、選択されるであろうcoding systemをwrite-regionをする前に知ることはできません。

でも、file-name-handlerを書いたりすると、 実際にファイルに書く前にchoose_write_coding_sysmemの返り値を知りたくなります。 ここで、この関数の中を見てみるとemacs_openするより先にVlast_coding_system_usedが設定されています。 これを使えば、以下のようなお行儀の悪い方法で目的を達成できます。

(condition-case nil
    (write-region start end "/")
  (file-error last-coding-system-used))

2006年3月15日

Hedgehog

というわけで、リリースしました。

Hedgehogは、EmacsenからGnuPGで暗号化したファイルを透過的に編集するためのソフトウェアです。 非常に低いレベル(write-region/insert-file-contents)で実装しているので、 ファイルに対するほぼすべての操作で暗号化ファイルを使うことが可能です。 なお、対象となるファイルは".gpg"という拡張子のついたものですが、 これも設定で変更可能です。

ラップトップ・コンピュータで『盗まれたりしたら不安だなあ』なんて考えてしまうあなた、 ほら、そこのあなたですよ、試してみてはいかがでしょうか?

2006年3月18日

call-process-regionは一時ファイルを作る

タイトルの通りなんですが、call-process-regionのdoc-stringにはさっぱり書いてません。 src/callproc.cを見ると、Fwrite_regionしてます。 ということは、 めんどいので試してませんがcall-process-regionのstartには文字列をつっこむこともできるはず。 一方、deleteをtのときにはFdelete_regionしてます。 したがって、startが文字列のときはエラーになります(意味から考えても当然)。

Hedgehogはcall-process-regionしてたんですが、 一時ファイルなんて作られちゃたまったものではないので、 やむを得ず非同期プロセスを同期プロセスのように使うように変更しました。 なんだかなー。

2006年7月25日

タブは邪魔だけどスクリーンの一覧は欲しい

なんて話を、ElScreenでたまに聞くことがあります。 たとえば、frame-titleに表示するなんて云うのはどうなんでしょうね?

こんな感じで。

(defun elscreen-frame-title-update ()
  (when (elscreen-screen-modified-p 'elscreen-frame-title-update)
    (let ((screen-list (sort (elscreen-get-screen-list) '<))
	  (screen-to-name-alist (elscreen-get-screen-to-name-alist)))
      (setq frame-title-format
	    (mapconcat
	     (lambda (screen)
	       (format "%d%s %s"
		       screen (elscreen-status-label screen)
		       (get-alist screen screen-to-name-alist)))
	     screen-list " ")))))

(eval-after-load "elscreen"
  '(add-hook 'elscreen-screen-update-hook 'elscreen-frame-title-update))

2006年9月17日

Hedgehog 0.99.5

Hedgehog 0.99.5をリリースしました。 Emacs 21.3でも動くといっておきながらろくに検証してなかったので、 ゴミ・データが混ざってしまう不具合があったようです。 Emacs 21ではstart-processしたあと、 データを渡せるようになるまでにちょっと待ってあげないとだめみたい。 ほんとにこれでいいのかはよくわかんないんだけど。

2006年11月12日

ElScreen-GF 1.5.2

ちうわけで、ElScreen-GF 1.5.2をリリースしました。

一番大きいのはGNU GLOBALのサポートですかね。 GNU GLOBALは、5.0からgrepスタイルの出力をサポートしたようなんですが、 結局これもインデントがおかしい(sedで自分で整形するのとかわらん)ので、 変なのをあきらめてサポートすることにしました。 5.0より古いものはsedを使うようになっているので、 バージョンはあまり気にせずに使えるんじゃないかな。

あとは…cscopeを使っているときに、callerを表示するようになった。 これは微妙にうれしいかも? それと、IDがないときにgidを実行しようとすると、 IDの生成かgrepの実行を選べるようになった。 これはGLOBALも同じ。

ElScreen本体は、だいぶ手が入ったまま放置状態…

2007年10月10日

recenter-masahiro

たまにはなにか書いてみる。Emacsでプロジェクタに表示しながらログを採るってことがあるかと思います。いやぼくはあまりロガーやんないですけど、まあそういうことはよくあるよねってことで。

で、ロガーは自分のラップトップの画面を見て書きたいけど、他のこともしたいので画面のミラーはしたくないわけです。そこで、Emacsちゅうくらいでmake-frame-commandとかやって、 違うフレームにログのバッファを表示させ、そのフレームだけをプロジェクタの画面に持って行ったりするわけですが、こいつがちょっとうまくいかない。つまり、同じバッファでもwindowごとにポイントは違うので、がんがんログをとって気がつくとプロジェクタではwindowの外、なんてことになったりするのですな。

その昔、そんなことがあったので、それを解消するべくrecenter-masahiroってのを書きました。 名前の由来はともかく(ぉ、それを懐かしむとともに、折角なので今ならこう書くぜというバージョンを晒しておきます。

(defadvice recenter (around recenter-masahiro activate)
  (let ((current-frame (selected-frame))
	(current-buffer (current-buffer))
	(current-point (point)))
    ad-do-it
    (mapc
     (lambda (frame)
       (mapc
	(lambda (window)
	  (select-window window)
	  (goto-char current-point)
	  ad-do-it)
	(get-buffer-window-list current-buffer nil frame)))
     (delq current-frame (frame-list)))))

要するに、recenterするときに他のwindowで表示されている同一バッファもrecenterしちゃおう、 というだけだったりします。

2007年10月19日

identity

すぐ忘れる…

identity is a built-in function in `C source code'.
(identity arg)

Return the argument unchanged.

2007年11月19日

ElScreen-Speedbar & ElScreen-ColorTheme

突然ですが、隙間ハックでつくったタイトルの二つを公開しました。 前者はSpeedbarのElScreen対応(不十分…)、後者はColorThemeでElScreen用のfaceが定義されていないテーマを選んだときにもなんとなくそれっぽいfaceを自動で生成するなにかです。

とはいえ、当の本人はどちらも使ってないのでどんなバグがあるかはよくわかりません。なにか見つけたら可能な限りは対応しますので、よろしくね。

2007年12月 8日

wl-user-mail-address-regexp

Wanderlustでは一般的にwl-user-mail-address-listに自分のメールアドレスを列挙します。しかし、plusなんかを使っているとこれでは対応しきれないので、wl-user-mail-address-regexpを使うことになります。これもリストにして欲しいんだけどな…

さて、これはこれでいいんですけど、replyするときに届いたメールに基づいてFromを変える、なんていう器用なことがとてもしにくい。これをなんとかしましょう、です。

この辺のコードは結構混沌としてるんですが、まあ以下の感じ。

(defun wl-summary-user-mail-address ()
  (save-excursion
    (catch 'user-mail-address
      (when (buffer-live-p reply-buf)        
        (set-buffer reply-buf)
        (mapc
         (lambda (address)
           (when (wl-address-user-mail-address-p address)
             (throw 'user-mail-address address)))
         (append (wl-parse-addresses (std11-field-body "From"))
                 (wl-parse-addresses (std11-field-body "To"))
                 (wl-parse-addresses (std11-field-body "Cc")))))
      wl-from)))

(setq wl-draft-config-alist
      '((t
         ("From" . (wl-summary-user-mail-address)))
	;; あとはふつう通りお好みで
	))

;; draft bufferの生成時にconfig-alistを処理
;; このタイミングじゃないとreply-bufは見えないので実は必須
(add-hook 'wl-mail-setup-hook
          (lambda ()
             (unless wl-draft-reedit
               (wl-draft-config-exec wl-draft-config-alist))))

もうちょっときれいにできそうだけどね。

追記

初出のコードでは、新規メール作成のときにエラーになってましたので、なおしました。

2008年7月16日

Dictionary.app

最近、LeopardのDictionary.appではWikipediaの検索もできると云うことを知りました。ほんとうはWikibooksも索けるとうれしいんですけど、Wikipediaだけでもまあまあ便利。

で、まあだからというわけでもないんですが、Emacsから手軽にDictionary.app使えるとうれしいなー、なんて。

(defvar open-dictionary-history nil)
(defun open-dictionary (&optional word)
  (interactive)
  (let ((word (or word (read-string "Open Dictionary.app for: "
				    (cons (thing-at-point 'word) 0)
				    'open-dictionary-history))))
    (start-process "dictionary.app" nil "open"
		   (format "dict:///%s" (encode-coding-string word 'utf-8)))))

(global-set-key "\M-l" 'open-dictionary)

あーWikibooks索きたい。

2009年1月17日

次のElScreenのリリースはいつかしら?

なんて待っていただいてる方がどれくらいいらっしゃるのかなぞですが、去年は結局一度もリリースできませんでした。

もうやること無いのかというとまだ微妙にあって、そんなこんなで内部構造ががっつり変わったバージョンは実は手元にあります。ええと、自分ではもう2年くらい使ってます(汗 じゃあなぜ出さないのかというと、まだやりたいことが相当数残ってるんですよね。でも今年も、少なくとも夏が終わるまでは一切コードは書けそうにありません。

というわけで、ごめんなさい、な感じです。

2009年2月 5日

Carbon EmacsでDrag'n Drop再び

このあたりで(ってもう3年半前か...)、Carbon EmacsでDrag'n Dropするぜという設定を載せました。まあ、よく見ると単にWanderlustの設定だったりしますけど。でも、この記事で使ってるmac-drag-N-dropって、もうないみたいなんですよね。

書いておいてあれですが、実はあまり使ってなかったのです。最近は特にこのへんで遊んでる暇もなくて、というのもあってなおさら。でも、メールで添付して飛ばしまくらないといけないことがありまして、昔の設定を探してみたらもう使えなかった、というわけです。

で、いまは、smart-dndというのに置き換わったみたいです。とりあえず使えるようにってことで中身はほぼ見てませんが、上記の記事と同様のことをするには以下の設定でおっけーです。わざわざt返したりしなくてもいいぶん、ちょっとシンプルになりましたね。

;;
;; smart-dnd
;;
(require 'smart-dnd)
(add-hook
 'wl-draft-mode-hook
 (lambda ()
   (smart-dnd-setup
    '((".*" . (mime-edit-insert-file (file-relative-name f) t))))))

2009年10月10日

そろそろEmacs 23に乗り換えるか

そろそろCocoaのEmacs 23も安定してきたような雰囲気が漂っているので、Emacs 23に乗り換えることにしました。

いや、実は、ElScreenでtermするとおかしくなるぜというレポートがあって、それが23.1だったから、というのがきっかけなんですが。でも、OSXでは再現しない(というか、再現してることに気づかない)状態だったので、VMwareにUbuntuいれました...というのは、また別の話。

% ./configure --with-ns
% make install

だけでいいという簡単さ。いや、make installすると、正しくEmacs.appにインストールされるのね。よくできました! ちなみに、設定とかもういいよね。十分詳しいページがたくさんあるので。基本的には、Emacs 22の頃と変わらず使えます。

ということで、ElScreenも23.1ベースの開発になります。というか、開発してるのか? とりあえず、1.4.99が動かない! と一瞬焦ったのは内緒。普通に動きました。

2010年5月30日

Emacs 23.2

ほんっとに日常的にEmacsを使わない生活になってしまいました。ふと気づくと、いやーん、23.2でてるじゃん...

実は23.2というか23.1.50の終盤で加えられた変更が、微妙にElScreenと不整合。と云うわけで直さないといけないわけだが...今まで手元で加えてた変更がもう忘却の彼方。たまらん、が、なんとかする。

2010年6月 5日

ns-open-file-select-line

前出の諸事情でEmacs 23.2に乗り換えたんですが(と云うか、Emacsは自宅でメール読むのに使うくらいになってしまったわけですが)、起動時の挙動がおかしい。具体的には、ふたつのファイルを指定するとフレームが2個開く。init.elを空っぽにしても同じ。でも、Emacs -qすると予定通りの挙動をするのです。

なんじゃこれはと思って悩むこと数時間、(featurep 'ns)でns-open-file-lineというイベントを拾ってns-open-file-select-lineが呼ばれていることが発覚。正直、余計なお世話... このイベントがどういうときに起きるのか調べる気力がないので正しい修正がわからないけど、とりあえずinit.elに以下をぶち込む。

(define-key global-map [ns-open-file-line] 'ignore)