是否可以在emacs中的矩形区域内执行replace-string
操作?如果是这样,怎么样?
答案 0 :(得分:26)
如果启用CUA选择模式:
M-x cua-selection-mode
RET
或永久存储在您的init文件中:
(cua-selection-mode 1)
然后,您可以使用其高级矩形编辑工具。
(或者,如果您是cua-mode
用户,那么您不需要这样做。)
有关文档,请在 Mx find-library
RET cua-base
RET <的注释中查找“CUA矩形支持”标题/ KBD>
如果由于某种原因你不想使用cua矩形工具(也许你真的需要replace-string
),使用apply-on-rectangle
的自定义函数就可以很简单地组合在一起了。 / p>
编辑:实际上,比我预期的要复杂一些,但大部分代码都是交互式规范和对'分隔'前缀参数行为的支持(均基于{{1} })。
编辑2 :我认为这值得以更全面的方式进行:
以下提供 Cx r M - %和 Cx r < kbd> CM - %,(希望)以您期望的方式行事。
replace-string
答案 1 :(得分:5)
在最近的Emacs(例如Emacs 25)中,您可以使用M-%
(query-replace
)或C-M-%
(query-replace-regexp
)开箱即用。
使用M-x rectangle-mark-mode
创建矩形区域。如有必要,请使用C-x C-x
在标记前加上点。然后只需查询替换。
replace-string
的Emacs 25进行相同的更改。如果你愿意,你可以这样做,只需添加参数region-noncontiguous-p
,就像在query-replace
中完成一样。代码很简单:
(defun replace-string (from-string to-string &optional delimited start end backward
region-noncontiguous-p)
"..."
(declare (interactive-only
"use `search-forward' and `replace-match' instead."))
(interactive
(let ((common
(query-replace-read-args
(concat "Replace"
(if current-prefix-arg
(if (eq current-prefix-arg '-) " backward" " word")
"")
" string"
(if (use-region-p) " in region" ""))
nil)))
(list (nth 0 common) (nth 1 common) (nth 2 common)
(if (use-region-p) (region-beginning))
(if (use-region-p) (region-end))
(nth 3 common)
(if (use-region-p) (region-noncontiguous-p)))))
(perform-replace
from-string to-string nil nil delimited nil nil start end backward region-noncontiguous-p))
或者,您只需下载库replace+.el
并从那里使用replace-string
版本。它做你想要的。
FWIW,我刚刚提交了Emacs bug#27897以将此功能添加到replace-string
以及同一个库replace.el
中的其他几个命令。
答案 2 :(得分:1)
对于恶意用户,您可以使用我的包evil-visual-replace在邪恶的视觉块中获取query-replace
和replace-regexp
。
答案 3 :(得分:0)
如果您处于CUA模式,则可以使用绑定到'M-r'的cua-replace-in-rectangle。