gpt4 book ai didi

sublimetext3 - Sublimetext 与适用于 Linux 的 Windows 子系统(WSL、bash)集成

转载 作者:行者123 更新时间:2023-12-03 13:34:49 25 4
gpt4 key购买 nike

有没有办法从 sublimetext 执行 bash 命令?

在许多项目中,最好通过适用于 Linux 的 Windows 子系统(WSL、bash)使用 linux 工具进行开发,因为大多数工具都是为 linux 构建的。

在 Windows 中,您可以像这样在 Windows 控制台中运行 bash 命令:

bash -c "echo \"my bash command here\""

假设我想运行一个非常具体的构建脚本,如下所示:
bash -c "prettier mypath/ && eslint mypath/ --fix"

或像这样:
bash -c "my_very_specific_build_script.sh"

甚至更好的是,有一个通过钩子(Hook)执行 linter 的钩子(Hook):
https://packagecontrol.io/packages/Hooks
bash -c "my_linting_script.sh"

然后像这样在每次“保存”时调用脚本:
"on_post_save_user":
[
{
"command": "bash_execute",
"args": {
"command": "my_linting_script.sh",
}
}
],

对于我们所有没有 Mac 的开发人员来说,这将改变游戏规则

我的进步至今

在 Keybindings 中这有效(按下 ctrl+alt+b 时创建一个日志)
{
"keys": ["ctrl+alt+b"],
"command": "exec",
"args": {
"cmd": "bash -c \"cd ~ && echo ok >> log.txt\"",
}
}

这适用于使用“钩子(Hook)”插件在每次“保存”时触发的首选项:
"on_post_save_user": [
{
"command": "exec",
"args": {
"cmd": "bash -c \"cd ~ && echo ok >> log.txt\"",
},
"scope": "window"

}
],

这是最好的方法吗?

尝试创建插件

我制作了一个简单的插件,可以在带有 WSL 的 Windows 中使用 bash 成功运行“top”。

https://github.com/eduardoarandah/sublime-bash-execute

只需在 Packages/User 中复制 BashCommand.py 并在控制台中运行:
view.run_command('bash_exec')
我从来没有做过一个 Sublime 的插件,任何帮助都会被记入,赞赏等等。

最佳答案

内部exec command 可以运行您选择向它抛出的任何任意命令,因此如果需要,可以使用该命令直接使用它来执行此操作。

需要注意的是 exec命令可以是 cmd作为 ["list", "of", "strings"]shell_cmd"a single string" .使用 cmd 时,列表中的第一项被直接调用,其他所有内容都作为参数传递,而在第二种情况下,字符串按原样直接传递给 shell。

通常对于您在此处提到的项目,您要使用 shell_cmd ;由于它直接传递给 shell 执行,因此它可以包含重定向和链接命令等内容。

如上面示例中所述,您可以使用 shell_cmd并在您想要执行的任何命令前加上 bash -c , 将命令的其余部分用双引号括起来,而 exec命令将运行 bash并将您提供的命令传递给它。

也可以在 Sublime 中创建一个类似于 exec 的简单命令。确实如此,同时在其中自动注入(inject)适当的项目以使 bash 为您执行命令。

这样的插件可能如下所示:

import sublime
import sublime_plugin

from Default.exec import ExecCommand


class BashExecCommand(ExecCommand):
"""
A drop in replacement for the internal exec command that will run the
given command directly in bash. Use of "shell_cmd" is recommended, but
some care is taken to convert "cmd" to the appropriate "shell_cmd"
equivalent.

For use in key bindings, replace `exec` with `bash_exec` and you're good
to go. For use in a build system, include the following lines to your
build to tell Sublime to use this command to execute the build as well as
how to kill it:

"target": "bash_exec",
"cancel": {"kill": True}
"""
def run(self, **kwargs):
# If we're being told to kill a running build, short circuit everything
# and just do it directly. Not really needed, but it's a nice reminder
# that custom builds need to handle this sort of thing in general.
if kwargs.get("kill", False):
return super().run(kill=True)

# If there is a "cmd" argument, grab it out and convert it into a
# string. Items in cmd that contain spaces are double quoted so that
# they're considered a single argument, and all items are joined
# together.
cmd = kwargs.pop("cmd", None)
if cmd is not None:
cmd = " ".join(["\"%s\"" % s if " " in s else s for s in cmd])

# If there is a "shell_cmd" argument, then modify it to include the
# correct prefix to run the command via bash as well as to quote all
# double quote characters so the shell sees them.
#
# This will fall back to the string we just gathered for "cmd" if no
# shell_cmd is given.
shell_cmd = kwargs.pop("shell_cmd", cmd)
if shell_cmd is not None:
kwargs["shell_cmd"] = "bash -c \"{0}\"".format(
shell_cmd.replace("\"", "\\\""))

# Defer to the built in exec command to run the command
super().run(**kwargs)

如果您删除解释这是做什么的注释,则更改约为 20 行左右。这样做是利用内部 exec命令为我们完成所有繁重的工作。因此,我们可以自动修改命令的参数,让 Sublime 处理细节。

如代码所示,如​​果 cmd如果提供了参数,则通过将所有参数与空格字符连接在一起,将其转换为字符串。一路上,任何包含空格的参数都会自动被双引号引起来,以便正确地传达给 shell。

如果 shell_cmd提供,它被类似地提取并转换为带有 bash -c 的字符串字首;一路上,出现在命令中的任何双引号都被引用,以便它们正确地传达给 shell。

此外, cmd 的转换值如果没有 shell_cmd,则用作默认值提供;因此,如果您指定 shell_cmd这总是被执行的,如果你使用 cmd它被转换成适当的 shell_cmd直接论证。

在使用这个实现的命令是 bash_exec , 并且应该是 exec 用途的替代品在您直接调用它的地方,例如在键绑定(bind)、菜单条目、命令面板条目、通过其他命令等中。

此外,您可以将以下两行直接添加到 sublime-build文件以使用此命令执行以这种方式进行的构建;第一行告诉 Sublime 使用这个命令而不是 exec执行构建,而第二个告诉它传递给命令的参数以使其取消正在运行的构建。

"target": "bash_exec",
"cancel": {"kill": True},

注意事项

这实际上只在 Windows 上使用;在 Linux 和 MacOS 上,Sublime 已经使用 bash执行 shell_cmd无需您做任何特别的事情。使用 sublime.platform() ,该命令可以确定它是否正在 Windows 上执行,并且仅在该操作系统上重写命令,否则如果需要,则不理会。

另请注意,我个人并未在我的 Windows 机器上使用 WSL,因此在该环境中未经测试(但它在我的 Linux 机器上按预期执行);因此,这里可能仍需要进行一些调整,例如 if bash不是直接在路径上,或者您希望它是可配置的。

最后要提的是要转换的代码 shell_cmdcmd进入 bash 命令行可能需要更多的智能或细微的调整,具体取决于您要实现的目标。如果事情看起来不像你期望的那样,Sublime 控制台会显示什么命令 exec正在运行,这可能会对事情有所帮助。

关于sublimetext3 - Sublimetext 与适用于 Linux 的 Windows 子系统(WSL、bash)集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com