Sublime Text 3按键绑定 - 使用变量

3

我正在尝试创建一个按键绑定,以便使用当前Sublime Text 3 $project_path文件夹打开我最喜欢的git应用程序,但是不知何故,Sublime Text 3没有将变量转换为实际路径。

下面是我的当前键盘绑定文件。

[
    {
        "keys": ["super+ctrl+alt+g"],
        "command": "exec",
        "args":
        {
            "shell_cmd": "open -a Gitbox $project_path"
        }
    }
]

$project_path不能转换为实际的项目路径...我做错了什么?我应该使用“构建系统”吗?我查看了构建系统,但问题在于您需要选择文件范围(例如*.rb),而我希望此键盘快捷方式对所有我的项目/文件有效。

在textmate2中,通过在“Bundle Editor”中创建一个新的“Command”并将快捷方式分配给它,可以轻松地实现相同的快捷方式。然后该命令将是:

#!/usr/bin/ruby
exec "open -a Gitbox '#{ENV['TM_PROJECT_DIRECTORY']}'"

我正在尝试在Sublime Text 3中实现同样的功能,但出现了一些问题。

谢谢!

2个回答

2

编辑:

与此同时,我已经创建了一个通用插件,让你能够通过按键或命令面板打开任何外部应用程序。

该插件可以在这里找到:ExternalTools

你可以通过命令面板cmd+shift+p轻松安装它。

在你的情况下,你可以前往偏好设置/按键绑定并添加以下内容:

{ 
    "keys": ["super+ctrl+alt+g"], 
    "command": "external_tools_run", 
    "args": { "cmd": ["open", "-a", "Gitbox", "$project_path"] }
} 

我仍然没有拥有一台苹果电脑,所以有可能它不能正常工作。在这种情况下,如果你能给我反馈(请参见Issues),我将不胜感激。


原始回答:

我花了几个小时搜索了同样的问题。最终我决定创建一个带有自己占位符的小插件。

import sublime, sublime_plugin

class RunAppCommand(sublime_plugin.WindowCommand):
    def run(self, app_args):
        app_args = self.fill_placeholder(app_args)
        self.window.run_command("exec", {"cmd": app_args } )        

def fill_placeholder(self, args):
    res = []
    proj_folder = self.get_project_folder()

    for arg in args:
        arg = arg.replace("$PROJECT_FOLDER", proj_folder)
        res.append(arg)

    return res

def get_project_folder(self,default=None):
    proj_folder = ""

    if self.window.project_file_name():
        proj = self.window.project_data()

    proj_folder_obj = self.get_first(proj["folders"])
    if proj_folder_obj:
        proj_folder = proj_folder_obj["path"]

    elif self.window.folders():
        proj_folder = self.get_first(self.window.folders())

    if not proj_folder:
        sublime.status_message("No project folder located")
        return default

    return proj_folder        

def get_first(self, iterable, default=None):
    if iterable:
        for item in iterable:
        return item
    return default

在将上述代码保存到Packages/User/RunApp.py之后,您只需要将以下内容添加到您的Default.sublime-keymap中即可使命令起效:
{ "keys": ["super+ctrl+alt+g"], "command": "run_app", "args": { "app_args": ["open", "-a", "Gitbox", "$PROJECT_FOLDER"]}}

这可能不是最好的解决方案,但对我来说有效。


我忘了说,我正在使用Windows机器。所以我不确定这些插件是否适用于Mac。 - fboers
这个有更新吗?我遇到了同样的问题,Mac上可以解决吗? - artSir
抱歉,但我仍然没有拥有Mac电脑。据我所知,即使是最新的开发版本也不包含这样的功能。 - fboers

0

我也花了几个小时在这里搜索 - 多亏了fboers的示例,我终于可以自己创建一个插件了。

所以这是我的解决方案:exec2 - 扩展所有sublime变量,然后将其转发到exec

将此保存为Packages/Exec2/Exec2.py

import sublime
import sublime_plugin

class Exec2Command(sublime_plugin.WindowCommand):
    def run(self, cmd):
        new_cmd = [sublime.expand_variables (value, self.window.extract_variables()) for value in cmd]
        self.window.run_command("exec", {"cmd": new_cmd } )     

按键绑定的示例:

{ "keys": ["ctrl+F7"], "command": "exec2", "args" : { "cmd": ["V:/v4_tools/v4Doccer.exe", "--mdi", "${file}"]}  },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接