简单的macOS evil输入法切换问题解决方案

不像fcitx.el,这个解决方案限制较多。但是实现很简单。

首先安装swim这个小软件

https://github.com/mitsuse/swim

git clone -b 0.2.0 https://github.com/mitsuse/swim.git && cd swim
swift build -c release
cp .build/release/swim ${YOUR_EXECUTABLE_PATH}

用法很简单:

  1. swim list列出所有目前可以切换到的输入法。
$ swim list
com.apple.keyboardlayout.all
com.apple.inputmethod.SCIM
  1. swim list --name 会把显示名称一并显示出来
$ swim list --name
ABC (com.apple.keyboardlayout.all)
Pinyin - Simplified (com.apple.inputmethod.SCIM)
  1. swim use input-method 切换输入法
swim use com.apple.inputmethod.SCIM
(输入法换了)

这样只要在emacs里自定义一些函数和hook就可以自动切换输入法了:

;; method0 是英文输入法,method1是中文输入法
(setq input-switch-method0 "com.apple.keyboardlayout.all")
(setq input-switch-method1 "com.apple.inputmethod.SCIM")
(setq input-switch-is-on nil)

;; 通过运行命令切换输入法
(defun input-switch-use-method (method)
  (when input-switch-is-on
    (shell-command (replace-regexp-in-string "method" method "swim use method"))))

;; 开启或关闭输入法切换
(defun input-switch-enable () (interactive) (setq input-switch-is-on t))
(defun input-switch-disable () (interactive) (setq input-switch-is-on nil))

;; 进入insert mode切换第二输入法(中文)
(add-hook 'evil-insert-state-entry-hook
          (lambda () (input-switch-use-method input-switch-method1)))
;; 退出insert mode切换第一输入法(英文)
(add-hook 'evil-insert-state-exit-hook
          (lambda () (input-switch-use-method input-switch-method0)))

这样只要执行M-x input-switch-enable 就可以开始愉快码字了。

更新

我又发现了一个功能和swim相同的小工具,效果基本一样。

https://github.com/vovkasm/input-source-switcher

更新2

确认了有的时候会出现输入法切换成了中文但是输入的依然是英文的情况。这时候emacs以外的地方再点回来(就是unfocus再focus)就正常工作了。有谁知道可能是为什么吗?

更新3

感谢@LdBeth, 原因找到了。中文输入法用的键盘布局和英文是一样的,这就导致一些复杂的问题。目前没有解决方法。

5赞
1赞

哇原来这里就有。谢啦。

问一个小小的有点蠢的问题 build 的时候 ${YOUR_EXECUTABLE_PATH}是什么意思

https://translate.google.cn

google translate还行。

https://www.zhihu.com/question/20464025

比如一般 /usr/local/bin 就行, mac上不用root权限。

我觉得您的回复很对我的问题。挺有意思 。谢谢

有个比较丑陋的解决办法,

;; 输入中文翻译成英文
(defun translation-input-chinese-to-english()
  (interactive)
  (call-process-shell-command "issw com.apple.keylayout.ABC")
  (call-process-shell-command "issw com.apple.inputmethod.SCIM.Shuangpin")
  (insert-translated-name-insert nil)
  )

多切一次,输入的时候就是中文了

1赞

pyim + karabiner-elements 可破.

本人环境 mac 10.14 Mojave + Spacemacs 0.300.0@26.2, 尝试了很多办法,终于搞定,编辑模式下是中文输入,退出编辑模式自动切换成英文:

*** step1: 在 dotspacemacs-configuration-layers 中配置并启用 chinese,并启用 fcitx.el #+begin_src elisp (chinese :variables chinese-enable-fcitx t) #+end_src

*** setp2 在 dotspacemacs/user-config() #+begin_src elisp ;; Make sure the following comes before `(fcitx-aggressive-setup)’ (setq fcitx-active-evil-states '(insert emacs hybrid)) ; For Spacemacs use hybrid mode。 默认方式是 '(insert emacs) (fcitx-aggressive-setup) ; 如果要在 minibuffer 里输入中文,就改成 ( fcitx-default-setup ) (fcitx-prefix-keys-add “M-m”) ; M-m is common in Spacemacs ;; (setq fcitx-use-dbus t) ; uncomment if you’re using Linux #+end_src

*** step3 在 macOS 终端用 brew 安装 fcitx-remote-for-osx #+begin_src bash brew tap xcodebuild/fcitx-remote-for-osx # 取消 tap 用 brew untap xcodebuild/fcitx-remote-for-osx; 显示当前有那些仓库可用 brew tap brew install xcodebuild/fcitx-remote-for-osx/fcitx-remote-for-osx --with-sogou-pinyin # --with-sogou-pinyin 表示搜狗拼音 brew info xcodebuild/fcitx-remote-for-osx/fcitx-remote-for-osx # 查看支持其他输入法的选项。 #+end_src

*** setp4 参考 [[https://github.com/xcodebuild/fcitx-remote-for-osx]] 在 macOS 在输入法面板设置“选择下一个输入法的快捷键”为:Ctrl-Shift-z

2赞

一直用着有点问题,能重新排版下吗?:grin:

格式化后,重新上传了操作步骤的截图,希望可以帮到你。 没办法,orgmode用多了,markdown不会用。

谢谢了 :+1:

Thank you!!!

Mac下不是直接能用系统输入法么。为啥要装fictx呢。

其实我也费解,为什么不喜欢用系统的输入法呢?

没用过 mac ,但现在 linux 端也基本可以在 emacs 中使用系统输入法。内置的输入法的优点是可以装很多探针,配置好后,可以做到基本不需要手动切换中英文。比如中文空格后自动变英文,英文空格后自动变中文,或是 command mode 下只能英文。当然这是最简单的探针,高级一点的比如有些 mode 下的探针是英文为主偶尔输入中文,有些 mode 下中文为主偶尔输英文。甚至可以在 telega 中不同的群使用不同的探针。这些都是系统输入法很难做到的。

用 emacs 里面的输入法首先是可以解决这个楼标题的问题。

第二就是可以解决中英文自动切换的问题,如果比如在注释中自动中文,代码里面自动英文。这个是系统输入法做不到的。

第三就是可以和 emacs 有一致的 look & feel. 比如下面的对比图

第四就是每个 buffer 可以有独立的状态,比如 emacs 里面使用 telega 聊天,里面是中文,其它的 buffer 还可以保持英文。而系统的输入法至少在 emacs 里面是区分不开的。

第五就是从记忆“当前是什么状态”变成“在什么位置会直接英文”或“输入什么内容使用什么格式”,后两者实际是无状态的,中文带一些单词和代码的时候会很省心。

1赞

补充一点, telega 里可以精细到针对不同的对话自动使用中文或英文,如 @emacs_zh 默认为中文,而 @emacs_en 默认为英文。

关于不同 buffer或者不同 mode 的输入法切换确实是优点,其他几点系统输入法都能做到。现在我主要关心稳定性和资源占用。也准备试试看。