2010-07-30 36 views
4

我使用emacs + auctex和自動填充模式。emacs,auctex和查詢替換字符串換行

現在有時我想搜索(並替換)包含空格的字符串,如「test1 test2」。問題是,自動填充模式有時會用換行符替換空格字符。因此,搜索和替換「test1 test2」沒有發現這些字符串的出現,其中自動填充由換行符替換空白。

任何想法如何解決這個問題?

我在文本模式下使用\ s-查詢替換regexp,即「test1 \ s-test2」但這不適用auctex模式,我不知道爲什麼。

使用CQ CJ是非常不舒服的使用,因爲這種情況下的「測試1測試2」發生非常頻繁,特別是因爲我想獲得新行和在一個運行的空間,所以我必須做這樣的事情:

M-x query-replace-regexp RET 

test1[ <-- one space 

C-j C-q 

]\s-*test2 

最後\ S-*是因爲在auctex可能的壓痕。 這似乎不是很優雅。

通過,如果你想查找和替換「測試1測試2」就是這樣,很討厭想專門治療換行的情況下,每次...

回答

3

Emacs也有「類別」,這就像語法類,但更靈活一點。您可以在正則表達式中使用\cX來匹配類別爲X的字符。

下面是一個定義「全空白」類別的函數,其中包括空格,換行符,製表符和表單提要,您可以在正則表達式中引用\cs

(defun define-all-whitespace-category (table) 
    "Define the 'all-whitespace' category, 's', in the category table TABLE." 
    ;; First, clear out any existing definition for category 's'. Otherwise, 
    ;; define-category throws an error if one calls this function more than once. 
    (aset (char-table-extra-slot table 0) (- ?s ?) nil) 
    ;; Define the new category. 
    (define-category ?s "all whitespace 
All whitespace characters, including tab, form feed, and newline" 
    table) 
    ;; Add characters to it. 
    (mapc (lambda (c) (modify-category-entry c ?s table)) 
     '(? ?\n ?\f ?\t))) 

(define-all-whitespace-category (standard-category-table)) 

它看起來對我來說,auctex模式使用標準類別表,所以你應該能夠在該模式下使用的查詢替換,正則表達式與foo\cs+bar

爲了測試它,你可以把點上的某些感興趣的人物,說:

M-: (looking-at "\\cs") RET 

將評估爲t如果下點的字符是所有空白類別。

+0

這是比我更好的解決方案。我幾乎不斷地在emacs中顯示以前未知的角落和縫隙,我喜歡那:) – jeremiahd 2010-07-30 23:00:01

0

最簡單的方法來修補解決這個可能會是寫一點elisp函數。

類似:

(defun auctex-query-replace-regexp (first second replace) 
    (interactive "Mfirst:\nMsecond:\nM:replace:") 
    (while (re-search-forward (concat first "[ 
]*" second)) 
    (replace-match replace))) 

堅持在你的.emacs,把點上的最後一個),並與C-x C-e

綁定它評估爲重點以全局與global-set-key,或特定模式與add-hook

注意字符類由一個字面space然後字面newline,插入有C-oC-q C-j

這是一個非常簡單的例子。改進它留給讀者來說是一個超);)