2013-11-27 5 views
1

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

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. Вставить команду insert (в 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 команды(), но это не похоже на работу ...

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

+0

, пожалуйста, избегайте задавать несколько вопросов на вопрос – MattDMo

ответ

1

Вкратце я отвечу. Если вы хотите получить более подробную информацию, создайте отдельные вопросы.

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

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

+0

1. Хорошо, я попробую это. 2. Я не совсем понимаю ваш ответ. 3. Хорошо, спасибо. Для заданного таймаута я попытаюсь проверить и понять, как это сделать правильно. Благодаря ! – nobe4

+0

Вместо трех отдельных команд вы можете вызвать 'newView.run_command (« copy_text »)' из текущей команды окна. Если вы действительно хотите сохранить что-то отдельное, вы можете применить некоторые настройки к новому представлению с помощью 'view.settings(). Set (" some special key ", )' и искать это представление. Вы также можете назвать буфер, смотри 'view # set_name', и искать его. – skuroda

+0

Мне нужно сделать копию вручную, потому что я не буду копировать весь файл за один раз, но вместо этого хочу его отключить. Назначение множественного класса состоит в том, что я не могу создать новый файл и сразу манипулировать внутри файла ... Или, может быть, используя встроенную команду возвышенного типа copy_text ... – nobe4