Извлечь в локальную переменную в Sublime Text
В eclipse и, возможно, в других IDE существует рефактор, называемый "Извлечь в локальную переменную". Он выполняет следующие операции:
- Заменяет текст под курсором произвольным именем переменной
- Добавляет объявление переменной с выделенным текстом справа и сгенерированным именем слева
- Помещает имя переменной вместо выделенного текста
- Помещает несколько курсоров в левой части объявления переменной и в замененном тексте
Например:
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 не могут это сделать, поскольку для этого потребуется, чтобы авторы сосредоточились на реализации синтаксических анализаторов языка для каждого поддерживаемого языка, а также на некоторых базах данных, относящихся к области действия проекта, внутренних и внешних отношений и зависимостей. Это не было предназначено для этого.
В вашем примере для выполнения рефакторинга программы потребуется:
- создайте новую переменную, которая будет помещена до того, как значение строки было явно использовано,
- убедитесь, что используемое имя разрешено - например, оно не затеняет некоторые переменные класса или переменную, которая была объявлена ранее / позже в коде,
- в строго типизированных языках этой переменной нужно будет присвоить соответствующий тип,
- затем замените значение на переменную, не путаясь.
Таким образом, даже такая простая задача требует знания синтаксиса языка и отношений внутри контекста кода. Это много усилий для функциональности, которую авторы даже не собирались иметь.