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)

ウチちの環境でこのエラーを再現する方法:

  1. emacs を起動。 (elscreen, iswitchb, mcomplete が使える状態)
  2. C-z b *Message* と入力しようとする
  3. [No match] [No match] … と出て、全くバッファ名にマッチしなくなる
  4. *Message* バッファに Error in pre-command-hook: (args-out-of-range 41 63) が出てる
  5. *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

My Happy Hacking Keyboard Lite 2

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

Happy Hacking Keyboard Lite2 日本語

今現在、デスクトップ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.4php-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)