Skip to content

About

Show the active macOS input source in your zsh prompt, in real time.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

which-keyboard

English README Platform: macOS zsh 5.8+ Native helper: Objective-C License: MIT GitHub Stars

在 zsh 提示符中实时显示 macOS 当前输入法。

切换输入法,标签随即更新,无需按回车或继续输入。支持左右位置、自定义标签和多行命令。

# 左侧
[EN]   ~/project ❯ git status
[拼音] ~/project ❯ git status

# 右侧(默认)
~/project ❯ git status                              [拼音]

快速开始 · 配置 · 使用限制 · 开发与测试 · 参与贡献

特性

  • 实时更新:监听系统输入源变化,事件驱动,无定时轮询。
  • 灵活显示:标签可放在左侧或右侧,支持按输入源 ID 自定义名称。
  • 保留编辑状态:异步更新时保留命令内容和光标位置,支持多行输入。
  • 减少重复计算:缓存标签,显示内容不变时不重绘主题。
  • 轻量依赖:使用 macOS 原生 API,无需 im-select、辅助功能或键盘监听权限。

插件只读取输入源状态,不记录按键,也不自动切换输入法。

快速开始

环境要求

依赖 要求
系统 macOS 本地桌面会话
Shell zsh 5.8+;已在 Apple Silicon / zsh 5.9 上验证
构建工具 仅源码 / Homebrew 安装需要:Xcode Command Line Tools,或包含 macOS SDK 的 Xcode

下载预编译版本(无需编译)

从 GitHub Releases 下载对应架构的压缩包和 SHA256SUMS:Apple Silicon 选择 arm64,Intel 选择 x86_64。

也可以在终端下载、校验并解压:

version=v0.1.1
archive="which-keyboard-${version}-macos-$(uname -m).tar.gz"
curl -fLO "https://github.com/Iristack/which-keyboard/releases/download/${version}/${archive}"
curl -fLO "https://github.com/Iristack/which-keyboard/releases/download/${version}/SHA256SUMS"
shasum -a 256 -c SHA256SUMS --ignore-missing

确认校验结果为 OK 后安装:

mkdir -p "$HOME/.local/share/which-keyboard-release"
tar -xzf "$archive" --strip-components=1 -C "$HOME/.local/share/which-keyboard-release"

在 ~/.zshrc 的主题初始化之后添加:

WHICH_KEYBOARD_POSITION=left
source "$HOME/.local/share/which-keyboard-release/which-keyboard.plugin.zsh"

压缩包包含原生程序、zsh 插件、文档和许可证,不需要 Xcode 或编译工具。二进制以 macOS 12.0 为最低构建目标,在 macOS 15 的两种架构 runner 上测试;未逐一验证旧版系统。采用 ad-hoc 签名,尚未使用 Developer ID 证书签名或 Apple 公证,macOS 可能提示安全检查。

通过 Homebrew 安装(推荐)

brew tap iristack/which-keyboard https://github.com/Iristack/which-keyboard.git
brew install iristack/which-keyboard/which-keyboard

在 ~/.zshrc 的主题初始化之后添加:

WHICH_KEYBOARD_POSITION=left  # 可选;默认显示在右侧
source "$(brew --prefix)/share/which-keyboard/which-keyboard.plugin.zsh"

打开新终端即可使用。Homebrew 会下载带 SHA-256 校验的版本源码并在本机编译,因此仍需要上表中的构建工具;目前不提供预编译 bottle。安装会同时提供 which-keyboard 命令。

从源码安装

git clone https://github.com/Iristack/which-keyboard.git "$HOME/.local/share/which-keyboard"
make -C "$HOME/.local/share/which-keyboard"

在 ~/.zshrc 的主题初始化之后添加:

source "$HOME/.local/share/which-keyboard/which-keyboard.plugin.zsh"

打开新的终端窗口,切换 ABC 和系统拼音即可看到标签更新。也可以在当前 zsh 中执行上述 source 命令立即试用。

安装目录可以自行调整,修改对应的加载路径即可。项目不会自动修改 shell 配置或下载依赖。

配置

配置应放在插件的 source 行之前。

显示位置

默认显示在右侧。设置 left 可将标签放在原提示符前面:

WHICH_KEYBOARD_POSITION=left

加载后也可以即时切换:

WHICH_KEYBOARD_POSITION=right  # left 或 right
which-keyboard-refresh

位置设置同时作用于普通提示符和多行命令的第二提示符,保留原有提示符内容。

自定义标签

默认使用系统提供的输入法名称。可以按输入源 ID 映射为短标签:

typeset -A WHICH_KEYBOARD_LABELS=(
  com.apple.keylayout.ABC EN
  com.apple.inputmethod.SCIM.ITABC 拼音
)
WHICH_KEYBOARD_POSITION=left

查看本机启用的输入源及其 ID(源码安装使用 ./build/which-keyboard --list):

which-keyboard --list

标签按纯文本处理,不解析颜色或其他提示符代码。加载后修改映射,运行 which-keyboard-refresh 即可应用。

命令

命令 用途
which-keyboard-refresh 应用配置,并请求最新输入源状态
which-keyboard-unload 停止监听、移除插件钩子并恢复原提示符

重复加载不会启动多个监听进程。卸载后可再次 source。

高级配置与原生接口

可在加载前设置 WHICH_KEYBOARD_BINARY,指定兼容监听程序的绝对路径。

以下状态变量可供其他 shell 配置读取:

