Sat, 17 Nov 2007

I edit my address book in Emacs --- it's a text file, I can grep it, I
can isearch it, I keep it in CVS --- and I prefer keeping things
consistent in it.  So here's a little utility I wrote to reformat
phone numbers into a consistent style.

;;; still doesn't handle the formats 4154975513 and 415 4975513
(defun reformat-us-phone-number ()
  "Reformat a phone number in a US format into my normal phone number format."
  (interactive)
  (save-excursion
    ; XXX these regexen break at end of buffer
    (if (looking-at "[0-9]\\{3\\}[-. ][0-9]\\{3\\}[-. ][0-9]\\{4\\}[^0-9]")
	(progn
	  (insert "+1 ")
	  (forward-char 3)
	  (delete-char 1)
	  (insert " ")
	  (forward-char 3)
	  (delete-char 1)
	  (insert " ")
	  t)
      (if (looking-at
	   "([0-9]\\{3\\})[-. ]?[0-9]\\{3\\}[-. ][0-9]\\{4\\}[^0-9]")
	  (progn 
	    (insert "+1 ")
	    (delete-char 1)
	    (forward-char 3)
	    (delete-char 1)
	    (if (looking-at "[-. ]") (delete-char 1))
	    (insert " ")
	    (forward-char 3)
	    (delete-char 1)
	    (insert " ")
	    t)
	nil))))

(defun magic-reformat-us-phone-number ()
  "Reformat a US phone number somewhere in the vicinity."
  (interactive)
  (or (reformat-us-phone-number)
      (save-excursion (forward-char 1) (reformat-us-phone-number))
      (save-excursion (backward-char 1) (reformat-us-phone-number))
      (and (looking-at "1-[0-9]\\{3\\}")
	   (progn (delete-char 2) (reformat-us-phone-number)))
      (save-excursion (backward-char 12) (reformat-us-phone-number))
      (save-excursion (backward-char 13) (reformat-us-phone-number))
      (save-excursion (backward-char 14) (reformat-us-phone-number))))
(global-set-key [C-M-tab] 'magic-reformat-us-phone-number)