tags:

views:

218

answers:

6

hello,

suppose I have a text list in emacs like this:

a
b
c
...
d

Is there a way to assign numbers to those items in Emacs, by selecting the region? End results should look like:

1. a
2. b
3. c
j. ...
n. d

Thanks.

+5  A: 

The way I do this, which may not be optimal, is to use regex search and replace. This, of course, requires that you be able to define a regex to match the start of the lines you want numbers on. Taking your example, I'd use a search regex like this:

\([a-z]\)

note the capturing brackets, we'll need that first letter soon. And a replace regex like this:

\#. \1

where:

\# is a special form which is replaced, by Emacs, by the right number (though see the warning below);

. writes a stop; and

\1 writes a space and the captured group.

WARNING: Emacs will number your items 0, 1, 2, .... Until someone posts to tell us how to start at 1, I always insert a dummy 0th element before the edit, then delete it.

High Performance Mark
If you use `\,(1+ \#).` for the replacement that will start from one. You can use arbitrary lisp expressions in replacements now, so that one just says replace with 1 plus the match number.
Singletoned
Thanks @Singletoned, I knew that someone on SO would sort that problem out for me.
High Performance Mark
+2  A: 

You can use the Emacs Keyboard Macro Counter.

  • Put the cursor one line ABOVE your list.

  • Start a macro: F3

  • Insert the counter value: C-x C-k C-i. A 0 will appear

  • Insert the DOT and a space: .

  • Move the cursor to the next line

  • Stop the macro: F4

  • Select your list

  • M-x apply-macro-to-region-lines

  • You can delete the 0 you added on the top and enjoy :)

NOTE: This will create a numbered list. It will not use letters.

Roberto Aloi
+1  A: 

Here's some elisp code to do it; would be easy to customize if you like tinkering.

This will number the current region (unless it is already numbered), and also the last line binds to the M-n keys. You could use a function key "[F6]" as needed.

Modified to take a format string to use. The default is 1. but you could do something like %d) to get a bracket instead of a . and so on.

  (defun number-region(fmt)
  (interactive "sFormat : ")
  (if (or (null fmt) (= 0 (length fmt)))
      (setf fmt "%d. "))
  (save-excursion
    (save-restriction
      (narrow-to-region (point) (mark))
      (goto-char (point-min))
      (let ((num 1))
    (while (> (point-max) (point))
  (if (null (number-at-point))
      (insert (format fmt num)))
      (incf num)
      (forward-line))))))


(global-set-key "\M-n" 'number-region)
justinhj
+3  A: 
(defun number-region (start end)
  (interactive "r")
  (let* ((count 1)
     (indent-region-function (lambda (start end)
                   (save-excursion
                     (setq end (copy-marker end))
                     (goto-char start)
                     (while (< (point) end)
                       (or (and (bolp) (eolp))
                       (insert (format "%d. " count))
                       (setq count (1+ count)))
                       (forward-line 1))
                     (move-marker end nil)))))
    (indent-region start end)))
Jürgen Hötzel
A: 

Not a direct answer to your question, but if you find yourself manipulating numbered lists frequently, you may want to look into org-mode. In particular, the section on plain lists.

Ryan Thompson
+1  A: 

A much simpler way is to use the CUA library's advanced rectangle editing commands. CUA is included in Emacs (at least 23.1, I think it's in earlier versions as well), so there isn't any new code to get.

You can use cua-set-rectangle-mark (bound to C-Return by default) to start a rectangle, and then use cua-sequence-rectangle to insert increasing values. It also gives you control over the format and starting value, so there is a lot of flexibility.

As an aside, CUA is primarily designed to make Emacs operate more like standard text editors (with C-c for copy, C-v for paste, etc), but it also includes some unrelated niceties, like rectangle editing. Don't ask me why :). If you want to use the rectangle editing without enabling the CUA keybindings (which is what I do), set cua-enable-cua-keys to nil, which can be done via customize.

haxney