【问题标题】:Emacs Rename VariableEmacs 重命名变量
【发布时间】:2012-03-29 07:28:16
【问题描述】:

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

【问题讨论】:

  • 您指的是哪种编程语言?爪哇?
  • 现在我正在研究 php,但最好是任何语言。
  • 尽管我很喜欢 emacs,但我发现缺少这个功能真的很烦人。也许那里有一些新的答案?
  • 请注意,范围感知重命名取决于正在编辑的语言的范围规则,因此虽然 Emacs 在某些特定的语言编辑模式下可能具有此功能,但没有希望像这样的通用功能自动适用于所有语言(但我们可以希望它成为在 Emacs 主要模式中实现的标准功能,适用于该功能有意义的所有“流行”语言)。

标签: emacs ide


【解决方案1】:

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

【讨论】:

  • 这对 Emacs 来说是一个很好的答案。但我强烈反对没有人需要 Java IDE 提供的范围感知重命名变量功能。
  • 上下文相关的重命名是我在 IDE 中最常用的功能。我绝对需要它。
  • 这对我来说效果很好,将 C 程序中的变量 n 重命名为更有意义的东西。它确实在格式字符串中的\n 处停止并提示,但它仍然比直接查询替换要好得多,后者在printf 等所有ns 处停止。
  • 永远不要只列出键绑定。包括函数名称。
  • isearch-forward-symbol-at-point(绑定到M-s .)。在“Symbol isearch”提示符下按C-h ? 以获得进一步帮助。我必须先删除我过去绑定到 M-s 的先前自定义。
【解决方案2】:

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

【讨论】:

  • iedit 而一个伟大的替换工具只做愚蠢的替换,所以它不适合智能替换(例如,如果变量名只是提问者所说的一个字母)
  • 实际上 iedit 和 expand-region 让我可以非常快速地替换有趣词汇范围内的符号。这是我在所有语言中重命名变量的首选工具。符号的长度并不重要。
【解决方案3】:

您可以使用narrowing 仅显示缓冲区的一部分,并且搜索/替换将仅在缩小的区域中进行。例如,您可以使用 C-x n d 缩小到当前功能,或者选择您想要的区域并执行 C-x n n。进行搜索/替换,然后用 C-x n w 扩大。对于像e 这样的单字母变量,使用C-M-% 执行query-replace-regexp 并使用像\be\b 这样的正则表达式,因此它只适用于单个e 而不是内部的换句话说。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      安装后我们有函数M-x traad-rename,它可以重命名项目中的一个变量。

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

      【讨论】:

        【解决方案6】:

        我不确定您的源代码语言是什么。因为您提到了 Eclipse,所以我假设它是 Java。一种选择是使用tags-query-replace 功能。使用Excuberant Ctags-e 开关生成etgas 样式标签并调用tags-query-replace

        【讨论】:

          【解决方案7】:

          由于您要求 Eclipse 功能,Iedit 不会删除它。它不是那么聪明,如果你在不同的范围内有两个同名的变量怎么办?这将改变他们两个。这不会发生在日食! 如果您期望这种意识,您将需要特定语言的工具。

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

          【讨论】:

            【解决方案8】:

            除了考虑已经建议的iedit,您还可以考虑multiple-cursors 包。查看article 的相关信息,以及现场版的动画。

            【讨论】:

              【解决方案9】:
              (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)
              

              【讨论】:

                猜你喜欢
                • 2017-10-23
                • 1970-01-01
                • 2021-04-29
                • 2021-06-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-10
                • 2019-04-21
                相关资源
                最近更新 更多