Save file before running custom command in Sublime3
Question: This question is similar to this one [Is it possible to chain key binding
commands in sublime text 2?](http://stackoverflow.com/q/9646552/1391441) Some
years have passed since that question (and the answers given), and I'm using
Sublime Text 3 (not 2), so I believe this new question is justified.

I've setup a custom keybind:

    
    
    {
        "keys": ["f5"],
        "command": "project_venv_repl"
    }
    

to run the `project_venv_repl.py` script:

    
    
    import sublime_plugin
    
    
    class ProjectVenvReplCommand(sublime_plugin.TextCommand):
        """
        Starts a SublimeREPL, attempting to use project's specified
        python interpreter.
    
        Instructions to make this file work taken from:
        http://stackoverflow.com/a/25002696/1391441
        """
    
        def run(self, edit, open_file='$file'):
            """Called on project_venv_repl command"""
            cmd_list = [self.get_project_interpreter(), '-i', '-u']
    
            if open_file:
                cmd_list.append(open_file)
    
            self.repl_open(cmd_list=cmd_list)
    
        def get_project_interpreter(self):
            """Return the project's specified python interpreter, if any"""
            settings = self.view.settings()
            return settings.get('python_interpreter', '/usr/bin/python')
    
        def repl_open(self, cmd_list):
            """Open a SublimeREPL using provided commands"""
            self.view.window().run_command(
                'repl_open', {
                    'encoding': 'utf8',
                    'type': 'subprocess',
                    'cmd': cmd_list,
                    'cwd': '$file_path',
                    'syntax': 'Packages/Python/Python.tmLanguage'
                }
            )
    

This runs the opened file in a SublimeREPL when the `f5` key is pressed.

What I need is a way to mimic the "Build" shortcut (`Ctrl+B`). This is: when
the `f5` key is pressed, the current (opened) file should be _saved_ before
running the `project_venv_repl` command.

Can this instruction be added to the `project_venv_repl.py` script, or to the
`command` line in the keybind definition?


Answer: There's no need to do anything fancy. If you just want to save the current
view before running the REPL, edit your `ProjectVenvReplCommand` class's
`run()` method (which is called when the `project_venv_repl` command is
executed) and add the following line at the beginning:

    
    
    self.view.run_command("save")
    

This will silently save the current view unless it has not been saved before,
in which case a Save As... dialog will open just like usual.

If you want to save all open files in the window, you can use this code:

    
    
    for open_view in self.view.window().views():
        open_view.run_command("save")
    

