【问题标题】:How to get user input before saving a file in Sublime Text如何在 Sublime Text 中保存文件之前获取用户输入
【发布时间】:2014-06-12 23:00:05
【问题描述】:

我正在 Sublime Text 中制作一个插件,提示用户输入密码以在保存文件之前对其进行加密。在执行保存之前执行的 API 中有一个钩子,所以我的幼稚实现是:

class TranscryptEventListener(sublime_plugin.EventListener):
    def on_pre_save(self, view):
        # If document is set to encode on save
        if view.settings().get('ON_SAVE'):
            self.view = view
            # Prompt user for password
            message = "Create a Password:"
            view.window().show_input_panel(message, "", self.on_done, None, None)

    def on_done(self, password):
        self.view.run_command("encode", {password": password})

问题在于,当用户输入密码的输入面板出现时,文档已经保存(尽管触发器是“on_pre_save”)。然后一旦用户点击enter,文档被很好地加密,但情况是有一个保存的明文文件,以及一个填充了加密文本的修改缓冲区。

所以我需要让 Sublime Text 等到用户输入密码后再进行保存。有没有办法做到这一点?

目前我只是在加密完成后手动重新保存:

def on_pre_save(self, view, encode=False):
    if view.settings().get('ON_SAVE') and not view.settings().get('ENCODED'):
        self.view = view
        message = "Create a Password:"
        view.window().show_input_panel(message, "", self.on_done, None, None)

def on_done(self, password):
    self.view.run_command("encode", {password": password})
    self.view.settings().set('ENCODED', True)
    self.view.run_command('save')
    self.view.settings().set('ENCODED', False)

但这很麻烦,如果用户取消加密,那么明文文件就会被保存,这并不理想。有什么想法吗?

编辑:我想我可以通过覆盖默认的save 命令来干净利落地做到这一点。我希望通过使用on_text_commandon_window_command 触发器来做到这一点,但似乎save 命令不会触发其中任何一个(也许它是一个应用程序命令?但没有on_application_command)。有没有办法覆盖保存功能?

编辑:我最终只是覆盖了与 TextCommand 的默认键绑定,似乎没有问题。

【问题讨论】:

    标签: encryption sublimetext sublimetext3 sublime-text-plugin


    【解决方案1】:

    您需要创建一个新命令来覆盖现有的保存行为以执行您想要的操作。如您所见,show_input_panel 命令是异步的。因此,该命令在创建输入面板后“完成”。而不是使用on_pre_save,您可能想尝试创建TextCommand 来进行保存。同样,这样做的缺点是您必须覆盖现有的键绑定。我想您可以使用 ST3 中可用的命令侦听器,但我不知道您是否正在尝试创建与 ST2 兼容的插件。

    【讨论】:

    • 啊哈,我没有注意到 on_text_command 等方法,所以从文档中:“监听器可能返回一个(命令,参数)元组来重写命令”所以你认为我可以附上这个到save 命令,并返回一个执行加密的函数,然后最终调用默认的save 命令?这听起来很有希望,我会试试这个。
    • @EddieJessup 我相信 save 是一个窗口命令。我知道奇怪,但它只是保存了聚焦在窗口中的视图。所以你会想要on_window_command 监听器。很抱歉造成混乱。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多