sublimetext3 - SublimeText:使用当前文件作为 arg 运行 exec(选项卡上下文菜单)
问题描述
我创建了一个选项卡上下文菜单来解码一些数据。现在,我需要将当前文件(选项卡上下文菜单)作为第一个参数来使用exec
.
目前我正在使用硬编码路径。如何改为传递当前文件的名称?
[
{ "command": "exec", "args": {"cmd": "P:\\decoder.exe P:\\in.txt"}, "caption": "DecodeJ" },
]
解决方案
一般来说,如果不使用某种插件代码将该信息传达给命令,就无法执行命令并向其提供当前活动文件的名称。
正如在键绑定、菜单等中定义的那样,您需要为预定义的命令提供参数,这意味着命令中的某些内容需要能够根据您提供的参数知道您是指当前文件,或者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_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\""
例如; 否则外部命令可能无法获得正确的文件名。
推荐阅读
- reactjs - how to display records in a dropdown using react redux
- c# - 从 C# 中的外部进程弹出 DLL
- lets-encrypt - AKS 的 cert-manager 的 helm chart 安装超时
- python - yum 源码中没有用的 if 语句
- android - RecyclerAdapter 正在背靠背创建多个视图
- java - Spring - 处理请求参数中的空值
- c# - 如何获取不同情况的特定子字符串
- ios - 使用 `inputAccessoryView` 时显示的警告
- swift - 使用 Alamofire swift 4 上传文件
- go - Golang SIGSEGV on *second* call only