首页
游戏
影视
直播
广播
听书
音乐
图片
更多
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
Search
1
在IC617中进行xa+vcs数模混仿
81 阅读
2
科普:Memory Compiler生成的Register file和SRAM有何区别?
73 阅读
3
virtuoso和empyrean alps模拟仿真和混仿教程
73 阅读
4
后仿中$setup,$hold与$setuphold
44 阅读
5
文档内容搜索哪家强? 15款文件搜索软件横向评测
35 阅读
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
登录
Search
标签搜索
python
Docker
vscode
linux
systemverilog
vcs
STM32
PyQT
EDA
FPGA
gvim
cadence
Alist
xilinx
UVM
uos
macos
package
MCU
risc-v
bennyhe
累计撰写
378
篇文章
累计收到
31
条评论
首页
栏目
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
页面
游戏
影视
直播
广播
听书
音乐
图片
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
搜索到
42
篇与
的结果
2025-12-30
BookStack:一款功能强大的免费知识库管理平
在这个信息爆炸的时代,你是否经常感到无所适从?团队文档杂乱无章,个人笔记四处散落,重要信息总是找不到...如果这些问题困扰着你,那么 BookStack 可能就是你一直在寻找的解决方案。🌟 BookStack:不只是另一个文档系统BookStack 是一个开源的知识管理平台,它将文档组织得像一本书一样直观。想象一下,如果维基百科和你最爱的笔记 App 有个孩子,那大概就是 BookStack 了。基于 PHP 和 Laravel 构建,BookStack 不仅功能强大,还特别注重用户体验。无论你是技术大牛还是普通用户,都能轻松驾驭。💡 为什么选择 BookStack?结构清晰:采用"书籍 > 章节 > 页面"的层级结构,让内容组织一目了然。编辑灵活:支持所见即所得和 Markdown 编辑器,满足不同偏好。权限管理:细粒度的权限控制,完美适配团队协作需求。搜索强大:全文搜索功能,让你瞬间找到需要的信息。多语言支持:包括中文在内的多种语言界面,无障碍使用。导出方便:可以导出html、markdown、txt和pdf格式。开源免费:企业级功能,零成本使用。🛠 用 Docker 搭建 BookStackBookStack 的部署非常简单,特别是使用 Docker 的话。下面我们详细解释如何通过 Docker 部署 BookStack,并对每个参数进行说明。方法一:Docker 命令行部署docker run -d \ --name=bookstack \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Asia/Shanghai \ -e APP_URL=http://your-domain.com \ -e APP_KEY=base64:C4MCxJYaoUMj6Rpn2cMmHyycBlU0hizsoDEbOO7w2LQ= -e DB_HOST=bookstack_db \ -e DB_USER=bookstack \ -e DB_PASS=your_password \ -e DB_DATABASE=bookstack \ -p 6875:80 \ -v /path/to/data:/config \ --restart unless-stopped \ lscr.io/linuxserver/bookstack:latest参数解释:--name=bookstack:为容器指定一个名称,方便管理。-e PUID=1000 和 -e PGID=1000:设置用户和组 ID,确保容器内外的权限一致。-e APP_URL=http://your-domain.com:设置 BookStack 的访问 URL,请替换为你的实际域名。-e APP_KEY=base64:C4MCxJYaoUMj6Rpn2cMmHyycBlU0hizsoDEbOO7w2LQ=:设置 BookStack 会话加密密钥,使用ocker run -it --rm --entrypoint /bin/bash linuxserver/bookstack:latest appkey可以生成一个。TZ=Asia/Shanghai:指定时区,中国的就用这个即可。-e DB_HOST=bookstack_db:数据库主机名,如果使用外部数据库,请相应修改。-e DB_USERNAME=bookstack:数据库用户名。-e DB_PASSWORD=your_password:数据库密码,请使用强密码替换。-e DB_DATABASE=bookstack:数据库名称。-p 6875:80:端口映射,将容器的 80 端口映射到主机的 6875 端口。-v /path/to/data:/config:数据卷挂载,确保数据持久化,请替换为你的实际路径。--restart unless-stopped:容器自动重启策略。方法二:Docker Compose 部署创建一个 docker-compose.yml 文件,内容如下:version: "2"services: bookstack:image: lscr.io/linuxserver/bookstack:latest container_name: bookstack environment: - PUID=501 - PGID=20 - TZ=Asia/Shanghai - APP_URL=http://localhost:6875 - APP_KEY=base64:C4MCxJYaoUMj6Rpn2cMmHyycBlU0hizsoDEbOO7w2LQ= - DB_HOST=172.17.0.1 - DB_PORT=3306 - DB_USERNAME=root - DB_PASSWORD=123456 - DB_DATABASE=bookstack volumes: - /path/to/data:/config ports: - 6875:80 restart: unless-stopped depends_on: - bookstack_dbbookstack_db:image: lscr.io/linuxserver/mariadb:latest container_name: bookstack_db environment: - PUID=1000 - PGID=1000 - MYSQL_ROOT_PASSWORD=your_root_password - TZ=Europe/London - MYSQL_DATABASE=bookstack - MYSQL_USER=bookstack - MYSQL_PASSWORD=your_password volumes: - /path/to/database:/config restart: unless-stopped这个 docker-compose.yml 文件定义了两个服务:bookstack 和 bookstack_db。参数含义与单独运行 Docker 命令时相同,但这里我们同时部署了一个 MariaDB 数据库容器。运行以下命令启动服务:docker-compose up -d这个命令会在后台启动 BookStack 和其数据库,并自动开始初始化数据表。🚀 BookStack 使用指南成功部署后,访问 http://your-domain.com:6875(替换为你的实际域名和端口)就可以开始使用 BookStack 了,使用默认的账号admin@admin.com和密码password登录。以下是一些基本使用步骤:设置中文点击右上角的头像,找到"My Account > Profile Details",然后在Preferred Language中选择中文即可。创建你的第一本"书":点击"图书 > 立即创建",给你的第一本书起个名字。组织内容:按照"书籍 > 章节 > 页面"的结构组织你的内容。编写和格式化:使用所见即所得编辑器或 Markdown 编辑器创建内容。协作与分享:邀请团队成员,设置权限,开始协作。搜索和标签:使用强大的搜索功能和标签系统快速找到信息。📝 进阶技巧使用模板:为常用文档类型创建模板,提高效率。版本控制:利用 BookStack 的版本历史功能,轻松回溯修改。API 集成:使用 BookStack 的 API 将其与其他工具集成。🌈 结语BookStack 不仅仅是一个文档系统,它是一个全方位的知识管理解决方案。通过 Docker 的简单部署,你可以快速搭建起自己的知识库,让团队协作更加顺畅,个人学习更加高效。现在,你已经了解了如何部署和使用 BookStack。为什么不立即动手,创建你的第一本"书"呢?相信我,当你开始使用 BookStack,你会惊讶于自己生产力的提升。
2025年12月30日
5 阅读
0 评论
0 点赞
2025-12-30
一招解决MAC软件残留图标
你是否曾经在卸载MAC软件后,发现图标仍然在桌面或者启动台中残留,无法删除?这可能会让人感到困扰和烦恼。今天,我们将为你提供几种有效的方法,帮助你轻松删除这些残留图标,让你的MAC桌面回归整洁。方法一:重新启动「访达」1、在菜单栏中,点击「前往」选项;2、按住「Option」键,点击「库」;3、进入Library文件夹后,找到并打开「Preferences」文件夹;4、在Preferences文件夹中,找到并删除以下文件(如果存在):com.apple.finder.plistcom.apple.sidebarlists.plist注:这两个与「访达」应用程序相关的属性列表(plist)文件。它们存储了与Finder应用程序的偏好设置和侧边栏列表相关的信息。在删除这些文件之前,建议先备份它们,以防万一你需要恢复之前的设置。5、重新启动「访达」,可以按住快捷键「command- option-esc」强制退出。方法二:使用终端命令打开「终端」,可以按住「command+空格」搜索终端,快速打开。在终端中输入「killall Dock」命令解决残留图标问题。方法三:手动删除残留文件1、在菜单栏中,点击「前往」选项。2、按住「option」键,点击「资源库」。3、进入「资源库」文件夹后,找到并打开「Application Support」(应用支持)文件夹。4、在Application Support文件夹中,查找与残留软件相关的文件夹或文件,并将其删除。Caches(缓存)Preferences(偏好设置)Saved Application State(保存的应用状态)5、重复步骤3和4,查找并删除以下文件夹或文件(如果存在):6、 在「访达」中,按住「Option」键,点击「前往」选项。7.、进入「资源库」文件夹,重复步骤3到5,查找并删除相关残留文件夹或文件。8、 最后,重新启动电脑。需要注意的是,在进行任何更改之前,建议先备份重要文件和设置。
2025年12月30日
3 阅读
0 评论
0 点赞
2025-12-30
解决dpkg/apt-get error : 子进程 post-installation script 返回了错误号 1
1 问题发现前段时间安装screen的时候, 直接Ctrl+C终止了, 导致后来安装软件都报错, 错误信息如下有 1 个软件包没有被完全安装或卸载解压缩后会消耗掉 0B 的额外空间您希望继续执行吗?[Y/n] y......dpkg: error processing screen (--configure): 子进程 已安装 post-installation 脚本 返回了错误号 1在处理时有错误发生: screen一键获取完整项目代码2 问题解析一般来说是由于我们在安装的过程中突然中止, 所以导致的环境变量异常, 软件已经可能安装了, 但是系统的信息却没有更新软件的状态信息有误, 状态信息在/var/lib/dpkg/status查看软件的配置信息不全, 位于/var/lib/dpkg/info/.*3 问题解决在解决问题之前, 请先删除出问题的软件包, 等待问题解决后, 再重新安装3.1 方法1 清除状态信息对于dpkg安装的软件包, 我们可以从/var/lib/dpkg/status查看到其安装状态如果希望查看screen的安装状态, 可以使用如下命令查看其在哪一行sudo cat -n /var/lib/dpkg/status | grep "Package: screen" # 查看在某一行一键获取完整项目代码查看到位于第31103行, 然后查看此处的信息sudo cat /var/lib/dpkg/status | tail -n +31103 | head -n 28一键获取完整项目代码由于我们的往问题已经解决, 可以看到我们的状态时安装成功的, 否则的话, 修改文件的内容将状态的信息删除sudo vim /var/lib/dpkg/status一键获取完整项目代码找到Package: ,比如Package: screen删除这部分的描述, 删到下个Package: XXX前就好. 存档后, 再进行操作就OK了。3.2 方法2 清除info文件如果安装成功的软件, info目录下会存储着其安装和配置的脚本信息, 用于在安装和卸载的过程中触发执行, 我们可以检查主要检查文件是否有缺失, 如果有缺失, 那么就删除他们, 然后重装该软件即可sudo rm /var/lib/dpkg/info/.*一键获取完整项目代码比如sudo rm /var/lib/dpkg/info/scerrn.*, 存档后,再进行重新安装就OK了3.3 方法3 重新生成info列表一般来说, 前面两种方法之一即可解决该问题, 如果还是没觉得, 可以重建info列表首先将info文件夹更名备份sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old一键获取完整项目代码cpp1再新建一个新的info文件夹sudo mkdir /var/lib/dpkg/info一键获取完整项目代码更新缓存信息sudo apt-get update, apt-get -f install一键获取完整项目代码恢复info文件夹的内容, 执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old一键获取完整项目代码把自己新建的info文件夹删掉sudo rm -rf /var/lib/dpkg/info一键获取完整项目代码把以前的info文件夹重新改回名字sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info————————————————版权声明:本文为CSDN博主「CHENG Jian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/gatieme/article/details/52839814
2025年12月30日
2 阅读
0 评论
0 点赞
2025-12-08
windows 知识汇总
右键菜单添加使用gvim打开方式①打开注册表编辑器,开始-->运行-->regedit②定位到:HKEY_CLASSSES_ROOT---> * --->Shell,在Shell 上右击,新建---> 项,输入: Open With gvim(使用vim打开)③在 Open With gvim 右键--->新建--->字符串值,数值名称设置为:Icon,数值数据设置为:C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe,0数值名称:Icon数值数据:C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe,0④在刚才新建的项:Open With gvim 下面添加一个新项:Command修改 Commnad 项右边窗口的数值数据为:C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe %1C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe %1上面的设置会带来一个小问题:当文件名的最后一个字符为空格时,使用GVIM打开某个文件时会新建一个空白的文件,而不是直接打开该文件。解决方法:加引号,如下:C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe "%1"效果如下:本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/,如需转载请自行联系原作者
2025年12月08日
6 阅读
0 评论
0 点赞
2025-10-26
跨平台且开源的文本扩展器:Espanso
不论是在手机还是电脑上,我们在与人交流的过程中常常会形成或用到一些重复性的表述,这些表述的内容长度可多可少,但由于它们被用到频率十分之高,所以我们通常会更喜欢用类似于缩写的方式来代替我们一字一句输入的过程,例如说「yyds」(永远滴神)、「dddd」(懂的都懂)、「nbnhhsh」(能不能好好说话)等。这些缩写或缩略语通常也可以被看作是用户自定义词典,我们不仅可以在操作设备上自定义,也可以在输入法上自定义。不过它们也仅限于定义一些纯文字性质的内容且长度有限,同时这些自定义设置可能会和特定的操作系统相绑定又或是无法完全导出,迁移成本存在过高的情况。但有这么一类应用和自定义词典类似,它们为了用户自定义输入的缩写内容而生,不仅能定义纯文字性质的内容,还具备较强的扩展性,也被称为是文本扩展器(Text Expander)。文本扩展器的作用表现和我们在使用自定义词典时的方式别无二致,都是输入一个特定的表达式,然后就会被替换成我们事先定义好的内容,比如:---------------------------------> [input] #42 ---------------------------------- [output] 意大利面拌 42 号混凝土 <---------------------------------当我们在文本扩展器中事先设置完整内容之后,只要输入 #42 后就会转换成「意大利面拌 42 号混凝土」完整的句子。知名的文本扩展器有 TextExpander,不过它属于付费应用也不是我们此次讨论的主角;而本文我们所介绍的则是另外一款免费、开源、跨平台且基于 Rust 语言编写的文本扩展器——Espanso,它不仅简单易用、体积小巧,且可配置性强,用户不但可以基于命令行配置扩展内容,而且还可以安装来自于社区的第三方扩展包。快速上手因为 Espanso 是一个开箱即用的工具,其安装步骤简单到可以一笔带过:打开 Espanso 官网,点击推荐的系统版本,下载并安装。注:安装完成并启动 Espanso 时需要额外的操作授权,否则 Espanso 可能无法正确运行。当然我们主要是看看如何使用 Espanso。毕竟安装完毕后启动 Espanso 是不会直接显示什么华丽的界面,因为它本质可以算是一个名不见经传的后台程序,只不过以应用的方式活跃在系统后台。使用 Espanso 的方式十分简单,我们只需在任意一个可以输入内容的地方,像输入代码一样先按下英文冒号「:」,然后再输入剩下的指令就可以神奇地看到 Espanso 已经为我们补全了内容。其中由 : 开始的一系列内容称为触发器(Trigger),而补全后的内容也被称为是匹配项(Match)。比如我们现在输入 :date 的触发器指令那么 Espanso 直接会就帮我们将内容替换为表示当天日期的匹配项:就是这么简单!不过你可能会好奇,我是怎么知道 :date 匹配项的呢?我们也可以在状态栏中找到 Espanso 的图表并点击「Open Search Bar」选项或是按下 Option+空格(Windows 上是 Alt+空格)就可以弹出相应的列表与搜索界面:除此之外,因为我前面说了 Espanso 本质是一个后台程序,所以我们可以通过命令行来与之交互(可以在终端上通过 espanso --help 命令获取所有命令)。这里我们为了查看有哪些匹配项,可以直接使用 espanso match list 命令:espanso match list:espanso - Hi there!:date - {{ date }}可以看到 Espanso 并没有内置过多的匹配项,所以要想它能为我们更好地自动补全内容,就需要我们像自定义缩略语或短语一样事先进行人为配置。Espanso 的配置主要有两部分,我们可以通过 espanso path 命令来找到配置文件路径:espanso pathConfig: /Users/Bobot/Library/Preferences/espansoPackages: /Users/Bobot/Library/Preferences/espanso/match/packagesRuntime: /Users/Bobot/Library/Application Support/espanso上述结果中的 Config 部分即为 Espanso 在当前操作系统中的配置存放路径。当中主要包含了两部分配置:$CONFIG/ config/default.ymlmatch/base.yml其中:config 部分的配置主要是针对 Espanso 程序本身,包括自定义补全的触发符号(比如将前面的英文冒号 : 更改为其他符号)、是否只在特定应用内 Espanso 才会生效等等;match 部分的配置主要就是我们需要自定义补全的部分,也即 :date 这样的匹配项具体设置。默认情况下 Espanso 是对所有应用都生效,因此当我们在应用中输入时很有可能就会极易触发匹配项弄巧成拙,为了避免冲突我们需要在后续在 config 部分进行配置以进行过滤。不论是 Espanso 本身的配置还是自定义匹配项,Espanso 都采用了目前主流的 YAML 配置文件,我们可以直接通过系统自带的文本编辑器打开。但是由于 YAML 的格式有些特殊,对于语法格式有严格要求,所以建议你使用 VS Code 这类编程专用的编辑器并在当中安装对应的 YAML 插件来进行编辑、配置;除此之外,可能你还需要简单学习一下 YAML 语法 才能更好地自定义相关配置内容。现在就让我们来试着定义一组触发器与匹配项练习一番,这里我就使用 VS Code 来进行操作。首先通过前面的命令我们找到了 Espanso 的配置文件夹后点击并拖拽至 VS Code,然后我们可以在 match/base.yml 默认匹配项的基础上进行设置,也可以像我一样新建一个名为 custom.yml 的匹配项进行设置:接着在当中填入如下内容(注意:如果你是在默认的 base.yml 文件中进行设置,由于已经存在了 matches 键就不需要重复填写): # custom.yml matches: - trigger: ":tomorrow" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: 86400 - trigger: ":yesterday" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: -86400 当中的内容是由 YAML 语法构成的配置内容,其中每一组由「-」符号并紧接着 trigger 开始到下一个 trigger 前的一整块内容都表示定义一个匹配项,里面包括了触发器以及对应的替换内容等等,关于这部分配置我们在后续深入展开,现在暂时按下不表。检测到有文件修改或保存后 Espanso 会自动重新加载配置文件,之后当我们输入 :tomorrow 或 :yesterday 时,就会看到 Espanso 帮我们进行了自动补全:以上仅是对 Espanso 管中窥豹一番,虽然它用法简单,但如果我们想要最大程度地发挥它的作用,可能还有更多用法有待我们进一步探索,所以接下来就让我们再深入了解一下 Espanso 的相关细节。深入了解 EspansoEspanso 相关配置Espanso 的设置默认会作用到所有应用,但这通常可能会导致一些意想不到地冲突,所以我们最好需要对其进行调整。只在特定应用中生效Espanso 的默认配置为 config/default.yml 文件,但我们也可以针对不同应用在同一层级下添加不同的配置文件,比如 config/vscode.yml。之后我们可以在 vscode.yml 文件中添加过滤选项,即不让 Espanso 在使用 VS Code 时生效: # vscode.yml filter_class: "com.microsoft.VSCode" enable: false当我写入这短短地两行内容并保存之后,Espanso 就不会在我使用 VS Code 时生效从而避免了冲突。Espanso 提供了三种过滤应用的方式,包括上述示例即 filter_title、filter_exec 以及 filter_class,它们也分别对应了按当前活跃窗口的文本标题过滤、按应用的可执行路径过滤以及按当前活跃窗口的类名(编程概念)过滤。这三种方式默认使用正则表达式,倘若你不清楚具体的内容,那你就可以填写正则表达式:filter_exec: "Chrome$"enable: false当然你也可能会好奇我前面的例子是如何找到 VS Code 对应的类名 com.microsoft.VSCode?因为 Espanso 内置了一个探测指令可以一次性帮我们生成对应三种过滤方式的内容。在未屏蔽 Espanso 的情况下,我们可以像使用匹配项那样输入 #detect# 来进行触发,比如我在 macOS 的微信随便选择一个对话框,然后输入该指令即可弹出如下界面。之后我们只需要点击拷贝到剪切板再自行粘贴选择即可。建议你在配置时侧重选择除 filter_title 之外的另外两种方式,因为当前活跃窗口的标题文本内容变化幅度较大并不是很稳定。但除了像上述示例那样直接使用 enable: false 这样简单粗暴的屏蔽方式之外,Espanso 也提供了另外一种模式,让你可以自主选择在特定应用中只屏蔽(exclude)掉对应的匹配项。比如我现在排除掉我前面自定义的 custom.yml 文件:filter_class: "com.microsoft.VSCode"extra_excludes:"../match/custom.yml"默认情况下的路径为当前的 config 路径,而匹配项则是在与 config 同级的路径中,所以我们需要通过 ../match 的方式返回到同级目录然后再选择 match 目录。保存之后在 VS Code 中即便使用 :tomorrow 或 :yesterday 都不会得到相应的匹配项。如果要屏蔽的内容过多,你既可以使用 glob 模式来设置路径,也可以换一种思路,即只让某些匹配项——比如代码片段(Snippets)——在特定应用中生效,比如我现在有一个 match/pycode.yml 配置,当中准备了一些 Python 相关的代码片段,现在我只想这些片段只在 VS Code 中生效,那么此时就应该这样做:filter_class: "com.microsoft.VSCode"extra_includes:"../match/pycode.yml"修改 Espanso 默认设置尽管说 Espanso 有提供了基本的 UI 界面并驻留在状态栏中,但 Espanso 的设置都是需要通过配置文件来修改,这样的方式缺点很明显,就是对于一般用户而言缺少图形化配置界面还需要额外的学习成本;不过对于喜欢折腾的玩家来说也好处颇多,一方面你可以随时随地同步配置文件在,在不同操作系统之间也能保持配置统一;另一方面,你可以根据自己直接手动快速修改。比如 Espanso 默认的搜索框界面可以用 Option+空格(Windows 为 Alt+空格)打开,那么我们也可以直接修改为 Option+Shift+空格 打开:search_shortcut: OPTION+SHIFT+SPACE当然我们也可以禁用搜索框快捷键的同时,自定义快速弹出 Espanso 匹配项的搜索框界面的触发器: # default.yml search_shortcut: off search_trigger: ">esp" 之后我们只要敲击 >esp 就能令搜索框直接弹出。除此之外,如果你不喜欢每次修改配置文件时 Espanso 就自动重载,那么你也可以关闭该选项并在每次配置之后手动点击状态栏的驻留程序并选择「Reload config」选项:auto_restart: false如果你觉得 Espanso 在扩展文本时的速度有点慢,那么也可以直接选择将 pre_paste_delay 选项尽量调低一些(默认为毫秒 ms),以便快速替换而不是保留肉眼可见的延迟:pre_paste_delay: 100更多的匹配项用法Espanso 相比于其他文本扩展器或用户自定义词典最为突出的地方在于它的匹配项是灵活且可配置的,并且还能搭配终端的命令行工具一起使用得到最后的匹配结果,当然这都需要我们进行配置。静态匹配项最简单的匹配项配置就是 Espanso 默认自带的例子,它们通常是由 trigger 和 replace 一组内容来组成: - trigger: ":espanso" replace: "Hi, there!" 像这样内容既定的部分和我们自定义词典没有什么区别,也被称为静态匹配项(Static Matches)。借助于 YAML 语法我们也可以编写长串的替换文本,即: - trigger: ":espanso" replace: "Hi,\nthere!" - trigger: ":espanso" replace: | Hi, there!默认情况下 Espanso 会直接将 replace 的部分作为匹配项的描述内容,这当我们存在多个同名触发器且内容近似的匹配项时会很容易造成困惑,所以 Espanso 支持我们为匹配项加上对应的描述信息(label 标签),以便能更好地知道当前触发器所得到的内容是什么: # custom.yml - trigger: ":espanso" replace: "Hi, there!" label: "inline content" - trigger: ":espanso" replace: "Hi,\nthere!" label: "content with newline(\\n)" - trigger: ":espanso" replace: | Hi, there! label: "content with newline" 之后我们再次触发 :espanso 时就会能看到不同匹配项所对应的不同描述内容是什么。类似地,我们也可以让一个匹配项拥有多个触发器,这里就需要用到 YAML 的数组语法来设置,例如: - trigger: [":espanso", ":greet"] replace: "Hi, there!" label: "inline content"但如果你要设置的匹配项其触发器虽然比较多但表达类似,那么 Espanso 也支持你使用正则表达式的方式来进行设置,我们只将 trigger 替换成 regex 并使用正则表达式即可。我们可以直接将上述示例稍作修改: - regex: ":(espanso|greet)" replace: "Hi, there!" label: "inline content" 动态匹配项除了静态匹配项之外,Espanso 也支持动态匹配项,这也是让 Espanso 灵活且强大之处,我前面给出的明天和昨天日期的示例就是如此。因为这两个匹配项有些重复,这里我就以明天时间日期为例: - trigger: ":tomorrow" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: 86400在当前的匹配项之下我们还可以自定义变量,也即对应着 vars 之下的内容。变量一词就是编程中经常用来保存内容的基本单位,而 Espanso 允许我们沿用这样的设定直接为匹配项设置一连串的变量,之后动态地生成内容,而不是像静态匹配项那样一成不变。所以在设置 :tomorrow 所对应的匹配项时,我自定义了一个 mytime 变量,这个变量的类型(type)是日期类型,然后又分别表示有 format 用于表示日期展示样式和 offset 日期偏移两个参数。像日期类型这样的变量设置在 Espanso 中又被称为扩展(Extension)。所以除了日期类型之外,Espanso 还支持多种类型以适应动态匹配项的需要,如多选类型、随机类型、脚本类型、Shell 命令类型等等。其中脚本类型和 Shell 命令类型有些类似,只不过前者主要是针对于逻辑更为复杂的脚本文件,它们通常由某种编程语言来编写,而后者主要就是适用于我们所示的终端命令行工具: # custom.yml - trigger: ":pynow" replace: "{{now}}" vars: - name: now type: script params: args: - python3 - -c - | from datetime import datetime print(datetime.now()) - trigger: ":sspai_title" replace: "{{title}}" vars: - name: title type: shell params: cmd: "curl -s https://sspai.com | htmlq --text 'title'" shell: zsh 上述定义的 :pynow 和 :sspai_title 两个动态匹配项里分别用到了脚本类型和 Shell 命令类型,前者是执行 Python 解释器及其来输出最终结果,而后者则是通过系统内的 curl 和 htmlq 两个命令行工具来访问少数派官方并通过 HTML 获得最终的标题内容。除了脚本类型和 Shell 命令类型之外,Espanso 还有一种类型——Form 表单——适用于多处动态内容生成的情况,通常可以被作为模板来使用,比如邮件回复模板、问题反馈模板等等: - trigger: ":reply" form: | Hey [[name]], Thank you for your email. We have already try to handle the [[number]] issue. 在上述匹配项中我们没有 replace 键,取而代之的是 form,并且当中的动态内容部分则是由之前的花括号变成了方括号。这是 Espanso 对于表单内容的一个简写方式,本质上等价于定义变量的方式: - trigger: ":reply" replace: | Hey {{template.name}}, Thank you for your email. We have already try to handle the {{template.number}} issue. vars: - name: template type: form params: layout: | Hey [[name]], Thank you for your email. We have already try to handle the [[number]] issue. 所以当我们配置完毕并保存后,输入 :reply 时会直接弹出 Espanso 为我们准备好的表单界面,我们只需填好其中的部分即可快速生成模板内容。但 Espanso 也还支持某个匹配项在其他匹配项中被使用或引用,极大地提高了灵活性与复用性。比方说我们现在再为这个模板自动带上一个当前回复日期:代码块复制Hey 100gle,Thank you for your email. We have already try to handle the #314 issue.2022-12-12那么我们就可以使用这种引用方式: - trigger: ":today" replace: "{{today}}" vars: - name: today type: date params: format: "%Y-%m-%d" - trigger: ":reply" replace: | Hey {{template.name}}, Thank you for your email. We have already try to handle the {{template.number}} issue. {{today}} vars: - name: today type: match params: trigger: ":today" - name: template type: form params: layout: | Hey [[name]], Thank you for your email. We have already try to handle the [[number]] issue.在 :reply 匹配项的变量中,我们会定义一个 today 变量,它的参数类型是特殊的 match 匹配项,然后当中的 trigger 参数与我们 :today 匹配项的触发器一致。这样只要我们填写完姓名与问题 ID 之后就会在模板中还自动生成当前的回复日期。安装社区第三方扩展包自定义匹配项会是一个永无止境的过程,因为它会随着个人的需要而与日俱增。但人类知识是相通的,也有一些内容可能不仅个人会用到,在互联网某一隅的一群人也会用到,譬如说 Emoji。可你知道吗?在我们日常网络交流中经常使用的每一个 Emoji 表情,其实也都基本有一个相对应称呼(CLDR Short Name),这里我就直接引用 Unicode 官方给出的示例列表:Browser CLDR Short Name😀 grinning face😃 grinning face with big eyes😄 grinning face with smiling eyes上述三个表情虽然都属于笑脸范畴,但是它们对应的 Unicode 编码不同,其文字称呼也不同;这也就意味着我们不仅能够通过 Unicode 编码来找到它们,同理文字称呼也适用。所以你要是恰好知道某个 Emoji 的名称而又不像自己四处翻找,那么借助 Espanso 就可以直接类似 :grinning-face 以文字称呼得到 Emoji 表情。Espanso 允许我们安装来自于社区其他人共享的第三方扩展包,它会类似于插件地形式来扩充我们的匹配项,可以让我们「站在巨人的肩膀」上去更好地使用 Espanso。我们可以直接到 Espanso 的官方 Hub 页面 去搜索。比如我们直接就以前面提到的「Emoji」一词进行搜索就可以找到与之相关的扩展包:但我们与扩展包相关的操作都需要通过命令行来完成:Shell复制espanso install all-emojis # 安装 all-emojis 扩展包espanso uninstall all-emojis # 卸载 all-emojis 扩展包espanso package list # 查看 Espanso 中的所有扩展包espanso package update all-emojis # 更新 all-emojis 扩展包espanso package update all # 更新 Espanso 中的所有扩展包安装完成之后我们就再次按照前面提到的查看匹配项的方式来检查是否安装成功。除上述方式之外 Espanso 还支持额外的安装方式,甚至你也可以自己去创建并分享一个扩展包,当然这些内容 Espanso 都在文档中找到详细说明,这里就不再额外赘述。结尾虽然 Espanso 在使用上直接了当并且功能强大,它不仅可以帮我们扩展静态的模板内容,也可以具备较强的扩展性,例如调用脚本或使用命令行来得到内容。不过为了让它好用、易用可能还需要多花一点心思在配置上。受限于篇幅,本文仅介绍了 Espanso 中比较重要的一些配置内容;但像全局变量、导入外部配置、变量注入、如何分享自己的扩展包等等细节并没有一一涉及。好在 Espanso 的官方文档已经给出了较为细致的说明,这些未提及的内容就留给你自行探索。
2025年10月26日
4 阅读
0 评论
0 点赞
1
2
3
...
9