emacs-devel
[Top][All Lists]
Advanced

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

Re: invisible


From: martin rudalics
Subject: Re: invisible
Date: Mon, 26 Nov 2007 08:59:50 +0100
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

> If you have a conrete situation where the current behavior is
> problematic, firsyt you need to understand how those things work:
> there are 2 places where invisibility impacts movement:
> - when combined with `intangible', it impacts every single movement of
>   `point', including within elisp functions.  This may "do the right
>   thing" in some sense, but it tends to break a lot of code, and
>   it can be terribly difficult to write code that works in the face of
>   intangible properties.  So I highly recommend against the use of
>   `intangible' except for those rare cases where it's *really*
>   absolutely needed.

Intangible text was never mentioned in this thread.

> - when not combined with `intangible', invisible properties have the
>   effect (just like composition and display properties) that after each
>   *command* (i..e more or less just after running post-command-hook)
>   point is moved outside of the invisible text.  Now since it's done at
>   the end of a command (which may have moved point many times in
>   arbitrarily complex ways), you can't do it right 100% of the time.
>   OTOH this interacts fine with pretty much any elisp code.
>
> Many of the problems you point out have to do with interactions with C-n
> and C-p which are surprisingly complex functions.  The interaction
> between all three is even worse.
>
> So if you can try and reproduce the problem with only C-n/C-p (i.e. no
> intangible text and with non-nil disable-point-adjustement) or with
> only intangible text or with only invisible text, that makes it more
> likely we can try and fix it.

This thread is about `line-move-ignore-invisible' - an option defined in
simple.el with the following doc-string:

          *Non-nil means C-n and C-p ignore invisible lines.
          Outline mode sets this.

Either this option makes sense - then we have to talk about C-n/C-p
_and_ invisible text - or it doesn't.  In the latter case let's remove
the option and the problem is resolved.

> Also the interaction with those things is sufficiently bad, that there
> are many problematic cases.  So if the problem only appears when you mix
> those, to have a better chance of seeing your bug fixed, try to make
> sure the symptom is really serious: e.g. C-n does move at all (or moves
> backward).

I never use "those things" hence I don't care about whether these
qualify as "serious symptoms".  I just reacted to a couple of problems
reported by others.  One of these was

         "the cursor stays put, i.e., C-p is a no-op here"

reported in 2004.  Apparently, it didn't have much chance getting fixed
then.

> And focus on *1* problem at a time.

I focused on *1* solution at a time.

>>Meanwhile could you please check my patch for simple.el too?
>
>
> Please post it again,

Attached.
*** simple.el.~1.888.~  Sat Nov 10 09:23:20 2007
--- simple.el   Sun Nov 18 16:02:42 2007
***************
*** 3862,3868 ****
             (save-excursion
               ;; Like end-of-line but ignores fields.
               (skip-chars-forward "^\n")
!              (while (and (not (eobp)) (invisible-p (point)))
                 (goto-char (next-char-property-change (point)))
                 (skip-chars-forward "^\n"))
               (point))))
--- 3862,3869 ----
             (save-excursion
               ;; Like end-of-line but ignores fields.
               (skip-chars-forward "^\n")
!              (while (and line-move-ignore-invisible
!                          (not (eobp)) (invisible-p (point)))
                 (goto-char (next-char-property-change (point)))
                 (skip-chars-forward "^\n"))
               (point))))
***************
*** 3940,3948 ****
  This function works only in certain cases,
  because what we really need is for `move-to-column'
  and `current-column' to be able to ignore invisible text."
!   (if (zerop col)
!       (beginning-of-line)
      (move-to-column col))

    (when (and line-move-ignore-invisible
             (not (bolp)) (invisible-p (1- (point))))
--- 3941,3956 ----
  This function works only in certain cases,
  because what we really need is for `move-to-column'
  and `current-column' to be able to ignore invisible text."
!   (cond
!    ((zerop col)
!     (beginning-of-line))
!    (line-move-ignore-invisible
      (move-to-column col))
+    (t
+     ;; Tedious.
+     (save-restriction
+       (narrow-to-region (line-beginning-position) (line-end-position))
+       (move-to-column col))))

    (when (and line-move-ignore-invisible
             (not (bolp)) (invisible-p (1- (point))))

reply via email to

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