Emacs Lisp: Writing a Wrap-URL Function
This page shows a example of writing a emacs lisp function that creates a HTML link on a URL string in the buffer. If you don't know elisp, first take a look at Emacs Lisp Basics.
Suppose you work in HTML a lot, and often need to make a URL into a link.
Suppose you have this URL text in your buffer:
and your cursor is on that line. You want to be able to, press a button, and have the text changed to
This page shows you how to write this function.
Here's the outline of steps:
- Grab the URL in the current line.
- Delete the URL.
- Insert the string
<a href="‹URL›">‹link text›</a>.
Here's how to grab the text the cursor is on.
;; this snippet grabs the current block of text delimited by space. ;; It relies on the very useful search-backward and search-forward ;; and buffer-substring (defun ff () "test. grabs the sequence of chars delimited by space." (interactive) (let (p1 p2 url) (search-backward " ") (forward-char) (setq p1 (point)) (search-forward " ") (backward-char) (setq p2 (point)) (setq url (buffer-substring p1 p2)) (message "%s" url) ) )
Now, if the URL “http://en.wikipedia.org/wiki/Green_tea”, we want the link text to be just “Green_tea”. We can do this with
(replace-regexp-in-string ".+/" "" "http://en.wikipedia.org/wiki/Green_tea")
Now, we have the URL string and the linkText string. We need to
concatenate them into one string. The key function is
; concatenate strings (concat "a" "b" "c")
Now we know how to code all the major steps for our wrap url function. We can put them together.
(defun tt () "Make thing at cursor point into a HTML link. Example: http://en.wikipedia.org/wiki/Emacs becomes <a href=\"http://en.wikipedia.org/wiki/Emacs\">Emacs</a>" (interactive) (let (p1 p2 url linkText) (progn (search-backward " ") (forward-char) (setq p1 (point)) (search-forward " ") (backward-char) (setq p2 (point)) (setq url (buffer-substring-no-properties p1 p2)) (setq linkText (replace-regexp-in-string ".+/" "" url) ) (setq linkText (replace-regexp-in-string "_" " " linkText) ) ) (delete-region p1 p2) (insert (concat "<a href=\"" url "\">" linkText "</a>")) ) )
Now, we can test this. For example, here is a URL:
checkout this http://en.wikipedia.org/wiki/Emacs from Wikipedia
Put your cursor on the URL, and call
wrap-url. The URL will become a link.