Emacs_切换系统输入法
2026-01-01
2 min read
一直使用emacs rime插件,作为一款在emacs中内置的输入法一直表现良好,不过如果可以使用系统的输入法,则输入法的行为和UI将更加协调一致。
hammerspoon
借用hammerspoon切换输入法的能力,可以让我们实现。
在hammerspoon使用
- `hs.keycodes.currentSourceID(“im.rime.inputmethod.Squirrel.Hans”)` 切换rime输入法。
- `hs.keycodes.currentSourceID(“com.apple.keylayout.ABC”)` 切换英文输入法。
配置hammerspoon进行快捷键转换
- 在Emacs中 C-; -> shift-space
- 在其他应用中 C-; -> C-z
配置:
hs.hotkey.bind({"ctrl"}, ";", function()
local win = hs.window.frontmostWindow()
if win then
local appName = win:application():name()
if appName == "Emacs" then
hs.eventtap.keyStroke({"shift"}, "space")
else
hs.eventtap.keyStroke({"ctrl"}, "z")
end
end
end)
rime config
- 配置不显示中英文弹框
- 配置 ; 选择第二个词
- 配置 C-p 选择下一个候选项
- 配置 C-n 选择上一个候选项
- 配置 C-h 删除上一个单词
- 配置 Shift+space 选择切换中英输入法
- 配置每次切换后都重置输入法, reset: false 则会记住历史中英模式。因为emacs中经常会切换至minibuffer ,而minibuffer以英文输入情况居多,据切换后强制设置为英文模式.
配置:
# options: always | never | appropriate
show_notifications_when: never
# 快捷键
key_binder:
bindings:
# Option/Alt + ←/→ 切换光标至下/上一个拼音
- { when: composing, accept: ";", send: "2" }
- { when: composing, accept: Control+p, send: Left }
- { when: composing, accept: Control+n, send: Right }
- { when: composing, accept: Control+h, send: BackSpace }
- { when: always, accept: Shift+space, toggle: ascii_mode }
patch:
switches:
- name: ascii_mode
reset: true
emacs config
- 配置切换输入法的函数
- 针对rime的entry和exit切换输入法
- 针对minibuffer的setup和exit切换输入法
配置:
(defun my/mac-switch-to-abc ()
(interactive)
(start-process
"hs-abc"
nil
"hs"
"-c"
"hs.keycodes.currentSourceID(\"com.apple.keylayout.ABC\")"))
(defun my/mac-switch-to-rime ()
(interactive)
(start-process
"hs-rime"
nil
"hs"
"-c"
"hs.keycodes.currentSourceID(\"im.rime.inputmethod.Squirrel.Hans\")"))
(with-eval-after-load 'evil
(add-hook 'evil-insert-state-entry-hook #'my/mac-switch-to-rime)
(add-hook 'evil-insert-state-exit-hook #'my/mac-switch-to-abc)
(add-hook 'minibuffer-setup-hook #'my/mac-switch-to-rime)
(add-hook 'minibuffer-exit-hook #'my/mac-switch-to-abc))