在macOS上都是如何平衡emacs内置输入法与系统自带输入法的

我是使用了鼠须管,emacsmacport与emacs-rime, 本来想使用几一个快捷键实现emacs之外的鼠标管的中英文切换以及emacs之内的emacs-rime的切换。

我尝试使用 https://www.hammerspoon.org/ 来拦截 cmd+space ,分别触发鼠须管的切换以及emacs中的 ctrl+\ 切换,但实际使用中发现鼠须管的切换有bug, 经常输入法切过去了,但仍只能输入英文,也尝试过使用三方工具如 https://github.com/laishulu/macism, 后来查这是 macOS TISSelectInputSource 一个多年未修复的bug。像 macism 里也尝试过不同的trick, 但都不是很稳定。 我现在恢复到自己习惯在emacs与其它应用中分别记忆不同的快捷键,并且配置鼠段管在 emacs 中默认英文状态,这样即使错误的使用了切鼠段管输入法的快捷键也不会影响emacs之内的。 但这样用起来肯定不是那么流畅,发个帖子看看大家有没有其它各舒适的用法。

鼠须管+带input-source patch的emacs-plus,再用smart-input-source自动切换中英文。

1 个赞

请问系统自带输入法有什么场景是覆盖不到的呢?内置输入法是不是有什么黑魔法提高生产力呀?大佬分享一下

emacs-rime 可以通过正则断言,实现一些场景的自动切换中英之类的。不过我用的上面2楼提到的方案。

2 个赞

没用 Karabiner Elements 吗?用它拦截 Emacs 内外的快捷键,指向不同的功能,比如我用 Shift 在 Emacs 里映射 C-\ ,在 Emacs 外映射 C-S-z 切换系统输入法。另外还用 hammerspoon 把 Emacs 的系统输入法强制设置为英文。

1 个赞

现在用 smart-input-source + patch鼠须管,MacOS Emacs输入法切换 ,这个方案目前用的很舒适

另外这是之前用 emacs-rime 时候碰到的问题以及一些解决方案:

  • 在 Emacs 内部和外部一样使用 Shift 切换中英文状态。解决办法:使用 Karabiner-Elements 映射了快捷键
  • 在切换到 Emacs 时,需要保证它是英文输入法(这里并不是指中文输入法的英文状态)。解决办法: Input Source Pro 设置 Emacs 的规则
  • isearch 中无法使用 emacs-rime 。解决办法: isearch-mb 包,或者 Swiper, consult-line 等。但我目前是只想用 isearch ,碰到需要中文的情况也只是将就用,或者临时使用 consult-line
  • 内外的词库不统一。解决办法:手动同步词库。需求不大,所以没有想办法定时去同步,偶尔会碰到
  • 字体中不包含的字符,出现之后会卡顿一会。解决办法: (setq inhibit-compacting-font-caches t), 这样就只会卡第一次了
1 个赞

可参考下 @ringawho 回复中的博文的第一小节

如果已经开始给 Squirrel 打私有patch了,是不是可以尝试拉 Squirrel 与 emacs-rime 两位作者帮忙一起看看有没有更方便的通信的机制。看最近 居戎氏 也在给 emacs-rime 提 PR, 不过是为了他新搓的双击输入方案的支持。feat: support chorded input by lotem · Pull Request #246 · DogLooksGood/emacs-rime · GitHub

确实ctrl+x b比较麻烦

前提:操作系统使用鼠须管+emacs使用rimelib,二者用同一个配置

emacs 中配置快捷键 C-, 来切换 rime 输入法

(global-set-key (kbd "C-,"  ) 'toggle-input-method             )

操作系统中将 配置输入法快捷键为 C-z

使用hammerspoon做按键映射,主要的目的是 让emacs聚焦时将 C-; 映射为 C-, 其余情况将 C-; 映射为 C-z ~/.hammerspoon/init.lua

-- 设置emacs 在系统级仅用英文输入法
set_app_input_method('Emacs'        , English)

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({"ctrl"}, ",")
        else
            hs.eventtap.keyStroke({"ctrl"}, "z")
        end
    end
end)

如此就可以实现使用 C-; 既在emacs 中切换输入法,也在操作系统中切换输入法了

1 个赞

MacOS存在一个功能在keyboard的All Input Sources中,可以实现使用CapsLock切换输入法,长按CapsLock切换大小写。利用Karabiner达到单击Ctrl实现ESC,组合则正常组合键。将CapsLock映射到原ESC键位,Ctrl放到原CapsLock键位。最终效果键盘上的CapsLock实现Ctrl和ESC效果,ESC实现切换输入法和大小写效果,解放Ctrl+空格这类常用的切换输入法,emacs中就随意设置切换输入法快捷键了。

1 个赞