Sublimetext2 触发每个字母数字按键的操作

Sublimetext2 触发每个字母数字按键的操作,sublimetext2,sublimetext,sublime-text-plugin,Sublimetext2,Sublimetext,Sublime Text Plugin,在插件的默认值(Windows)中,我有以下几行代码。sublime keymap文件: ... { "keys": ["ctrl+shift+a"], "command": "table_editor_align", "context": [ { "key": "setting.enable_table_editor", "operator": "equal", "operand": true, "match_all": true }, { "key":

在插件的
默认值(Windows)中,我有以下几行代码。sublime keymap
文件:

...
{ "keys": ["ctrl+shift+a"], "command": "table_editor_align", "context":
    [
        { "key": "setting.enable_table_editor", "operator": "equal", "operand": true, "match_all": true },
        { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*\\|", "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "$", "match_all": true }
    ]
},
...
我不想只在ctrl+shift+a时触发此命令,而是希望在每次字母数字键按下后触发此命令(a-Z、a-Z、0-9,为什么不加重音、a、ç等,即我们在书写时使用的所有字符)

似乎不起作用

注意:这个插件目前是的一个子类,我认为保持它是必须的。我试图修改的插件是,我希望自动重新对齐是在每次按键后自动进行的,而不是在每次按下CTRL+SHIFT+A后进行的,如下所示:


据我所知,无法将一个密钥同时绑定到一大类密钥,因此为了完成您想要的操作,您必须为每个密钥一次创建一个单独的映射,这相当麻烦,而且很可能不是一个好主意


[编辑] 实际上有一种方法可以做到这一点;我在回答的末尾添加了更多信息 [/编辑]


通过一些简单的测试,您感兴趣的键(输入文本)似乎直接由Sublime core处理,除非您为它们提供映射。也就是说,它们颠覆了正常的命令机制,这意味着您不能只捕获插入和重新格式化文本的时间

一种方法是,正如MattDMO所建议的,在修改的处理程序上使用
跟踪何时修改缓冲区,然后以这种方式触发重新对齐

可以执行类似操作的示例插件如下所示:

导入升华
导入升华插件
进口稀土
类TableFormatEventListener(升华插件.EventListener):
定义初始化(自):
self.\u views=dict()
self.regex=re.compile(r“\s*\\\”)
def on_已修改(自身、视图):
#仅适用于启用了表编辑但尚未启用的视图
#修改
if(view.settings().get(“启用表格编辑器”,False)和
self.\u views.get(view.id(),False)为False):
对于视图中的s.sel():
line=view.substr(view.line(s.begin()))
如果s.begin()>0,则previor=view.substr(s.begin()-1)
#仅当所有游标都位于表行内且
#光标前面的字符不是空格
如果self.regex.match(行)为None或previor==“”:
返回
#执行重新排列
self.\u视图[view.id()]=True
查看。运行命令(“表格编辑器\u对齐”)
self._视图[view.id()]=False
def on_text_命令(self、view、cmd、args):
#撤消时不要触发重新格式化
如果cmd==“撤消”:
self.\u视图[view.id()]=True
def on_post_text_命令(self、view、cmd、args):
#撤销完成;恢复重新格式化处理
如果cmd==“撤消”:
self._视图[view.id()]=False
这实现了一个事件监听器,每次修改视图时都会触发该监听器。这意味着文本被添加了或删除了,还包括了粘贴等内容(字面上是指修改缓冲区的任何内容;稍后会有更多内容)

该插件执行与键绑定相同的上下文检查,以确保所有可用的插入符号当前都位于表行内,就好像调用命令重新对齐表一样,否则会抛出错误

此外,还将检查最后添加的字符是否为空格。这是因为重新格式化似乎删除了尾随空格,这实际上阻止了您在表中的任何位置输入空格

假设所有游标都在表行中,并且不只是插入空格,则在当前视图上执行重新对齐表的命令

这里需要注意的是,重新调整表会导致修改缓冲区的内容,然后再次触发插件侦听器,插件侦听器在循环中一次又一次地重新调整表,直到插件主机崩溃

为了防止这种情况发生,我们跟踪应该忽略其
on_modified
事件的视图,在修改表之前将当前视图添加到列表中,然后在完成后将其删除

插件的一个副作用是,您在表内所做的任何更改都会导致两个修改;您所做的更改,以及重新调整表的更改(即使它没有更改)。这意味着,为了撤消表中的更改,有时必须按undo的次数超出您的想象

这会导致潜在的问题。例如,如果要在表格行的开头退格,则该行和上一行将位于同一行。该修改调用了重新对齐函数,该函数正式地将两行合并为一行

现在你有点为难了,因为你无法撤消更改;当您按一次undo键时,它会撤消重新对齐,但这样做会修改缓冲区,从而触发重新对齐立即再次发生

为了解决这个问题,事件侦听器还侦听
undo
命令即将执行的时间,并确保在执行undo时,修改处理程序不会重新对齐表

由于我没有使用这个特定的插件,其他场景可能会有类似的边缘情况需要以这种方式处理

性能可能会受到影响,也可能不会受到影响,这取决于您正在编辑的表的大小。在我的(极其简单的)测试中,在我的机器上,对小表的性能影响可以忽略不计。您的里程数可能会有所不同,因此在代码中进行额外检查可能是一个好主意,如果当前文件超过某一行,则可以阻止其触发
"keys": ["[a-zA-Z0-9_]"]