bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#67000: 30.0.50; [PATCH] Add support for reading/writing IELM input h


From: Simen Heggestøyl
Subject: bug#67000: 30.0.50; [PATCH] Add support for reading/writing IELM input history
Date: Wed, 07 Feb 2024 15:02:56 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

Hi Stefan, thanks for your feedback. An updated patch is attached.

Stefan Kangas <stefankangas@gmail.com> writes:

> Simen Heggestøyl <simenheg@runbox.com> 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

Attachment: 0001-Add-support-for-reading-writing-IELM-input-history.patch
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]