2014年5月10日土曜日

term, ansi-term, multi-term + cygwin-mount.el で発生する No such directory found via CDPATH environment variable について


このエントリーをはてなブックマークに追加


少々長いタイトルになってしまいましたが、題記の通りです。cygwin-mount.el を有効化した環境で、term.el系を起動したタイミングや、特定ディレクトリへ cd したタイミングで発生します。

No such directory found via CDPATH environment variable

この現象は、ターミナル側の cd を捕捉して、Emacs 側でも cd を動かそうとして発生しますので、.emacs や init.el で、

;; term側 cd 捕捉によるEmacs側の cd を抑制(term.elで定義されている関数)
(fset 'term-command-hook '(lambda (x)))

として、ターミナル側の入力をキャッチしている関数を無効化すると、とりあえずは現象を回避できます。

この根本原因は、cygwin-mount.el によって変換される cygwin マウントポイント となるディレクトリを直接指定する場合に、末尾に / つきパスでないと変換してくれない、という仕様によるもののようです。

このようなマウントポイントの場合、
(shell-command "df -h")

ファイルシス                                 サイズ  使用  残り 使用% マウント位置
C:/gnupack_devel-12.02/app/cygwin/cygwin/bin   230G  153G   77G   67% /usr/bin
C:/gnupack_devel-12.02/app/cygwin/cygwin/lib   230G  153G   77G   67% /usr/lib
C:/gnupack_devel-12.02/app/cygwin/cygwin       230G  153G   77G   67% /
C:/gnupack_devel-12.02/app/cygwin/local        230G  153G   77G   67% /usr/local
C:/gnupack_devel-12.02/home                    230G  153G   77G   67% /home


これは上手くいきますが、
(cd "/home/")

"c:/gnupack_devel-12.02/home/"

これはエラーになります。
(cd "/home")

Debugger entered--Lisp error: (error "No such directory found via CDPATH environment variable")
  signal(error ("No such directory found via CDPATH environment variable"))
  error("No such directory found via CDPATH environment variable")
  ad-Orig-cd("/home")
  cd("/home")
  eval((cd "/home") nil)
  eval-last-sexp-1(t)
  eval-last-sexp(t)
  eval-print-last-sexp()
  call-interactively(eval-print-last-sexp nil nil)


このあたりをいじるとよくなるかもしれないですが、どんな影響があるかわからないので、今回の対策としました。

cygwin-mount-activate is an interactive Lisp function in
`cygwin-mount.el'.

(cygwin-mount-activate)

Activate cygwin-mount- and cygwin-style-handling.

file-name-handler-alist

(("\\(?:\\.dz\\|\\.xz\\|\\.lzma\\|\\.lz\\|\\.g?z\\|\\.\\(?:tgz\\|svgz\\|sifz\\)\\|\\.tbz2?\\|\\.bz2\\|\\.Z\\)\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)?\\'" . jka-compr-handler)
 ("\\.gpg\\(~\\|\\.~[0-9]+~\\)?\\'" . epa-file-handler)
 ("\\`/[^/]\\{2,\\}\\'" . tramp-completion-file-name-handler)
 ("\\`/\\([^[/|:]\\{2,\\}\\|[^/|]\\{2,\\}]\\):" . tramp-file-name-handler)
 ("\\.lnk\\'" . w32-symlinks-file-name-handler)
 ("^/cygdrive/[A-Za-z]/" . cygwin-mount-map-drive-hook-function)
 ("^//[A-Za-z]/" . cygwin-mount-map-drive-hook-function)
 ("^/[^:@]*$\\|^/|/[^/:]+\\(\\'\\|/\\)" . cygwin-mount-name-hook-function)
 ("\\`/:" . file-name-non-special))

0 件のコメント:

コメントを投稿