Вообще говоря, нет способа выполнить команду и предоставить ей имя текущего активного файла без использования какого-либо кода плагина для передачи этой информации команде.
Как определено в привязках клавиш, меню и т. Д., Вы должны предоставить аргументы для предопределенных команд, что означает, что что-то в команде должно быть в состоянии знать на основе аргумента, который вы указали, что вы имели в виду текущий файл , или команде нужно неявно просто работать с текущим файлом, не получая указаний сделать это.
Наиболее целесообразный способ сделать что-то подобное - создать файл sublime-build
, который запускает команду, которую вы хотите запустить, и затем использовать переменную $file
в cmd
. запись, представляющую текущий файл, с последующей привязкой команды меню к команде build
, чтобы она запускала сборку.
Недостатки в том, что это может помешать использованию сборок для других целей; команда build
выполняет только текущую выбранную сборку, поэтому требуется сначала установить систему сборки перед тем, как вы начнете использовать меню, или установить систему сборки на Automatic
, чтобы Sublime выполняла правильную сборку с правильной время. В любом случае, может или не может помешать вам использовать сборки для других целей без необходимости выполнять ручные шаги в середине.
Альтернативой этому может быть создание плагина, который реализует версию команды exec
, которая сама будет расширять переменные вместо того, чтобы требовать, чтобы команда build
развернула их для нее.
Примером такого плагина может быть следующий (см. это видео , если вы не знакомы с использованием пользовательских плагинов):
import sublime
import sublime_plugin
from Default.exec import ExecCommand
class MenuExecCommand(ExecCommand):
def run(self, **kwargs):
variables = self.window.extract_variables()
for key in ("cmd", "shell_cmd", "working_dir"):
if key in kwargs:
kwargs[key] = sublime.expand_variables(kwargs[key], variables)
super().run(**kwargs)
Это реализует команду с именем menu_exec
, которая делает именно то, что exec
будет делать при вызове, за исключением того, что переменные в аргументах cmd
, shell_cmd
и working_dir
будут расширены так же, как и в sublime-build
файлов.
С этим плагином ваша запись sublime-menu
поменяет exec
на menu_exec
и использует $file
для представления текущего файла:
[
{
"caption": "DecodeJ",
"command": "menu_exec",
"args": {
"cmd": "P:\\decoder.exe $file"
}
},
]
Примечание: Если имена ваших файлов содержат пробелы, вы должны заключить переменную в двойные кавычки; "P:\\decoder.exe \"$file\""
например; в противном случае внешняя команда может не получить правильное имя файла.