X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a749f1c648f2b9bf1a0b0b10e2da4c1c4e3d431d..d1ab001b5ba5db6d33d93e78ae2373ce7fd72128:/lisp/thingatpt.el diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el index b3fe1bc795..9920fa06d0 100644 --- a/lisp/thingatpt.el +++ b/lisp/thingatpt.el @@ -1,6 +1,6 @@ -;;; thingatpt.el --- get the `thing' at point +;;; thingatpt.el --- get the `thing' at point -*- lexical-binding:t -*- -;; Copyright (C) 1991-1998, 2000-2015 Free Software Foundation, Inc. +;; Copyright (C) 1991-1998, 2000-2016 Free Software Foundation, Inc. ;; Author: Mike Williams ;; Maintainer: emacs-devel@gnu.org @@ -145,7 +145,7 @@ a symbol as a valid THING." (let ((bounds (bounds-of-thing-at-point thing))) (when bounds (buffer-substring (car bounds) (cdr bounds))))))) - (when (and text no-properties) + (when (and text no-properties (sequencep text)) (set-text-properties 0 (length text) nil text)) text)) @@ -178,34 +178,40 @@ The bounds of THING are determined by `bounds-of-thing-at-point'." ;; Sexps (defun in-string-p () - "Return non-nil if point is in a string. -\[This is an internal function.]" + "Return non-nil if point is in a string." + (declare (obsolete "use (nth 3 (syntax-ppss)) instead." "25.1")) (let ((orig (point))) (save-excursion (beginning-of-defun) (nth 3 (parse-partial-sexp (point) orig))))) -(defun end-of-sexp () - "Move point to the end of the current sexp. -\[This is an internal function.]" +(defun thing-at-point--end-of-sexp () + "Move point to the end of the current sexp." (let ((char-syntax (syntax-after (point)))) (if (or (eq char-syntax ?\)) - (and (eq char-syntax ?\") (in-string-p))) + (and (eq char-syntax ?\") (nth 3 (syntax-ppss)))) (forward-char 1) (forward-sexp 1)))) -(put 'sexp 'end-op 'end-of-sexp) +(define-obsolete-function-alias 'end-of-sexp + 'thing-at-point--end-of-sexp "25.1" + "This is an internal thingatpt function and should not be used.") -(defun beginning-of-sexp () - "Move point to the beginning of the current sexp. -\[This is an internal function.]" +(put 'sexp 'end-op 'thing-at-point--end-of-sexp) + +(defun thing-at-point--beginning-of-sexp () + "Move point to the beginning of the current sexp." (let ((char-syntax (char-syntax (char-before)))) (if (or (eq char-syntax ?\() - (and (eq char-syntax ?\") (in-string-p))) + (and (eq char-syntax ?\") (nth 3 (syntax-ppss)))) (forward-char -1) (forward-sexp -1)))) -(put 'sexp 'beginning-op 'beginning-of-sexp) +(define-obsolete-function-alias 'beginning-of-sexp + 'thing-at-point--beginning-of-sexp "25.1" + "This is an internal thingatpt function and should not be used.") + +(put 'sexp 'beginning-op 'thing-at-point--beginning-of-sexp) ;; Lists @@ -213,7 +219,7 @@ The bounds of THING are determined by `bounds-of-thing-at-point'." (defun thing-at-point-bounds-of-list-at-point () "Return the bounds of the list at point. -\[Internal function used by `bounds-of-thing-at-point'.]" +[Internal function used by `bounds-of-thing-at-point'.]" (save-excursion (let ((opoint (point)) (beg (ignore-errors @@ -274,8 +280,8 @@ If nil, construct the regexp from `thing-at-point-uri-schemes'.") "finger://" "fish://" "ftp://" "geo:" "git://" "go:" "gopher://" "h323:" "http://" "https://" "im:" "imap://" "info:" "ipp:" "irc://" "irc6://" "ircs://" "iris.beep:" "jar:" "ldap://" - "ldaps://" "mailto:" "mid:" "mtqp://" "mupdate://" "news:" - "nfs://" "nntp://" "opaquelocktoken:" "pop://" "pres:" + "ldaps://" "magnet:" "mailto:" "mid:" "mtqp://" "mupdate://" + "news:" "nfs://" "nntp://" "opaquelocktoken:" "pop://" "pres:" "resource://" "rmi://" "rsync://" "rtsp://" "rtspu://" "service:" "sftp://" "sip:" "sips:" "smb://" "sms:" "snmp://" "soap.beep://" "soap.beeps://" "ssh://" "svn://" "svn+ssh://" "tag:" "tel:" @@ -283,7 +289,7 @@ If nil, construct the regexp from `thing-at-point-uri-schemes'.") "uuid:" "vemmi://" "webcal://" "xri://" "xmlrpc.beep://" "xmlrpc.beeps://" "z39.50r://" "z39.50s://" "xmpp:" ;; Compatibility - "fax:" "mms://" "mmsh://" "modem:" "prospero:" "snews:" + "fax:" "man:" "mms://" "mmsh://" "modem:" "prospero:" "snews:" "wais://") "List of URI schemes recognized by `thing-at-point-url-at-point'. Each string in this list should correspond to the start of a @@ -355,7 +361,7 @@ the bounds of a possible ill-formed URI (one lacking a scheme)." (if found (cons (match-beginning 1) (match-end 1)))))) -(defun thing-at-point--bounds-of-well-formed-url (beg end _pt) +(defun thing-at-point--bounds-of-well-formed-url (beg end pt) (save-excursion (goto-char beg) (let (url-beg paren-end regexp) @@ -382,7 +388,11 @@ the bounds of a possible ill-formed URI (one lacking a scheme)." (scan-lists (1- url-beg) 1 0)))) (not (blink-matching-check-mismatch (1- url-beg) paren-end)) (setq end (1- paren-end))) - (cons url-beg end))))) + ;; Ensure PT is actually within BOUNDARY. Check the following + ;; example with point on the beginning of the line: + ;; + ;; 3,1406710489,http://gnu.org,0,"0" + (and (<= url-beg pt end) (cons url-beg end)))))) (put 'url 'thing-at-point 'thing-at-point-url-at-point) @@ -479,19 +489,26 @@ looks like an email address, \"ftp://\" if it starts with (defun thing-at-point-looking-at (regexp &optional distance) "Return non-nil if point is in or just after a match for REGEXP. Set the match data from the earliest such match ending at or after -point." +point. + +Optional argument DISTANCE limits search for REGEXP forward and +back from point." (save-excursion (let ((old-point (point)) (forward-bound (and distance (+ (point) distance))) (backward-bound (and distance (- (point) distance))) - match) + match prev-pos new-pos) (and (looking-at regexp) (>= (match-end 0) old-point) (setq match (point))) ;; Search back repeatedly from end of next match. ;; This may fail if next match ends before this match does. (re-search-forward regexp forward-bound 'limit) - (while (and (re-search-backward regexp backward-bound t) + (setq prev-pos (point)) + (while (and (setq new-pos (re-search-backward regexp backward-bound t)) + ;; Avoid inflooping with some regexps, such as "^", + ;; matching which never moves point. + (< new-pos prev-pos) (or (> (match-beginning 0) old-point) (and (looking-at regexp) ; Extend match-end past search start (>= (match-end 0) old-point) @@ -550,7 +567,7 @@ with angle brackets.") "Return the sentence at point. See `thing-at-point'." (thing-at-point 'sentence)) -(defun read-from-whole-string (str) +(defun thing-at-point--read-from-whole-string (str) "Read a Lisp expression from STR. Signal an error if the entire string was not used." (let* ((read-data (read-from-string str)) @@ -564,9 +581,14 @@ Signal an error if the entire string was not used." (error "Can't read whole string") (car read-data)))) +(define-obsolete-function-alias 'read-from-whole-string + 'thing-at-point--read-from-whole-string "25.1" + "This is an internal thingatpt function and should not be used.") + (defun form-at-point (&optional thing pred) (let ((sexp (ignore-errors - (read-from-whole-string (thing-at-point (or thing 'sexp)))))) + (thing-at-point--read-from-whole-string + (thing-at-point (or thing 'sexp)))))) (if (or (not pred) (funcall pred sexp)) sexp))) ;;;###autoload