Como faço para que meus arquivos init .emacs sejam carregados corretamente com o servidor emacs?

5

Meus arquivos init são configurados de tal forma que meu .emacsarquivo é um link simbólico apontando para um init específico do sistema operacional que, por sua vez, carrega o arquivo init principal com configurações que não são afetadas pelo sistema operacional. Eu não tive problemas com essa configuração para emacs que não são servidores.

No entanto, não funciona direito ao usar o emacsclient. Por exemplo, eu tenho uma configuração para org-modeque no Terminal no OSX, S-Tabseja mapeado para backtab para que ele funcione corretamente em vez de lançar um erro sobre a chave indefinida. Esta configuração funciona bem se eu não estiver usando o servidor emacs. Quando estou usando o emacsclient, recebo o erro de atalhos de teclado indefinidos.

Eu sei que todos os meus arquivos init estão sendo carregados sem erro porque qualquer (mensagem "qualquer") linhas que eu coloquei nos arquivos mostra bem quando o servidor é iniciado. Então não é como se o servidor emacs estivesse faltando os arquivos de alguma forma. É como se as teclas mapeadas fossem carregadas para o servidor, mas esquecidas quando um cliente se conectava. Eu até tentei evalos mapeamentos de teclas uma vez em um buffer do emacsclient, mas sem erros, sem alterações. Alguma ideia?

(btw, --debug-initnão mostra nada de estranho. Tudo está carregando sem erro.)

labirinto
fonte
Você pode criar um init.el mínimo que ilustra o problema? (Vamos ignorar o symlinking e o carregamento do arquivo init OS-neutral por enquanto.)
Davor Cubranic
Uma possibilidade é que, se você configurar atalhos de teclado no init, dependendo do valor window-systemou algo parecido, as configurações podem não ser para um terminal, mas para a GUI.
Davor Cubranic

Respostas:

5

Eu acho que o seu problema é que o seu arquivo .emacs define algo como local-function-key-mapou input-decode-mapmas essas variáveis ​​são terminais-locais, o que significa que todo "terminal" (sua GUI é um "terminal", e toda conexão emacsclient durante um período de texto será outra "terminal") obtém um valor diferente dessa variável.

Então você precisa re-executar esse código para cada novo terminal. Você pode fazer isso de after-make-frame-functionsacordo com o sugerido pelo reza.safiyat, pois ele será executado com mais freqüência do que o necessário (uma vez por quadro, em vez de uma vez por terminal). Mas como isso provavelmente só é necessário para terminais "xterm", outra boa opção é fazer isso de 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)

BTW, às vezes uma alternativa é usar function-key-map, desde que é uma variável global e se aplica igualmente a todos os terminais.

Dailan Kifki
fonte
Curiosamente, esse gancho não parece ser definido em qualquer lugar ...
Clément
grep terminal-init-xterm-hook **/*.elmostra isso lisp/term/xterm.el. Observe que os ganchos não precisam ser "definidos" (um valor não ligado funciona tão bem quanto um valor nulo).
Dailan Kifki
2

Finalmente encontrei uma solução.

Esta é uma solução copiada, mas infelizmente perdi o link para ela. Basta adicionar isso ao seu initarquivo.

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

(add-hook 'after-make-frame-functions #'startup_func)
reza.safiyat
fonte