Сохраните файл перед запуском пользовательской команды в Sublime3

Этот вопрос похож на этот Можно ли связать команды привязки клавиш в возвышенном тексте 2? С тех пор прошло несколько лет вопрос (и данные ответы), и я использую Sublime Text 3 (а не 2), поэтому я считаю, что этот новый вопрос оправдан.

Я установил пользовательскую привязку клавиш:

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

чтобы запустить скрипт project_venv_repl.py:

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:
    https://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'
            }
        )

Это запускает открытый файл в SublimeREPL при нажатии клавиши f5.

Что мне нужно, так это способ имитировать ярлык «Сборка» (Ctrl+B). А именно: при нажатии клавиши f5 текущий (открытый) файл должен быть сохранен перед выполнением команды project_venv_repl.

Можно ли добавить эту инструкцию в сценарий project_venv_repl.py или в строку command в определении привязки клавиш?


person Gabriel    schedule 27.09.2016    source источник
comment
Просто добавьте self.view.run_command("save") к вашему методу run().   -  person MattDMo    schedule 28.09.2016
comment
Отлично, гораздо проще, чем я думал. Не могли бы вы превратить свой комментарий в ответ, чтобы я мог пометить его как принятый? Спасибо!   -  person Gabriel    schedule 28.09.2016


Ответы (1)


Ничего сверхъестественного делать не нужно. Если вы просто хотите сохранить текущее представление перед запуском REPL, отредактируйте метод run() вашего класса ProjectVenvReplCommand (который вызывается при выполнении команды project_venv_repl) и добавьте в начало следующую строку:

self.view.run_command("save")

Это автоматически сохранит текущий вид, если он не был сохранен ранее, и в этом случае диалоговое окно «Сохранить как...» откроется, как обычно.

Если вы хотите сохранить все открытые файлы в окне, вы можете использовать этот код:

for open_view in self.view.window().views():
    open_view.run_command("save")
person MattDMo    schedule 27.09.2016
comment
Мэтт, сегодня с этим ответом я столкнулся с проблемой, которую раньше не замечал. Команда self.view.run_command("save") полностью сохранит текущий (открытый) файл, но не любой другой открытый файл с несохраненными изменениями. Я попытался изменить его на self.view.run_command("save_all"), но он по-прежнему сохраняет только текущий файл перед запуском. Это вообще можно сделать? - person Gabriel; 30.09.2016
comment
@Gabriel, посмотри мое редактирование - тебе просто нужно перебрать все представления в текущем окне. - person MattDMo; 01.10.2016
comment
Извините, что так долго не отвечаю, Мэтт, мне пришлось выполнить чистую установку ОС. Я попробовал ваше решение, и хотя оно сохраняет все файлы с несохраненными изменениями в текущем представлении, оно также показывает всплывающее окно с просьбой сохранить файл, из которого я запустил REPL, или что-то подобное: *REPL* [/home/gabriel/.pyenv/versions/test-env/bin/python -i -u /home/gabriel/Github/test.py]. Если я выберу Отмена, REPL будет выполняться нормально (с сохранением несохраненных файлов), но я не хочу закрывать это всплывающее окно каждый раз, когда запускаю свой скрипт. Возможно, мне следует открыть новый вопрос? - person Gabriel; 03.10.2016
comment
Я создал отдельный вопрос здесь. - person Gabriel; 04.10.2016