如何用 bc 命令计算 buffer 中已经写好的一个算式?

比如命令 echo "12+5" | bc 会得出结果 17。

试了在 buffer 中选中 12+5 再用 M-| (shell-command-on-region) 运行 bc 命令,会提示下面的错误:

(standard_in) 1: syntax error

错误的原因是什么?应该怎么做才能得到结果?

bc 只接受标准输入和文件名作为参数,不支持 bc "expr"

可以封装一个 bc-region 函数,实现参数转换 (shell-command "echo $region | bc")

或者封装一个通用的函数,用来执行所有类似的命令 (shell-command "echo $region | $command")

2 个赞

或者用literate-calc-mode,buffer 里面写算式,buffer里面显示结果。基于内置的calc

2 个赞

请教一下,literate-calc-mode是怎么用的,刚刚装上,一脸懵逼。。。

创建一个临时的buffer,然后M-x literate-calc-mode,之后就可以输入算式了,具体参照readme的example章节,把buffer保存成txt就能保存历史记录

1 个赞

很有意思,谢谢推荐。

但是 wc 命令同样是不支持 wc "text",却可以得到结果,这又是为什么呢?

差别在 bc 需要一个回车符作为确认:

(with-temp-buffer
  (insert "1+2\n")
  (call-process-region (point-min) (point-max) "bc" t t)
  (buffer-string))
  ;; => "3"

(with-temp-buffer
  (insert "1+2")
  (call-process-region (point-min) (point-max) "bc" t t)
  (buffer-string))
  ;; => "(standard_in) 1: parse error"

(with-temp-buffer
  (insert "1+2\n")
  (call-process-region (point-min) (point-max) "wc" t t)
  (buffer-string))
  ;; => "       1       1       4"

(with-temp-buffer
  (insert "1+2")
  (call-process-region (point-min) (point-max) "wc" t t)
  (buffer-string))
  ;; => "       0       1       3"

可以在终端上验证:

$ bc
1+2

需要按回车才会进行计算。

所以,另一个解决方案就是用 advice 给 bc 命令补回车。

2 个赞