2011-12-16 32 views
12

雖然這個問題涉及到Emacs(也許Auctex)中LaTeX的格式,但我相信這可以應用於Emacs中關於括號,括號和大括號等分隔符的更一般情況。如何用Emacs一次修改兩個匹配的分隔符?

我期望能夠用Emacs(和elisp)完成以下工作,並且不知道從哪裏開始。說我有:

(This is in parentheses) 

隨着Emacs的一些鍵綁定,我想Emacs的找到匹配的分隔符哪一個是我的光標(我知道Emacs可以做,因爲它可以突出各種模式匹配的分隔符某事物)和能夠兩者改變爲

\left(This is in parentheses \right) 

,我想這與對工作的分隔符:(...)[...]\lvert ... \rvert\langle ... \rangle\{ ... \}。我需要什麼elisp來完成這項任務?

歡迎使用更一般的方式來處理匹配的分隔符。

+1

+1好主意!這樣的東西永遠是有用的... – 2011-12-16 18:46:21

+0

請澄清修改來自哪裏?修改是否總是爲分隔符預先添加「\ left」和「\ right」? – 2011-12-17 01:59:29

回答

8

在Emacs中評估下面的命令。重新加載後,您可以在關閉後立即放置點(文本光標)。然後執行M-x replace-matching-parens來取代關閉)\right)和匹配開始文件(\left(

(defun replace-matching-parens() 
    (interactive) 
    (save-excursion 
    (let ((end-point (point))) 
     (backward-list) 
     (let ((start-point (point))) 
     (goto-char end-point) 
     (re-search-backward ")" nil t) 
     (replace-match " \\\\right)" nil nil) 

     (goto-char start-point) 
     (re-search-forward "(" nil t) 
     (replace-match "\\\\left(" nil nil))))) 

interactive位指示我希望有一個「命令」,所以它可以使用M-x執行。爲了避免遊標在執行後在一個奇怪的地方結束,我正在將邏輯打包在save-excursion中。該點使用backward-list跳回到開頭paren並保持paren匹配區域的開始和結束位置。最後,從最後開始並向後工作,我將替換字符串。通過替換而不是轉發,我避免在我需要之前使end-point無效。

推廣這個來處理不同種類的分隔符應該不會太壞。 backward-list應該與任意一對字符串emacs識別爲()的類似物。要添加更多的圓括號字符串對,請在Parenthesis Matching文章中查看set-syntax-table

使用global-set-key來設置密鑰綁定到replace-matching-parens

公平警告replace-matching-parens是我實施的第一個elisp命令,因此可能與最佳實踐不符。對於那裏的所有專家,我都樂於接受建設性的批評。

相關問題