5 月 11
emacs(Meadow 3.00-dev) の elscreen と iswitchb と mcomplete が便利でよかったんだけど、いつの頃からか、
C-z b(elscreen-find-and-goto-by-buffer) をしたときに、ミニバッファが↓の様になって、うまくいかない事件が発生。
[No match] [No match] [No match] [No match] [No match] …
調べてみると、*Message* バッファに次のエラーが。(数値の部分はその時々で変わる)
Error in pre-command-hook: (args-out-of-range 41 63)
ウチちの環境でこのエラーを再現する方法:
- emacs を起動。 (elscreen, iswitchb, mcomplete が使える状態)
- C-z b *Message* と入力しようとする
- [No match] [No match] … と出て、全くバッファ名にマッチしなくなる
- *Message* バッファに Error in pre-command-hook: (args-out-of-range 41 63) が出てる
- *Message* [No match] [No match] [No match] [No match] とかいう名前のバッファが新規作成される
ちなみに、 C-x b などでバッファを選ぶと問題ない。 C-z b の時だけ。
原因究明:
pre-command-hook とか言われても、どの hook がダメなのかさっぱりだったので、いろいろ追っかけて、elscreen と mcomplete の連携がうまくいってないことが判明。
ずっと、iswitchb が原因と思って iswitchb.el をデバッグしてたのに・・・。
mcomplete.el の 1093 行目付近の以下の箇所を修正。
修正前:
(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off)))
'(iswitchb-buffer iswitchb-buffer-other-window
iswitchb-display-buffer iswitchb-buffer-other-frame
ido-find-file ido-find-alternate-file ido-write-file
ido-insert-file ido-switch-buffer ido-insert-buffer
ido-kill-buffer ido-find-file-other-window
ido-find-file-other-window ido-switch-buffer-other-window
ido-display-buffer ido-find-file-other-frame
ido-switch-buffer-other-frame))
修正後:
(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off)))
'(iswitchb-buffer iswitchb-buffer-other-window
iswitchb-display-buffer iswitchb-buffer-other-frame
ido-find-file ido-find-alternate-file ido-write-file
ido-insert-file ido-switch-buffer ido-insert-buffer
ido-kill-buffer ido-find-file-other-window
ido-find-file-other-window ido-switch-buffer-other-window
ido-display-buffer ido-find-file-other-frame
ido-switch-buffer-other-frame
elscreen-find-and-goto-by-buffer
))
どうやら、mcomplete は、 iswitchb とかと競合しないように気を遣っているようだけど、elscreen は眼中になかったらしい。
4 月 30
php-mode.el を修正。
↓の様なインデントをサポートするように改造。
$a = array(
'aaaa' => 1,
'bbbb' => 2,
);
あと、もともと入っていた template という、ウィザード形式の入力支援が苦手だったので、全部その処理をしているところをばっさり削除。
便利な入力支援は yasnippet を使うことにする方がいいかも。
http://code.google.com/p/yasnippet/
3 月 31

