ST3插件将选择附加到新文件的末尾

时间:2018-06-20 17:14:07

标签: plugins sublimetext3

我一直在尝试一些Sublime Text 3插件,并且正在制作一个将视图选择添加到新文件末尾的插件。

    import sublime
    import sublime_plugin


    class AddToCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            # text = sublime.Region(0, view.size())
            window = self.view.window()
            view = self.view
            s = ''
            for region in view.sel():
                if not region.empty():
                    s += '\n' + view.substr(region)
            print(s)
            for v in window.views():
                print(v.name())
                if v.name() == 'untitled':
                    f = v
                    break
            else:  # if no break occurs --> no current view called [untitled]
                f = window.new_file()
            # print(self)
            # print(edit)
            # print(f)
            window.focus_view(f)
            f.run_command('insert_in_new_file', view.sel())


    class InsertInNewFileCommand(sublime_plugin.TextCommand):
        def run(self, edit, selection):
            self.count = 0  # not using enumerate as it goes through 2 loops
            for line in selection:
                for char in line:
                    self.insert(edit, self.count, char)
                    self.count += 1
                self.insert(edit, self.count, '\n')
                self.count += 1

我已经了解到了这一点,它会(以一种基本的方式)检查一个已经打开的文件,所以现在我试图将其附加到此“未命名”文件的末尾。但是,当我运行此代码时,出现错误:

    f.run_command('insert_in_new_file', view.sel())
        File "C:\Users\ ... \Sublime Text 3\sublime.py", line 838, in run_command
            sublime_api.view_run_command(self.view_id, cmd, args)
    TypeError: Value required

我的InsertInNewFile类或调用它的.run命令似乎有问题,但是缺少ST3插件文档意味着我找不到任何类似的问题或解决方案

1 个答案:

答案 0 :(得分:1)

run_command希望将命令名作为第一个参数,并将json字典(作为从关键字到值的映射)作为第二个参数。

让我们从这里开始

f.run_command('insert_in_new_file', view.sel())

您的第二个参数是sublime.Selection对象,该对象既不是json兼容的也不是字典。因此,我们创建了一个字典:

f.run_command('insert_in_new_file', { "selection": view.sel() })

现在它是一个字典(并且键与run方法的形式参数中的键相同),但是它不兼容json,因此会引发错误。我们可以通过将选择内容转换为元组列表来解决此问题:

f.run_command('insert_in_new_file', { "selection": list((s.a, s.b) for s in view.sel()) })

现在,调用将成功,但是您还需要正确处理参数。 根据那里的代码,您需要一个字符串列表,而不是文件位置列表。因此,我们可以再次更改参数以传递选择内容而不是选择本身,并跳过空选择:

f.run_command('insert_in_new_file', { "selection": list(view.substr(s) for s in view.sel() if len(s)) })

然后将self.insert(edit, self.count, char)替换为self.view.insert(edit, self.count, char),它应该可以工作。

相关问题