在Sublime Text 2中,是否可以链接键绑定命令?

50

在 Sublime Text 中,有时我想要在侧边栏中显示当前文件并浏览文件夹结构。

这可以使用命令reveal_in_side_barfocus_side_bar实现,但是它们必须绑定到两个不同的按键组合,因此我需要执行两次键盘按键才能达到目标,而理想情况下,我只希望使用一个组合键(我很懒)。

是否有办法将多个命令绑定到一个按键组合上?例如:

{
  "keys": ["alt+shift+l"], 
  "commands": ["reveal_in_side_bar", "focus_side_bar"]
},

解决方案

结合@artem-ivanyk和@d_rail的回答:

1)工具 → 新建插件

import sublime, sublime_plugin

class RevealInSideBarAndFocusCommand(sublime_plugin.WindowCommand):
    def run(self):
        self.window.run_command("reveal_in_side_bar")
        self.window.run_command("focus_side_bar")

保存为RevealInSideBarAndFocus.py

2) Sublime Text 2 → 首选项 → 快捷键绑定 - 用户

将其绑定到快捷键:

{ "keys": ["alt+shift+l"], "command": "reveal_in_side_bar_and_focus" }
9个回答

36

虽然这个问题已经有一年了,但这可能对仍在寻找答案的人有所帮助。

最近,jisaacks开发了一个新的包,叫做Chain of command。它的主要任务是做你请求的事情,即一次性链接多个命令。

该包可以在此处找到: https://github.com/jisaacks/ChainOfCommand

下面是一个示例。

假设你想要将当前文件复制一份并绑定按键。你可以设置以下按键绑定:

{
  "keys": ["super+shift+option+d"], 
  "command": "chain", 
  "args": {
    "commands": [
      ["select_all"],
      ["copy"],
      ["new_file"],
      ["paste"],
      ["save"]
    ]
  }
}

这将选择所有文本,复制它,创建一个新文件,粘贴文本,然后打开保存文件对话框。

来源:https://sublime.wbond.net/packages/Chain%20of%20Command


我在Debian上使用Sublime 3 Build 3126。这个插件似乎不起作用,有什么建议吗? - T04435
1
像魔法一样好用。对于带有参数的命令,只需省略 "args": 即可。例如:["set_file_type", {"syntax": "PostgreSQL.tmLanguage"}] - Ufos
一个适合那些不想自己制作插件的好解决方案。 - Daniel Dewhurst
Sublime Text 3无法工作,我尝试使用以下代码:{ "keys": ["ctrl+v"], "command": "chain", "args": { "commands": [ ["paste"], ["reindent"] ] } } - user924

30

更新@Artem Ivanyk的回答。我不知道Sublime发生了什么变化,但是那个解决方案对我没有起作用,但我用下面的方法解决了:

import sublime, sublime_plugin

class RevealInSideBarAndFocusCommand(sublime_plugin.WindowCommand):
    def run(self):
        self.window.run_command("reveal_in_side_bar")
        self.window.run_command("focus_side_bar")

.

{ "keys": ["ctrl+shift+8"], "command": "reveal_in_side_bar_and_focus" }

顺便提一下,我正在使用 Build 2220 版本


正在开发 v2.0.1 Build 2217 版本。请将文件名保存为“RevealInSideBarAndFocus.py”。 - KKK
我认为文件名并不重要,对吧? - Geo
不是根据我的经验,而是根据位置和类名。 "command" 是 CamelCased Python 类转换为下划线的形式。此外,请保存在 Packages/CustomCommand 文件夹中,而不是 Packages/User 中。 - d_rail

26

我遇到了类似的问题。当试图记录涉及“保存”命令的宏时,控制台会抛出“未知的宏命令保存”消息。 我使用基本插件解决了这个问题。

1) 工具→ 新建插件

import sublime, sublime_plugin

