我使用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”,那么每次特别处理换行案时都会非常讨厌......
答案 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-o
或C-q C-j
这是一个非常简单的例子。改进它是留给读者的一个例外;)