首页 > 解决方案 > SublimeText:使用当前文件作为 arg 运行 exec(选项卡上下文菜单)

问题描述

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

目前我正在使用硬编码路径。如何改为传递当前文件的名称?

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

标签: sublimetext3sublimetextsublime-text-plugin

解决方案


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

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

执行此类操作的最便捷方法是创建一个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_cmdworking_dir参数中的变量将以与文件中相同的方式扩展sublime-build

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

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

注意:如果您的文件名包含空格,则应将变量用双引号引起来;"P:\\decoder.exe \"$file\""例如; 否则外部命令可能无法获得正确的文件名。


推荐阅读