From: Jim Porter <jporterbugs@gmail.com>
To: 68881@debbugs.gnu.org
Subject: bug#68881: 30.0.50; [PATCH] Field properties confuse 'outline-minor-mode'
Date: Thu, 1 Feb 2024 15:51:57 -0800 [thread overview]
Message-ID: <83986cee-a32d-707f-6ee0-ec1ba2bd42c2@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 960 bytes --]
I'd like to add support for 'outline-minor-mode' in Eshell. However,
Eshell's use of field properties confuses outline.el. Attached is a WIP
patch + demo code for Eshell that should resolve this.
The main issue was that outline.el uses 'line-beginning-position' and
friends, which respects field boundaries, but I think we want to avoid
that for 'outline-minor-mode'. Maybe we could use 'pos-bol' and friends
instead, but my understanding is that 'line-beginning-position' respects
display directionality (which we probably want), but 'pos-bol' doesn't.
You can try things out here by starting Eshell and activating
'outline-minor-mode'. You can also see the problems by applying only the
Eshell part of the patch.
Any thoughts? Is this the right way to go about this? (Note: I think the
Eshell side of things will take more work, which I'll address in a later
bug. However, this should be enough to show off the problems on the
outline.el side.)
[-- Attachment #2: 0001-WIP-Make-outline.el-able-to-handle-buffers-with-fiel.patch --]
[-- Type: text/plain, Size: 5860 bytes --]
From fad64a23e38fbc43cee121db78f00e255df3ecd8 Mon Sep 17 00:00:00 2001
From: Jim Porter <jporterbugs@gmail.com>
Date: Thu, 1 Feb 2024 13:58:20 -0800
Subject: [PATCH] [WIP] Make outline.el able to handle buffers with field
properties
* lisp/outline.el (outline-back-to-heading, outline-on-heading-p)
(outline-next-visible-heading, outline-mark-subtree)
(outline-hide-sublevels, outline--insert-button)
(outline--fix-up-all-buttons): Inhibit field text motion.
* lisp/eshell/em-prompt.el (eshell-outline-search): New function (for
testing only).
(eshell-prompt-initialize): Initialize outline-mode variables.
---
lisp/eshell/em-prompt.el | 14 +++++++++++++-
lisp/outline.el | 32 +++++++++++++++++++++-----------
2 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/lisp/eshell/em-prompt.el b/lisp/eshell/em-prompt.el
index 3662c1fa895..bf3a24689f8 100644
--- a/lisp/eshell/em-prompt.el
+++ b/lisp/eshell/em-prompt.el
@@ -107,6 +107,14 @@ eshell-prompt-repeat-map
;;; Functions:
+(defun eshell-outline-search (&optional bound move backward looking-at)
+ "Search for outline headings. See `outline-search-function'."
+ ;; FIXME: This probably isn't the right way to do things. Does it
+ ;; work with multiline prompts? Still, it's useful for a proof of
+ ;; concept.
+ (outline-search-text-property 'field 'prompt bound move backward
+ looking-at))
+
(define-minor-mode eshell-prompt-mode
"Minor mode for eshell-prompt module.
@@ -117,7 +125,11 @@ eshell-prompt-initialize
"Initialize the prompting code."
(unless eshell-non-interactive-p
(add-hook 'eshell-post-command-hook 'eshell-emit-prompt nil t)
- (eshell-prompt-mode)))
+ (eshell-prompt-mode)
+
+ (setq-local outline-search-function #'eshell-outline-search
+ outline-level (lambda () 1)
+ outline-minor-mode-use-buttons 'in-margins)))
(defun eshell-emit-prompt ()
"Emit a prompt if eshell is being used interactively."
diff --git a/lisp/outline.el b/lisp/outline.el
index b50708c1a7b..e7e8d269640 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -686,7 +686,8 @@ 'outline-before-first-heading
(defun outline-back-to-heading (&optional invisible-ok)
"Move to previous heading line, or beg of this line if it's a heading.
Only visible heading lines are considered, unless INVISIBLE-OK is non-nil."
- (beginning-of-line)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
(or (outline-on-heading-p invisible-ok)
(let (found)
(save-excursion
@@ -705,7 +706,8 @@ outline-on-heading-p
"Return t if point is on a (visible) heading line.
If INVISIBLE-OK is non-nil, an invisible heading line is ok too."
(save-excursion
- (beginning-of-line)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
(and (bolp) (or invisible-ok (not (outline-invisible-p)))
(if outline-search-function
(funcall outline-search-function nil nil nil t)
@@ -941,9 +943,10 @@ outline-next-visible-heading
A heading line is one that starts with a `*' (or that
`outline-regexp' matches)."
(interactive "p")
- (if (< arg 0)
- (beginning-of-line)
- (end-of-line))
+ (let ((inhibit-field-text-motion t))
+ (if (< arg 0)
+ (beginning-of-line)
+ (end-of-line)))
(let ((regexp (unless outline-search-function
(concat "^\\(?:" outline-regexp "\\)")))
found-heading-p)
@@ -963,7 +966,9 @@ outline-next-visible-heading
(re-search-forward regexp nil 'move)))
(outline-invisible-p (match-beginning 0))))
(setq arg (1- arg)))
- (if found-heading-p (beginning-of-line))))
+ (if found-heading-p
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line)))))
(defun outline-previous-visible-heading (arg)
"Move to the previous heading line.
@@ -980,7 +985,8 @@ outline-mark-subtree
(let ((beg))
(if (outline-on-heading-p)
;; we are already looking at a heading
- (beginning-of-line)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
;; else go back to previous heading
(outline-previous-visible-heading 1))
(setq beg (point))
@@ -1183,7 +1189,8 @@ outline-hide-sublevels
(cond
(current-prefix-arg (prefix-numeric-value current-prefix-arg))
((save-excursion
- (beginning-of-line)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
(if outline-search-function
(funcall outline-search-function nil nil nil t)
(looking-at outline-regexp)))
@@ -1834,13 +1841,15 @@ outline--create-button-icons
(defun outline--insert-button (type)
(with-silent-modifications
(save-excursion
- (beginning-of-line)
+ (let ((inhibit-field-text-motion t))
+ (beginning-of-line))
(let ((icon (nth (if (eq type 'close) 1 0) outline--button-icons))
(o (seq-find (lambda (o) (overlay-get o 'outline-button))
(overlays-at (point)))))
(unless o
(when (eq outline-minor-mode-use-buttons 'insert)
- (let ((inhibit-read-only t))
+ (let ((inhibit-read-only t)
+ (inhibit-field-text-motion t))
(insert (apply #'propertize " " (text-properties-at (point))))
(beginning-of-line)))
(setq o (make-overlay (point) (1+ (point))))
@@ -1866,7 +1875,8 @@ outline--fix-up-all-buttons
(when from
(save-excursion
(goto-char from)
- (setq from (line-beginning-position))))
+ (let ((inhibit-field-text-motion t))
+ (setq from (line-beginning-position)))))
(outline-map-region
(lambda ()
(let ((close-p (save-excursion
--
2.25.1
next reply other threads:[~2024-02-01 23:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-01 23:51 Jim Porter [this message]
2024-02-07 17:37 ` bug#68881: 30.0.50; [PATCH] Field properties confuse 'outline-minor-mode' Juri Linkov
2024-02-10 18:22 ` Jim Porter
2024-02-10 19:23 ` Eli Zaretskii
2024-02-10 21:14 ` Jim Porter
2024-02-11 6:07 ` Eli Zaretskii
2024-02-11 7:08 ` Jim Porter
2024-02-11 17:40 ` Juri Linkov
2024-02-11 18:19 ` Jim Porter
2024-02-12 18:25 ` Juri Linkov
2024-02-13 4:03 ` Jim Porter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83986cee-a32d-707f-6ee0-ec1ba2bd42c2@gmail.com \
--to=jporterbugs@gmail.com \
--cc=68881@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.