diff --git a/ChangeLog b/ChangeLog index e00dba41..5aa7f447 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2026-03-29 Bob Weiner + +* kotl/kview.el (kview:id-counter-set): Add. + kotl/kotl-mode.el (kotl-mode:kill-tree): Add support for sending 0 as + the prefix arg to say kill from the root of the outline tree all the + way down, killing all cells and inserting a new blank #1 cell in + the buffer. + 2026-03-29 Mats Lidell * hproperty.el: Remove defalias of display-color-p, defined since @@ -51,6 +59,7 @@ 2026-03-28 Bob Weiner + * hypb.el (hypb:sqlite-p): Add to return non-nil when Emacs supports sqlite. (hypb:advised-p): Add to test whether a function has been advised with a specific function. diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el index b997d739..ab0cfa88 100644 --- a/kotl/kotl-mode.el +++ b/kotl/kotl-mode.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 6/30/93 -;; Last-Mod: 19-Feb-26 at 01:12:25 by Bob Weiner +;; Last-Mod: 29-Mar-26 at 12:53:49 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -2780,12 +2780,28 @@ With prefix ARG, kill entire cell contents." (defun kotl-mode:kill-tree (&optional arg) "Kill ARG following trees starting with tree rooted at point. -If ARG is a non-positive number, nothing is done." +An ARG of 0 deletes the entire koutline and inserts an empty #1 cell, +restarting the outline fresh once you save it. + +If ARG is a negative number, nothing is done." (interactive "*p") (or (integerp arg) (setq arg 1)) - (let ((killed) (label (kcell-view:label)) + (let ((killed) + (label (kcell-view:label)) (lbl-sep-len (kview:label-separator-length kotl-kview)) start end sib) + (when (zerop arg) + (setq start (point-min) + end (point-max) + sib nil + killed t) + ;; Don't want to delete any prior cells, so if on last cell, ensure + ;; this is the last one killed. + (if (kotl-mode:last-cell-p) + (progn (setq arg 0) + (kview:delete-region start end)) + (kview:delete-region start end)) + (kview:id-counter-set kotl-kview 0)) (while (> arg 0) (setq start (kotl-mode:tree-start) end (kotl-mode:tree-end) @@ -2798,7 +2814,8 @@ If ARG is a non-positive number, nothing is done." (progn (setq arg 0) (kview:delete-region start end)) (kview:delete-region start end) - (kotl-mode:to-valid-position))) + (unless (kotl-mode:buffer-empty-p) + (kotl-mode:to-valid-position)))) (when killed (cond (sib (klabel-type:update-labels label)) ((kotl-mode:buffer-empty-p) @@ -3224,7 +3241,7 @@ collapsed." (kotl-mode:expand-tree all-flag) (kotl-mode:collapse-tree all-flag))) -;;; +;;; ;;;###autoload (defun kotl-mode:overview (&optional arg) "Show the first line of each cell. @@ -3264,7 +3281,7 @@ With optional prefix ARG, toggle display of blank lines between cells." ;; Restore buffer modification status (set-buffer-modified-p modified-p))) -;;; +;;; (defun kotl-mode:hide-sublevels (levels-to-keep) "Hide all cells in outline at levels deeper than LEVELS-TO-KEEP (a number). Shows any hidden cells within LEVELS-TO-KEEP. 1 is the first level. 0 means diff --git a/kotl/kview.el b/kotl/kview.el index 1d72939e..08a56b8b 100644 --- a/kotl/kview.el +++ b/kotl/kview.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 6/30/93 -;; Last-Mod: 1-Jan-26 at 18:18:36 by Mats Lidell +;; Last-Mod: 29-Mar-26 at 12:34:05 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -848,6 +848,11 @@ On success, return t, else nil." "Return the highest current idstamp (an integer) used by KVIEW." (kcell:get-attr (kview:get-attr kview 'top-cell) 'id-counter)) +(defun kview:id-counter-set (kview id-counter) + "Reset the KVIEW ID-COUNTER for the current buffer. +Use this only after a Koutline has been created." + (kcell:set-attr (kview:get-attr kview 'top-cell) 'id-counter id-counter)) + (defun kview:id-increment (kview) "Return next idstamp (an integer) for KVIEW." (let ((counter (1+ (kview:id-counter kview))))