vovkasm / input-source-switcher

Command line input source switcher for Mac.
MIT License
139 stars 11 forks source link

Emacs using #4

Closed ghost355 closed 9 years ago

ghost355 commented 9 years ago

Интересно, эту штуку можно прикрутить к Emacs, точнее к Spacemacs? В Emacs есть Evil, который организует поддержку vim способа навигации по тексту и всего остального. Вот мне что ответили в ветке Spacemacs

There are hooks for entering and exiting each evil state where you can attach a function that does arbitrary things. If you can figure out how to change the language in Emacs Lisp (e.g. by calling an executable), that should solve the problem.

vovkasm commented 9 years ago

Вероятно, можно. Я, к сожалению, достаточно мало знаком с Emacs, поэтому тут могу помочь только поддержкой со стороны самого input-source-switcher.

Варинат 1

Если возможно писать нативные расширения для Emacs. Можно просто использовать C++ api InputSourceController. Пример использования для утилиты issw: main.cpp

Вариант 2

Если Emacs умеет загрузить динамическую библиотеку и вызвать функцию из неё. Сейчас libInputSourceSwitcher.dylib содержит две функции которые может вызвать любое приложение на C и плагин vim-xkbswitch через libcall() в vim.

const char* Xkb_Switch_getXkbLayout(const char* /* unused */);
const char* Xkb_Switch_setXkbLayout(const char* newgrp);

Если для этого варианта чего-то не хватает, с удовольствием реализую нужный интерфейс.

Вариант 3

Если Emacs может только вызывать внешние программы, то можно воспользоваться утилитой-примером из дистрибутива issw.

issw    # вернуть текущий метод ввода
issw ${input-method-name} # сменить метод ввода
ghost355 commented 9 years ago

вот скорее всего вариант 3 там есть хуки входа и выхода из состояния, например, тот же insert mode. сейчас изучаю ELisp, чтобы понять как правильно сделать

как то так

(setq lang_source "com.apple.keylayout.US")                    
(add-hook 'evil-insert-state-entry-hook                        
          (lambda ()
            (shell-command (concat "issw " lang_source))))    

(add-hook 'evil-insert-state-exit-hook                       
          (lambda ()
            (setq lang_source (shell-command-to-string "issw"))
            (shell-command "issw com.apple.keylayout.US")))

плюс нужно ввести переменную для сохранения установленного режима в insert mode для того, чтобы при возврате восстанавливался язык текущего ввода Я проверил, все работает отлично - входит включает русский, выходит из вставки включает английский. Осталось описать все оставшиеся режимы вставки