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))