diff --git a/emacs/MANUAL.md b/emacs/MANUAL.md index 5a45a95..5235178 100644 --- a/emacs/MANUAL.md +++ b/emacs/MANUAL.md @@ -378,6 +378,8 @@ per line. | `S-TAB` / `p` | previous field | | `e` | set the field at point | | `C-c C-e` | open the value for editing | +| `C-c C-c` | commit what you changed in it | +| `C-c C-k` | abandon the edit | | `q` | close | Two things worth knowing, because they are unlike other inspectors. diff --git a/emacs/flan-inspect.el b/emacs/flan-inspect.el index d814a1a..2587989 100644 --- a/emacs/flan-inspect.el +++ b/emacs/flan-inspect.el @@ -435,7 +435,10 @@ its loop and stopped again since: what is on the screen would then describe storage that has moved, and overwriting it would be aimed at nothing anybody looked at.") (defvar-local flan-inspect--editing nil - "Non-nil while this buffer is the value rather than a listing of it.") + "Where the value starts, while this buffer is the value rather than a listing. +A marker and not a flag, because the header above it is two lines or three +depending on whether the daemon named a type, and the reader that parses the +buffer back has to start in the same place this one stopped writing.") (defun flan-inspect--label (child) "How CHILD is named in the list: `0.' for an element, `.x' for a field. @@ -662,6 +665,13 @@ and whether that may be followed is the answer")) (setq flan-inspect--at-stop (plist-get answer :at-stop)) (setq flan-inspect--stack stack) (setq flan-inspect--editing nil) + ;; Put back what editing turned off, here and not in the two commands + ;; that leave it: this is the one funnel every drawing goes through, and + ;; the mode body that set them in the first place does not run a second + ;; time on a buffer that is already in the mode. Without it a listing + ;; drawn after a commit is a listing you can yank into. + (setq buffer-read-only t) + (setq-local truncate-lines t) (flan-inspect--render root path flan-inspect--node stack flan-inspect--type)) (display-buffer buf) @@ -1096,25 +1106,29 @@ program holds afterwards, `C-c C-k' throws the edit away." "--- Editing. C-c C-c commits what you changed, C-c C-k abandons it.\n" 'face 'font-lock-comment-face)) (insert "\n") + ;; Where the value starts, recorded rather than counted back to. The + ;; header above is two lines or three depending on whether the daemon + ;; named a type, and a count written here and again in the reader is two + ;; places to keep in step for no gain. + (setq flan-inspect--editing (point-marker)) + (set-marker-insertion-type flan-inspect--editing nil) (insert (flan-inspect--literal flan-inspect--node)) (insert "\n") (setq buffer-read-only nil) (setq-local truncate-lines nil) - (setq flan-inspect--editing t) ;; The header is not part of the value, so it is not part of what gets ;; parsed back — and it is fixed rather than merely un-parsed, because a ;; header edited by accident would otherwise read as the value having ;; grown a line. - (let ((end (save-excursion (goto-char (point-min)) (forward-line 4) (point)))) - (add-text-properties (point-min) end '(read-only t front-sticky t))) + (add-text-properties (point-min) (marker-position flan-inspect--editing) + '(read-only t front-sticky t)) (goto-char (point-max)) (forward-line -1))) (defun flan-inspect--edited () "What the editable part of this buffer says, parsed." (save-excursion - (goto-char (point-min)) - (forward-line 4) + (goto-char (marker-position flan-inspect--editing)) (let ((text (buffer-substring-no-properties (point) (point-max)))) (when (string-empty-p (string-trim text)) (user-error "flan: there is nothing left in the buffer to commit")) diff --git a/emacs/test-flan-cider.el b/emacs/test-flan-cider.el index d87b404..0e613c7 100644 --- a/emacs/test-flan-cider.el +++ b/emacs/test-flan-cider.el @@ -918,7 +918,12 @@ would be overwritten. Look again and re-do the edit") (flan-inspect-abandon) (test-flan--check "and abandoning draws what the program holds" (and (not flan-inspect--editing) - (string-match-p "\\.id +7" (buffer-string)))))) + (string-match-p "\\.id +7" (buffer-string)))) + ;; The listing is read-only again, and that is the assertion rather than + ;; the flag: the flag says which mode the buffer is in, this says whether + ;; `C-k' on a line of the listing would do something. + (test-flan--check "and the listing is read-only again afterwards" + buffer-read-only))) (test-flan--writable "(Blob {.id 7})" "Blob" nil