Извлечь в локальную переменную в Sublime Text

В eclipse и, возможно, в других IDE существует рефактор, называемый "Извлечь в локальную переменную". Он выполняет следующие операции:

  1. Заменяет текст под курсором произвольным именем переменной
  2. Добавляет объявление переменной с выделенным текстом справа и сгенерированным именем слева
  3. Помещает имя переменной вместо выделенного текста
  4. Помещает несколько курсоров в левой части объявления переменной и в замененном тексте

Например:

do_stuff(2)

Становится....

Var = 2,
do_stuff(Var)

Есть ли способ автоматизировать это в Sublime Text?

2 ответа

Решение

Оказывается, что создать плагин для этого не так сложно, потребовалось около часа, чтобы понять систему плагинов и заставить ее работать в моем простом случае.

Он сохранен в gist по адресу 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) 

Учитывая тот факт, что ST не может даже обнаружить некоторые очевидные синтаксические ошибки (только базовая подсветка синтаксиса), я сомневаюсь, что он сможет сделать что-либо, требующее более глубокого анализа и понимания кода, как любая форма рефакторинга.

Среды IDE, такие как Eclipse или IntelliJ, могут это делать, потому что они анализируют код, если вы его набираете, и у вас есть действительно продвинутые базы данных о том, какие зависимости находятся внутри всего проекта, каковы отношения между переменными, методами и классами и так далее. AFAIK Eclipse имеет собственный внутренний компилятор, который его обрабатывает.

Между тем Sublime Text предназначен для относительно простого текстового редактора с подсветкой синтаксиса, инструментов, которые улучшают само текстовое издание. Такие вещи, как настройка проекта и запуск сборщиков, являются хорошими функциями, но они не меняют того факта, что авторы вдохновлены редактором Vi (m), а не Emacs. Обратите внимание, что он видит каждый файл как отдельную вещь и не может определить свою роль в общей картине (весь проект).

Возможно, кто-то пытался это сделать, но в настоящее время ни ST2, ни ST3 не могут это сделать, поскольку для этого потребуется, чтобы авторы сосредоточились на реализации синтаксических анализаторов языка для каждого поддерживаемого языка, а также на некоторых базах данных, относящихся к области действия проекта, внутренних и внешних отношений и зависимостей. Это не было предназначено для этого.

В вашем примере для выполнения рефакторинга программы потребуется:

  • создайте новую переменную, которая будет помещена до того, как значение строки было явно использовано,
  • убедитесь, что используемое имя разрешено - например, оно не затеняет некоторые переменные класса или переменную, которая была объявлена ​​ранее / позже в коде,
  • в строго типизированных языках этой переменной нужно будет присвоить соответствующий тип,
  • затем замените значение на переменную, не путаясь.

Таким образом, даже такая простая задача требует знания синтаксиса языка и отношений внутри контекста кода. Это много усилий для функциональности, которую авторы даже не собирались иметь.

Другие вопросы по тегам