2013-11-20 1 views
2

Я хотел бы переопределить двойной щелчок в Sublime Text 3, чтобы запустить мой код плагина тогда и только тогда, когда пользователь находится в определенном виде. В противном случае двойной щелчок должен вести нормальное поведение (выделите слово и другие экземпляры в файле). Тем не менее, я не хочу, чтобы нормальное поведение выполнялось в моем пользовательском представлении.Как установить событие Sublime Text 3 для запуска как пользовательского поведения, так и поведения по умолчанию?

Соответствующий код для достижения этого в Sublime Text 2 (и Python 2) можно найти по адресу https://www.sublimetext.com/forum/viewtopic.php?f=6&t=8823, но я не могу реорганизовать его для работы в Sublime Text 3 (и Python 3).

Рабочий код (взято из вышеуказанной ссылки) для Sublime Text 2 является:

class MySpecialDoubleclickCommand(sublime_plugin.TextCommand): 
    def run_(self, args): 
     if self.view.name() == "mySpecialBuffer": 
      self.doMyStuff() 
     else: 
      system_command = args["command"] if "command" in args else None 
      if system_command: 
       system_args = dict({"event": args["event"]}.items() + args["args"].items()) 
       self.view.run_command(system_command, system_args) 

Для того, чтобы заставить его работать в Python 3, я переработан в коде обработки в словаре (в противном случае код является то же самое):

system_args = dict({"event" : args["event"].items() | args["args"].items()}) 

Однако, когда я называю run_command(system_command, system_args) метод, который он возвращает следующее сообщение об ошибке:

File "C:\Program Files\Sublime Text 3\sublime.py", line 607, in run_command 
sublime_api.view_run_command(self.view_id, cmd, args) 
TypeError: Value required 

Поскольку документация по API для Sublime Text 3 практически отсутствует, я пытаюсь выяснить, есть ли какая-то проблема в моем словаре system_args или API, который просто изменился каким-то другим способом?

ответ

2

Вопрос старый, но лучше быть поздно, чем потом сожалеть, наткнуться на это сегодня

ValueError на мой взгляд, брошенный sublime.decode_value(string)

Этот метод является декодирует строку JSON в объект и, как я думаю, используется в run_command, затем разбор args для запуска команды от нажатия клавиши или вызова internaly.

Файлы .sublime-keymap содержат массив JSON, который содержит объекты JSON для указания привязок клавиш. Объекты JSON должны содержать ключи keys и command, а также могут содержать ключ args, если для команды требуются аргументы.

Таким образом, если значение агд не является действительным объектом JSON, вы получаете ValueError

Обход - передавать строки или номера

view.run_command('name', {'string_arg': 'string', 'num_arg': 1})

class NameCommand(sublime_plugin.TextCommand): 

    def run(self, edit, string_arg, num_arg): 
     pass 

Или дамп объект как JSON строки передать в команду и restore at place

0

Не делал никаких привязок для мыши самостоятельно, но кажется, что вам не хватает аргумента для команды run. Обратите внимание, что он ожидает 3 шт., Которые вам только дают. Пробовали ли вы пройти в self.view.id в качестве первого парма (основанного на ошибке, это, вероятно, то, что он ожидает).

+0

Если я изменил команду на идентификатор в качестве первого параметра (например, 'self.view.run_command (self.view.id, s ystem_command, system_args). Я получу следующую ошибку: «Файл» C: \ Users \ User \ AppData \ Roaming \ Sublime Text 3 \ Packages \ MyPlugin \ output.py ", строка 153, в run_ self.view. run_command (self.view.id, system_command, system_args) ТипError: run_command() принимает от 2 до 3 позиционных аргументов, но 4 даны ' – Scam

+0

Ой, извините, моя ошибка, я неправильно прочитал код. Я думал, что вы вызываете 'sublime_api.view_run_command' прямо каким-то образом. Похоже, вы пытаетесь переопределить метод 'run_', а не обычный метод' run'. Я не знаю, что он что-нибудь исправит, вероятно, вы должны соответствовать сигнатуре существующего метода, который является 'def run_ (self, edit_token, args):' – skuroda

+0

Такая же ошибка появляется, даже если я сопоставляю сигнатуру существующего метода , Я также попытался вызвать непосредственно 'sublime_api.view_run_command (self.view_id, cmd, args)', но это дает мне более загадочное сообщение об ошибке: 'TypeError: String required'. – Scam

Смежные вопросы