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

evil

#1

不像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, 原因找到了。中文输入法用的键盘布局和英文是一样的,这就导致一些复杂的问题。目前没有解决方法。


#4

#5

哇原来这里就有。谢啦。


#6

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


#7

https://translate.google.cn


#8

google translate还行。

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

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


#9

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


#10

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

;; 输入中文翻译成英文
(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)
  )

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


#11

pyim + karabiner-elements 可破.


#13

本人环境 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


#14

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


#16

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


#17

谢谢了 :+1: