Передача элемента через плагин Sublime Text 3

Я работаю над плагином Sublime Text 3, и у меня есть небольшой скрипт, который копирует весь текст из текущего файла в другой, используя три класса:

import sublime, sublime_plugin

# string and new file created
s = 0
newFile = 0

class CreateNewWindowCommand(sublime_plugin.WindowCommand):
    def run(self):
        global s, newFile
        s = self.window.active_view().substr(sublime.Region(0, self.window.active_view().size()))
        newFile = self.window.new_file()

class CopyTextCommand(sublime_plugin.TextCommand):
    def printAChar(self,char,edit):
        self.view.insert(edit, 0, char)

    def run(self, edit):
        global s
        st = list(s)
        for i in st[::-1]:
            self.printAChar(i, edit)

class PrintCodeCommand(sublime_plugin.WindowCommand):
    def run(self):
        self.window.run_command("create_new_window")
        newFile.run_command("copy_text")

сценарий сначала выполняется через PrintCodeCommand.

У меня есть несколько вопросов по этому коду:

  1. Это «правильный» метод? Потому что передача данных с глобальными переменными кажется немного грязной.
  2. Есть ли способ создать класс, который может использовать WindowCommand и TextCommand одновременно?
  3. команда вставки (в CopyTextCommand) вставьте в первую очередь, есть ли способ добавить в конец файла?

И еще один: как я могу использовать sublime.set_timeout ()? Потому что вот так:

# ...
class CopyTextCommand(sublime_plugin.TextCommand):
    def printAChar(self,char,edit):
        sublime.set_timeout(self.view.insert(edit, 0, char) , 1000) 
        # I want to print a char one per second

Или используя команду time.sleep (), но она, похоже, не работает ...

Заранее спасибо !


person nobe4    schedule 27.11.2013    source источник
comment
пожалуйста, не задавайте несколько вопросов на вопрос   -  person MattDMo    schedule 27.11.2013


Ответы (1)


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

  1. Нет, вы можете передавать аргументы команде запуска. Метод выполнения для CopyTextCommand будет выглядеть примерно так def run(self, edit, content).
  2. Нет, но вы можете запустить текстовую команду в созданном представлении, а не передавать ее. Вы также можете применить имя или создать произвольную настройку с целью определения правильного представления.
  3. Взгляните на документацию (https://www.sublimetext.com/docs/3/api_reference.html). Второй аргумент - это смещение.

Бонус: set_timeout ожидает обратного вызова. Для одного лайнера, как у вас, найдите лямбда в python.

person skuroda    schedule 27.11.2013
comment
1. Хорошо, я попробую. 2. Я не совсем понимаю ваш ответ. 3. Хорошо, спасибо. За установленный таймаут попробую потестить и понять, как правильно это сделать. Спасибо ! - person nobe4; 27.11.2013
comment
Вместо трех отдельных команд вы можете вызывать newView.run_command("copy_text") из того, что сейчас является командой нового окна. Если вы действительно хотите, чтобы вещи были разделены, вы можете применить некоторые настройки к новому представлению, используя view.settings().set("some special key", <some value>), и выполнить поиск этого представления. Вы также можете назвать буфер см view#set_name и искать его. - person skuroda; 27.11.2013
comment
Мне нужно сделать копию вручную, потому что я не буду копировать сразу весь файл, а хочу отложить это на время. Цель наличия нескольких классов заключается в том, что я не могу создать новый файл и сразу управлять внутренней частью файла ... Или, может быть, используя встроенную команду sublime, например copy_text ... - person nobe4; 28.11.2013
comment
Возможно, я не понимаю вашего варианта использования. Вы можете получить доступ к содержимому текущего представления, используя window#active_view. Оттуда вы можете копировать любой контент, который хотите. Затем вы можете вернуть новый объект представления как часть window#new_file. Вы сохраняете это в переменной newView. Затем вы можете запустить команду вставки, используя newView.run_command("copy_text"). Что ж, в конце концов, решать только вам. - person skuroda; 30.11.2013