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 arquivo .emacs é 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-mode para que no Terminal no OSX, S-Tab seja mapeado para backtab para que ele funcione corretamente em vez de gerar 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 do emacs estivesse faltando os arquivos de alguma forma. É como se as chaves mapeadas fossem carregadas para o servidor, mas esquecidas quando um cliente se conectava. Eu até tentei eval dos mapeamentos de teclas uma vez em um buffer emacsclient, mas sem erros, sem alteração. Alguma idéia?

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

    
por labyrinth 17.01.2013 / 21:47

2 respostas

5

Eu acho que o seu problema é que seu arquivo .emacs define algo como local-function-key-map ou input-decode-map , mas essas variáveis são locais de terminal, o que significa que todo "terminal" (sua GUI é um "terminal" e cada emacsclient conexão através de um texto-teminal será outro "terminal") recebe um valor diferente desta variável.

Então, você precisa reexecutar esse código para cada novo terminal. Você pode fazer isso a partir de after-make-frame-functions , como sugerido por 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 em 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 , já que é uma variável global e se aplica igualmente a todos os terminais.

    
por 19.10.2015 / 20:06
1

Finalmente encontrei uma solução.

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

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

(add-hook 'after-make-frame-functions #'startup_func)
    
por 18.10.2015 / 16:52