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.

Elena
fonte
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.)

Constantine
fonte
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