SublimeText:运行 以当前文件作为 arg 的 exec(Tab 上下文菜单)

SublimeText: Run the exec with current file as arg (Tab context menu)

我创建了一个选项卡上下文菜单来解码一些数据。现在,我需要将当前文件(Tab 上下文菜单)作为第一个参数来使用 exec 解码该文件。

目前我正在使用硬编码路径。我怎样才能传递当前文件的名称?

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

一般来说,如果不使用某种插件代码将该信息传递给命令,就无法执行命令并向其提供当前活动文件的名称。

如键绑定、菜单等中所定义,您需要为预定义的命令提供参数,这意味着命令中的某些内容需要能够根据您提供的参数知道您的意思当前文件,或者该命令需要隐式地只在当前文件上工作而不被告知这样做。

最方便的方法是创建一个 sublime-build 文件,其中 运行 包含您想要 运行 的命令,然后使用 $file variablecmd 条目中表示当前文件,然后将菜单命令绑定到 build 命令,以便它触发构建。

这里的缺点是这会妨碍将构建用于其他用途; build 命令只执行当前选择的构建,因此它要求您在开始使用菜单之前首先设置构建系统,或者将构建系统设置为 Automatic 以便 Sublime 执行正确的在正确的时间建造。无论哪种方式都可能会或可能不会妨碍您将构建用于其他目的的能力,而无需在中间采取手动步骤。

另一种方法是创建一个插件来实现 exec 命令的一个版本,该版本将扩展变量本身,而不是要求 build 命令为其扩展它们。

此类插件的示例如下(如果您不熟悉使用自定义插件,请参阅 this video):

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 将执行的操作,除了 cmdshell_cmd 和 [=24= 中的变量] 参数将以与 sublime-build 文件中相同的方式展开。

使用该插件,您的 sublime-menu 条目会将 exec 替换为 menu_exec 并使用 $file 表示当前文件:

[
    { 
        "caption": "DecodeJ",
        "command": "menu_exec", 
        "args": {
            "cmd": "P:\decoder.exe $file"
        }
    },
]

Note: If your file names contain spaces, you should wrap the variable in double quotes; "P:\decoder.exe \"$file\"" for example; otherwise the external command might not get the right filename.