2013-10-31 74 views
4

作为确定为Emacs功能的第一次经历,我想提出编写采取的argv所有出现[一些数],为了重新编号它们的功能。的Emacs Lisp逃脱正则表达式

这里面有替换,正则表达式的Emacs完成,进入作为搜索/替换字符串

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

现在,我想在我的.emacs写这让我明白我也需要逃避Lisp的特殊字符。所以在我看来,它应该写

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

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

任何想法

+0

字符串反斜杠的量应该是双的,对于交互使用。而已。 –

+0

这是不够的,因为你必须逃离这是在列表中的一个特殊字符而不是正则表达式中的括号。 – user2941893

+0

这就够了。以交互方式,如果要捕获,则可以放入'\(\)'。 在elisp的你把'\\(\\)'在同一个地方。如果你想要使用纯 括号,你不必逃避他们在这两种情况下。 –

回答

6

报价从replace-regexp帮助(粗体是我的):

互动电话,T他替换文本可能包含'\”

您没有使用交互在你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))))) 
+0

非常感谢,这项工作完美!我想过把(互动)将已经足以让我的解决办法,但我错过了帮助页面... – user2941893