More tweaks of skeleton documentation wrt \n behavior at bol/eol.
[bpt/emacs.git] / lisp / ffap.el
index 0769469..119e0ad 100644 (file)
@@ -1,9 +1,9 @@
 ;;; ffap.el --- find file (or url) at point
 
-;; Copyright (C) 1995-1997, 2000-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1995-1997, 2000-2014 Free Software Foundation, Inc.
 
 ;; Author: Michelangelo Grigni <mic@mathcs.emory.edu>
-;; Maintainer: FSF
+;; Maintainer: emacs-devel@gnu.org
 ;; Created: 29 Mar 1993
 ;; Keywords: files, hypermedia, matching, mouse, convenience
 ;; X-URL: ftp://ftp.mathcs.emory.edu/pub/mic/emacs/
@@ -164,9 +164,9 @@ schemes (e.g. \"ftp\"); in that case, only convert those URLs."
   :version "24.3")
 
 (defcustom ffap-ftp-default-user "anonymous"
-  "User name in ftp file names generated by `ffap-host-to-path'.
+  "User name in FTP file names generated by `ffap-host-to-path'.
 Note this name may be omitted if it equals the default
-\(either `efs-default-user' or `ange-ftp-default-user'\)."
+\(either `efs-default-user' or `ange-ftp-default-user')."
   :type 'string
   :group 'ffap)
 
@@ -185,7 +185,7 @@ Note this name may be omitted if it equals the default
    "\\|"
    "\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://" ; needs host
    "\\)")
-  "Regexp matching the beginning of a URI, for FFAP.
+  "Regexp matching the beginning of a URI, for ffap.
 If the value is nil, disable URL-matching features in ffap.")
 
 (defcustom ffap-foo-at-bar-prefix "mailto"
@@ -228,7 +228,7 @@ it passes it on to `dired'."
   :group 'ffap)
 
 (defcustom ffap-pass-wildcards-to-dired nil
-  "If non-nil, pass filenames matching `ffap-dired-wildcards' to dired."
+  "If non-nil, pass filenames matching `ffap-dired-wildcards' to Dired."
   :type 'boolean
   :group 'ffap)
 
@@ -291,8 +291,8 @@ For a fancy alternative, get `ffap-url.el'."
 
 (defcustom dired-at-point-require-prefix nil
   "If non-nil, reverse the prefix argument to `dired-at-point'.
-This is nil so neophytes notice FFAP.  Experts may prefer to
-disable FFAP most of the time."
+This is nil so neophytes notice ffap.  Experts may prefer to
+disable ffap most of the time."
   :type 'boolean
   :group 'ffap
   :version "20.3")
@@ -343,7 +343,7 @@ Only considers strings that match `ffap-next-regexp'."
   "Search buffer for next file or URL, and run ffap.
 Optional argument BACK says to search backwards.
 Optional argument WRAP says to try wrapping around if necessary.
-Interactively: use a single prefix to search backwards,
+Interactively: use a single prefix \\[universal-argument] to search backwards,
 double prefix to wrap forward, triple to wrap backwards.
 Actual search is done by the function `ffap-next-guess'."
   (interactive
@@ -413,7 +413,7 @@ See `mail-extr.el' for the known domains."
 Depending on the domain (none, known, or unknown), follow the strategy
 named by the variable `ffap-machine-p-local', `ffap-machine-p-known',
 or `ffap-machine-p-unknown'.  Pinging uses `open-network-stream'.
-Optional SERVICE specifies the port used \(default \"discard\"\).
+Optional SERVICE specifies the port used (default \"discard\").
 Optional QUIET flag suppresses the \"Pinging...\" message.
 Optional STRATEGY overrides the three variables above.
 Returned values:
@@ -459,7 +459,8 @@ Returned values:
           (let ((mesg (car (cdr error))))
             (cond
              ;; v18:
-             ((string-match "^Unknown host" mesg) nil)
+             ((string-match "\\(^Unknown host\\|Name or service not known$\\)"
+                            mesg) nil)
              ((string-match "not responding$" mesg) mesg)
              ;; v19:
              ;; (file-error "connection failed" "permission denied"
@@ -641,7 +642,7 @@ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
 
 (defun ffap-list-env (env &optional empty)
   "Return a list of strings parsed from environment variable ENV.
-Optional EMPTY is the default list if \(getenv ENV\) is undefined, and
+Optional EMPTY is the default list if (getenv ENV) is undefined, and
 also is substituted for the first empty-string component, if there is one.
 Uses `path-separator' to separate the path into substrings."
   ;; We cannot use parse-colon-path (files.el), since it kills
@@ -768,7 +769,7 @@ This uses `ffap-file-exists-string', which may try adding suffixes from
     ;; (lisp-interaction-mode . ffap-el-mode) ; maybe
     (finder-mode . ffap-el-mode)       ; type {C-h p} and try it
     (help-mode . ffap-el-mode)         ; maybe useful
-    (c++-mode . ffap-c-mode)           ; search ffap-c-path
+    (c++-mode . ffap-c++-mode)         ; search ffap-c++-path
     (cc-mode . ffap-c-mode)            ; same
     ("\\.\\([chCH]\\|cc\\|hh\\)\\'" . ffap-c-mode) ; stdio.h
     (fortran-mode . ffap-fortran-mode) ; FORTRAN requested by MDB
@@ -786,12 +787,12 @@ This uses `ffap-file-exists-string', which may try adding suffixes from
      . ffap-rfc)                       ; "100% RFC2100 compliant"
     (dired-mode . ffap-dired)          ; maybe in a subdirectory
     )
-  "Alist of \(KEY . FUNCTION\) pairs parsed by `ffap-file-at-point'.
+  "Alist of (KEY . FUNCTION) pairs parsed by `ffap-file-at-point'.
 If string NAME at point (maybe \"\") is not a file or URL, these pairs
 specify actions to try creating such a string.  A pair matches if either
   KEY is a symbol, and it equals `major-mode', or
   KEY is a string, it should match NAME as a regexp.
-On a match, \(FUNCTION NAME\) is called and should return a file, an
+On a match, (FUNCTION NAME) is called and should return a file, an
 URL, or nil.  If nil, search the alist for further matches.")
 
 (put 'ffap-alist 'risky-local-variable t)
@@ -865,6 +866,28 @@ URL, or nil.  If nil, search the alist for further matches.")
 (defun ffap-c-mode (name)
   (ffap-locate-file name t ffap-c-path))
 
+(defvar ffap-c++-path
+  (let ((c++-include-dir (with-temp-buffer
+                           (when (eq 0 (ignore-errors
+                                         (call-process "g++" nil t nil "-v")))
+                             (goto-char (point-min))
+                             (if (re-search-forward "--with-gxx-include-dir=\
+\\([^[:space:]]+\\)"
+                                                      nil 'noerror)
+                                 (match-string 1)
+                               (when (re-search-forward "gcc version \
+\\([[:digit:]]+.[[:digit:]]+.[[:digit:]]+\\)"
+                                                   nil 'noerror)
+                                 (expand-file-name (match-string 1)
+                                                   "/usr/include/c++/")))))))
+    (if c++-include-dir
+        (cons c++-include-dir ffap-c-path)
+      ffap-c-path))
+  "List of directories to search for include files.")
+
+(defun ffap-c++-mode (name)
+  (ffap-locate-file name t ffap-c++-path))
+
 (defvar ffap-fortran-path '("../include" "/usr/include"))
 
 (defun ffap-fortran-mode (name)
@@ -957,7 +980,7 @@ If t, `ffap-tex-init' will initialize this when needed.")
 (defcustom ffap-rfc-path
   (concat (ffap-host-to-filename "ftp.rfc-editor.org") "/in-notes/rfc%s.txt")
   "A `format' string making a filename for RFC documents.
-This can be an ange-ftp or tramp remote filename to download, or
+This can be an ange-ftp or Tramp remote filename to download, or
 a local filename if you have full set of RFCs locally.  See also
 `ffap-rfc-directories'."
   :type 'string
@@ -995,8 +1018,8 @@ If a given RFC isn't in these then `ffap-rfc-path' is offered."
     ;; Mathematica paths: allow backquotes
     (math-mode ",-:$+<>@-Z_[:lower:]~`" "<" "@>;.,!?`:")
     )
-  "Alist of \(MODE CHARS BEG END\), where MODE is a symbol,
-possibly a major-mode name, or one of the symbol
+  "Alist of (MODE CHARS BEG END), where MODE is a symbol,
+possibly a major-mode name, or one of the symbols
 `file', `url', `machine', and `nocolon'.
 Function `ffap-string-at-point' uses the data fields as follows:
 1. find a maximal string of CHARS around point,
@@ -1009,8 +1032,8 @@ Function `ffap-string-at-point' uses the data fields as follows:
 
 (defun ffap-string-at-point (&optional mode)
   "Return a string of characters from around point.
-MODE (defaults to value of `major-mode') is a symbol used to look up string
-syntax parameters in `ffap-string-at-point-mode-alist'.
+MODE (defaults to value of `major-mode') is a symbol used to look up
+string syntax parameters in `ffap-string-at-point-mode-alist'.
 If MODE is not found, we use `file' instead of MODE.
 If the region is active, return a string from the region.
 Sets the variable `ffap-string-at-point' and the variable
@@ -1072,7 +1095,7 @@ Assumes the buffer has not changed."
     (or (and (eq major-mode 'w3-mode) ; In a w3 buffer button?
             (w3-view-this-url t))
        (let ((thing-at-point-beginning-of-url-regexp ffap-url-regexp)
-             (thing-at-point-default-mail-scheme ffap-foo-at-bar-prefix))
+             (thing-at-point-default-mail-uri-scheme ffap-foo-at-bar-prefix))
          (thing-at-point-url-at-point t
                                       (if (use-region-p)
                                           (cons (region-beginning)
@@ -1120,7 +1143,7 @@ The two subexpressions are the KEY and VALUE.")
    ;; Icky regexp avoids: default: 123: foo::bar cs:pub
    ;; It does match on: mic@cs: cs:/pub mathcs.emory.edu: (point at end)
    "\\`\\([^:@]+@[^:@]+:\\|[^@.:]+\\.[^@:]+:\\|[^:]+:[~/]\\)\\([^:]\\|\\'\\)")
-  "Strings matching this are coerced to ftp file names by ffap.
+  "Strings matching this are coerced to FTP file names by ffap.
 That is, ffap just prepends \"/\".  Set to nil to disable.")
 
 (defun ffap-file-at-point ()
@@ -1422,7 +1445,7 @@ and the functions `ffap-file-at-point' and `ffap-url-at-point'."
 (defcustom ffap-menu-regexp nil
   "If non-nil, regexp overriding `ffap-next-regexp' in `ffap-menu'.
 Make this more restrictive for faster menu building.
-For example, try \":/\" for URL (and some ftp) references."
+For example, try \":/\" for URL (and some FTP) references."
   :type '(choice (const nil) regexp)
   :group 'ffap)
 
@@ -1442,7 +1465,7 @@ These properties may be used to fontify the menu references.")
   "Put up a menu of files and URLs mentioned in this buffer.
 Then set mark, jump to choice, and try to fetch it.  The menu is
 cached in `ffap-menu-alist', and rebuilt by `ffap-menu-rescan'.
-The optional RESCAN argument \(a prefix, interactively\) forces
+The optional RESCAN argument (a prefix, interactively) forces
 a rebuild.  Searches with `ffap-menu-regexp'."
   (interactive "P")
   ;; (require 'imenu) -- no longer used, but roughly emulated
@@ -1475,7 +1498,7 @@ a rebuild.  Searches with `ffap-menu-regexp'."
 
 (defun ffap-menu-ask (title alist cont)
   "Prompt from a menu of choices, and then apply some action.
-Arguments are TITLE, ALIST, and CONT \(a continuation function\).
+Arguments are TITLE, ALIST, and CONT (a continuation function).
 This uses either a menu or the minibuffer depending on invocation.
 The TITLE string is used as either the prompt or menu title.
 Each ALIST entry looks like (STRING . DATA) and defines one choice.
@@ -1735,7 +1758,7 @@ Only intended for interactive use."
   ;; Preserve selected buffer, but do not do save-window-excursion,
   ;; since we want to see any window created by the form.  Temporarily
   ;; select the article buffer, so we can see any point movement.
-  (let ((sb (window-buffer (selected-window))))
+  (let ((sb (window-buffer)))
     (gnus-configure-windows 'article)
     (pop-to-buffer gnus-article-buffer)
     (widen)