Emacs lisp逃避正则表达式

时间:2013-10-31 14:57:31

标签: regex emacs escaping lisp

作为定义emacs函数的第一次经验,我想编写一个函数,它可以记录argv [某个数字]的所有内容并按顺序重新编号。

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

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

现在,我想在我的.emacs中写这个,所以我理解我还需要逃避Lisp特殊字符。所以在我看来应该写

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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)))))