En lo sublime, ¿por qué funciona def run en un caso y no en otro, y cómo puedo hacer que funcione?

Tengo una clase blahtestCommand(sublime_plugin.ApplicationCommand) con una ejecución, falla.

Otra clase, que tengo con sublime_plugin.TextCommmand) funciona.

Estoy un poco desconcertado con el aspecto que debería tener la definición de ejecución. Sé java (hice una progtwigción OOP hace 10 años, que recuerdo bien), pero sé muy poco de python. (así que no entiendo que una clase tome un parámetro, ya que no estaba en java, pero supongo que es un poco como ‘amplia’ -herencia- o ‘implementos’).

También estoy tratando de determinar lo que en la documentación de la API de ST2 le diría a alguien que cuando una clase tiene un parámetro de sublime_plugin.TextCommand , que la línea def run debería verse como esta def run(self, edit) mientras que cuando una clase tiene el parámetro sublime_plugin.ApplicationCommand la sublime_plugin.ApplicationCommand la definición debería parecerse a: no sé qué. (así que eso es un misterio aún más grande)

Note que el view.run_('......') no funciona para la clase blahtest , no está imprimiendo ‘aaaaaaaa’

No consigo errores en absoluto en la consola. El plugin – lo que sea.py se está cargando bien. Por lo tanto, se ejecuta un método de ejecución de clase, aunque el otro no. blahtestCommand carga. Puedo poner una línea entre def run y class blahtestCommand para imprimir “123456789” y se imprime tan pronto como guardo cualquier .py ‘porque se vuelve a cargar y no hay errores. Es solo que su método de ejecución no se llama cuando veo view.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 

Agregado por una extraña suerte, logré que funcionara para 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" 

Podría actualizar esta pregunta en el futuro con respecto a la ejecución de ‘ejecutar’ en las clases de api sublimes.

Para el # 1, tienes razón. En Python, esto significa herencia. La syntax de una definición de clase derivada se parece a la class DerivedClass(BaseClassName):

Herencia en Python

Para el # 2, Sublime Text 2 admite tres tipos de comandos. El método de run se invoca cuando ejecuta un comando. Además del parámetro requerido, puede definir tantos parámetros como desee para run . Cuando ejecuta un comando con parámetros adicionales, debe pasar estos parámetros en un mapa.

  • ApplicationCommand : comando para todo el texto sublime 2. No se requiere parámetro.
  • WindowCommand : comando para una ventana. No requiere parámetro.
  • TextCommand : comando para una vista. Un parámetro requerido, edit .

Para el # 3, cómo ejecutar:

  • ApplicationCommand : sublime.run_command('application_command_name') . Verifique la función run_command para el módulo sublime en la referencia de la API .
  • WindowCommand : window.run_command('window_command_name') . Compruebe el método sublime.Window de sublime.Window .
  • TextCommand : view.run_command('text_command_name') . Compruebe el método sublime.View de sublime.View

Ejemplo 1: comandos sin parámetros extra

 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") 

Ejecute estos comandos:

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

Ejemplo 2: comandos con parámetros extra

 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) 

Ejecute estos comandos:

 >>> 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