变量 内容
WHICH_KEYBOARD_INPUT_SOURCE_ID 系统输入源 ID
WHICH_KEYBOARD_INPUT_SOURCE_NAME 系统提供的显示名称
WHICH_KEYBOARD_LABEL 应用映射后的标签

在仓库目录运行原生工具:

./build/which-keyboard --once   # 查询当前输入源
./build/which-keyboard --list   # 列出启用且可选择的输入源
./build/which-keyboard --watch  # 输出初始状态和后续变更,Ctrl-C 退出

输出格式为 UTF-8 ID<TAB>名称<换行>。监听模式下收到 SIGUSR1 会输出最新快照。

更新与卸载

Homebrew 安装:

brew update
brew upgrade which-keyboard

更新后打开新终端,或先执行 which-keyboard-unload,再重新执行 Homebrew 的 source 加载行。卸载软件可运行 brew uninstall which-keyboard,随后移除 .zshrc 中对应的加载行和配置。

源码安装:更新源码并重新编译:

git -C "$HOME/.local/share/which-keyboard" pull --ff-only
make -C "$HOME/.local/share/which-keyboard"

在已加载插件的终端中重新加载:

which-keyboard-unload
source "$HOME/.local/share/which-keyboard/which-keyboard.plugin.zsh"

卸载时,执行 which-keyboard-unload,并删除 ~/.zshrc 中的加载行和相关配置;不再使用的安装目录可以自行删除。

使用限制

场景 当前支持情况
系统输入源切换,例如 ABC ↔ 系统拼音 支持实时显示
搜狗、鼠须管内部通过 Shift 切换中英文 若系统输入源未改变,则无法区分内部模式
多行命令 支持,第二提示符使用相同的位置设置
Vim、less 或其他前台命令运行中 不显示标签,回到 zsh 行编辑时恢复
Powerlevel10k、Starship 等复杂主题 尚未专门适配,兼容性需验证
SSH 远端、tmux 多客户端 不支持获取远端对应的本地输入源,也未实现按客户端区分

右侧标签可能在命令过长时被 zsh 隐藏;启用 SINGLE_LINE_ZLE 等不显示右侧提示符的配置时,请使用左侧模式。

输入源状态来自当前 macOS 桌面。后台终端可能收到其他应用引起的变更,回到终端时会重新同步。

工作原理

每个 shell 启动一个原生监听进程,通过 macOS 的输入源变更通知查询当前状态,并写入管道。zsh 使用 zle -F 异步接收事件,仅在提示符内容变化时调用 zle reset-prompt 重绘。

标签缓存在 precmd 阶段准备好,避免每次进入命令行时重复展开主题。插件退出时清理监听进程;监听异常结束后移除标签,下次进入命令行时尝试重启。

性能

Apple Silicon / zsh 5.9 / 简单提示符下的连续切换样本(2026-09-14):

测量 样本数 中位数 P95 最大值
模拟事件写入 → PTY 输出新标签 100 0.162 ms 0.207 ms 0.299 ms
调用系统切换接口 → PTY 输出新标签 20 5.111 ms 6.946 ms 41.725 ms

测量不包含快捷键识别、终端画面呈现及显示器刷新时间。结果来自单机短时样本,实际表现取决于系统、终端和主题,不能视为跨设备保证。

开发与测试

开发测试额外需要 Python 3,使用标准库,无需安装 Python 依赖。在仓库目录执行:

make        # 编译原生监听程序
make test   # 语法检查、原生接口与 PTY 集成测试

默认测试不会切换系统输入法,覆盖异步重绘、光标和编辑内容、多行输入、提示符兼容、标签转义及进程生命周期。

运行无需切换系统输入法的性能基准:

python3 tools/benchmark.py

以下命令会短暂切换真实输入源,并在结束时尝试恢复原状态;需要至少两个启用的输入源:

WK_TEST_REAL_SWITCH=1 python3 -m unittest discover -s tests -v
python3 tools/benchmark.py --real-switch --switches 20

自动发布

Release 工作流 在推送 vMAJOR.MINOR.PATCH 标签时运行:

  1. 在标准 macos-15(arm64)和 macos-15-intel(x86_64)runner 上分别构建、测试。
  2. 对二进制进行 ad-hoc 签名,按固定文件清单打包,生成 SHA-256 校验值。
  3. 两个构建均成功后创建草稿 Release,上传两个压缩包和 SHA256SUMS,再公开发布。

可在 Actions 页面手动运行;选择 main 只构建和测试,不创建 Release。已公开的同名 Release 不会被覆盖。流程使用自动提供的 GITHUB_TOKEN,无需额外配置发布密钥。

公开仓库使用标准 runner 的运行时间免费;larger runner 和超额存储适用各自的计费规则。此工作流不使用 larger runner 或缓存,中间构建产物保留 1 天。参见 GitHub Actions 计费说明。

参与贡献

欢迎通过 Issues 反馈问题或提出建议,也欢迎提交 Pull Request。

反馈问题时,请提供 macOS 与 zsh 版本、终端及主题名称、使用的输入法,以及最小复现步骤。涉及界面显示的问题,可附上已隐去个人信息的截图。

提交代码前请运行 make test。涉及提示符重绘的改动,请一并检查多行输入、光标位置和已有主题内容是否保持正常。

许可证

本项目采用 MIT 许可证。

About

Show the active macOS input source in your zsh prompt, in real time.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages