在Sublime Text中提取到局部变量

时间:2013-12-07 12:35:14

标签: sublimetext2

在eclipse和其他IDE中,有一个名为“Extract to local variable”的重构器。它执行以下操作:

  1. 使用任意变量名
  2. 替换光标下的文本
  3. 添加一个变量声明,其右侧是所选文本,左侧是生成的名称
  4. 将变量名称替换为所选文本
  5. 在变量声明的左侧和替换的文本
  6. 中放置多个游标

    例如:

    do_stuff(2)
    

    ...变为

    Var = 2,
    do_stuff(Var)
    

    有没有办法在Sublime Text中自动执行此操作?

2 个答案:

答案 0 :(得分:2)

事实证明,创建一个插件来做到这一点并不是那么困难,花了大约一个小时来弄清楚插件系统并让它适用于我的简单案例。

它保存在https://gist.github.com/andytill/7856573的要点中,还有一些问题需要解决。光标应该确实设置在变量声明中,因此快速ctrl + d将编辑变量名称的两种情况。

import sublime
import sublime_plugin
import re

class IntroduceVariableCommand(sublime_plugin.TextCommand):

    var_name = "NewVar"

    def run(self, edit):

        sels = self.view.sel()

        for sel in sels:  
            if not sel.empty():
                sel_text    = self.view.substr(sel)
                top_line    = self.view.lines(sel)[0]
                top_line_text = self.view.substr(top_line)
                indentation = ""

                match = re.search(r"\W*", top_line_text, re.UNICODE)

                if match:
                    indentation = match.group(0)

                var_declaration = indentation + self.var_name + " = " + sel_text + ",\n"

                self.view.replace(edit, sel, self.var_name)

                self.view.insert(edit, top_line.a, indentation) 

答案 1 :(得分:0)

考虑到ST甚至无法检测到一些明显的语法错误(只有基本的语法突出显示),我怀疑它能够做任何需要更深入解析和理解代码的事情,就像任何形式的重构一样。

像Eclipse或IntelliJ这样的IDE能够做到这一点,因为它们是解析代码,您可以键入它,并且有一些非常高级的数据库,关于整个项目中的依赖关系,变量,方法和类之间的关系等等。 AFAIK Eclipse有自己的内部编译器来处理它。

与此同时,Sublime Text旨在成为相对简单的文本编辑器,具有语法高亮功能,这些工具可以改进文本编辑本身。像项目设置和运行构建器这样的东西是不错的功能,但它们并没有改变作者受Vi(m)编辑器启发而不是Emacs启发的事实。请注意,它将每个文件视为一个单独的东西,并且不能在大图(整个项目)中推断出它的作用。

也许有人尝试过,但目前ST2和ST3都没有能够做到这一点,因为它要求作者专注于为每种支持的语言实现语言解析器,以及内部和外部关系的一些项目范围数据库和依赖。它不是为此而设计的。

在您的示例中,执行重构程序需要:

  • 创建新变量,该变量将在显式使用行值之前放置,
  • 确保允许使用的名称 - 例如它不会覆盖代码中早先/稍后声明的某些类变量或变量,
  • 在强类型语言中,它必须为该变量分配匹配类型
  • 然后用变量替换值而不会弄乱。

因此即使是这样简单的任务也需要在代码的上下文中了解语言的语法和关系。对于作者甚至不打算拥有的功能而言,这是一项很大的努力。