Velixo
Velixo

Reputation: 724

How to set key-bindings in Sublime that change values of settings?

I'm looking to bind the "alt+f11" binding to toggle "draw_centered", which centers the text as in Distraction-free mode. I'm not sure how to get it to work though.

Heres my keybinds so far:

//if draw_centered == true, set to false
{ "keys": ["alt+f11"], "command": "set_setting", "args":
    {
        "setting": "draw_centered",
        "value": "true",
    },

    "context":
    [
        { "key": "setting.draw_centered", "operator": "equal", "operand": false}
    ]
},

//if draw_centered == false, set to true
{ "keys": ["alt+f11"], "command": "set_setting", "args":
    {
        "setting": "draw_centered",
        "value": "false",
    },

    "context":
    [
        { "key": "setting.draw_centered", "operator": "equal", "operand": true}
    ]
}

I couldn't find a command that automatically toggled "draw_centered", so I had to resort to building some sort of advanced command. I'm having a bit of trouble understanding the documentation on keybindings, but I tried to follow the "Contexts" example. Could anyone point to what I'm doing wrong?

Upvotes: 2

Views: 577

Answers (2)

Alexis
Alexis

Reputation: 5075

A little late, but it took me a while to find out how to do something similar and this was the most closest question to what I was trying to achieve.

toggle_setting only works in the current view(file you are working on), it also won't work in other options like show_encoding, because these aren't too related to the view specifically rather than being more part of the panel spectrum.

After digging a couple of hours I found an old plugin called Cycle Settings, this one was for Sublime 2, but after a little tweaking it worked as expected.

(I remember that there was an option to create packages directly in sublime, but don't remember where..)

Go to Preferences/Browse Packages... and create a new file there "Cycle Settings/cycle_setting.py" and the following code there:

"""

Cycle Setting plugin for Sublime Text 3.
Copyright 2011 Jesse McCarthy <http://jessemccarthy.net/>

Adds a command that can be called from a key binding to toggle or
cycle through values for a setting.

The Software may be used under the MIT (aka X11) license or Simplified
BSD (aka FreeBSD) license.  See LICENSE

"""

import sublime, sublime_plugin

class CycleSettingCommand(sublime_plugin.TextCommand):

    def run(self, edit, setting, options):

        """Cycle $setting to next of $options"""

        index = len(options)

        if not index :

            return


        settings = sublime.load_settings('Preferences.sublime-settings')

        value = settings.get(setting)


        if value in options :

            index = options.index(value)


        index += 1


        if index >= len(options) :

            index = 0


        value = options[index]


        settings.set(setting, value)

        sublime.save_settings('Preferences.sublime-settings')

        self.view.set_status(

            'cycle_setting',

            "Setting '{setting}' cycled to value '{value}'".format(**locals())

        )

Now, lets use our new command for bindings

Go to Preferences/Key Bindings

[
    {
        "keys": ["f5"],
        "command": "cycle_setting",
        "args": {
            "setting": "draw_centered",
            "options": [true, false]
        }
    },
    {
        "keys": ["shift+f5"],
        "command": "cycle_setting",
        "args": {
            "setting": "default_line_ending",
            "options": ["system", "windows", "unix"]
        }
    }
]

What our command is doing is cycling through the options array and saving the current one in the cycle to User/Preferences.sublime-settings.

I hope this helps someone else, I actually spend a while trying to find how to achieve this with many commands for external plugins and at this rate I was soon going to run out of key combinations, regards!

Upvotes: 0

Velixo
Velixo

Reputation: 724

Thanks sergioFC for the tip about toggle_setting! I got it to work with this code:

{ "keys": ["alt+f11"], "command": "toggle_setting", "args":
    {
        "setting": "draw_centered",
    }
}

EDIT: I discovered a bug with this. After using the key-combination "alt-f11" now, the distraction-free mode isn't behaving like it should. It now follows the draw_centered state that I am in when I switch from normal to distraction-free mode.

For example: if I have a file opened and click 'alt-f11' so I am left-aligned (i.e. draw_centered = false) , the window will remain left-aligned when I enter distraction-free mode. Any ideas as to why this is and how to fix it?

Upvotes: 1

Related Questions