NTEmacs23.3でショートカットをw32-symlinksで扱えるようにする

以前 NTEmacsでw32-symlinksを使えるようにする - ヒルズで働く@robarioの技ログ で無理やり解決したんだけど、
パッチを当てるのが嫌なのでちょっとデバッグしてみた。記事中に

ただ、(string= (buffer-substring 13 14) "\xC0")はnilなのに、
scratchバッファで(string= "\300" "\xC0)とするとtになる。
C-q 3 0 0 RETがÀになるのが怪しいんだけど。

なんてことを書いたんだけど実はこれがビンゴで(まだまだ衰えてないかな)、*.lnkの読み込み時にマルチバイト変換されてしまうのが原因だったことが分かった。

;; 文字列が書き込まれた瞬間のenable-multibyte-charactersの値によってその後の挙動も変わる。
;; *scratch*で以下を一行ずつ評価するとちょっと面白い光景が見れる。
(set-buffer-multibyte t)
(insert 192)
(set-buffer-multibyte nil)
(insert 192)
(set-buffer-multibyte t)
(set-buffer-multibyte nil)

w32-symlinks.elをEmacsWikiのものに戻して、*.lnkを読み込むときにadviceしてみたらうまく動いた。

(defadvice insert-file-contents-literally (before insert-file-contents-literally-before activate)
  (set-buffer-multibyte nil))
;;↑元の値に戻さなくても大丈夫?もし戻す必要があるなら書き直す。
;;↑enable-multibyte-charactersがバッファローカルなので大丈夫のはず。

これでミニバッファでの補完もちゃんと動くので最終的にこんな設定になった。

;; w32-symlinks.el
(custom-set-variables '(w32-symlinks-handle-shortcuts t))
(require 'w32-symlinks)

(defadvice insert-file-contents-literally (before insert-file-contents-literally-before activate)
  (set-buffer-multibyte nil))

(defadvice minibuffer-complete (before expand-symlinks activate)
  (let ((file (expand-file-name
               (buffer-substring-no-properties
                (line-beginning-position) (line-end-position)))))
    (when (file-symlink-p file)
      (delete-region (line-beginning-position) (line-end-position))
      (insert (w32-symlinks-parse-symlink file)))))

Enjoy!