老问题,切换mac中文输入法的最佳方案是什么?

用Mac系统的朋友都怎么切换输入法呢?

我的Win和Linux都可以很顺畅的用 emacs-smart-input-source 这个插件原生切换输入法,非常顺滑,不需要额外安装软件,但Mac上遇到不少阻碍。

(在此先感谢作者的付出,这个插件非常好用,配合原生快捷键和Evil都完美。)

我的问题是:

1、Mac上安装官方版本的Emacs,尝试过该插件配合“macism”来切换,虽然功能没问题,但发热、卡顿明显。也尝试过fcitx-remote-for-osx,同样有明显卡顿感,打开Quicksilver时甚至直接卡死5秒以上。

Emacs-Plus和Emacs-mac是不是自带切换输入法函数?不过我还是想用原生Emacs解决问题,不用在Homebrew里加Tap。

我用Emacs很纯粹,就是用Org-Mode写文章和安排Todo-list,所以输入法切换非常重要,最近都是用PC写文章,Linux笔记本随时查看和转发,Mac冷落很久了,不知道大家有好方法建议吗?

用 sis,通过 karabiner 实现 shift 切换中/英文, hammerspoon 实现 Emacs默认英文。

1 个赞

感谢回复,我的痛点是在evil或者C-x/M-x这些快捷键后输入字母,中文输入法会打断,还需要手动C-SPC一下。

你在mac上用sis是用emacs-mac这个发行版,还是用作者写的macism?

emacs 中还是rime好用点

没明白你意思,sis 就是估意临时切为英文的,可以关闭。

我没用 emacs-mac,我用的 macports 编译安装的Emacs 29 + macism,用 macsport 应该更方便,因为不要 macism

你说的应该是 emacs-rime,也很好用,但这个有局限,只能用 librime (macOS的鼠须管也是用librime);要管理2套 rime 配置,不然词库不方便同步(可以手动同步)。

总的来说,sis 门槛更低,emacs-rime 和 emacs 匹配的更好。

建议都试试,然后2选1 :smile:

分享一下我在 macOS 上的输入法方案:

  1. macOS 下

    使用 kawa(GitHub - hatashiro/kawa: A macOS input source switcher with user-defined shortcuts.) 设置固定的切换快捷键

  • Command+Space : 固定切换到英文输入法
  • Caps_lock(Command+Control+Option+Shift)+Space : 固定切换到中文输入法(Rime),Caps_lock 是使用了 Karabiner 做了映射
  1. Emacs 下

    切换输入法用的是 BetterTouchTools 绑定特定快捷到 Emacs 应用上,emacs 中用的输入法是 emacs-rime

  • Command+Space : 固定切换 Emacs 到英文输入法,调用 yc/turn-off-input-method
  • Caps_lock(Command+Control+Option+Shift)+Space: 固定切换 Emacs 到中文输入法,调用 yc/turn-on-rime-input-method
  (defun yc/turn-on-rime-input-method ()
    (interactive)
    (deactivate-input-method)
    (setq-local default-input-method "rime")
    (toggle-input-method)
    (rime-force-enable))

  (defun yc/turn-off-input-method ()
    (interactive)
    (deactivate-input-method))

给我带来的好处就是,不管哪个应用下通过相同的快捷键切换到特定的输入法上。

把emacs mac port的输入法切换的代码搬到master分支。

1 个赞

可以试试 pyim

配合清华词库

1 个赞

使用pyim纯lisp输入法和清华词库可以参考我的设置,

,/启动或关闭输入法,无论是否使用了evil,无论evil的state, 无论操作系统和环境。

我目前也是类似方案,这个方案的一个问题是我用 Karabiner 判断当前应用是否是 Emacs,无法判断 LaunchBar/Alfred/Bob 这类应用弹出的情况,从而导致还得绑定别的键来切换中英文,不知道 BetterTouchTools 是否可以

  1. 除了 Emacs 外的应用我是用了 kawa 设置的全局按键;
  2. 在 Rime 里面设置了,默认进入 Emacs/Alfred 是 ascii_mode 的;

和 2. 没关系

我现在是在 Emacs 中把切换输入法的键(如 ⌘-space)映射到别的快捷键(⌃-\),而这些快捷键(⌃-\)可以在 Emacs 中切换输入法。但是这样的话,Emacs 在后,Alfred/Bob 等应用在前时,⌘-space 还是会被 Karabiner 映射到 ⌃-\,无法切换系统外部输入法。

Linux就不提了,fcitx和ibus都有各自通用接口,现在连Windows都不用单独下载input-select,直接用sis插件就可以切换,Mac未来有没有可能Mac也加入切换输入法的API?

BetterTouchTools 没遇到这个问题

1 个赞

本来想把emacs mac port的代码搬到emacs里来,但是觉得我改的不好,有些object c的代码没搞明白是什么意思,而且从master到release要很久,就没有提,只能只用了,谁能提的就好了。

