Hi Stefan, thanks for your feedback. An updated patch is attached. Stefan Kangas writes: > Simen Heggestøyl writes: > >> +--- >> +*** IELM now remembers input history between sessions. >> + >> +--- >> +*** New variable 'ielm-history-file-name'. >> +If non-nil, name of the file to read/write IELM input history. Set to >> +nil to revert IELM to the old behavior of not remembering input >> +history between sessions. > > I would probably make this into one entry, like so: > > *** IELM now remembers input history between sessions. > The new user option 'ielm-history-file-name' is the name of the file > where IELM input history will be saved. Customize it to nil to revert > to the old behavior of not remembering input history between sessions. Aight, changed! >> +(defcustom ielm-history-file-name >> + (locate-user-emacs-file "ielm-history.eld") >> + "If non-nil, name of the file to read/write IELM input history." >> + :type '(choice (const :tag "nil" nil) > > The tag here should be "Disable input history" or something like that. Ok. Should it be updated for `comint-input-ring-file-name' too then (I copied it from there)? > This should read > > (defvar ielm--exit nil > > or the below docstring will instead be its value. Of course, thanks. >> + "Function to call when Emacs is killed.") >> + >> +(defun ielm--input-history-writer (buf) >> + "Return a function writing IELM input history to BUF." >> + (lambda () >> + (with-current-buffer buf >> + (comint-write-input-ring)))) >> + >> ;;; Major mode >> >> (define-derived-mode inferior-emacs-lisp-mode comint-mode "IELM" >> @@ -605,6 +623,17 @@ inferior-emacs-lisp-mode >> #'ielm-indirect-setup-hook 'append t) >> (setq comint-indirect-setup-function #'emacs-lisp-mode) >> >> + ;; Input history >> + (setq-local comint-input-ring-file-name ielm-history-file-name) >> + (setq-local ielm--exit (ielm--input-history-writer (current-buffer))) >> + (setq-local kill-buffer-hook >> + (lambda () >> + (funcall ielm--exit) >> + (remove-hook 'kill-emacs-hook ielm--exit))) >> + (unless noninteractive >> + (add-hook 'kill-emacs-hook ielm--exit)) >> + (comint-read-input-ring t) > > There are some complications here: > > You can get more than one IELM buffer using > > M-x ielm RET > M-x rename-buffer RET foo RET > M-x ielm RET > > What happens if there is more than one IELM buffer? It will save only > the history from the last one, or something like that? Yes. Though I think that's kind of expected; that's how Eshell for instance also works. > Perhaps the kill-emacs-hook should look for all buffers that are using > `ielm-mode' and save the history from all of them? It would also need to be handled in the kill-buffer hooks I guess, updating the remaining buffers' histories when one buffer is killed. Sounds kind of messy though, I think I'd prefer the more simple approach suggested here. -- Simen