Запустите команду на новом фрейме с демоном / клиентом в Emacs - PullRequest
4 голосов
/ 21 февраля 2011

Возможно, это довольно просто, но я не нашел ничего полезного при поиске.Итак, вот так:)

Я использую Emacs в режиме демона (emacs --daemon), и это действительно удобно.Я также использую dvorak и обнаружил, что переназначение Cj в Cc (и наоборот) действительно удобно в долгосрочной перспективе, и для перевода используйте следующее:

(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j)

Это прекрасно работает, когда не использует Emacs в качестве демона.Когда я запускаю новый клиент (cli / gui), Cj больше не привязан к Cc .Whaaat?

Итак, я думаю, мне нужно будет запустить keyboard-translate после создания нового клиентского фрейма, но я понятия не имею, как это сделать.Я попробовал с defadvice, я нашел где-то, но не смог заставить его работать, поэтому я сдался и удалил его.

Ответы [ 3 ]

6 голосов
/ 21 февраля 2011

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), чтобы помочь с этим).

0 голосов
/ 11 декабря 2018

Чтобы расширить ответ phils:

В Emacs 26.1 мне пришлось запускать переводы клавиатуры в контексте нового фрейма, например:

(defun make-keyboard-translations ()
  (keyboard-translate ?\C-j ?\C-c))

(defun setup-frame-keyboard (frame)
  (with-selected-frame frame
    (make-keyboard-translations)))

(make-keyboard-translations)
(add-hook 'after-make-frame-functions #'setup-frame-keyboard)
0 голосов
/ 19 апреля 2012

Еще один хук, который запускается каждый раз, когда вызывается emacsclient, это server-visit-hook, что, возможно, более уместно, чем after-make-frame-functions.

(add-hook 'server-visit-hook 
     (lambda ()
          (keyboard-translate ?\C-j ?\C-c)
          (keyboard-translate ?\C-c ?\C-j)))
...