* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
@ 2024-06-06 15:50 Nicholas Vollmer
2024-06-07 6:35 ` Eli Zaretskii
2024-06-08 2:24 ` Nicholas Vollmer
0 siblings, 2 replies; 9+ messages in thread
From: Nicholas Vollmer @ 2024-06-06 15:50 UTC (permalink / raw)
To: 71404
string-edit-mode is a nice feature to have built in.
It would be nice if one could change the major mode of the editing
buffer while preserving the edit/abort functionality and any
buffer state necessary to make those function.
Any reason it couldn't be implemented as a minor mode?
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-06 15:50 bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode Nicholas Vollmer
@ 2024-06-07 6:35 ` Eli Zaretskii
2024-06-07 23:37 ` Nicholas Vollmer
2024-06-08 2:24 ` Nicholas Vollmer
1 sibling, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2024-06-07 6:35 UTC (permalink / raw)
To: Nicholas Vollmer; +Cc: 71404
> From: Nicholas Vollmer <nv@parenthetic.dev>
> Date: Thu, 06 Jun 2024 11:50:16 -0400
>
>
> string-edit-mode is a nice feature to have built in.
It already is? Or what do you mean by "built in" here?
> It would be nice if one could change the major mode of the editing
> buffer while preserving the edit/abort functionality and any
> buffer state necessary to make those function.
> Any reason it couldn't be implemented as a minor mode?
In what major modes will this make sense as a minor mode?
IOW, I don't think I understand what you mean by "preserving the
edit/abort functionality and buffer state", so please elaborate.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-07 6:35 ` Eli Zaretskii
@ 2024-06-07 23:37 ` Nicholas Vollmer
0 siblings, 0 replies; 9+ messages in thread
From: Nicholas Vollmer @ 2024-06-07 23:37 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 71404
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Nicholas Vollmer <nv@parenthetic.dev>
>> Date: Thu, 06 Jun 2024 11:50:16 -0400
>>
>>
>> string-edit-mode is a nice feature to have built in.
>
> It already is? Or what do you mean by "built in" here?
Correct. It is. I was just commenting that I'm glad to see it part
of Emacs, rather than re-implemented over and over in third-party
packages.
That is all.
>> It would be nice if one could change the major mode of the
>> editing
>> buffer while preserving the edit/abort functionality and any
>> buffer state necessary to make those function.
>> Any reason it couldn't be implemented as a minor mode?
>
> In what major modes will this make sense as a minor mode?
Many. For example. If the string to edit is an elisp form, why
shouldn't the editing buffer be emacs-lisp-mode?
If the string to edit is a message which can be formatted with
markdown, why not markdown-mode?
(I ran into this yesterday when implementing a command for
personal use).
I can imagine many scenarios where the major mode could be
something other than text-mode.
It seems to me that it would make more sense for the
"abort/finish" key bindings to be bound to a minor mode map so
the editing buffer can be much more flexible.
> IOW, I don't think I understand what you mean by "preserving the
> edit/abort functionality and buffer state", so please elaborate.
The buffer has some local state (e.g. the abort callback function,
header-line) stored in a buffer-local variables which are not
preserved when the major mode is changed.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-06 15:50 bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode Nicholas Vollmer
2024-06-07 6:35 ` Eli Zaretskii
@ 2024-06-08 2:24 ` Nicholas Vollmer
2024-06-08 2:27 ` Nicholas Vollmer
1 sibling, 1 reply; 9+ messages in thread
From: Nicholas Vollmer @ 2024-06-08 2:24 UTC (permalink / raw)
To: 71404
Nicholas Vollmer <nv@parenthetic.dev> writes:
Attached is a proof-of-concept patch which addresses bugs #71404,
#71405, and #71406
I'll take care of that if/when the design is agreed upon.
The patch rewrites string-edit-mode as a minor mode.
It utilizes an overlay for the edit prompt (to persist across
major mode changes) and prevents the prompt separator from being
deleted.
It persists the buffer-local editing data so that the major mode
can be changed and the edit can still be completed.
It uses #'ignore as the default abort function if none is
provided.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-08 2:24 ` Nicholas Vollmer
@ 2024-06-08 2:27 ` Nicholas Vollmer
2024-06-10 20:53 ` Nicholas Vollmer
0 siblings, 1 reply; 9+ messages in thread
From: Nicholas Vollmer @ 2024-06-08 2:27 UTC (permalink / raw)
To: 71404
[-- Attachment #1: Type: text/plain, Size: 692 bytes --]
Nicholas Vollmer <nv@parenthetic.dev> writes:
> Nicholas Vollmer <nv@parenthetic.dev> writes:
>
> Attached is a proof-of-concept patch which addresses bugs
> #71404, #71405, and
> #71406 I'll take care of that if/when the design is agreed upon.
>
> The patch rewrites string-edit-mode as a minor mode.
> It utilizes an overlay for the edit prompt (to persist across
> major mode
> changes) and prevents the prompt separator from being deleted.
> It persists the buffer-local editing data so that the major mode
> can be changed
> and the edit can still be completed.
> It uses #'ignore as the default abort function if none is
> provided.
Sorry. Forgot to attach patch.
Attached here.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-textmodes-string-edit.el-refactor-as-minor-mode.patch --]
[-- Type: text/x-patch, Size: 5458 bytes --]
From 10ae067b0590884c7df6854ca04a1863782c368c Mon Sep 17 00:00:00 2001
From: Nicholas Vollmer <iarchivedmywholelife@gmail.com>
Date: Fri, 7 Jun 2024 22:11:16 -0400
Subject: [PATCH] lisp/textmodes/string-edit.el: refactor as minor mode
---
lisp/textmodes/string-edit.el | 82 +++++++++++++++++++----------------
1 file changed, 45 insertions(+), 37 deletions(-)
diff --git a/lisp/textmodes/string-edit.el b/lisp/textmodes/string-edit.el
index 03be426ac25..0eeba50b8ed 100644
--- a/lisp/textmodes/string-edit.el
+++ b/lisp/textmodes/string-edit.el
@@ -23,20 +23,22 @@
;;; Code:
-(require 'cl-lib)
-
(defface string-edit-prompt
'((t (:inherit font-lock-comment-face)))
"Face used on `string-edit' help text."
:group 'text
:version "29.1")
-(defvar string-edit--success-callback)
-(defvar string-edit--abort-callback)
+(defvar-local string-edit--success-callback nil)
+(put 'string-edit--success-callback 'permanent-local t)
+(defvar-local string-edit--abort-callback nil)
+(put 'string-edit--abort-callback 'permanent-local t)
+(defvar-local string-edit--prompt nil)
+(put 'string-edit--prompt 'permanent-local t)
+
;;;###autoload
-(cl-defun string-edit (prompt string success-callback
- &key abort-callback)
+(defun string-edit (prompt string success-callback &optional abort-callback)
"Switch to a new buffer to edit STRING.
When the user finishes editing (with \\<string-edit-mode-map>\\[string-edit-done]), SUCCESS-CALLBACK
is called with the resulting string.
@@ -50,36 +52,16 @@ string-edit
Also see `read-string-from-buffer'."
(with-current-buffer (generate-new-buffer "*edit string*")
- (when prompt
- (let ((inhibit-read-only t))
- (insert prompt)
- (ensure-empty-lines 0)
- (add-text-properties (point-min) (point)
- (list 'intangible t
- 'face 'string-edit-prompt
- 'read-only t))
- (insert (propertize (make-separator-line) 'rear-nonsticky t))
- (add-text-properties (point-min) (point)
- (list 'string-edit--prompt t))))
- (let ((start (point)))
- (insert string)
- (goto-char start))
-
+ (setq string-edit--prompt prompt
+ string-edit--success-callback success-callback
+ string-edit--abort-callback (or abort-callback #'ignore))
+ (string-edit-mode)
+ (save-excursion (insert string))
;; Use `fit-window-to-buffer' after the buffer is filled with text.
(pop-to-buffer (current-buffer)
'(display-buffer-below-selected
(window-height . (lambda (window)
(fit-window-to-buffer window nil 10)))))
-
- (set-buffer-modified-p nil)
- (setq buffer-undo-list nil)
- (string-edit-mode)
- (setq-local string-edit--success-callback success-callback)
- (when abort-callback
- (setq-local string-edit--abort-callback abort-callback))
- (setq-local header-line-format
- (substitute-command-keys
- "Type \\<string-edit-mode-map>\\[string-edit-done] when you've finished editing or \\[string-edit-abort] to abort"))
(message "%s" (substitute-command-keys
"Type \\<string-edit-mode-map>\\[string-edit-done] when you've finished editing"))))
@@ -99,9 +81,9 @@ read-string-from-buffer
(lambda (edited)
(setq string edited)
(exit-recursive-edit))
- :abort-callback (lambda ()
- (exit-recursive-edit)
- (error "Aborted edit")))
+ (lambda ()
+ (exit-recursive-edit)
+ (error "Aborted edit")))
(recursive-edit)
string)
@@ -109,9 +91,35 @@ string-edit-mode-map
"C-c C-c" #'string-edit-done
"C-c C-k" #'string-edit-abort)
-(define-derived-mode string-edit-mode text-mode "String"
- "Mode for editing strings."
- :interactive nil)
+(defun string-edit--prepare-buffer ()
+ "Prepare `string-edit-mode' buffer."
+ (with-silent-modifications
+ (when string-edit--prompt
+ (insert (propertize " " 'intangible t 'read-only t))
+ (let ((o (make-overlay (point-min) (point-max))))
+ (overlay-put o 'display
+ (concat (propertize string-edit--prompt 'face 'string-edit-prompt)
+ "\n"
+ (propertize "\n" 0 1 'face '(:inherit separator-line :extend t))))
+ (overlay-put o 'evaporate nil)
+ (insert (propertize "\n" 'string-edit--prompt t 'read-only t 'rear-nonsticky t 'intangible t 'front-sticky t)))
+ (setq string-edit--prompt nil))
+ (setq header-line-format
+ (substitute-command-keys
+ "Type \\<string-edit-mode-map>\\[string-edit-done] when you've finished editing or \\[string-edit-abort] to abort"))
+ (setq buffer-undo-list nil)))
+
+(define-minor-mode string-edit-mode
+ "Minor mode for editing strings in a dedicated buffer."
+ :lighter " string-edit"
+ (cond
+ (string-edit-mode
+ (add-hook 'after-change-major-mode-hook #'string-edit-mode nil t)
+ (put 'after-change-major-mode-hook 'permanent-local t)
+ (string-edit--prepare-buffer))
+ (t
+ (remove-hook 'after-change-major-mode-hook #'string-edit-mode t)
+ (put 'after-change-major-mode-hook 'permanent-local nil))))
(defun string-edit-done ()
"Finish editing the string and call the callback function.
--
2.45.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-08 2:27 ` Nicholas Vollmer
@ 2024-06-10 20:53 ` Nicholas Vollmer
2024-06-11 6:21 ` Eli Zaretskii
0 siblings, 1 reply; 9+ messages in thread
From: Nicholas Vollmer @ 2024-06-10 20:53 UTC (permalink / raw)
To: 71404; +Cc: Eli Zaretskii
Nicholas Vollmer <nv@parenthetic.dev> writes:
> Nicholas Vollmer <nv@parenthetic.dev> writes:
>
>> Nicholas Vollmer <nv@parenthetic.dev> writes:
>>
>> Attached is a proof-of-concept patch which addresses bugs
>> #71404, #71405, and
>> #71406 I'll take care of that if/when the design is agreed
>> upon.
>>
>> The patch rewrites string-edit-mode as a minor mode.
>> It utilizes an overlay for the edit prompt (to persist across
>> major mode
>> changes) and prevents the prompt separator from being deleted.
>> It persists the buffer-local editing data so that the major
>> mode can be
>> changed
>> and the edit can still be completed.
>> It uses #'ignore as the default abort function if none is
>> provided.
>
> Sorry. Forgot to attach patch.
> Attached here.
>
> [2. text/x-patch;
> 0001-lisp-textmodes-string-edit.el-refactor-as-minor-mode.patch]...
Any thoughts here?
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-10 20:53 ` Nicholas Vollmer
@ 2024-06-11 6:21 ` Eli Zaretskii
2024-07-11 15:01 ` No Wayman
0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2024-06-11 6:21 UTC (permalink / raw)
To: Nicholas Vollmer; +Cc: 71404
> From: Nicholas Vollmer <nv@parenthetic.dev>
> CC: Eli Zaretskii <eliz@gnu.org>
> Date: Mon, 10 Jun 2024 16:53:47 -0400
>
> Any thoughts here?
I didn't yet have time to look into this, sorry.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-06-11 6:21 ` Eli Zaretskii
@ 2024-07-11 15:01 ` No Wayman
2024-07-23 21:04 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 9+ messages in thread
From: No Wayman @ 2024-07-11 15:01 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Nicholas Vollmer, 71404
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Nicholas Vollmer <nv@parenthetic.dev>
>> CC: Eli Zaretskii <eliz@gnu.org>
>> Date: Mon, 10 Jun 2024 16:53:47 -0400
>>
>> Any thoughts here?
>
> I didn't yet have time to look into this, sorry.
Feel free to close this. Patch has gone rotten on the vine.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode
2024-07-11 15:01 ` No Wayman
@ 2024-07-23 21:04 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 0 replies; 9+ messages in thread
From: Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-23 21:04 UTC (permalink / raw)
To: No Wayman; +Cc: Eli Zaretskii, 71404, Nicholas Vollmer
No Wayman <iarchivedmywholelife@gmail.com> writes:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: Nicholas Vollmer <nv@parenthetic.dev>
>>> CC: Eli Zaretskii <eliz@gnu.org>
>>> Date: Mon, 10 Jun 2024 16:53:47 -0400
>>> Any thoughts here?
>>
>> I didn't yet have time to look into this, sorry.
>
> Feel free to close this. Patch has gone rotten on the vine.
Please elaborate?
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-07-23 21:04 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-06 15:50 bug#71404: 30.0.50; [WISHLIST] string-edit-mode should allow changing major mode Nicholas Vollmer
2024-06-07 6:35 ` Eli Zaretskii
2024-06-07 23:37 ` Nicholas Vollmer
2024-06-08 2:24 ` Nicholas Vollmer
2024-06-08 2:27 ` Nicholas Vollmer
2024-06-10 20:53 ` Nicholas Vollmer
2024-06-11 6:21 ` Eli Zaretskii
2024-07-11 15:01 ` No Wayman
2024-07-23 21:04 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).