Espanso 是一个花哨玩意儿,我尝试了数次研究出来一些有趣的玩法,记录一下。
Windows 下执行 shell 脚本
shell 脚本在 win 下默认走的是 Powershell,而且不支持配置成 git bash。
但并非不能——espanso 自己不用 git bash,那我自己用。
对官网的 curl 示例:
| - trigger: ";ip" replace: "{{output}}" vars: - name: output type: shell params: cmd: "curl 'https://api.ipify.org'"
|
对应的改为:
| - trigger: ";ip" replace: "{{output}}" vars: - name: output type: script params: args: - C:\Program Files\Git\usr\bin\bash.exe - -c - | printf 'my ip: ' curl -s 'https://api.ipify.org'
|
屏蔽变量的内容(只执行命令,不返回它的结果)
espanso 的变量是 lazy 的——不被引用就不执行。有时候我们想要执行一个命令,但不想要它的标准输出流被拷出来,这就很麻烦。
但变量之间是可以互相依赖的,一般来说 espanso 会根据实际的依赖关系建立依赖树去按顺序执行变量,但是可以使用depends_on去主动指明依赖,即使没有使用它。
| - trigger: ';some-test' replace: '{{var2}}' vars: - name: var1_hide type: script params: args: - python - D:\some\script.py - name: var2 depends_on: - var1_hide type: echo params: echo: hello
|
关于退格键
espanso 执行命令后,会使用剪切板或模拟输入去将命令的结果输出出来。不想要输出?使用上面的方法,然后变量的值设为空即可。
而在这个步骤之前,espanso 会模拟输入一定数量的退格键,先删除输入的命令的内容……这就出问题了。比如我用 espanso 当软件快捷键用,这时候的一系列退格键可能会造成非预期的问题。
我想到的最合适的方法就是直接使用 espanso 的 search bar 去搜索和执行命令,使用这个方法似乎是不会输入退格键的……再不然就是让在 espanso 输入退格键时保证应用窗口是失焦的,不知道有啥方法更优雅地做这个。
仔细看看 Espanso,我们能发现什么?
Alt+Space 唤起一个 Search Bar,能匹配和选择命令去执行
- 原生提供 Form,提供输入栏和选择框(下拉式或列表式),其中输入栏可以给定默认值,选择框可以使用脚本给定所有选项
- Form 可以和 Script 协同使用,Form 的值可以喂给 Script,反之亦然
- Script 的执行结果可以贴到当前输入框中
这就造成了一种非常轻量的类似 utools 的工具——我调用命令,我通过表单填写参数,我通过当前输入框获取命令的执行结果,但最重要的是,定义 Espanso 的一个新命令是非常容易的,不像 utools 或类似的工具,插件上来就是什么生命周期,还可能要写前端,麻烦不死你。
简单实现一个 base64 和文本互转的命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| - trigger: ';b64' replace: '{{result}}' vars: - name: form type: form params: layout: | 文本和Base64互相转换,只填一个 文本转 base64: [[original_text]] base64 转文本: [[encoded_text]] - name: result type: script params: args: - python - -c - | import sys import base64 def text_to_base64(text, encoding='utf-8'): """文本转 Base64""" text_bytes = text.encode(encoding) base64_bytes = base64.b64encode(text_bytes) return base64_bytes.decode('ascii') def base64_to_text(base64_string, encoding='utf-8'): """Base64 转文本""" try: base64_bytes = base64_string.encode('ascii') text_bytes = base64.b64decode(base64_bytes) return text_bytes.decode(encoding) except Exception as e: return f"Base64 解码失败: {e}" if sys.argv[1]: # 文本转 base64 print(text_to_base64(sys.argv[1])) elif sys.argv[2]: print(base64_to_text(sys.argv[2])) else: pass # 毛都没输入,就什么也不输出 - '{{form.original_text}}' - '{{form.encoded_text}}'
|