2013-10-31 75 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