SublimeText: запустить exec с текущим файлом как arg (контекстное меню вкладки) - PullRequest
0 голосов
/ 08 июля 2019

Я создал контекстное меню вкладки для декодирования некоторых данных.Теперь мне нужно взять текущий файл (контекстное меню Tab) в качестве 1-го аргумента для декодирования этого файла, используя exec.

В настоящее время я использую жестко закодированный путь.Как мне вместо этого передать имя текущего файла?

[
  { "command": "exec", "args": {"cmd": "P:\\decoder.exe P:\\in.txt"}, "caption": "DecodeJ" },
]

1 Ответ

1 голос
/ 08 июля 2019

Вообще говоря, нет способа выполнить команду и предоставить ей имя текущего активного файла без использования какого-либо кода плагина для передачи этой информации команде.

Как определено в привязках клавиш, меню и т. Д., Вы должны предоставить аргументы для предопределенных команд, что означает, что что-то в команде должно быть в состоянии знать на основе аргумента, который вы указали, что вы имели в виду текущий файл , или команде нужно неявно просто работать с текущим файлом, не получая указаний сделать это.

Наиболее целесообразный способ сделать что-то подобное - создать файл 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\"" например; в противном случае внешняя команда может не получить правильное имя файла.

...