5

Мои файлы инициализации настроены так, что мой файл .emacs является символической ссылкой, указывающей на специфичный для ОС init, который, в свою очередь, загружает основной файл инициализации с настройками, которые не зависят от ОС. У меня не было проблем с этой настройкой для несерверных Emacs.

Тем не менее, он не работает правильно при использовании emacsclient. Например, у меня есть настройка для org-mode чтобы в Terminal на OSX S-Tab отображался в backtab, чтобы он работал правильно, а не выдавал ошибку о неопределенном ключе. Этот параметр работает нормально, если я не использую сервер Emacs. Когда я использую emacsclient, я получаю ошибку неопределенного связывания клавиш.

Я знаю, что все мои файлы инициализации загружаются без ошибок, потому что любые строки (сообщение "что угодно"), которые я помещаю в файлы, отображаются нормально при запуске сервера. Так что сервер emacs не пропускает файлы. Как будто сопоставленные ключи загружаются для сервера, но забываются при подключении клиента. Я даже однажды попробовал eval сопоставлений клавиш в буфере emacsclient, но пока без ошибок, без изменений. Есть идеи?

(кстати, --debug-init ничего странного не показывает. Все загружается без ошибок.)

2 ответа2

5

Я думаю, что ваша проблема в том, что ваш файл .emacs устанавливает что-то вроде local-function-key-map или input-decode-map но эти переменные являются терминальными локальными, что означает, что каждый "терминал" (ваш GUI - это один "терминал", и каждое emacsclient соединение через текстовый терминал будет другим "терминалом") получает другое значение этой переменной.

Поэтому вам нужно перезапускать этот код для каждого нового терминала. Вы можете сделать это из after-make-frame-functions как предложено reza.safiyat, так что он будет выполняться чаще, чем нужно (один раз на кадр, а не один раз на терминал). Но так как это, вероятно, необходимо только для терминалов "xterm", другой хороший вариант - сделать это из terminal-init-xterm-hook:

(defun my-text-terminal-keys ()
  (define-key input-decode-map ...)
  (define-key local-function-key-map ...))
(add-hook 'terminal-init-xterm-hook #'my-text-terminal-keys)

Кстати, иногда альтернативой является использование function-key-map , так как это глобальная переменная и применяется в равной степени ко всем терминалам.

1

Наконец-то нашел решение.

Это скопированное решение, но, к сожалению, я потерял ссылку на него. Просто добавьте это в ваш файл init .

(defun startup_func(_)
  (load-file "/path/to/custom-keybindings.el"))

(add-hook 'after-make-frame-functions #'startup_func)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .