お品書き

概要 *

fileffap-2007.10.19.zip

emacsにあるffapの説明をみて想像で実装したものです。
コードは参考にしていないのでバグや機能不足があるかもしれません。

キャレット位置周辺の文字を見てパスやURIを探し、
パスの場合、デフォルトの値に指定した状態でfind-fileします。
URIの場合、ブラウザ等で開きます。(設定可)
キャレット位置周辺から探せなかった場合は、
以前と変わらぬfind-fileをお楽しみ頂けます。

要するに (require "ffap") や <a href="../index.html">
等の上でC-x C-fしたときにミニバッファが
Find file: c:/bin/xyzzy/site-lisp/ffap.l

Find file: c:/data/web/index.html
という状態でfind-fileを開始できるようになります。

設定 *

NetInstallerで導入した方は 1 は不要です
(ni-autoload)している方は 2 の1行目は不要です

  1. $XYZZY/site-lisp/ 以下にコピーし、バイトコンパイルしてください
  2. .xyzzy や siteinit.l に以下を記述し、
    siteinit.lに書いた人は再ダンプしてください
(require "ffap")
(ffap-bindings)

使い方 *

  • find-file-at-point:
    • 通常通りfind-file(デフォルトはC-x C-f)してください
    • 以前のfind-file同様、C-u C-x C-fでエンコードを指定出来ます
    • ffapがパスを探せず、困った時はセレクションで選択してC-x C-fしてください
    • URIが見つかった場合は関連付けに従って開こうとします
  • open-file-at-point:
    • 通常通りopen-filer(デフォルトはC-c C-f)してください
    • アクティブな側のパスを変更してファイラを開く
      • C-u C-c C-f
    • アクティブでない側のパスを変更してファイラ開く
      • C-u C-u C-c C-f

謝辞 *

作成にあたり、clickable-uriを参考にさせていただきました。
作者のOHKUBO Hiroshiさんに感謝いたします。

履歴 *

2007.10.19

  • virtual-fileからfind-fileした場合の初期ディレクトリをまともにした

2007.02.22

  • キャレット付近に空白があるときにopen-filer-at-pointするとエラーが出たのを修正

2007.02.19

  • uriのヒストリを取るようにした

2007.02.13

  • find-other-file-at-point, insert-file-at-point, read-file-at-pointを追加
  • 全てのキー割り当てをする関数 ffap-bindings を追加

2007.02.08

  • open-filer-at-pointでバッファ上の文字がパスでない場合はdefault-directoryを使うようにした

2006.10.08

  • バッファ上の文字を考慮してファイラを開く機能を追加

2006.10.05

  • 1画面ファイラを開いた時に複数のファイルが選べなくなっていたのを修正

2006.05.10

  • 初版

