4

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

现在有时我想搜索(和替换)一个包含空格的字符串,如“test1 test2”。问题是,自动填充模式有时会用换行符替换空格字符。因此,“test1 test2”的搜索和替换不会找到该字符串的那些出现,其中自动填充将空格替换为换行符。

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

在文本模式下,它可以在查询替换正则表达式中使用 \s-,即“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”,每次特别处理换行符时都会很烦人......

4

2 回答 2

3

Emacs 也有“类别”,类似于语法类,但更灵活一些。您可以\cX在正则表达式中使用来匹配 category 中的字符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-mode 使用标准类别表,因此您应该能够foo\cs+bar在该模式下使用 query-replace-regexp。

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

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

它将评估t点下的字符是否在全空白类别中。

于 2010-07-30T19:07:49.123 回答
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 中,将 point 放在最后),然后使用C-x C-e

使用 将其绑定到全局键global-set-key或特定于模式的键add-hook

请注意,字符类由一个文字组成space,然后是一个文字,用ornewline插入C-oC-q C-j

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

于 2010-07-30T13:06:05.800 回答