class MyChainedActionsCommand():
    def run(self):
        self.view.run_command("reveal_in_side_bar")
        self.view.run_command("focus_side_bar")

类名需要使用大驼峰命名法。ST2将此类暴露给命令名称,并删除"Command"后缀,并将其余部分转换为小写下划线格式。例如,在此示例中,可以在sublime的控制台中键入view.run_command("my_chained_actions")来运行MyChainedActionsCommand

2) Sublime Text 2 → Preferences → Key Bindings — User

将其绑定到快捷方式:

{ "keys": ["alt+shift+l"], "command": "my_chained_actions" }

请注意逗号。


1
代码在版本2.0.1构建2217中没有任何作用;无论是MyChainedActionsCommand()还是MyChainedActionsCommand(sublime_plugin.WindowCommand)或其他任何东西。 - mreq

8
请看这个代码片段
我已经试图实现它很长时间了,偶然发现了这个。
别忘了阅读提供的“文档”。我一直在尝试使其工作,直到意识到我没有传递“上下文”关键字。

这个代码片段很棒。谢谢你分享链接。+1 另外:实际上我没有使用上下文,只是省略了它,我的按键绑定也可以工作了。 - RaphaelDDL

4
您可以创建宏来完成此操作。对于Sublime Text而言,宏本质上只是链接在一起的命令。然后您需要为该宏创建一个键绑定。您可以使用“工具”>“录制宏”的选项来创建宏,然后执行您的命令(请注意,宏也会记录按键操作,因此最好使用来自菜单栏的命令以避免冲突),然后点击“停止录制”,最后点击“保存宏”。保存宏后,您可以在Sublime Text中打开它,以确保它只记录了您想要的内容。

我已经设置了一个宏,但是在控制台中显示“未知的宏命令reveal_in_side_bar”(对于focus_side_bar也是如此)。有没有办法从宏内部引用现有的命令? - James Hollingworth
1
嗯。ST2的宏似乎很挑剔,只记录/接受有效命令。如果是这种情况,您将不得不编写一个插件,使用run_command()串联这些命令。它并没有听起来那么复杂。我很快会更新我的答案。 - Liam Cain

1
我是使用Sublime Text3版本3083。只需通过“在侧边栏中显示”就可以解决问题,焦点会自动聚焦。
我已经在“首选项->键绑定-用户”下添加了一个自定义的“在侧边栏中显示”的快捷键,添加以下语句即可:
[
    { "keys": ["ctrl+shift+r"], "command": "reveal_in_side_bar"}
]

选项 - '在侧边栏中显示' 在图像文件类型中缺失,因为鼠标右键单击不会出现上下文菜单。在这种情况下,自定义的键盘快捷方式非常方便。

1
我曾试图使用相同的命令,但结果出现了一个bug,当文件夹已经展开时,Sublime会移动我的侧边栏顶部焦点,那里可以看到打开的文件。为了改善这种行为,我编写了一个新的插件,确保它将按照我的意愿运行,这里是https://github.com/miguelgraz/FocusFileOnSidebar

1

基于Artem Ivanyk的回复,这是一个带有参数的ChainedActions版本。它需要actionsargs两个参数。两者都是列表,列表中的每个命令都会使用相应的参数执行。这个例子插入了两个代码片段:view.run_command("chained_actions", {"actions":["insert_snippet","insert_snippet"],"args":[{"contents": "($0)"},{"contents": "1($0)"}]})

import sublime
import sublime_plugin

class ChainedActionsCommand(sublime_plugin.TextCommand):
    def run(self, edit, actions, args):
        for i, action in enumerate(actions):
            self.view.run_command(action, args[i])

0

从Sublime Text Build 4103开始,该功能得到本地支持:

“添加了chain命令,它接受要在其“commands”参数中运行的命令列表。这允许绑定一个键以运行多个命令,而无需使用宏”

请参阅https://www.sublimetext.com/dev上的更改日志


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