emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Adding email address support to thingatpt.el.


From: Karl Fogel
Subject: Re: Adding email address support to thingatpt.el.
Date: Tue, 27 Feb 2007 04:08:50 -0800
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.93 (gnu/linux)

Andreas Roehler <address@hidden> writes:
> Just for consideration:
>
> Email at point might be used to pick emails from a
> csv-database. Than `;' and `,' as delimiters should be
> possible together with or instead of angles.

It's okay, they're already treated as boundaries, because they're not
legal in the email address.  (I tested just now to make sure.)

Unless you mean they should be returned *as part of* the email
address, like ",address@hidden,"?  But that wouldn't be
good -- commas and semicolons are not the same as angle brackets in
that respect.

> AFAIU rfc2822, several more chars are allowed to be
> part of an email-adress than regexp honours now:

It's tough to know what to include.  Many characters that technically
could be part of an email address are rarely used in practice, and
instead appear much more often as delimiters (in certain contexts).
So if thingatpt.el is to Do The Right Thing most often for the user,
it probably can't comply precisely with the RFC.

I'm including the latest patch below, for reference, but I won't do
anything with it until after the release.

-Karl

2007-02-25  Karl Fogel  <address@hidden>

   * thingatpt.el: Add support for email addresses (`email').
   (thing-at-point, bounds-of-thing-at-point): Document `email' support.
   (thing-at-point-email-regexp): New variable.
   (`email'): Put `bounds-of-thing-at-point' and `thing-at-point'
   properties on this symbol, with lambda forms for values.

Index: thingatpt.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/thingatpt.el,v
retrieving revision 1.40
diff -u -r1.40 thingatpt.el
--- thingatpt.el        21 Jan 2007 03:53:10 -0000      1.40
+++ thingatpt.el        27 Feb 2007 03:07:51 -0000
@@ -67,7 +67,7 @@
   "Determine the start and end buffer locations for the THING at point.
 THING is a symbol which specifies the kind of syntactic entity you want.
 Possibilities include `symbol', `list', `sexp', `defun', `filename', `url',
-`word', `sentence', `whitespace', `line', `page' and others.
+`email', `word', `sentence', `whitespace', `line', `page' and others.
 
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING.
@@ -124,7 +124,7 @@
   "Return the THING at point.
 THING is a symbol which specifies the kind of syntactic entity you want.
 Possibilities include `symbol', `list', `sexp', `defun', `filename', `url',
-`word', `sentence', `whitespace', `line', `page' and others.
+`email', `word', `sentence', `whitespace', `line', `page' and others.
 
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING."
@@ -340,6 +340,33 @@
              (goto-char (car bounds))
            (error "No URL here")))))
 
+;;   Email addresses
+(defvar thing-at-point-email-regexp
+  "<?[-+_.~a-zA-Z][-+_.~:address@hidden>?"
+  "A regular expression probably matching an email address.
+This does not match the real name portion, only the address, optionally
+with angle brackets.")
+
+;; Haven't set 'forward-op on 'email nor defined 'forward-email' because
+;; not sure they're actually needed, and URL seems to skip them too.
+;; Note that (end-of-thing 'email) and (beginning-of-thing 'email)
+;; work automagically, though.
+
+(put 'email 'bounds-of-thing-at-point
+     (lambda ()
+       (let ((thing (thing-at-point-looking-at thing-at-point-email-regexp)))
+         (if thing
+             (let ((beginning (match-beginning 0))
+                   (end (match-end 0)))
+               (cons beginning end))))))
+
+(put 'email 'thing-at-point
+     (lambda ()
+       (let ((boundary-pair (bounds-of-thing-at-point 'email)))
+         (if boundary-pair
+             (buffer-substring-no-properties
+              (car boundary-pair) (cdr boundary-pair))))))
+
 ;;  Whitespace
 
 (defun forward-whitespace (arg)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]