Как мне получить, чтобы мои файлы инициализации .emacs правильно загружались с сервера emacs?

1395
labyrinth

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

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

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

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

5
Можете ли вы создать минимальный init.el, который иллюстрирует проблему? (Давайте пока проигнорируем символическую ссылку и загрузку нейтрального для ОС файла инициализации.) Davor Cubranic 8 лет назад 0
Одна возможность состоит в том, что если вы устанавливаете сочетания клавиш в init в зависимости от значения `window-system` или чего-то подобного, тогда настройки могут быть не для терминала, а для GUI. Davor Cubranic 8 лет назад 0

2 ответа на вопрос

5
Dailan Kifki

Я думаю, что ваша проблема в том, что ваш файл .emacs устанавливает что-то вроде local-function-key-mapили, input-decode-mapно эти переменные являются локальными терминалами, что означает, что каждый «терминал» (ваш графический интерфейс пользователя является одним «терминалом», и каждое соединение 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, так как это глобальная переменная и применяется в равной степени ко всем терминалам.

Интересно, что этот крючок, кажется, нигде не определен ... Clément 6 лет назад 0
grep терминал-init-xterm-hook ** / *. el` показывает, что он находится в `lisp / term / xterm.el`. Обратите внимание, что хуки не нужно «определять» (несвязанное значение работает так же, как и нулевое значение). Dailan Kifki 6 лет назад 0
1
reza.safiyat

Finally found a solution.

This is a copied solution but sadly I lost the link to it. Just add this to your init file.

(defun startup_func(_) (load-file "/path/to/custom-keybindings.el")) (add-hook 'after-make-frame-functions #'startup_func) 

Похожие вопросы