当你在Talon中发出命令时,有时你需要将你所说的一些内容转化为计算机可以理解的内容。有几种方法可以实现这一点,但很容易做错。
实现这一点的简单方法是发出一堆小命令。例如,假设我正在尝试实现一个命令来插入我的博客的对话片段。天真的方法是做这样的事情:
blog conversation mara hacker [<user.text> [over]]: insert('<XeblogConv name="Mara" mood="hacker">') insert("\n") insert(text or "") insert("\n") insert("</XeblogConv>")
blog conversation mara happy [<user.text> [over]]: insert('<XeblogConv name="Mara" mood="happy">') insert("\n") insert(text or "") insert("\n") insert("</XeblogConv>")
# etc...
这可行,但我必须实现一堆不同的几乎相同的片段。这很容易详尽地涵盖所有可能的名称和情绪组合。但从可维护性的角度来看,这非常不理想。如果我想更改代码片段的格式或添加其他特征,我可能必须在 27 个位置进行更改。
不过,我可以在这里使用其他几个选项。它们是自定义捕获和列表。它们都是解决这个问题的有效方法,但我认为列表是我在实现中要做的方法。
自定义捕获
我们再看一下Talon命令的语法。从高层次来看,命令是一个口头短语,其中包含从中捕获的元素。例如,如果您想编写一个可以输入一些文本的命令,您可以这样做:
insert <user.text> [over]: insert(text)
该命令将接受您在插入一词后所说的任何内容并将其键入。尖括号内的user.text
是捕获的变量。它被放入 talon 代码中名为 text 的变量中。该命令还可以选择让您用“over”一词终止文本字符串。这可以让您将多个命令堆叠到同一个话语中。例如,考虑这样的命令:
slog 调试意外的文件系统错误 向左逗号双引号第二个 向左错误 向右逗号错误
该命令将输出以下内容:
slog . Debug ( "unexpected filesystem error" , "err" , err )
一旦你真正学会了如何堆叠这样的命令,你就真正理解了像 Talon 这样的东西的流程模型。它可以让你在做事情的时候拥有很大的力量。但是,真正重要的部分是当您声明在这些可消除终止符的上下文中使用的自定义捕获时。
让我们看一下自定义捕获的语法:
@mod . capture ( rule = "(pointer | raised)" ) def go_pointer ( m : str ) - > str : return "*" if "pointer" or "raised" in m else ""
捕获只是一个接受字符串并返回一些数据的 Python 函数。 @mod.capture
装饰器告诉 Talon 这是一个捕获。 rule
参数定义此捕获将满足的模式。例如,如果此捕获与字符串"pointer"
和"raised"
匹配,则返回"*"
。这允许您定义自己的自定义逻辑来从语音中捕获值。
对于许多情况,这将非常有效。有时您需要比任意 Python 代码更简单的东西。有时,您只是列出了要说的话与计算机应该理解的内容的列表。例如谈话情绪和博客人物的巨大列表。为此,我们可以使用列表。
列表
列表是一种不同类型的捕获,允许您将口头形式转换为机器形式。它们的定义与自定义捕获不同,因为它们要简单得多。这是一个示例列表:
from talon import Context , Module , actions
mod = Module ( ) mod . list ( "xesite_blog_character" , desc = "Characters for xesite blog conversations" )
ctx = Context ( ) ctx . matches = r""" app: vscode """ ctx . lists [ "user.xesite_blog_character" ] = { "owie" : "Aoi" , "mara" : "Mara" , "katie" : "Cadey" , "numa" : "Numa" , "mini" : "Mimi" , "scoots" : "Scoots" , }
因此,当我说“owie”时,列表会将其解释为 Aoi。列表也有自己的捕获格式:
blog conversation {user.xesite_blog_character} {user.xesite_blog_mood} [<user.text> [over]]: insert('<XeblogConv name="{user.xesite_blog_character}" mood="{user.xesite_blog_mood}">') insert("\n") insert(text or "") insert("\n") insert("</XeblogConv>")
这会让我说类似“博客对话 owie grin 这是一些文本”之类的内容,它会插入以下内容:
这是一些文字。
但是,我们可以更进一步。现在,您需要在 Python 代码中定义列表。这确实有效。但为了改变某些东西而修改 Python 代码有点麻烦。鉴于列表是 Talon 中的首要概念,有一种方法可以更原生地表达它们:使用.talon-list
文件。 .talon-list
文件中的字符列表如下所示:
list: user.xesite_blog_character app: vscode - owie: Aoi mara: Mara katie: Cadey numa: Numa mini: Mimi scoots: Scoots
对于不懂 Python 但仍需要使用 Talon 的人来说,这更容易阅读、理解和修改。
您需要进入 Patreon Beta 才能使用.talon-list
文件。如果您没有使用 Patreon Beta,您可以使用 Python 代码版本。它们在功能上是相同的。
如果你更认真地使用 Talon,无论如何你都应该加入 Patreon Beta。公共版本已经有一段时间没有更新了,并且缺少很多在测试版中添加的功能。另外,它有助于确保 Talon 开发人员能够……嗯……吃饭。天下没有免费的午餐。
结论
Talon 真的很酷,不幸的是,很多真正酷的部分都没有被记录下来,我在这里只是触及了表面,但这记录了我在更深入地研究 Talon 时所发现的内容。我希望这对某人有用。
如果您想查看我为我的博客角色创建的 Talon 绑定,您可以查看我的Xe/invocations
repo 。我仍在研究它们,但对于任何想做类似事情的人来说,它们是一个很好的起点。