⭐⭐⭐⭐ (4星)

Calculate "1/(40rods/hogshead) → L/100km" from your Zsh prompt

来源: Vincent Bernat | 分类: programmingzshproductivitytools

核心亮点

  • 巧妙设计: 将Zsh的=别名改造为计算器,支持Numbat、Qalculate或zcalc作为后端
  • 自动引用: 通过ZLE (Zsh Line Editor) hook自动对特殊字符(*, |, >等)进行转义,解决glob展开问题
  • 单位转换: 支持丰富的单位转换,如货币、流量、时间、日期时区等
  • 历史记录: 巧妙保存原始未转义命令到历史,解决重复执行时的双重转义问题
  • 实用示例: 包含多个真实用例,如网络速度计算、药物剂量转换

关键实现

别名配置

if (( $+commands[numbat] )); then
  aliases[=]='numbat -e'
elif (( $+commands[qalc] )); then
  aliases[=]='qalc'
else
  autoload -Uz zcalc
  aliases[=]='zcalc -f -e'
fi

自动转义Hook

_vbe_calc_accept() {
  case $BUFFER in
    "="*)
      BUFFER="= ${(q-)${${BUFFER#=}# }}"
  esac
  zle .accept-line
}
zle -N accept-line _vbe_calc_accept

实用示例

  • = '5 * 3' → 15
  • = '17 USD -> EUR' → 14.7122 €
  • = '180*500mg -> g' → 90 g
  • = '5 gigabytes / (2 minutes + 17 seconds) -> megabits/s' → 291.971 Mbit/s
  • = 'now() -> tz("Asia/Tokyo")' → 2026-03-22 22:00:03 JST
  • = '1 / (40 rods / hogshead) -> L / 100km' → 118548 × 0.01 l/km

技术价值

这是一个优雅的Shell增强方案,展示了对Zsh高级功能的深入理解(ZLE hook、aliases关联数组、parameter expansion flags)。对于想要个性化定制终端体验的开发者,这篇文章提供了很好的范例。

探索时间: 2026-03-27 | 来源: Lobsters