Ch f keyboard-translate
RET говорит, что:
Эта переменная имеет отдельную привязку для каждого терминала.См. Информационный узел `(elisp) Multiple display '.
, который указывает нам правильное направление, хотя в этой документации есть ошибка, так как ссылочный информационный узел не существует.Поиск предполагает, что узел на самом деле переименован в (elisp)Multiple terminals
, который вы также можете прочитать здесь: http://www.gnu.org/s/emacs/manual/html_node/elisp/Multiple-Terminals.html
В системах GNU и Unix каждый дисплей X представляет собой отдельный графический терминал [...] Emacs может даже подключаться к другим текстовым терминалам, взаимодействуя с программой emacsclient.
Поэтому, когда вы запускаете emacs как демон, вы еще не подключились к терминалу (или, по крайней мере, не к тому, который вам полезен), и поэтому ваши команды не генерируют привязки длятерминалы, которые вы в конечном итоге используете.
Переменная after-make-frame-functions
предоставляет один из способов решения этой проблемы.
(defun my-dvorak-translations (&optional frame)
"Re-map keys in the current terminal."
(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j))
;; Evaluate both now (for non-daemon emacs) and upon frame creation
;; (for new terminals via emacsclient).
(my-dvorak-translations)
(add-hook 'after-make-frame-functions 'my-dvorak-translations)
Экспериментально кажется безопасным повторять ваши команды, поэтому мы не будемнам не нужно беспокоиться о том, чтобы выполнить это только один раз для терминала (но если бы мы это сделали, мы могли бы использовать (get-device-terminal FRAME)
, чтобы помочь с этим).