偶然见刷到的一个代码段,可以再Rime中用Lua实现一个简易的计算器功能,效果如下:

Lua脚本地址:rime-lua-collection/calculator_translator.lua

使用方法

格式:=<exp>
Lambda語法糖:`\<arg>.<exp>|`

例子:

=1+1 輸出 2
=floor(9^(8/7)*cos(deg(6))) 輸出 -3
=e^pi>pi^e 輸出 true
=max({1,7,2}) 輸出 7
=map({1,2,3},\x.x^2|) 輸出 {1, 4, 9}
=map(range(-5,5),\x.x*pi/4|,deriv(sin)) 輸出 {-0.7071, -1, -0.7071, 0, 0.7071, 1, 0.7071, 0, -0.7071, -1}
=$(range(-5,5,0.01))(map,\x.-60*x^2-16*x+20|)(max)() 輸出 21.066
=test(\x.trunc(sin(x),1e-3)==trunc(deriv(cos)(x),1e-3)|,range(-2,2,0.1)) 輸出 true

安装:

- 將本文件保存至 <rime>/lua/
- 在 <rime>/rime.lua 新增一行:
`calculator_translator = require("calculator_translator")`
- 在 <rime>/<schema>.schema.yaml 新增:
`engine/translators/@next: lua_translator@calculator_translator`
`recognizer/patterns/expression: "^=.*$"`
註:
- <rime> 替換爲RIME的共享目錄
- <schema> 替換爲自己的方案ID
- 如目錄/文件不存在,請自行創建

后续问题

我在实装后发现小键盘上输入数字会直接上屏,无法正常进行计算,后通过修改按键绑定解决。

default.custom.yaml

  key_binder/bindings/+:
        - { when: composing, accept: KP_Enter, send: Return } 
        - { when: composing, accept: KP_Equal, send: = } 
        - { when: composing, accept: KP_Multiply, send: asterisk } 
        - { when: composing, accept: KP_Add, send: plus } 
        - { when: composing, accept: KP_Subtract, send: minus } 
        - { when: composing, accept: KP_Divide, send: slash } 
        - { when: composing, accept: KP_Decimal, send: period }