X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2536fb611876d5526fe40b9bee2a16e2836d4ff3..61523a7c4090576ccc812e3328bf18aa9ea9ecec:/lisp/ffap.el diff --git a/lisp/ffap.el b/lisp/ffap.el index 314d48e9ca..2c750d8f61 100644 --- a/lisp/ffap.el +++ b/lisp/ffap.el @@ -1,7 +1,7 @@ ;;; ffap.el --- find file (or url) at point ;; Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007 Free Software Foundation, Inc. +;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: Michelangelo Grigni ;; Maintainer: FSF @@ -13,7 +13,7 @@ ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) +;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -482,7 +482,7 @@ Returned values: "In remote FULLNAME, replace path with NAME. May return nil." ;; Use ange-ftp or efs if loaded, but do not load them otherwise. (let (found) - (mapcar + (mapc (function (lambda (sym) (and (fboundp sym) (setq found sym)))) '( efs-replace-path-component @@ -797,7 +797,10 @@ This uses ffap-file-exists-string, which may try adding suffixes from ("\\.bib\\'" . ffap-bib) ; search ffap-bib-path ("\\`\\." . ffap-home) ; .emacs, .bashrc, .profile ("\\`~/" . ffap-lcd) ; |~/misc/ffap.el.Z| - ("^[Rr][Ff][Cc][- #]?\\([0-9]+\\)" ; no $ + ;; This uses to have a blank, but ffap-string-at-point doesn't + ;; handle blanks. + ;; http://lists.gnu.org/archive/html/emacs-devel/2008-01/msg01058.html + ("^[Rr][Ff][Cc][-#]?\\([0-9]+\\)" ; no $ . ffap-rfc) ; "100% RFC2100 compliant" (dired-mode . ffap-dired) ; maybe in a subdirectory ) @@ -953,12 +956,20 @@ If t, `ffap-tex-init' will initialize this when needed.") "/pub/gnu/emacs/elisp-archive/")) (substring name 2)))) +(defcustom ffap-rfc-directories nil + "A list of directories to look for RFC files. +If a given RFC isn't in these then `ffap-rfc-path' is offered." + :type '(repeat directory) + :version "23.1" + :group 'ffap) + (defvar ffap-rfc-path (concat (ffap-host-to-filename "ftp.rfc-editor.org") "/in-notes/rfc%s.txt")) (defun ffap-rfc (name) - (format ffap-rfc-path - (substring name (match-beginning 1) (match-end 1)))) + (let ((num (match-string 1 name))) + (or (ffap-locate-file (format "rfc%s.txt" num) t ffap-rfc-directories) + (format ffap-rfc-path num)))) ;;; At-Point Functions: @@ -969,7 +980,7 @@ If t, `ffap-tex-init' will initialize this when needed.") ;; Slightly controversial decisions: ;; * strip trailing "@" and ":" ;; * no commas (good for latex) - (file "--:$+<>@-Z_[:lower:]~*?" "<@" "@>;.,!:") + (file "--:\\\\$+<>@-Z_[:lower:]~*?" "<@" "@>;.,!:") ;; An url, or maybe a email/news message-id: (url "--:=&?$+@-Z_[:lower:]~#,%;*" "^[:alnum:]" ":;.,!?") ;; Find a string that does *not* contain a colon: @@ -1045,6 +1056,9 @@ Assumes the buffer has not changed." ;; Older: (apply 'copy-region-as-kill ffap-string-at-point-region) (message "Copied to kill ring: %s" str)))) +;; External. +(declare-function w3-view-this-url "ext:w3" (&optional no-show)) + (defun ffap-url-at-point nil "Return url from around point if it exists, or nil." ;; Could use w3's url-get-url-at-point instead. Both handle "URL:", @@ -1259,17 +1273,26 @@ which may actually result in an url rather than a filename." )) (setq dir (file-name-directory guess)))) (let ((minibuffer-completing-file-name t) - (completion-ignore-case read-file-name-completion-ignore-case)) - (setq guess - (completing-read - prompt - 'ffap-read-file-or-url-internal - dir - nil - (if dir (cons guess (length dir)) guess) - (list 'file-name-history) - (and buffer-file-name - (abbreviate-file-name buffer-file-name))))) + (completion-ignore-case read-file-name-completion-ignore-case) + (fnh-elem (cons ffap-url-regexp 'url-file-handler))) + ;; Explain to `rfn-eshadow' that we can use URLs here. + (push fnh-elem file-name-handler-alist) + (unwind-protect + (setq guess + (completing-read + prompt + 'ffap-read-file-or-url-internal + dir + nil + (if dir (cons guess (length dir)) guess) + (list 'file-name-history) + (and buffer-file-name + (abbreviate-file-name buffer-file-name)))) + ;; Remove the special handler manually. We used to just let-bind + ;; file-name-handler-alist to preserve its value, but that caused + ;; other modifications to be lost (e.g. when Tramp gets loaded + ;; during the completing-read call). + (setq file-name-handler-alist (delq fnh-elem file-name-handler-alist)))) ;; Do file substitution like (interactive "F"), suggested by MCOOK. (or (ffap-url-p guess) (setq guess (substitute-in-file-name guess))) ;; Should not do it on url's, where $ is a common (VMS?) character. @@ -1687,20 +1710,8 @@ Only intended for interactive use." ;;; Bug Reporter: -(defun ffap-bug nil - "Submit a bug report for the ffap package." - ;; Important: keep the version string here in synch with that at top - ;; of file! Could use lisp-mnt from Emacs 19, but that would depend - ;; on being able to find the ffap.el source file. - (interactive) - (require 'reporter) - (let ((reporter-prompt-for-summary-p t)) - (reporter-submit-bug-report - "Michelangelo Grigni " - "ffap" - (mapcar 'intern (all-completions "ffap-" obarray 'boundp))))) - -(fset 'ffap-submit-bug 'ffap-bug) ; another likely name +(define-obsolete-function-alias 'ffap-bug 'report-emacs-bug "23.1") +(define-obsolete-function-alias 'ffap-submit-bug 'report-emacs-bug "23.1") ;;; Hooks for Gnus, VM, Rmail: @@ -1724,6 +1735,13 @@ Only intended for interactive use." (defvar gnus-summary-buffer) (defvar gnus-article-buffer) +;; This code is called from gnus. +(declare-function gnus-summary-select-article "gnus-sum" + (&optional all-headers force pseudo article)) + +(declare-function gnus-configure-windows "gnus-win" + (setting &optional force)) + (defun ffap-gnus-wrapper (form) ; used by both commands below (and (eq (current-buffer) (get-buffer gnus-summary-buffer)) (gnus-summary-select-article)) ; get article of current line