4

作为为 emacs 定义函数的第一次体验,我想编写一个函数来获取所有出现的 argv[some number] 并按顺序重新编号。

这是在 emacs 中使用 replace-regexp 完成的,输入为搜索/替换字符串

argv\[\([0-9]+\)\]
argv[\,(+ 1 \#)]

现在,我想在我的 .emacs 中写这个,所以我知道我也需要为 Lisp 特殊字符转义。所以在我看来它应该写

(defun argv-order () 
  (interactive)
  (goto-char 1)
  (replace-regexp "argv\\[[0-9]+\\]" "argv[\\,\(+ 1 \\#\)]")
)

搜索字符串工作正常,但替换字符串给了我错误“在替换文本中无效使用 \。我一直在尝试添加或删除一些 \,但没有成功。

任何想法 ?

4

1 回答 1

6

引用来自replace-regexp(粗体是我的)的帮助:

交互式调用中,替换文本可能包含 `\,'

您没有在 defun 中以交互方式使用它,因此出现错误消息。来自同一帮助的另一句话有助于解决您的问题:

This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
  (while (re-search-forward REGEXP nil t)
    (replace-match TO-STRING nil nil))
which will run faster and will not set the mark or print anything.

以及基于此的解决方案:

(defun argv-order ()
  (interactive)
  (let ((count 0))
    (while (re-search-forward "argv\\[[0-9]+\\]" nil t)
      (replace-match (format "argv[%d]" count) nil nil)
      (setq count (1+ count)))))
于 2013-10-31T15:49:14.820 回答