Espanso 的一些用例

Espanso 是一个花哨玩意儿,我尝试了数次研究出来一些有趣的玩法,记录一下。

Windows 下执行 shell 脚本

shell 脚本在 win 下默认走的是 Powershell,而且不支持配置成 git bash。

但并非不能——espanso 自己不用 git bash,那我自己用。

对官网的 curl 示例:

1
2
3
4
5
6
7
- trigger: ";ip"
replace: "{{output}}"
vars:
- name: output
type: shell
params:
cmd: "curl 'https://api.ipify.org'"

对应的改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
- 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 才能执行……不然会报莫名其妙的错
curl -s 'https://api.ipify.org'

屏蔽变量的内容(只执行命令,不返回它的结果)

espanso 的变量是 lazy 的——不被引用就不执行。有时候我们想要执行一个命令,但不想要它的标准输出流被拷出来,这就很麻烦。

但变量之间是可以互相依赖的,一般来说 espanso 会根据实际的依赖关系建立依赖树去按顺序执行变量,但是可以使用depends_on去主动指明依赖,即使没有使用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 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 当作 utools 用

仔细看看 Espanso,我们能发现什么?

  1. Alt+Space 唤起一个 Search Bar,能匹配和选择命令去执行
  2. 原生提供 Form,提供输入栏和选择框(下拉式或列表式),其中输入栏可以给定默认值,选择框可以使用脚本给定所有选项
  3. Form 可以和 Script 协同使用,Form 的值可以喂给 Script,反之亦然
  4. 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}}'

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 协议 ,转载请注明出处!