通过Sublime Text 3插件传递元素

时间:2013-11-27 00:17:46

标签: python text timeout sublimetext3 sublime-text-plugin

我正在制作一个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中)首先插入,有没有办法在文件末尾追加?
  4. 另一个:我如何使用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()命令,但它似乎不起作用......

    提前致谢!

1 个答案:

答案 0 :(得分:1)

我在这里简单回答一下。如果您想了解更多细节,请创建单独的问题。

  1. 不,您可以将参数传递给run命令。 CopyTextCommand的run方法看起来像def run(self, edit, content)
  2. 不,但您可以在创建的视图上运行文本命令,而不是传递它。您还可以应用名称或创建任意设置以识别正确的视图
  3. 查看文档(https://www.sublimetext.com/docs/3/api_reference.html)。第二个参数是偏移量。
  4. 加成: set_timeout期待回调功能。对于像你这样的单线,请在python中查找lambda。