Created
June 2, 2025 07:41
-
-
Save douo/aa4858a1ef429203c49880175c215dda to your computer and use it in GitHub Desktop.
本脚本用于配合 yabai 的 window_focused 信号,实现以下自动化功能:每次窗口聚焦时,根据不同应用自动切换输入法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# ============================================================================ | |
# 脚本名称:switch_input_method.sh | |
# | |
# 功能简介: | |
# 本脚本用于配合 yabai 的 window_focused 信号,实现以下自动化功能: | |
# - 每次窗口聚焦时,根据窗口 ID 查询应用名称 | |
# - 根据不同应用自动切换到英文或中文输入法(通过 macism 命令) | |
# - 并将当前窗口的 ID、应用名、窗口标题及切换记录写入日志,方便调试 | |
# | |
# 使用方法: | |
# 1. 通过 yabai 信号绑定调用本脚本,例如: | |
# yabai -m signal --add event=window_focused action="$HOME/scripts/switch_input_method.sh" | |
# 2. 日志将输出到 $HOME/scripts/switch_input_method.log | |
# | |
# 依赖: | |
# - jq(用于处理 JSON,安装:brew install jq) | |
# - macism(用于切换输入法,安装:brew install knu/tap/macism) | |
# ============================================================================ | |
# ---------- 以下为脚本正文 ---------- | |
# 变量定义 | |
ENGLISH_IME="com.apple.keylayout.ABC" | |
CHINESE_IME="im.rime.inputmethod.Squirrel.Hans" | |
# 第一类:始终切换到英文输入法的应用 | |
english_apps=("Terminal" "iTerm2" "kitty") | |
# 第二类:始终切换到中文输入法的应用 | |
chinese_apps=("WeChat" "QQ" "DingTalk" "Microsoft Word" "Notes" "钉钉" "有道云笔记") | |
# 获取聚焦窗口ID | |
window_id="$1" | |
# 如果window_id为空,主动获取 | |
if [ -z "$window_id" ]; then | |
window_id=$(yabai -m query --windows --window | jq -r '.id') | |
fi | |
window_info=$(yabai -m query --windows --window "$window_id") | |
# 获取app名 | |
app_name=$(echo "$window_info" | jq -r '.app') | |
# 获取窗口标题 | |
window_title=$(echo "$window_info" | jq -r '.title') | |
# 日志记录 | |
# echo "$(date '+%Y-%m-%d %H:%M:%S') - ID: $window_id, App: $app_name, Title: $window_title" >> "/tmp/switch_input_method.log" | |
# 判断函数 | |
function contains() { | |
local n=$# | |
local value=${!n} | |
for ((i=1;i < $#;i++)) { | |
if [ "${!i}" == "${value}" ]; then | |
return 0 | |
fi | |
} | |
return 1 | |
} | |
# 判断所属类别并切换输入法 | |
if contains "${english_apps[@]}" "$app_name"; then | |
macism "$ENGLISH_IME" | |
elif contains "${chinese_apps[@]}" "$app_name"; then | |
macism "$CHINESE_IME" | |
else | |
# 第三类,不切换输入法 | |
: | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment