Lembrando o histórico entre as sessões no Modo Inferior Emacs Lisp


9

Não consigo fazer o Emacs lembrar a história dos *ielm*buffers entre as sessões. Tanto quanto posso dizer, esse histórico é registrado na variável buffer-local comint-input-ring. Portanto, eu adicionei a seguinte expressão ao meu arquivo init:

(setq desktop-locals-to-save
    (append desktop-locals-to-save
            '((comint-input-ring . 50))))

Isso não funciona. Eu sei que o desktoppacote está funcionando porque o Emacs se lembra das variáveis ​​globais às quais eu adicionei desktop-globals-to-saveno meu arquivo init.

-

EDIT: savehisttambém não funciona. Suponho que seja porque comint-input-ringé uma variável local de buffer.


11
Agora não há tempo para verificar por que pode não funcionar na área de trabalho. Mas você pode tentar usar savehist.ele adicionar essa variável à lista de vars para salvar.
Tirou

Obrigado, Drew, mas eu já tinha pensado savehist(desculpe por não ter mencionado). Tanto quanto pude ver, era apenas para variáveis ​​globais, enquanto comint-input-ringé local de buffer. Agora, eu tentei de qualquer maneira, sem sucesso.
Elena

AVISO: A solução a seguir é blasfêmia !!!! Comente comint.elas duas linhas de código a seguir: (put 'comint-input-ring 'permanent-local t)e (make-local-variable 'comint-input-ring). Em seguida, adicione comint-input-ringa desktop-locals-to-save. Por fim, recompile novamente os arquivos aplicáveis, reinicie o Emacs e aproveite a vida ao máximo.
lawlist

Respostas:


5

Você pode salvar o valor local do buffer comint-input-ringem uma variável global quando um *ielm*buffer é eliminado e restaurá-lo em inferior-emacs-lisp-mode-hook:

;; global copy of the buffer-local variable
(defvar ielm-comint-input-ring nil)

(defun set-ielm-comint-input-ring ()
  ;; create a buffer-local binding of kill-buffer-hook
  (make-local-variable 'kill-buffer-hook)
  ;; save the value of comint-input-ring when this buffer is killed
  (add-hook 'kill-buffer-hook #'save-ielm-comint-input-ring)
  ;; restore saved value (if available)
  (when ielm-comint-input-ring
    (message "Restoring comint-input-ring...")
    (setq comint-input-ring ielm-comint-input-ring)))

(defun save-ielm-comint-input-ring ()
  (message "Saving comint-input-ring...")
  (setq ielm-comint-input-ring comint-input-ring))

(require 'ielm)
(add-hook 'inferior-emacs-lisp-mode-hook #'set-ielm-comint-input-ring)

Agora você deve ser capaz de adicionar ielm-comint-input-ringpara savehist-additional-variablesobter o comportamento desejado. (Eu testei essa abordagem; você também deve poder usá-la desktop-locals-to-save.)


11
Você deve usar o LOCALargumento para add-hook, ao invés de chamar manualmente make-local-variableem kill-buffer-hook. O último pode causar problemas ao tentar adicionar retornos de chamada ao gancho globalmente.
phils

Fiquei muito satisfeito ao descobrir que isso também funcionou inf-mongo(ou, presumivelmente, qualquer outro modo que use comint). Isso é muito útil e também me ensinou um pouco mais sobre elisp ... obrigado!
Blake Miller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.