Hatena::ブログ(Diary)

ヒルズで働く@robarioの技ログ このページをアンテナに追加 RSSフィード

2011年06月10日

[][] 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!

ひろーひろー 2011/07/04 11:49 ありがとうございます!
自分の知識量では何が悪いのか見当もつかなかったのですが、おかげさまでw32-symlinksが使えるようになりました。m(_ _)m

holidays-lholidays-l 2011/07/19 11:09 役に立って良かったです。
平たく言うと、リンク先を調べるためにショートカットファイルを読み込んだ時、Emacsが内容を勝手に変更してしまうのでリンク先が分からなくなっていた→ので変更させないようにした、という感じです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証