2014-04-04 32 views
1

我不明白如何在我正在編寫自己的命令中重新使用交互式命令。如何定義emacs replace-regex快捷命令?

我想製作一個總是使用相同參數到replace-regexp的命令。這真是一條捷徑。

所以,我想在一個函數模仿什麼,我會在選定的區域進行交互,即:

(defun myH2js() 
    "Converts html to an (incomplete) JavaScript String concatenation." 

    (interactive) 
    (let (p1 p2) 
    (setq p1 "^\(\s *\)\(.*\)\s *$") 
    (setq p2 "\1 + '\2'") 
    (replace-regexp p1 p2) 
) 
) 

但我的功能:

M-x replace-regexp RET ^\(\s *\)\(.*\)\s *$ RET \1 + '\2' 

我寫這個功能模仿它「替換所選區域的零次出現」,而我的交互完全按照我的意願重寫所有內容。

我在做什麼錯?

+0

[正則表達式替換的Emacs(http://stackoverflow.com/questions/1060723/regex-replacement-with-emacs) – Barmar

回答

1

你需要在字符串中的反斜槓,因爲反斜槓是兩個字符串和正則表達式轉義字符:

(defun myH2js (start end) 
    "Converts html to an (incomplete) JavaScript String concatenation." 

    (interactive "r") 
    (let ((p1 "^\\(\\s *\\)\\(.*\\)\\s *$") 
     (p2 "\\1 + '\\2'")) 
    (replace-regexp p1 p2 nil start end) 
) 
) 

注意replace-regexp不推薦程序內部使用;在線文檔中提到:

此函數通常在Lisp程序中使用是錯誤的。 你可能想要的是這樣一個循環:

(while (re-search-forward regexp nil t) 
    (replace-match to-string nil nil)) 

其運行速度更快,也不會設置標記或打印任何東西。

+1

他注意到這個問題,他使用這種交互方式上的某個地區可能重複,您需要向函數添加開始和結束參數,並使用(交互式「r」)來支持相同的行爲 –

+0

感謝@Barmar和@Jordon Biondo。我也從中得知,只要有一個有效的區域被選中,就會自動提供'start'和'end'參數。 – iainH

+0

我發現了一個小技巧:通過在let塊中添加'(message「p1是%s。」p1)'',您可以在* Message *緩衝區中看到任何轉義錯誤,其中Emacs打印「未轉義」您的正則表達式的「原始」/更易於調試的版本。 – iainH