如何在 emacs 中重命名变量? Eclipse 有一个简洁的“重命名”重构操作,它允许您以范围感知的方式重命名变量,这比本地化替换字符串更容易使用,特别是当变量名称是像 e 这样的字符时。 emacs 是否内置了类似的功能?
新的Emacs有
M-s .
来选择光标下的符号,然后你可以C-M-%
,它会使用当前选择的符号来执行替换。注意这只是普通的字符串替换,与 IDE 的“重命名变量”功能不同。
iedit就是为这种事情而生的。
您可以使用缩小仅显示缓冲区的一部分,并且搜索/替换将仅在缩小的区域中进行操作。例如,您可以使用 C-x n d 缩小到当前函数,或者选择所需区域并执行 C-x n n。进行搜索/替换,然后使用 C-x n w 扩大范围。对于像
e
这样的单个字母变量,请使用 C-M-%执行
query-replace-regexp
并使用像 \be\b
这样的正则表达式,这样它只适用于单个 e
,而不是其他单词中的。
编辑:刚刚想到另一件事。如果您选择一个区域,则搜索/替换仅适用于该区域。因此,您只需选择要替换的范围,然后执行
query-replace-regexp
操作即可。
在 Python 中,这或多或少可以通过 Rope 重构库实现,为此我建议在 MELPA 中使用emacs-traad(安装简单且易于使用)。
安装后,我们有功能
M-x traad-rename
,可以重命名项目中的变量。
为了更简单的搜索和替换,我们有前面提到的 Iedit 以及 Projectile 的
projectile-replace
。
我不确定你的源代码语言是什么。因为你提到了Eclipse,所以我假设它是Java。一种选择是使用
tags-query-replace
功能。使用 Excuberant Ctags 和 -e
开关来生成 etgas 样式标签并调用 tags-query-replace
。
除了考虑已经建议的 iedit 之外,您还可以考虑 multiple-cursors 包。查看有关它的文章,其中包含现场版动画。
(defun replace-var (new)
"Replace the variable on the cursor"
(interactive (list
(read-string (format "Rename %s to: " (thing-at-point 'symbol)))))
(let ((old (thing-at-point 'symbol)))
(mark-defun)
(replace-string old new)))
(defun replace-old-var (old new)
"Input the old and new name"
(interactive "sFrom: \nsTo: ")
(mark-defun)
(replace-string old new))
(global-set-key (kbd "C-c r o") 'replace-old-var)
(global-set-key (kbd "C-c r v") 'replace-var)