问题如标题。
更具体地说,我厌倦了打字\(
等等,每次我想在 Emacs 的(交互式)正则表达式函数中使用括号(更不用说\\(
在代码中)。所以我写了类似的东西
(defadvice query-replace-regexp (before my-query-replace-regexp activate)
(ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0)))
(ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0)))))
希望我可以在“交互模式”期间方便地忘记 emacs 在正则表达式中的特性。除非我无法得到正确的正则表达式......
(replace-regexp-in-string "(" "\\\\(" "(abc")
gives \\(abc
而不是想要的\(abc
。斜杠数量的其他变化只会产生错误。想法?
既然我开始提问,不妨再问另一个:因为 lisp 代码不应该使用交互函数,所以建议query-replace-regexp
应该没问题,我说得对吗?
你的替代品对我来说效果很好。
就拿正文来说吧:
hi there mom
hi son!
并根据您的建议尝试 query-replace-regexp :
M-x query-replace-regexp (hi).*(mom) RET \1 \2! RET
yields
hi mom!
hi son!
我不必在括号前面添加反斜杠即可将它们分组。也就是说,这使得无法匹配实际的括号......
原因是replace-regexp-in-string
yields \\(abc
,是作为string,这相当于交互式键入\(abc
。在一个字符串中\
用于表示后面的字符是特殊的,例如"\t"
是一个带制表符的字符串。因此,为了仅指定反斜杠,您需要在其前面使用反斜杠"\\"
是一个包含反斜杠的字符串。
关于建议交互函数,lisp 代码可以随心所欲地调用交互函数。一个典型的例子是find-file
- 到处都这么叫。为了让你的建议更安全一些,你可以用支票包裹身体interactive-p
避免与内部调用混淆:
(defadvice query-replace-regexp (before my-query-replace-regexp activate)
(when (interactive-p)
(ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0)))
(ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)