emacs,auctex和查询替换字符串换行

时间:2010-07-30 12:25:07

标签: regex emacs auctex

我使用emacs + auctex和自动填充模式。

现在有时我想搜索(并替换)包含空格的字符串,例如“test1 test2”。问题是,自动填充模式有时会用换行符替换空格字符。因此,搜索和替换“test1 test2”时,找不到此字符串的出现位置,其中auto-fill用换行符替换空白。

知道如何解决这个问题吗?

我在文本模式下使用\ s-在query-replace-regexp中,即“test1 \ s-test2”,但这在auctex模式下不起作用,我不知道为什么。

使用Cq Cj使用起来非常不舒服,因为“test1 test2”这样的情况经常发生,特别是因为我想在一次运行中获取换行符和空格,所以我必须做这样的事情:

M-x query-replace-regexp RET

test1[ <-- one space

C-j C-q

]\s-*test2

最后的\ s- *是因为auctex中可能存在缩进。 这似乎不是很优雅。

顺便说一句,如果你想搜索和替换“test1 test2”,那么每次特别处理换行案时都会非常讨厌......

2 个答案:

答案 0 :(得分:3)

Emacs也有“类别”,类似于语法类,但更灵活一些。您可以在正则表达式中使用\cX来匹配类别X中的字符。

这是一个定义“all-whitespace”类别的函数,其中包括空格,换行符,制表符和换页符,您可以在正则表达式中引用\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-mode使用标准类别表,因此您应该能够在该模式下使用query-replace-regexp和foo\cs+bar

为了测试它,你可以指出一些感兴趣的角色并说:

M-: (looking-at "\\cs") RET
如果点下的字符在全空白类别中,

将评估为t

答案 1 :(得分: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

这是一个非常简单的例子。改进它是留给读者的一个例外;)