在崇高中,为什么def运行在一个案例而不是另一个案例中,我怎样才能使它工作?

时间:2013-10-23 03:23:02

标签: python sublimetext2 sublime-text-plugin

我有一个运行的类blahtestCommand(sublime_plugin.ApplicationCommand),它失败了。

我和sublime_plugin.TextCommmand)合作的另一堂课。

我对运行定义看起来有点困惑。我知道java(10年前做过一些我记得很好的OOP编程),但我知道很少有python。 (所以我不太了解一个带参数的类,因为它不是在java中,但我会做一个弱猜测它有点像'extends'-inheritance-或'implements')。

我还试图确定ST2 API documentation中哪些人会告诉某人当一个类的参数为sublime_plugin.TextCommand时,def运行行应该看起来像def run(self, edit),而当一个类有参数sublime_plugin.ApplicationCommand def运行应该看起来像 - 我不知道是什么。 (这是一个更大的谜团)

请注意view.run_('......')不适用于课程blahtest,而不是打印'aaaaaaaa'

我在控制台中完全没有错误。插件 - whatever.py加载正常。因此,一个类运行方法运行,但另一个不运行。 blahtestCommand确实加载。我可以在def run和class blahtestCommand之间添加一行来打印“123456789”,它会在我保存whatever.py后立即打印,因为它重新加载并且没有错误。这只是它的run方法在我查看时没有被调用.run_command('blahtest')

import sublime, sublime_plugin

class blahtestCommand(sublime_plugin.ApplicationCommand):
    def run(self):
        print "aaaaaaaaaaa"

class butthiswillworkCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        print "bbbb"
>>> view.run_command('blahtest')
>>> view.run_command('butthiswillwork')
bbbb

加入 通过完全奇怪的运气,我设法让它适用于WindowCommand

window.run_command('saef4',{"string":"abcd"})

, {"keys": ["ctrl+s", "ctrl+d"], "command": "saef4", "args": {"string": "abcd"} }

class saef4Command(sublime_plugin.WindowCommand): 
    def run(self,string):
        print "uabcccc"   

我可能会在将来进一步更新这个问题,关于在sublime api类中运行'run'。

1 个答案:

答案 0 :(得分:4)

对于#1,你是对的。在Python中,这意味着继承。派生类定义的语法类似于class DerivedClass(BaseClassName):

Inheritance in Python

对于#2,Sublime Text 2支持三种类型的命令。运行命令时会调用run方法。除了必需参数外,您还可以为run定义任意数量的参数。运行带有额外参数的命令时,需要在映射中传递这些参数。

对于#3,如何运行:

  • ApplicationCommandsublime.run_command('application_command_name')。在API reference
  • 中查看sublime模块的run_command功能
  • WindowCommandwindow.run_command('window_command_name')。查看sublime.Windowrun_command方法。
  • TextCommandview.run_command('text_command_name')。查看sublime.View
  • run_command方法

示例1:没有额外参数的命令

import sublime, sublime_plugin

class TestApplicationCommand(sublime_plugin.ApplicationCommand):
    def run(self):
        print("running TestApplicationCommand")


import sublime, sublime_plugin

class TestWindowCommand(sublime_plugin.WindowCommand):
    def run(self):
        print("running TestWindowCommand")


import sublime, sublime_plugin

class TestTextCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        print("running TestTextCommand")

运行以下命令:

>>> sublime.run_command('test_application')
running TestApplicationCommand
>>> window.run_command('test_window')
running TestWindowCommand
>>> view.run_command('test_text')
running TestTextCommand

示例2:带有额外参数的命令

import sublime, sublime_plugin

class TestApplicationCommand(sublime_plugin.ApplicationCommand):
    def run(self, arg1, arg2):
        print("running TestApplicationCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)


import sublime, sublime_plugin

class TestWindowCommand(sublime_plugin.WindowCommand):
    def run(self, arg1, arg2):
        print("running TestWindowCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)


import sublime, sublime_plugin

class TestTextCommand(sublime_plugin.TextCommand):
    def run(self, edit, arg1, arg2):
        print("running TestTextCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)

运行以下命令:

>>> sublime.run_command('test_application', {'arg1' : '1', 'arg2' : '2'})
running TestApplicationCommand
arg1: 1
arg2: 2
>>> window.run_command('test_window', {'arg1' : '1', 'arg2' : '2'})
running TestWindowCommand
arg1: 1
arg2: 2
>>> view.run_command('test_text', {'arg1' : '1', 'arg2' : '2'})
running TestTextCommand
arg1: 1
arg2: 2