如何执行区分大小写的查询替换?


16

当我这样做M-x query-replace,以取代所有出现vw,那么它也匹配V(大写V)。如何强制emacs仅查找小写字母v


默认大小写是“不区分大小写”,在搜索中大小写无关紧要。如果您只想匹配一个大小写,则需要“区分大小写”。(我也可能会错过一些内容,如果需要,可以随时回滚编辑)
T. Verron,2015年

@ T.Verron我现在确信,你是对的。
命名

Answers:


13
(customize-set-variable case-fold-search  nil)

或在您自己的命令中绑定该变量(选项),否则该命令只是一个包装器query-replace。这样做的好处是,在查询替换之外,它不会更改一般使用的变量值。

另请参见variable case-replace,它控制替换文本的大小写。

另请参见C-h f query-replace,其内容如下:

如果case-fold-search为非nil并且FROM-STRING没有大写字母,则匹配与大小写无关。如果case-replacecase-fold-search不为nil并且FROM-STRING没有大写,替换将旧文本的大小写模式转移到新文本

另请参阅下面的注释以及Emacs错误#20687,其中显示了如何修补,perform-replace以便在期间切换大小写折叠query-replace


也请注意,现有的perform-replace绑定代码以case-fold-search这种方式绑定(请注意其依赖的变量):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))

case-fold-search像我们在isearch使用M-c绑定期间所做的那样,随时进行更改将是一件很不错的事情。但是不幸的query-replace是确实有它的模式图。
Kaushal Modi

2
@kaushalmodi:通常,将其简单地添加到query-replace-map(defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))和会很简单(define-key query-replace-map "C" 'toggle-case)。但是该映射中的键处理是用硬编码的perform-replace。您可能想要M-x report-emacs-bug,使perform-replace代码更加开放,因此可以将键添加到地图。它至少应该具有一个fallback子句,该子句仅调用绑定到密钥的cmd。
Drew

谢谢!不知道为什么我以前找不到query-replace-map
Kaushal Modi

1
我现在已经提交了该错误报告(#20687)。解决方案在该错误报告中:只需进行修改perform-replace即可添加一个附加cond子句,以调用您在中定义的键query-replace-map。将new子句放在catch-all t子句之前。这是新的子句:(def (call-interactively def))。再简单不过了。
2015年

(customize-set-variable case-fold-search nil)给出错误customize-set-variable: Attempt to set a constant symbol: nil。我也尝试了两者(setq case-fold-search nil)(setq case-replace nil)但查询仍然匹配大写的V。–
名称
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.