Top / MeadowMemo / diredでWindowsのリンクを扱う―w32-symlinks

コメント

最新の10件を表示しています。 コメントページを参照

  • おお!どなたか存じませんが、補完用のアドバイスありがとうです。 -- ななしですねん? 2003-10-14 (火) 08:51:36
  • win2k環境だと、file-symlink-pが常にnilを返すみたいで、動作しないんですけど…w32-symlinks.elのバージョンは 1.19ですたい -- ななしです? 2003-10-14 (火) 09:38:18
    • (customize-option 'w32-symlinks-handle-shortcuts) で t にした後*scratch*で(file-symlink-p "~/test.lnk")を評価しても nil になりますか? -- 松下 2003-10-14 (火) 11:48:26
      • はい。相変わらずnilが返ってきます。lnkがファイルの場合もディレクトリの場合もnilです。 -- ななしです? 2003-10-14 (火) 14:08:15
  • completerでは動かないと思ってたけど、たまに動きますね(completer-completeにアドバイスする)。ただし、highlight-completion.el が補完してしまうと、動作しないみたい。もう一工夫必要か。 -- 松下 2003-10-14 (火) 09:52:27
  • (string-match ".lnk$" file)の方はうまく動きました。当分これ使わせてもらいます。ありがとうございます。 -- ななしです? 2003-10-15 (水) 09:49:08
お名前:

dired以外でも有効にする

ご存知とは思いますが、dired以外(find-fileとか)でも効くようです。
以下の式を評価し、onに設定し、Save for Future Sessions する。

(require 'w32-symlinks)
(customize-option 'w32-symlinks-handle-shortcuts)

これで…
リンク先が通常ファイルの場合は C-x C-f ~/なんとか.lnk でリンク先のファイルを開いてくれる。
でも リンク先がディレクトリの場合は、C-x C-f ~/かんとか.lnk/ と出た後の補完はやってくれず、結局diredでそのディレクトリを開くようです。

なんか中途半端な感じですね。
どっかにアドバイスするなりフックに仕掛けたらディレクトリの場合も補完できるようになりませんかねー

適当ですが

(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 (ls-lisp-parse-symlink file)))))

こんな感じかな.completerとかを利用しているなら,関数を変更する必要があります.しかし,なぜかcompleterを使っていると動かない...

Win2000/XPで確認してみましたが、リンクファイルが存在しなくても、リンクらしきファイル名だと(file-symlink-p "~/test.lnk")がt になりました。とすると、こんな確認でもいいのかな。

(defadvice minibuffer-complete
  (before expand-symlinks activate)
  (let ((file (expand-file-name
               (buffer-substring-no-properties
                (line-beginning-position) (line-end-position)))))
    (when (string-match ".lnk$" file)
      (delete-region (line-beginning-position) (line-end-position))
      (insert (ls-lisp-parse-symlink file)))))

ヒストリを微妙に実現

diredでw32-symlinks.elを使って、フォルダを開く時, 新しいバッファを作成しないの設定を使っていると、以前のディレクトリへ戻ることが面倒(だからこそリンクを使うわけだし)。

これは、diredでディレクトリを辿るたびに現在のディレクトリをリストとして保存すればいい。ということで適当にでっち上げたものを使ってます。

(defvar my-dired-history nil)

(defadvice dired
  (after make-variable-dired-history activate)
  (make-local-variable 'my-dired-history)
  (setq my-dired-history (cons default-directory nil)))

(defadvice dired-advertised-find-file
  (around save-dired-history activate)
  (let ((lst my-dired-history))
    ad-do-it
    (make-local-variable 'my-dired-history) 
    (setq my-dired-history (cons default-directory lst))))

(defadvice dired-up-directory
  (around save-dired-history activate)
  (let ((lst my-dired-history))
    ad-do-it
    (make-local-variable 'my-dired-history)
    (setq my-dired-history (cons default-directory lst))))

(defun my-dired-previous-history ()
  (interactive)
  (let ((lst my-dired-history) (flg t))
    (kill-buffer (current-buffer))
    (if (and lst
             (string-match (car lst) default-directory))
        (dired (car (cdr lst)))
      (setq flg nil)
      (dired (car lst)))
    (make-local-variable 'my-dired-history)
    (if flg
        (setq my-dired-history (cdr (cdr lst)))
      (setq my-dired-history (cdr lst)))))

(define-key dired-mode-map "\C-^" 'my-dired-previous-history)

w32-symlinks の日本語化の修正

永井? (2005-01-31 (月) 19:33:11)

「25.3.8 dired でWindows のショートカットを扱う方法」が紹介されていて
設定してみましたが、リンク先が日本語を含む場合について私の環境では問題がありましたが、解決しましたので、参考のため報告します。

リンク先が日本語含む場合の修正として、変数 file-name-coding-system の
代わりに、'shift-jis を使うように修正していますが、mewdow2.00 では、
'shift-jis 代わりに 'japanese-shift-jisとする必要がありました。
さらに、固定したコーディングでなくではなくdefault-file-name-coding-system を参照するとうまく行きましたので、現在は以下のようにして使っています。

*** w32-symlinks.el.0	Mon Jan 31 17:36:58 2005
--- w32-symlinks.el	Mon Jan 31 18:50:41 2005
***************
*** 347,352 ****
  		       (buffer-substring (point) (+ (point) len)))))))
         (when target
! 	 (setq target (decode-coding-string
! 		       target file-name-coding-system))	; Eli Zaretskii
  	 (cond ((eq w32-symlinks-shortcut-target 'expand) ; Canonicalize
  		;; Full expansion RELATIVE TO THE SHORTCUT DIRECTORY
--- 347,356 ----
  		       (buffer-substring (point) (+ (point) len)))))))
         (when target
! 	 (setq target (decode-coding-string             ; Eli Zaretskii
! 		       target
! 		       (if file-name-coding-system
! 			   file-name-coding-system
! 			 default-file-name-coding-system))); Yutaka Nagai
! 					
  	 (cond ((eq w32-symlinks-shortcut-target 'expand) ; Canonicalize
  		;; Full expansion RELATIVE TO THE SHORTCUT DIRECTORY

つまり file-name-coding-system が設定されているときはそれを使い、そう
でない時は、default-file-name-coding-system を参照しています。


お名前:

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Fri, 28 Dec 2007 17:22:05 JST (3409d)