Happy Hacking Keyboard Lite2 を使い始めて、手首を浮かすことがだいぶ少なくなったので、手首が腱鞘炎っぽくなることがほぼ無くなった。
それでも今度は、Emacs 使いの所為か左手小指にかなり負荷がかかっていて、
一日の終わりに頭よりも目よりも先に、左小指が一番最初にガタが来る症状に悩まされたあげく、自分なりの解決策にたどり着いた。
解決策:一番丈夫なのにスペースキーくらいしか叩いてない親指に働いてもらう
↑の画像のようにキーを入れ替える。
- 半角/全角 → 左Alt
- 無変換 → 左Control
- 変換 → 右Control
- カタカナ/ひらがな → 右Alt
- 左Alt → メニュー
- ;(セミコロン) → Enter
- Ctrl+;(Ctrlを押しながら;) → ;(セミコロン)
キーの入れ替えには「窓使いの憂鬱」というソフトを使用。
このソフトはかなり便利で、いろんなソフトで Emacs ライクなキーバインドを使える。
窓使いの憂鬱の設定ファイル .mayu に以下を追加。
mod control += 無変換 # 無変換 を LControl に
key *無変換 = *LControl # 〃
mod control += 変換 # 変換を を LControl に
key *変換 = *LControl # 〃
mod alt += ひらがな # ひらがな を LAlt に
key *ひらがな = *LAlt # 〃
if ( HHKBLite2 )
mod alt -= RAlt # RAlt を 右クリックメニューの出るやつに
key *RAlt = *APPS # 〃
mod alt += 半角/全角 # 半角/全角 を LAlt に
key *半角/全角 = *LAlt # 〃
key Escape = &Default # Escape を元に戻す
endif
if ( LetsNoteCFY2 )
key *半角/全角 = *Esc # 半角/全角を Esc に
#key *Esc = *半角/全角 # Esc はそのまま
key *Escape = *Escape # Escape を元に戻す
endif
key *IC-SemiColon = Enter # セミコロン を Enter に
key *IC-C-~S-SemiColon = SemiColon # Ctrlを押しながらだとセミコロンに;
#key *IC-C-~S-I = Tab # Ctrlを押しながらだとTabに
↑の設定では、デスクトップの HHKBLite2 と、Laptop の Let’s note CF-Y2 で同じ設定を共有できるように、
デスクトップで使用する場合は、シンボルに HHKBLite2 を、
Laptop で使用する場合は、シンボルに LetsNoteCFY2 を定義して切り分けるようにしてある。
これで、Control キーを押しっぱなし、Alt キーを押しっぱなしといったことがほとんど親指の仕事になったので、
左小指への負担はだいぶ軽減された。相当酷使しない限り今のところ平気。
あとは、さらに小指の負担が減るように、 Ctrl+i で Tab になるようにしてある。
「窓使いの憂鬱」を使い始めて、何も Happy Hacking Keyboard Lite2 じゃなくても、
同じくらいか、もう少し小さめのキーを押しやすいキーボードがあればそれでいい気がしてきた・・・。
英語版キーボードも、スペースキーの周りにもっとキーがいっぱいあればな・・・。
関連:キーボード(Happy Hacking Keyboard Lite2)
3 月 31

今現在、デスクトップPC用のキーボードで Happy Hacking Keyboard Lite2 の日本語配列を使用中。(キーを入れ替えて使用)
選んだ理由は、使い始めた当時、Happy Hacking Keyboard は使いやすいと噂で聞いていたのと、
Happy Hacking Keyboard Professional が英語配列しかなくて、しかも高かったので、 HHKB Lite2 を選択。
Continue reading »
3 月 26
Meadow で、 dired から外部のプログラムへファイルを送る実験。
CraftDrop というコマンドラインからファイルを、起動中のプログラムへファイルをドラッグ&ドロップするプログラムを使用する。
cdrop.exe, cdropopt.exe, cdrop.dat(←cdrop.exeを初回起動時に作成される) を PATH の通ったところにコピー。
(めんどかったので、meadow/bin に放り込んだ)
.emacs に↓を追加:
;; dired で "c" でファイルを CraftDrop 送り
(add-hook 'dired-mode-hook
(lambda ()
(local-set-key "c" 'dired-exec-craftdrop)))
(defun dired-exec-craftdrop ()
"In dired, execute CraftDrop"
(interactive)
(craftdrop (dired-get-filename)))
;; 現在の行のファイルを craftdrop 送りにする
(define-process-argument-editing "/cdrop\\.exe$"
(lambda (x)
(general-process-argument-editing-function x nil nil nil)))
(defun craftdrop (&optional fname)
(interactive)
(if (not (file-exists-p fname))
(message "%s can't open." fname)
(setq fname (unix-to-dos-filename fname))
(let ((w32-start-process-show-window t))
(apply (function start-process)
"cdrop" nil "cdrop.exe" (list fname)))))
C-x d で dired を起動して、何かファイルにカーソルを合わせた状態で c を押すと、そのファイルを CraftDrop 送りにできる。
CraftDrop をまだ、ちゃんと使ってないので、このコードが活きてくるのか不明・・・。
参考にしたサイト:
3 月 01
※新しい php-mode.el (2008/04/30)
PHP を使うことになったので emacs の php-mode を入れてみたけど、非常に使いにくい状態。
不満噴出で、いろいろ調べて既存の2つの php-mode をくっつけて修正したバージョン。
php-mode.el ver 0.0.4 と php-mode.el var 1.2.0を混ぜて少し修正。
meadow で動作確認。
site-lisp に php-mode.el をコピーして、
.emacs に以下の行を追加。
(autoload 'php-mode "php-mode" "PHP mode" t)
(setq auto-mode-alist
(cons '("\\.\\(php\\|php5\\|inc\\)$" . php-mode) auto-mode-alist))
(add-hook 'php-mode-hook '(lambda ()
(setq php-intelligent-tab nil)
(setq intelligent-tab nil)
(setq indent-tabs-mode t)
(setq c-basic-offset 4)
(setq tab-width 4)
) t)