views:

178

answers:

2

I'm developing a text annotation system in emacs, where the format of the annotation is something like this. If this is the text:

Lorem ipsem por favor

I need to annotate it like this:

{latin}Lorem imsem{/latin} {spanish}por favor{/spanish}

So what I want to do is select a region and then run a function or a macro that will prompt for the tag name, and insert the curly braces, the closing / and the tag name into the buffer at the start and end of the region.

This is probably pretty straightforward, but I've always found emacs lisp to be rather confusing to get started with, because I don't use it very often at all.

+7  A: 

Well, there are a bunch of ways. yasnippet is one, and I'm sure a bunch of the various xml/html modes have one.

For simplicity, you can use some elisp like:

(defun my-tag-region (b e tag)
  "'tag' a region"
  (interactive "r\nMTag for region: ")
  (save-excursion
    (goto-char e)
    (insert (format "{/%s}" tag))
    (goto-char b)
    (insert (format "{%s}" tag))))
Trey Jackson
brilliant, thanks! And just to get the cursor in the right place at the end, after the save-excursion function, we can do (search-forward "}")
singingfish
+3  A: 

If you want point to be after the closing } when you're done, I think this is more robust than searching:

(defun my-tag-region (b e tag)
  "'tag' a region"
  (interactive "r\nMTag for region: ")
  (let ((e (copy-marker e)))
    (goto-char b)
    (insert (format "{%s}" tag))
    (goto-char e)
    (insert (format "{/%s}" tag))))
offby1