コメント *

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

  • si:getenvの戻り値がnilになることがありますが、それが考慮されていません。(Linux上のWineで起動した場合ですが、(si:getenv "PATHEXT") が nil でロードに失敗しました)
    それと、*ffap-default-extension* と *ffap-default-path* は起動時に作るようにする方が良いと思います。ダンプに含まれてしまうと、ダンプ作成後の環境変数の変更が反映されません。
    Windows ディレクトリは(si:getenv "WINDIR") よりも (get-windows-directory) がいいかもしれません。(どちらでも良いような気はします) -- NANRI? 2008-03-26 (水) 19:48:08
    diff -r a97af19fe04c ffap.l
    --- a/ffap.l	Wed Mar 26 03:50:26 2008 +0900
    +++ b/ffap.l	Sat Mar 29 03:57:31 2008 +0900
    @@ -207,30 +207,29 @@
     
     ;; デフォルトの拡張子
     ;; >> "\\.\\(COM\\|EXE\\|BAT\\|CMD\\|VBS\\|VBE\\|JS\\|JSE\\|WSF\\|WSH\\)$"
    -(defvar *ffap-default-extension*
    -  (concat "\\.\\("
    -		  (substitute-string (substitute-string
    -							  (si:getenv "PATHEXT")
    -							  "\\." "")
    -							 ";" "\\\\|")
    -		  "\\)$"))
    +(defvar *ffap-default-extension* nil)
    +
    +(defun ffap-create-default-extension ()
    +  (and (si:getenv "PATHEXT")
    +	   (format nil "\\(~{~a~^\\|~}\\)$" (mapcar #'regexp-quote (split-string (si:getenv "PATHEXT") ";")))))
     
     ;; デフォルトのパス
    -(defvar *ffap-default-path*
    -  (append ;xyzzyのインストールディレクトリ
    -   (list (si:system-root))
    -   ;環境変数 PATH
    -   (mapcar 'map-backslash-to-slash
    -		   (split-string (si:getenv "PATH") ";"))
    -   ;Windows (あってるか自信ない)
    -   (mapcar 'map-backslash-to-slash
    -		   (split-string (si:getenv "WINDIR") ";"))
    -   ;Home
    -   (mapcar 'map-backslash-to-slash
    -		   (split-string (si:getenv "HOME") ";"))
    -   ;XyzzyHome
    -   (mapcar 'map-backslash-to-slash
    -		   (split-string (si:getenv "XYZZYHOME") ";"))))
    +(defvar *ffap-default-path* nil)
    +
    +(defun ffap-create-default-path ()
    +  (let ((paths nil))
    +	(pushnew (si:system-root) paths) ; xyzzyのインストールディレクトリ
    +	(when (si:getenv "PATH")
    +	  (mapcar #'(lambda (x)
    +				  (pushnew (map-backslash-to-slash x) paths :test #'path-equal))
    +			  (split-string (si:getenv "PATH") ";"))) ; 環境変数 PATH
    +	(pushnew (map-backslash-to-slash (get-windows-directory)) paths :test #'path-equal)
    +	(pushnew (map-backslash-to-slash (user-homedir-pathname)) paths :test #'path-equal) ; ~/
    +	(nreverse paths)))
    +
    +(add-hook '*post-startup-hook* #'(lambda ()
    +								   (setq *ffap-default-extension* (ffap-create-default-extension))
    +								   (setq *ffap-default-path* (ffap-create-default-path))))
     
     ;; history
     (defvar *ffap-uri-history* nil)
  • patchも書いてみましたので置いておきます。 -- NANRI? 2008-03-29 (土) 06:54:00
  • ffap-get-path中のstrやstr1がパス名としては長すぎた場合の対処がされていません。fundamental-modeで「C-u 1 0 2 4 a C-a C-x C-f(find-file-at-point)」などとすると再現するかと思います。てきとーに対処したpatchも置いておきます。 -- NANRI? 2008-08-21 (木) 21:20:11
    diff -r ebe5b343c735 site-lisp/ffap.l
    --- a/site-lisp/ffap.l	Thu Aug 21 21:05:52 2008 +0900
    +++ b/site-lisp/ffap.l	Thu Aug 21 21:09:21 2008 +0900
    @@ -388,26 +388,27 @@
     (defvar *ffap-find-uri* t)
     
     (defun ffap-get-path ()
    -  (let ((str (substitute-string
    -			  (ffap-get-current-string-syntax)
    -			  "\\\\\\\\" "\\\\")); パスの区切りが\\の時にこの値が"\\\\"となる対策
    -		(str1 (substitute-string
    -			   (ffap-get-current-string-uri-chars)
    -			   "\\\\\\\\" "\\\\")))
    -	(ffap-correct-uri
    -	 (or (and (not (string= str "")) (file-exist-p str) str)
    -		 (and (not (string= str1 "")) (file-exist-p str1) str1)
    -		 (ffap-locate str)
    -		 (ffap-locate-approx str)
    -		 (when *ffap-find-uri*
    -		   (ffap-get-uri str))
    -		 (ffap-get-mail-address str)
    -		 
    -		 (ffap-locate str1)
    -		 (ffap-locate-approx str1)
    -		 (when *ffap-find-uri*
    -		   (ffap-get-uri str1))
    -		 (ffap-get-mail-address str1)))))
    +  (ignore-errors
    +   (let ((str (substitute-string
    +			   (ffap-get-current-string-syntax)
    +			   "\\\\\\\\" "\\\\")); パスの区切りが\\の時にこの値が"\\\\"となる対策
    +		 (str1 (substitute-string
    +				(ffap-get-current-string-uri-chars)
    +				"\\\\\\\\" "\\\\")))
    +	 (ffap-correct-uri
    +	  (or (and (not (string= str "")) (file-exist-p str) str)
    +		  (and (not (string= str1 "")) (file-exist-p str1) str1)
    +		  (ffap-locate str)
    +		  (ffap-locate-approx str)
    +		  (when *ffap-find-uri*
    +			(ffap-get-uri str))
    +		  (ffap-get-mail-address str)
    +
    +		  (ffap-locate str1)
    +		  (ffap-locate-approx str1)
    +		  (when *ffap-find-uri*
    +			(ffap-get-uri str1))
    +		  (ffap-get-mail-address str1))))))
     
     (defun ffap-open-uri (uri)
       (when (and uri
  • This artilce keeps it real, no doubt. -- Javier? 2015-12-12 (土) 10:43:29
  • Now I know who the brainy one is, I'll keep loiknog for your posts. -- Independence? 2016-08-19 (金) 17:16:08
お名前:

Tag: xyzzy script



添付ファイル: fileffap-2007.10.19.zip 1104件 [詳細] fileffap-2007.02.22.zip 632件 [詳細] fileffap-2007.02.19.zip 543件 [詳細] fileffap-2007.02.13.zip 520件 [詳細]
トップ   編集 凍結 差分 BACKUP 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-19 (金) 06:26:41 (3450d)