Emacs 重命名变量

问题描述 投票:0回答:9

如何在 emacs 中重命名变量? Eclipse 有一个简洁的“重命名”重构操作,它允许您以范围感知的方式重命名变量,这比本地化替换字符串更容易使用,特别是当变量名称是像 e 这样的字符时。 emacs 是否内置了类似的功能?

emacs ide
9个回答
28
投票

新的Emacs有

M-s .
来选择光标下的符号,然后你可以
C-M-%
,它会使用当前选择的符号来执行替换。注意这只是普通的字符串替换,与 IDE 的“重命名变量”功能不同。


14
投票

iedit就是为这种事情而生的。


14
投票

随着 Emacs 中LSP支持的出现,除了其他答案中的缩小/iedit/多光标等选项之外,实际的“重命名”重构最终变得可行,具体取决于底层语言服务器支持的内容。

  • emacs-lsp 软件包提供
    lsp-rename
  • eglot 套件提供
    eglot-rename

12
投票

您可以使用缩小仅显示缓冲区的一部分,并且搜索/替换将仅在缩小的区域中进行操作。例如,您可以使用 C-x n d 缩小到当前函数,或者选择所需区域并执行 C-x n n。进行搜索/替换,然后使用 C-x n w 扩大范围。对于像

e
这样的单个字母变量,请使用
C-M-%
执行 query-replace-regexp 并使用像
\be\b
这样的正则表达式,这样它只适用于单个
e
,而不是其他单词中的。

编辑:刚刚想到另一件事。如果您选择一个区域,则搜索/替换仅适用于该区域。因此,您只需选择要替换的范围,然后执行

query-replace-regexp
操作即可。


5
投票

在 Python 中,这或多或少可以通过 Rope 重构库实现,为此我建议在 MELPA 中使用emacs-traad(安装简单且易于使用)。

安装后,我们有功能

M-x traad-rename
,可以重命名项目中的变量。

为了更简单的搜索和替换,我们有前面提到的 Iedit 以及 Projectile 的

projectile-replace


2
投票

我不确定你的源代码语言是什么。因为你提到了Eclipse,所以我假设它是Java。一种选择是使用

tags-query-replace
功能。使用 Excuberant Ctags
-e
开关来生成 etgas 样式标签并调用
tags-query-replace


1
投票

既然你要求 Eclipse 功能,Iedit 不会削减它。这不太聪明,如果你在不同的作用域中有两个同名的变量怎么办?这会改变他们两个。这不会发生在日食上! 如果您期望有这种意识,您将需要特定于语言的工具。

使用打字稿,您可以使用tide。 使用 golang,您可以使用 go-doctor。 特别是对于 Java,我找不到任何东西,但我使用 meghanada,这很棒。但重构已在其 TODO 列表中!您还可以使用 emacs 作为 eclipse 和 eclim 的客户端。


1
投票

除了考虑已经建议的 iedit 之外,您还可以考虑 multiple-cursors 包。查看有关它的文章,其中包含现场版动画。


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)
© www.soinside.com 2019 - 2024. All rights reserved.