How to detect in keybindings if sidebar is open?

99 Views Asked by At

I'd like cmd+1 to alternate between reveal in sidebar (if closed) and if sidebar is open, close it.

if closed: { "keys": ["super+1"], "command": "reveal_in_side_bar"}

if open: { "keys": ["super+1"], "command": "toggle_side_bar" }

I don't know how to do the if part . Thanks

1

There are 1 best solutions below

3
Keith Hall On BEST ANSWER

As far as I know, there is no built-in key binding context that can be used to tell whether the sidebar is open or closed. But this is something that can easily be done using the Python API, specifically with window.is_sidebar_visible() and it is also possible to create custom keybinding contexts.

From the Tools menu, navigate to Developer > New Plugin. Then replace the contents of the view with:

import sublime, sublime_plugin

class SidebarContextListener(sublime_plugin.EventListener):
    def on_query_context(self, view, key, operator, operand, match_all):
        if key != 'sidebar_visible' or not (operand in ('reveal', 'toggle')):
            return None
        visible = view.window().is_sidebar_visible()
        if operand == 'toggle' and visible:
            return True
        if operand == 'reveal' and not visible:
            return True
        return None

and save it, in the folder ST suggests (Packages/User) as something like sidebar_context.py - the extension is important, the name isn't.

Now, we can use it in your keybindings, like:

{ "keys": ["super+1"], "command": "toggle_side_bar", "context":
    [
        { "key": "sidebar_visible", "operand": "toggle" },
    ],
},

{ "keys": ["super+1"], "command": "reveal_in_side_bar", "context":
    [
        { "key": "sidebar_visible", "operand": "reveal" },
    ],
},