我正在使用 zsh 和prezto配置框架。我希望能够输入诸如1 + 2 * (3 / 4)
“2.5”之类的术语。
这些术语可以被识别,因为它们只包含某些字符:0123456789 +-*/()
. 对于更复杂的一切,我可以打开一个专用程序(如 python shell)。
不够好的解决方案
- 使用程序:我不想
python -c
在我的任期之前键入或将其输入bc
. 打字太多了,我希望它可以做得更好。 - 使用函数或别名:有一些解决方案允许在使用
c
or=
或时进行这些计算calc
,例如 in= 1 + 2 * (3 / 4)
。这很好,但与第 1 点基本相同。 - 使用另一个 shell:我知道xonsh并且我确信还有其他 shell 可以做到这一点。但我喜欢zsh,我不想换shell。
什么可能有效
- zsh 插件:我可以想象一个 zsh 插件,它会查找命令是否与某个正则表达式匹配,然后将其通过管道传输到 python/bc/whatever 中。有点类似于仅输入目录名称时自动 cd 所做的事情。我不知道这是否可能。我很想听听一些提示,这样我才能写出来。
- Intercept
command not found
:和4类似。或许可以在没有找到命令的情况下拦截zsh的行为。但同样,我不知道我会怎么做。 - 为所有数字取别名:我想你可以为所有数字写一个别名,这样它们就是将数学字符串的其余部分作为参数的命令。这可能有效,但看起来很hacky。此外,“所有数字”是很多别名,即使在为其自动生成代码时也是如此。
我想听听关于如何解决这个问题的想法。我不害怕编写代码,但我更喜欢干净的解决方案而不是 hacky 的解决方案。
在命令执行之前拦截命令是可能的,但为时已晚:命令已经被解析并且别名已经被扩展。因此,例如
2 * 3
将显示为找不到命令2
(假设没有该名称的命令),后跟当前目录中的文件列表。相反,您需要在命令提交后立即拦截它,甚至在它被解析之前。所以你需要挂接到命令行界面,而不是挂接到命令执行引擎。我认为没有通用的方法可以做到这一点:我能想到的唯一方法是覆盖 enter 键命令及其兄弟命令,并让它们重写命令行。这并不漂亮,但它符合您的要求。
主要的回车键命令是
accept-line
,绑定到^J
和^M
。您可以按如下方式覆盖它(您需要对您使用的其他类似小部件执行此操作,例如accept-and-hold
、accept-line-and-down-history
等):现在,为函数重写接受的行。行内容在
BUFFER
. 唯一的困难是进行重写的逻辑。可能是这样的,它要求行以一个数字(不是变量,这太模糊)开头,可选地前面是一元运算符和括号,后跟一个二元运算符:请注意,我只对裸 zsh 进行了最少的测试。我还没有调查这是否会干扰 Prezto。