(重新)emacs中的编号列表(缪斯)

时间:2010-04-09 13:45:28

标签: emacs elisp

假设我在emacs中有这样的文本列表:

a
b
c
...
d

有没有办法通过选择区域为Emacs中的这些项目分配数字?最终结果应如下所示:

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

感谢。

6 个答案:

答案 0 :(得分:10)

我这样做的方式,可能不是最佳的,是使用正则表达式搜索和替换。当然,这要求您能够定义正则表达式以匹配您想要数字的行的开头。举个例子,我会使用像这样的搜索正则表达式:

\([a-z]\)
注意捕获括号,我们很快就会需要第一封信。并取代这样的正则表达式:

\#. \1

其中:

\#是一种特殊形式,由Emacs替换为正确的数字(尽管请参阅下面的警告);

.写了句;和

\1写一个空格和捕获的组。

警告:Emacs会为您的商品0, 1, 2, ...编号。直到有人发帖告诉我们如何从1开始,我总是在编辑之前插入一个虚拟的第0个元素,然后删除它。

答案 1 :(得分:6)

您可以使用the Emacs Keyboard Macro Counter

  • 将光标放在列表上方一行。

  • 启动宏:F3

  • 插入计数器值:C-x C-k C-i。将出现0

  • 插入DOT和空格:.

  • 将光标移动到下一行

  • 停止宏:F4

  • 选择列表

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

  • 您可以删除您在顶部添加的0并享受:)

注意:这将创建一个编号列表。它不会使用字母。

答案 2 :(得分:5)

更简单的方法是使用CUA库的高级矩形编辑命令。 CUA包含在Emacs中(至少23.1,我认为它也在早期版本中),因此没有任何新代码可以获得。

您可以使用cua-set-rectangle-mark(默认情况下绑定到C-Return)来启动矩形,然后使用cua-sequence-rectangle插入增加的值。它还可以控制格式和起始值,因此具有很大的灵活性。

另外,CUA的主要目的是让Emacs更像标准文本编辑器(C-c用于复制,C-v用于粘贴等),但它还包括一些不相关的细节,如矩形编辑。不要问我为什么:)。如果您想在不启用CUA键绑定的情况下使用矩形编辑(这就是我的操作),请将cua-enable-cua-keys设置为nil,这可以通过自定义完成。

答案 3 :(得分:3)

(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)))

答案 4 :(得分:1)

这里有一些elisp代码;如果你喜欢修补,那么很容易定制。

这将对当前区域进行编号(除非它已经编号),并且最后一行也会绑定到M-n键。您可以根据需要使用功能键“[F6]”。

修改为使用格式字符串。默认值为1.但您可以执行类似%d的操作来获取括号而不是a。等等。

  (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)

答案 5 :(得分:0)

不能直接回答您的问题,但如果您发现自己频繁操纵编号列表,则可能需要查看org-mode。特别是section on plain lists