我是来用 https://karabiner-elements.pqrs.org/ 来做按键绑定 可以参考我的配置中关于 RIME 的配置(搜RIME即可) dotfiles/karabiner.json at main · jixiuf/dotfiles · GitHub 比如这段,在非emacs 的app 上按下right_shift 的行为(通过frontmost_application_unless断言实现判断)

  1. 当单right_shift时 发送left_control+space即 系统切换输入法的按键
  2. 当right_shift 与其他键组合按时,依然是shift的功能,如shift+a=A
                            {
                                "conditions": [
                                    {
                                        "bundle_identifiers": [
                                            "^org\\.gnu\\.Emacs$",
                                            "^org\\.gnu\\.AquamacsEmacs$",
                                            "^org\\.gnu\\.Aquamacs$"
                                        ],
                                        "file_paths": [
                                            "/usr/local/emacs/bin/emacs",
                                            "/usr/local/bin/emacs"
                                        ],
                                        "type": "frontmost_application_unless"
                                    }
                                ],
                                "description": "按 right_command 切换系统英文和 RIME 输入法",
                                "from": {
                                    "key_code": "right_shift",
                                    "modifiers": {
                                        "optional": [
                                            "caps_lock"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "right_shift"
                                    }
                                ],
                                "to_if_alone": [
                                    {
                                        "key_code": "spacebar",
                                        "modifiers": [
                                            "left_control"
                                        ]
                                    }
                                ],
                                "type": "basic"
                            },

下面这一段的行为 当input_sources=en 且当前app 是emacs时right_shift的行为

  1. right_shift+a 等组合按键时 依然拥有right_shift原生的功能
  2. 当right_shift 单独按下抬起时,相当于按下left_control+space ,后 再按下f18 而我emacs f18的按键绑定是进入evil-insert-state, 意思是说当前处于英文态时按时right_shift 会通过left_control+space切换到中文输入法,同时进入evil-insert-state
(global-set-key (kbd "<f18>") 'evil-insert-state) ;mac karabiner用来控制输入法
                            {
                                "conditions": [
                                    {
                                        "input_sources": [
                                            {
                                                "language": "en"
                                            }
                                        ],
                                        "type": "input_source_if"
                                    },
                                    {
                                        "bundle_identifiers": [
                                            "^org\\.gnu\\.Emacs$",
                                            "^org\\.gnu\\.AquamacsEmacs$",
                                            "^org\\.gnu\\.Aquamacs$"
                                        ],
                                        "file_paths": [
                                            "/usr/local/emacs/bin/emacs",
                                            "/usr/local/bin/emacs"
                                        ],
                                        "type": "frontmost_application_if"
                                    }
                                ],
                                "description": "emacs按 right_command 切换到RIME 输入法",
                                "from": {
                                    "key_code": "right_shift",
                                    "modifiers": {
                                        "optional": [
                                            "caps_lock"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "right_shift"
                                    }
                                ],
                                "to_if_alone": [
                                    {
                                        "key_code": "spacebar",
                                        "modifiers": [
                                            "left_control"
                                        ]
                                    },
                                    {
                                        "key_code": "f18"
                                    }
                                ],
                                "type": "basic"
                            },

下面这段的意思是 非英文状态下 emacs中按下right_shift的行为 单按right_shift后,先后发送f19, left_control+space 两个按键序列 f19 我在rime 输入法中 绑定为Send Escape 用于清空输入法中未上屏的输入

  key_binder/bindings:
    # Ctrl-g
    # - { when: composing, accept: Control+g,  send: Escape}
    - { when: composing, accept: F19, send: Escape }
(global-set-key (kbd "<f19>") #'ignore) ;mac karabiner用来控制输入法 ,rime f19 send escape
(define-key isearch-mode-map (kbd "<f19>") #'ignore) ;详见isearch-pre-command-hook
                            {
                                "conditions": [
                                    {
                                        "input_sources": [
                                            {
                                                "language": "en"
                                            }
                                        ],
                                        "type": "input_source_unless"
                                    },
                                    {
                                        "bundle_identifiers": [
                                            "^org\\.gnu\\.Emacs$",
                                            "^org\\.gnu\\.AquamacsEmacs$",
                                            "^com\\.googlecode\\.iterm2$",
                                            "^org\\.gnu\\.Aquamacs$"
                                        ],
                                        "file_paths": [
                                            "/usr/local/emacs/bin/emacs",
                                            "/usr/local/bin/emacs"
                                        ],
                                        "type": "frontmost_application_if"
                                    }
                                ],
                                "description": "emacs按 right_command 切换到英文输入法",
                                "from": {
                                    "key_code": "right_shift",
                                    "modifiers": {
                                        "optional": [
                                            "caps_lock"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "right_shift"
                                    }
                                ],
                                "to_if_alone": [
                                    {
                                        "key_code": "f19"
                                    },
                                    {
                                        "key_code": "spacebar",
                                        "modifiers": [
                                            "left_control"
                                        ]
                                    }
                                ],
                                "type": "basic"
                            },

像input_sources 、bundle_identifiers 等 可以通过它提供的工具来查看,只需要你切换到相应的app ,它就会显示相应的值,如图

还有其他一些功能,如 我将spacebar 当成hyper来用 hyper 被我定义为 (cmd+ctrl+option) 而space+e = toggle emacs (即当前窗口若是eamcs ,则space+e则隐藏当前窗口,若不是当前窗口,则将emacs 挪到最上层)

更多功能参见我的配置吧。

1 个赞

这个没法判断 Bob Alfred Launcher 等弹出式的应用

或许吧,但这个影响比较小吧,弹出式应用,使用的时候留意下就好吧。