如何在emacs中重命名变量? Eclipse有一个简洁的“重命名”重构操作,它允许您以一种范围感知方式重命名变量,这比使用本地化替换字符串更容易使用,特别是如果变量名称是像e这样的字符。 emacs是否内置了类似的功能?
答案 0 :(得分:15)
新的Emacs有M-s .
选择光标下的符号,然后你可以C-M-%
它将使用当前选择的符号来执行替换。注意这只是简单的字符串替换,而不像IDE'重命名变量'功能。
答案 1 :(得分:9)
您可以使用narrowing仅显示缓冲区的一部分,而搜索/替换只能在缩小的区域中运行。例如,您可以使用 C-x n d 缩小到当前函数,或选择所需的区域并执行 C-x n n 。进行搜索/替换,然后使用 C-x n w 进行扩展。对于像e
这样的单个字母变量,请使用 CM - %执行query-replace-regexp
并使用像\be\b
这样的正则表达式,这样它才能在单个{{1}上运行而不是其他词里面的那些。
编辑:想到另一件事。如果选择区域,则搜索/替换仅适用于该区域。因此,您只需选择要替换的范围,然后执行e
操作。
答案 2 :(得分:8)
iedit是为了这种事情而做的。
答案 3 :(得分:5)
随着Emacs中LSP支持的出现,取决于基础语言服务器支持的内容,除了缩小/ iedit / multicursor等选项之外,实际的“重命名”重构终于变得可行。
答案 4 :(得分:3)
在Python中,这或多或少可以使用Rope重构库,我建议在MELPA中使用emacs-traad(简单易用且易于使用)。
安装完成后,我们将使用函数M-x traad-rename
重命名项目中的变量。
为了更简单的搜索和替换,我们有上述的Iedit和Projectile的projectile-replace
。
答案 5 :(得分:2)
我不确定您的源代码语言是什么。因为你提到过Eclipse,我认为它是Java。一种选择是使用tags-query-replace
功能。使用Excuberant Ctags和-e
开关生成etgas样式标记并调用tags-query-replace
。
答案 6 :(得分:1)
除了考虑已经建议的iedit之外,您还可以考虑multiple-cursors包。查看有关它的article,以及动态版的动画。
答案 7 :(得分:0)
由于你要求Eclipse功能,Iedit不会削减它。它不那么聪明,如果你在不同的范围内有两个同名的变量怎么办?它会改变它们。这不会发生在日食上! 如果你期望这种意识,你将需要特定于语言的工具。
使用打字稿,您可以使用tide。 使用golang,您可以使用go-doctor。 特别是使用Java,我找不到任何东西,但我使用meghanada,这很棒。但重构在其TODO名单上!您还可以使用emacs作为eclipse的eclipse客户端。
答案 8 :(得分:0)
对这种现代IDE功能的支持正逐渐被Emacs等中生代编辑所吸收。对于Scala,你可以通过Ensime获得这个。
答案 9 :(得分:0)
(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)