假设我在emacs中有这样的文本列表:
a
b
c
...
d
有没有办法通过选择区域为Emacs中的这些项目分配数字?最终结果应如下所示:
1. a
2. b
3. c
j. ...
n. d
感谢。
答案 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。