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)