Skip to content

Instantly share code, notes, and snippets.

Last active Nov 19, 2021
What would you like to do?
Sane switching of input methods when using evil-mode in Emacs on OSX
;; switch to english input method when switching to normal mode
;; and switch back when entering insert/replace modes
;; need external script support, currently mac-only
(defvar default-im "" "Default ascii-only input method")
(defvar prev-im (substring (shell-command-to-string "~/bin/im-select") 0 -1)
"IM that I use when starting Emacs and exiting insert mode")
(defun im-use-dvorak ()
"Switch to Dvorak input method on a Mac. im-select is a tool
provided at"
(cond ((eq system-type 'darwin)
(call-process-shell-command (concat "~/bin/im-select " default-im)))))
(defun im-remember ()
"Remember the input method being used in insert mode,
so we can switch to it in other modes."
(cond ((eq system-type 'darwin)
(setq prev-im (substring (shell-command-to-string "~/bin/im-select") 0 -1)))))
(defun im-use-prev ()
"Use previous input method.
If previous input method is not defined, use default method"
(cond ((eq system-type 'darwin)
(if prev-im
(call-process-shell-command (concat "~/bin/im-select " prev-im))
(call-process-shell-command (concat "~/bin/im-select " default-im))))))
(add-hook 'evil-normal-state-entry-hook 'im-use-dvorak)
(add-hook 'evil-insert-state-entry-hook 'im-use-prev)
(add-hook 'evil-insert-state-exit-hook 'im-remember)
(add-hook 'evil-replace-state-entry-hook 'im-use-prev)
(add-hook 'evil-replace-state-exit-hook 'im-remember)
(add-hook 'evil-emacs-state-entry-hook 'im-use-dvorak)
Copy link

penn201500 commented May 18, 2019

that's great! tks!

Copy link

heinwol commented Nov 19, 2021

Easy to adapt to a linux system (e.g. with xkb-switch). Works perfectly!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment