我一直在尝试一些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插件文档意味着我找不到任何类似的问题或解决方案
答案 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)
,它应该可以工作。