Obsidian 插件:Text Expander
插件名片
概述
在编辑器中扩展文本快捷键,运行 shell 命令和 python 脚本

原文出处
下面自述文件的来源于 Readme
Readme(翻译)
下面是 obsidian-text-expander 插件的自述翻译
⚠️ 不支持基于 CM6 的编辑器(Obsidian 版本大于等于 v13.0.0 的默认选项)。请考虑使用传统编辑器。
文本扩展插件
该插件在按下Tab键时替换格式为 {{<text>}} 的快捷方式。替换可以是静态文本,也可以是执行任意命令的结果。
⚠️ 目前,该插件仅部分支持 Windows。请参阅已知问题部分。
使用案例
- 静态文本模板的快捷方式:
{{trigger}}->一些模板文本 - 动态值:
{{now}}->14:23,{{date}}->2021-01-15 - Python 表达式:
{{eval:2**10}}->1024,{{eval:len(open("<note_path>").readlines())}},{{py:from numpy import*;print(linalg.inv(triu([1,2,3,4])))}},… - Shell 命令:
{{shell:ls <vault_path>/attachments}} - 自定义工具:
{{mytool:extract_all_lines_starting_with_(#tag)}}->#tag 文本\n#tag ...
安装
打开“设置 > 第三方插件 > 社区插件 > 浏览”,然后搜索“Text Expander”,点击“安装”。
设置
快捷方式被定义为一个 JSON 列表,每个条目包含三个字段:regex(必需)、replacement(可选)和 command(可选)。
regex字段定义了触发模式。条目按顺序尝试,直到regex与输入匹配。- 如果提供了
replacement,则简单地替换快捷方式。 command包含在 shell 中运行的命令。快捷方式被其输出替换。
默认快捷键
以下是可以在“设置 > 插件选项 > 文本扩展 > 快捷键”中更改的默认配置:
[
{
"regex": "^trigger$",
"replacement": "## 示例替换\n- [ ] ",
},
{
"regex": "^now$",
"command": "printf `date +%H:%M`",
},
{
"regex": "^py:",
"command": "echo <text> | cut -c 4- | python3"
},
{
"regex": "^eval:",
"command": "echo <text> | cut -c 6- | python3 -c 'print(eval(input()), end=\"\")'"
},
{
"regex": "^shell:",
"command": "echo <text> | cut -c 7- | sh"
},
{
"regex": "^tool:",
"command": "echo <text> | cut -c 6- | python3 <scripts_path>/tool.py"
},
{
"regex": "^sympy:",
"command": "echo <text> | cut -c 7- | python3 <scripts_path>/sympy_tool.py"
}
]
变量
使用 <variable_name> 可以在执行 command 字段之前将变量的值插入其中。可以使用以下变量:
<text>括号内的内容,带有转义的单引号。在大多数情况下推荐使用。<text_raw>与<text>相同,但不进行任何转义。<vault_path>当前 vault 的绝对路径。<inner_path>在 Obsidian 文件浏览器中当前笔记的目录。例如,在<vault_path>/folder/folder2/note.md中,其值将为folder/folder2。<note_name>当前笔记的文件名,即上面示例中的note.md。<note_path><inner_path>/<note_name>的快捷方式。<scripts_path><vault_path>/.obsidian/scripts的快捷方式。
示例流程
示例 #1
{{trigger}}Tab 被输入^trigger$匹配trigger-> 使用第一个快捷方式- 第一个快捷方式的
replacement字段替换{{trigger}}
示例 #2
{{now}}Tab^trigger$不匹配now-> 继续到第二个快捷方式^now$匹配now-> 使用第二个快捷方式command字段在指定的 shell 中执行,然后将输出用于替换{{now}}
示例 #3
{{sympy:latex(integrate(x, x))}}Tab- 只有最后一个快捷方式的
regex与输入匹配 - 变量被处理:
echo <text> | cut -c 7- | python3 <scripts_path>/sympy_tool.py->echo 'sympy:latex(integrate(x, x))' | cut -c 7- | python3 /path/to/vault/.obsidian/scripts/sympy_tool.py - 命令被执行:
cut剪切了sympy:前缀,latex(integrate(x, x))作为输入传递给sympy_tool.py sympy_tool.py输出\frac{x^{2}}{2},替换了{{sympy:latex(integrate(x, x))}}
自定义脚本
您可以将任何脚本放置在 <vault_path>/.obsidian/scripts 中以在命令中使用它们。示例 文件夹包含两个示例脚本,启用 {{tool: 和 {{sympy: 快捷方式。
安全性
由于插件是由 shell 驱动的,只需键入 {{shell:rm -rf ...}}Tab就可以轻松运行破坏性命令。当光标位于类似 {{shell:...}} 的内容上时,请三思而后按下Tab键。我也强烈不建议使用 {{shell:...}} 模式,这个模式主要是为了演示目的而添加的,建议使用 Python 脚本来代替。
未来工作
<cursor>占位符,定义替换后的光标位置。示例用法:{{texenv:cases}}->\begin{cases}\n\t<cursor>\n\end{cases}。如果在单个快捷方式中使用了多个<cursor>占位符,则 Tab 键将在它们之间切换光标位置,直到所有占位符都被访问。- 特殊语法(类似
{*{<text>}})用于预览时渲染,而不是立即替换。 - 仅对 Windows 提供静态支持。
已知问题
- 长时间运行的命令可能会导致问题。例如,如果您输入
{{shell:sleep 10 && echo 1}}Tab,并在它完成之前输入{{now}}Tab,那么{{now}}将被替换为1。 - 目前对 Windows 的支持有限:
- 带有
replacement字段的快捷方式会被正确处理 - 要在 Windows 上使用
command字段,您需要安装一个 WSL子系统,并将Settings > Plugin Options > Text Expander > Shell executable设置为<your os name>.exe(例如 Ubuntu 的ubuntu.exe),还要确保您使用的任何 Python 包都已安装 - 或者将
Settings > Plugin Options > Text Expander > Shell executable设置为powershell,并在命令中使用 PowerShell 语法。
- 带有
鸣谢
该项目受到了 Poc文本扩展实现 的启发。我还借鉴了 Run Snippets插件 的一些想法。
发布说明
1.1.0
- 添加了对
:now语法的支持。使用{{py: long command}}语法来处理包含空格字符的触发器,使用:trigger来处理不包含空格的短触发器 - 当 “Shell executable” 的值发生变化时,Shell 可执行文件现在会自动重新启动
1.0.1
- 修复由于 “Shell 可执行文件 ” 值不正确而导致的错误
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。