Sublimetext3 提示用户输入密码并用升华文本隐藏输入

Sublimetext3 提示用户输入密码并用升华文本隐藏输入,sublimetext3,sublimetext2,sublimetext,sublime-text-plugin,Sublimetext3,Sublimetext2,Sublimetext,Sublime Text Plugin,我希望有一个提示,在Sublime Text 2/3插件中查询密码,并用***隐藏输入。这不起作用,甚至会崩溃升华文本: 导入升华插件,升华 class ExampleOneCommand(升华插件.WindowCommand): def运行(自): self.window.show_input_面板(“输入密码”,self.on_done,self.getpwd,无) def getpwd(自身,密码): stars=“*”*len(密码) self.window.show_input_面板(

我希望有一个提示,在Sublime Text 2/3插件中查询密码,并用
***
隐藏输入。这不起作用,甚至会崩溃升华文本:

导入升华插件,升华 class ExampleOneCommand(升华插件.WindowCommand): def运行(自): self.window.show_input_面板(“输入密码”,self.on_done,self.getpwd,无) def getpwd(自身,密码): stars=“*”*len(密码) self.window.show_input_面板(“输入密码”,星号,self.on_input,self.getpwd,无) def on_done(自我,密码): 通过 def on_输入(自身、密码): 通过
如何正确执行?

如上所述,当我调用您的命令时,它会导致插件主机崩溃,并出现
运行时错误
,达到
最大递归深度。发生这种情况的原因也许可以通过以下简单的例子得到最好的说明:

class ExampleTowCommand(升华插件.WindowCommand):
def运行(自):
self.window.show\u input\u面板(“示例”,“初始文本”,无,self.on\u更改,无)
def on_更改(自身、pwd):
打印('on_change(“%s”)“%pwd”)
如果调用该命令,然后在不与输入交互的情况下立即查看控制台,则会看到:

>>> window.run_command("example_two")
on_change("Initial Text")
因此,本质上,您的问题是,当输入面板打开时,它会将初始文本告知
on_change()
处理程序,而您的命令会立即再次打开输入面板,这会执行相同的操作,然后返回kaboom

为了避免这种情况的发生,你需要有一个适当的守卫来阻止这种情况的发生;例如:

class ExampleTreeCommand(升华插件.WindowCommand):
def运行(自):
self.initial=“”
self.window.show_input_面板(“示例”,“无”,无,self.on_更改,无)
def on_更改(自身、pwd):
如果self.initial!=pwd:
stars=“*”*透镜(pwd)
self.initial=pwd
self.window.show\u输入面板(“示例”,星形,无,self.on\u更改,无)
现在,只有当文本发生更改时,on_change()
处理程序才会重新打开输入处理程序

这样做的结果是,最终返回给您的文本是您编辑后的初始文本,因此当最后调用
on_done
时,由于此处的操作,它得到的文本将包含所有
*
字符

要绕过这一点,您需要检查
上的
中给出的
密码
,查看其中包含哪些字符不是
*
字符,以了解实际键入的内容,然后将其分开,以便在用户编辑文本时保留文本。类似地,如果密码长度发生更改,则需要丢弃由于有人从输入中删除了一个或多个字符而保存的字符。您还需要注意用户在面板内移动光标的情况(例如插入字符)

综上所述,实现所有这些功能的最简单示例如下所示,它使用
密码设置告诉输入面板,无论键入什么,都应该将其隐藏起来:

class ExampleFourCommand(升华插件.WindowCommand):
def运行(自):
panel=self.window.show\u input\u panel(“输入密码”,self.on\u完成,无,无)
panel.settings().set(“密码”,True)
def on_done(自我,密码):
升华消息对话框(“输入的密码:'%s'%Password”)
但我不确定升华文本2中是否支持此设置;当你在那里输入密码时,它被用在升华合并的密码输入中,所以可能是在那时添加的

如果需要Sublime Text 2支持,下一个最好的方法是插件和相关键绑定的组合(我认为应该在那里工作,但我没有副本可以测试):

\u password=“”
类示例FiveCommand(升华插件.WindowCommand):
def运行(自):
panel=self.window.show\u input\u panel(“输入密码”,self.on\u完成,无,无)
panel.settings().set(“密码输入”,True)
全局密码
_password=“”
def on_done(自我,密码):
升华消息对话框(“输入的密码:'%s'%”%u密码)
类PasswordInputCommand(升华插件.TextCommand):
def运行(自我、编辑、字符):
全局密码
_密码+=字符
self.view.run_命令(“插入”,{“字符”:“*”})
{“键”:[“”],“命令”:“密码输入”,“上下文”:[
{“key”:“setting.password_input”,“operator”:“equal”,“operator”:true},
],
},
在这里,当您输入字符时,密钥绑定执行自定义命令,但仅当视图具有设置
password\u input
并将其设置为true时。相关命令以字符串形式跟踪实际密码,打开输入面板应用该设置。结果是,只要面板处于打开状态并且您正在输入,自定义命令就会获取并保留文本

对于一个更完整的示例,您还需要绑定backspace键,以防用户想要进行更正。您还可以使用视图中的选择来确定按下的字符在现有密码中的位置


总的来说,
password
设置是最干净的解决方案。

如上所述,当我调用您的命令时,它会导致插件主机崩溃,导致
运行时错误
达到
最大递归深度
。发生这种情况的原因也许可以通过以下简单的例子得到最好的说明:

class ExampleTowCommand(升华插件.WindowCommand):
def运行(自):
self.window.show\u input\u面板(“示例”,“初始”
    { "keys": ["<character>"], "command": "password_input", "context": [
        { "key": "setting.password_input", "operator": "equal", "operand": true },
    ],
    },