跳转到正文
Zjl37's logo 动量星空

基于 rofi 的本地表情管理指北

/ 8分钟

目录

500 张表情包上限不够用了,怎么办?答案是本地表情。将表情包存在本地,并研发一种方式快速地筛选并输入到聊天软件中。

表情储备

要使得以下的操作的作用与意义突显出来,首先你得有足够数量的表情包并以文件形式保存在本地。我的本地表情文件夹大致有如下结构:

../emo
├── 草-lons.png
├── 很内向-在工位都不敢工作-cauj.jpg
├── 猫听了都摇头-mdrquw.gif
├── 你的精神问题主要是这个导致的-pfao.jpg
├── ……
├── 展就完了-cgwr.jpg
├── capoo
├── Chiikawa
├── chillet
├── correct-extension.py
├── doro
├── ……
└── geopelia

分不分子文件夹随意,重要的是文件名,因为我们稍后会用文件名去索引。花一些时间给每一张图片命名,格式为:显示名称+输入码。如果图片取名为全英文,就不再加输入码;否则,图片取名一般含有中文。用你喜欢的输入方案给名称(或其中关键的短语)编码——这时候考验你的输入方案的离散性能的时候到了。

在收藏了新表情后,也别忘了顺手为之命名。

用文件名做索引而不引入更复杂的元信息,我觉得在此情景下足矣。

表情筛选与输入

法1:使用聊天软件的插件(不推荐)

这样的插件工具是存在的。请感兴趣的读者自行上网了解。

法2:使用剪贴板+外部工具

通过剪贴板贴图,这种方法应该算是最没有风险,最不容易失效,适用范围最广的。

这时,我们需要的工具其实就描述为:能展示指定文件夹下所有图片,允许通过输入框筛选文件名,选中后复制到剪贴板。

my-rofi-select-img.sh 效果展示

用过 window manager 的同学大概也都会用过 dmenu 类工具,它一般用作开始菜单来启动应用程序,边键入边筛选,以快速找到目标选项;也可以用来选择 emoji、窗口等其他东西。重要的是这类工具通过标准输入接受选项列表,通过标准输出返回选中项,实现了 Unix 哲学意义下、很多命令行工具都具有的与其他程序的可组合性。

那么有 dmenu 类似物能展示图片吗?答案是肯定的,一些 dmenu 类工具会称之为「图标」,因为它们本来的用途是用来启动应用程序的;唯需在输入中遵循特定的控制字符格式。我最终选用 rofi-wayland,并在大模型的帮助下写出如下脚本:

my-rofi-select-img.sh
#!/bin/sh
# 选择指定目录下的图片并复制到剪贴板
# Author: Zjl37
# Date: 2025-01-31
# 用第一个参数指定搜索目录,否则默认用当前目录
DIR="${1:-.}"
generate_menu() {
# 用 `-print0` 结合 read 处理防文件名有空格或特殊字符
find "$DIR" -type f \
\( -name '*.png' \
-o -name '*.jpg' \
-o -name '*.jpeg' \
-o -name '*.gif' \
-o -name '*.webp' \) -print0 | \
while IFS= read -r -d '' img; do
# 参考:
# https://github.com/davatorium/rofi/blob/next/doc/rofi-script.5.markdown#parsing-row-options
echo -en "$img\0display\x1f$(basename "$img")\x1ficon\x1f$img\n"
done
}
# 用 rofi 展示选择菜单
SELECTED=$(generate_menu | rofi -dmenu -show-icons \
-config ~/.config/rofi/select-img.config.rasi)
# 没有选择时退出
[ -z "$SELECTED" ] && exit
wl-copy -t text/uri-list "file://$(realpath -s "$SELECTED")"

为了更适合图片展示,仅为此工具改一下 rofi 主题:

~/.config/rofi/select-img.config.rasi
@theme "paper-float"
element {
orientation: vertical;
}
element-icon {
size: 6em;
}
listview {
columns: 4;
lines: 2;
fixed-columns: true;
}

配置一下你的桌面环境或窗口管理/合成器,将这个脚本绑定到顺手的组合键或键序列上,就可以用了。显示效果如前面图片所展示。

在 rofi 中选择图片后,再在聊天软件中按下 Ctrl+V 粘贴,整个流程一般只需 4~8 次击键。

结语

有了本地表情后,就可以将表情收藏数量受限的聊天软件中的表情收藏当做本地表情的缓存,只保留常用好用的了,(CSAPP 说的好,小储存设备当大储存设备的缓存,不是吗?)方便没有以上桌面环境的(移动)设备上使用。

当然,这套方案还是有局限性。不是所有表情都很容易命名,有些微妙者甚至很难找到简短而贴切的描述文字。这时总是很纠结,或许只能分配一个「无理码」给它。也经常有想要用的表情想不起来名称的情况。确实需要多加熟悉,才能让你的表情收藏库真正成为你得心应手的「语言」。

另外,这套流程很大程度上还是手动的。或许可以运用更多科技,在表情搜集、分类、命名、语义化索引、模糊查找等方面实现更多的自动化。