Sometimes I need to share a long URL in an e-mail or document with the purpose of making it clear, rather than making it clickable. When I need to do this, I'll rewrite the URL by add newlines and whitespace to ? and & characters and URL-decode parameter values. That turns this:
http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCwQFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FEditor_war&ei=k9ktUuz2Kvaj4APCmoGIBw&usg=AFQjCNGrgP7q1TYCPmuQnkgcfMIJKpFHOg&sig2=a6GUXFARKXj6r1JyiNkQ8w&bvm=bv.51773540,d.dmg
Into this:
http://www.google.com/url? sa=t& rct=j& q=& esrc=s& source=web& cd=1& cad=rja& ved=0CCwQFjAA& url=http://en.wikipedia.org/wiki/Editor_war& ei=k9ktUuz2Kvaj4APCmoGIBw& usg=AFQjCNGrgP7q1TYCPmuQnkgcfMIJKpFHOg& sig2=a6GUXFARKXj6r1JyiNkQ8w& bvm=bv.51773540,d.dmg
This format makes discussing or catching issues with individual URL parameters much easier.
For years I've used a created-on-the-fly emacs macro to help speed up the above conversion. And while I love keyboard macros I was many years overdue in turning this into an elisp function. Last week I finally corrected this oversight. Here's the code:
(defun url-humanify ()
"Take the URL at point and make it human readable."
(interactive)
(let* ((area (bounds-of-thing-at-point 'url))
(num-params (count-occurances-in-region "&" (car area) (cdr area)))
(i 0))
(beginning-of-thing 'url)
(when (search-forward "?" (cdr area) t nil)
(insert "\n ")
(while (< i num-params)
(search-forward "&" nil t nil)
(insert "\n ")
(save-excursion
(previous-line)
(beginning-of-line)
(let ((start (search-forward "="))
(end (search-forward "&")))
(url-decode-region start end)))
(setq i (+ i 1))))))
(defun url-decode-region (start end)
"Replace a region with the same contents, only URL decoded."
(interactive "r")
(let ((text (url-unhex-string (buffer-substring start end))))
(delete-region start end)
(insert text)))
(defun count-occurances-in-region (needle start end)
(save-excursion
(let ((found 0))
(goto-char start)
(while (search-forward needle end t nil)
(setq found (+ found 1)))
found)))
(The usual disclaimers apply: url-humanify is not the most efficient elisp implementation, but it should reliably work. That (set i (+ i 1)) code shows I was thinking PHP instead of lisp; but so be it. At least I depend on thing-at-point to do the URL parsing. Oh, and I've included url-decode-region as a bonus. It's another function I use all the time.)
Now, whenever I have an ugly URL, I just need to execute M-x url-humanify and it all becomes clear.
Hope this saves you some typing.
Update: D'oh - forgot to include the count-occurances-in-region. As @anonymous pointed out, I should probably be using count-matches.
To make this work for me I had to replace count-occurances-in-region with count-matches, as the first isn't known.
ReplyDeleteD'oh - nice catch. All fixed. Next time, I'll have to use count-matches.
ReplyDeletedelete-and-extract-region shortens things too!
ReplyDeleteYou oughta put this up on marmalade. Let me know I can send you a file to show you how it is really simple.
ReplyDeleteAlso, are you on planet emacs?
> You oughta put this up on marmalade. Let me know I can send you a file to show you how it is really simple.
ReplyDeleteSounds tasty. It would be awesome if you sent me a sample file.
> Also, are you on planet emacs?
I am.
Thanks Grant!