NTEmacsでw32-symlinksを使えるようにする


; windows ショートカットを有効にする
; http://www.emacswiki.org/emacs/w32-symlinks.el
; ntemacs だと使えないぽい
;(setq w32-symlinks-handle-shortcuts t)
;(require 'w32-symlinks)
同じように悩んでいてとりあえず無理やり解決したので載せておく。

ショートカットかどうかを判断するために、ショートカットファイル内の
「L^@^@^@^A^T^B^@^@^@^@^@\300^@^@^@^@^@^@F」と
「"L\0\0\0\ \x01\x14\x02\0\0\0\0\0\xC0\0\0\0\0\0\0\x46"」を
string=してるんだけども、何故か\300の部分が\xC0がマッチしないのが原因。
ただ、(string= (buffer-substring 13 14) "\xC0")はnilなのに、
scratchバッファで(string= "\300" "\xC0)とするとtになる。C-q 3 0 0 RETがÀになるのが怪しいんだけど。

多分8ビット目が立ってるからstring=が失敗するんだと思うんだけど、良く分からんのでそこだけ飛ばして比較するようにしたら動いた。

Index: w32-symlinks.el
===================================================================
--- w32-symlinks.el     (リビジョン 1097)
+++ w32-symlinks.el     (作業コピー)
@@ -271,8 +271,8 @@
      ;; Parse the File Header Table.
      ;; Check for Shell Link identifier (4 bytes)
      ;; followed by Shell Link GUID (16 bytes):
-     (string= (buffer-substring 1 21)  ; otherwise not a shortcut file
-             "L\0\0\0\ \x01\x14\x02\0\0\0\0\0\xC0\0\0\0\0\0\0\x46")
+     (string= (store-substring (buffer-substring 1 21) 12 "_")  ; otherwise not a shortcut file
+             "L\0\0\0\ \x01\x14\x02\0\0\0\0\0_\0\0\0\0\0\0\x46")
      ;; Get the main flags dword at offset 14h.
      (let ((flags (w32-symlinks-buffer-substring-as-int (+ (point) ?\x14) 4))
           target)
(注意)requireする前にw32-symlinks-handle-shortcutsをtにしないといけない。
(setq w32-symlinks-handle-shortcuts t)
(require 'w32-symlinks)
これはシンボリックリンクの実装をショートカットにしている場合の話です。 具体的にはCYGWIN=winsymlinks ln -sで生成したシンボリックリンクか、Windows側で生成したショートカットに対応するものです。