Add support for reading/writing IELM input history (bug#67000)

* lisp/ielm.el (inferior-emacs-lisp-mode): Add support for saving input
history to a file.
(ielm--history-file-name): New variable indicating IELM input history
file.
(ielm--exit): Holds a function to call when Emacs is killed to write
out the input history.
(ielm--input-history-writer): Helper function for writing the IELM
input history out to file.

* lisp/comint.el (comint-input-ring-file-name): Improve defcustom tag.
This commit is contained in:
Simen Heggestøyl 2024-01-16 08:21:41 +01:00
parent 783a511d1e
commit 60cff1ac9d
3 changed files with 38 additions and 1 deletions

View file

@ -1357,6 +1357,14 @@ characters, such as ½ (U+00BD VULGAR FRACTION ONE HALF), are also
recognized as rational fractions. They have been since 2004, but it
looks like it was never mentioned in the NEWS, or even the manual.
** IELM
---
*** 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.
* New Modes and Packages in Emacs 30.1

View file

@ -254,7 +254,7 @@ This variable is buffer-local."
See also `comint-read-input-ring' and `comint-write-input-ring'.
`comint-mode' makes this a buffer-local variable. You probably want
to set this in a mode hook, rather than customize the default value."
:type '(choice (const :tag "nil" nil)
:type '(choice (const :tag "Disable input history" nil)
file)
:group 'comint)

View file

@ -110,6 +110,13 @@ This gives more frame width for large indented sexps, and allows functions
such as `edebug-defun' to work with such inputs."
:type 'boolean)
(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 "Disable input history" nil)
file)
:version "30.1")
(defvaralias 'inferior-emacs-lisp-mode-hook 'ielm-mode-hook)
(defcustom ielm-mode-hook nil
"Hooks to be run when IELM (`inferior-emacs-lisp-mode') is started."
@ -503,6 +510,17 @@ behavior of the indirect buffer."
(funcall pp-default-function beg end)
end))
;;; Input history
(defvar ielm--exit nil
"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 @@ Customized bindings may be defined in `ielm-map', which currently contains:
#'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)
;; A dummy process to keep comint happy. It will never get any input
(unless (comint-check-proc (current-buffer))
;; Was cat, but on non-Unix platforms that might not exist, so