unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Alan Mackenzie <acm@muc.de>
Cc: "Vitalie Spinu" <spinuvit@gmail.com>,
	"Andreas Röhler" <andreas.roehler@online.de>,
	emacs-devel@gnu.org, "Stefan Monnier" <monnier@iro.umontreal.ca>,
	"Eli Zaretskii" <eliz@gnu.org>,
	"Drew Adams" <drew.adams@oracle.com>
Subject: Re: A vision for multiple major modes [was: Re: [Emacs-diffs] widen-limits c331b66:]
Date: Fri, 25 Mar 2016 02:11:34 +0200	[thread overview]
Message-ID: <a79d408a-20f4-acc8-6ebc-dd8ee61531b8@yandex.ru> (raw)
In-Reply-To: <20160324183835.GB2721@acm.fritz.box>

On 03/24/2016 08:38 PM, Alan Mackenzie wrote:

>> Each multi-mode package implements something like this already. It
>> doesn't work well e.g. because font-lock rules of each particular
>> language, indentation code, etc, are free to widen.
>
> With islands it should work well, regardless of whether any major mode
> widens or narrows.  That's because primitives (such as regexp search)
> would constrain themselves to the island.

It might work well. Without so much as a proof of concept, there's no 
way to tell, really.

>>> For this we will need a new type of local variable, an "island-local" or
>>> "span-local" variable, or whatever you want to call it.  Values of these
>>> variables will vary according to where point is.
>
>> That part is already doable (and done), for most practical purposes.
>
> Except you said above that it doesn't work very well.

Submode-local, and chunk-local, variables work fine. But you don't get 
functioning facilities just by having variables.

>> You'll have to present the total list of facilities, decide how the
>> islands would be applied, and other issues will likely come up from
>> unexpected places.
>
> That will require more investigation.  But syntax based searching and
> regexp based searching will certainly be amongst them.

What about looking-at? char-after? syntax-after? forward-char? 
goto-char? Speaking of the last one, will the buffer positions, as 
visible to the submode code, be renumerated, or will they have gaps?

The above are just some prominent functions that are frequently used in 
indentation code.

> The island-local variables would stay with the island, so that when
> somebody inserts or removes text the right thing would be done.  If
> somebody deletes the island, those variables would disappear (just as
> buffer local ones do when a buffer is deleted).

Depending on your answer to the previous question, even simply inserting 
text inside one of the preceding islands might make syntax-ppss-cache 
out of date in the current island.

>> On the one hand, we'd probably want to retain some variables, in order
>> not to rerun the major mode functions over and over again. On the
>> other hand, if we were to put e.g.  syntax-ppss-last into an
>> island-local variable (and it's a logical continuation of this idea),
>> after island boundaries change it should what... become unbound? Nil?
>
> That's for the application to decide.  The island local binding would
> countinue to exist for as long as the island exists, and the application
> would be free to use it.

Something would have to create and maintain the island identities, as 
users add and remove text, including island delimiters, it's not like 
Emacs could do that automagically. My point is, implementing significant 
part in Elisp is unavoidable anyway.

>> Next, at which points exactly would Emacs look at the island boundaries
>> and change the island-local variables to the values set in the current
>> island? Probably not after each point movement. In post-command-hook?
>> That's also already done.
>
> It wouldn't use any high level facility like post-command-hook.  The
> mechanism would be more like a buffer local variable, entirely handled
> by the C level, so that such a binding would simply exist.

You didn't answer my question, though. When will the bindings apply?

>>> Although the above vision implies a lot of development work, there is
>>> nothing there which is beyond our abilities to implement readily.  It
>>> would give us a true multi major mode capability, yet the impact on
>>> individual major modes would be minimal.
>
> I'm worried by this.  Already narrowing/widening which is currently
> simple, straightforward, and rigorously defined, is looking like
> becoming complicated.  Major modes are going to be constrained in what
> they can do.

A lot of code is already constrained. That's why we most often use 
(point-min) instead of 1. The only unconstrained code we currently have 
is the one that starts with (widen).

> I get the impression that major modes are going to be
> restricted in how they can use parse-partial-sexp.  These are serious
> matters, but I haven't seen any widespread debate on emacs-devel about
> them.

Most parse-partial-sexp uses don't call `widen' in advance.

>> On the other hand, using narrowing for multi-mode purpose is a familiar
>> ground already, and the changes in Emacs core required to do so are
>> minimal. And most of the code written for Emacs has been taught to
>> respect narrowing bounds (even if only by the virtue of always using
>> (point-min) instead of 1), so we can utilize that.
>
> What is "(narrow-to-region 1 (point-max))" going to become?  It seems
> there will be a need for "the bounds of the island", which will impose
> complexities in major mode code.

Replacing '1' with (point-min) everywhere sounds like a minor change all 
modes can bear.

I don't know if we'd need the island-beginnig/island-end accessors in 
your proposal.

> How will this be done when narrowing is the tool used?  It you narrow to
> an island, none of the other islands in a chain are visible.  If you
> narrow to the smallest region which spans those islands, you leave a lot
> of stuff visible which shouldn't be.

a) You can assign whitespace syntax to that stuff (which should cover 
many use cases).

b) You can use a temporary buffer.

>> Doing that using an islands framework limits it to a
>> predefined set of semantics (e.g. all Ruby islands see all other Ruby
>> islands).
>
> I don't see why.  There's no reason why islands couldn't be linked to
> and unlinked from eachother freely at runtime.

Very well.

>> That's not to say that being able to make parse-partial-sexp to skip
>> over certain intervals wouldn't be valuable. But you can do that, sort
>> of, already, by applying existing text properties to those intervals
>> (like beginning-of-comment/end-of-comment, or just "whitespace" over the
>> whole of it), and then removing them at the end of an operation.
>
> Not really.  If you "whitespace" a region out, you've got to remember
> the text properties that were there originally, and restore them
> afterwards.  There's no easy way to do that.

I think it's doable using char-property-alias-alist. The multi-mode will 
define its own property as an alias of `syntax-table', and then put it 
on and remove it from text at will.

> The comment-fence text
> properties won't work either, because, in the general case, there will
> already be comment-fence properties in your region which will foul
> things up.

Yeah, that's a plausible problem. So at least your proposal could pivot 
into something like new kind of high-priority, generic comment fences. 
Or maybe just being able to assign priorities to the "generic comment" 
syntax-table values.

> I'm worried that the multi-mode projects will suborn these
> text properties, making them unavailable for major modes to use.

See the "alias" suggestion.

>> But the end benefits might not be high enough to justify the necessary
>> work and the increase in complexity in internals.
>
> They might not.  They might.  Basically, nobody else really seams
> interested in my idea, so it doesn't look like it will happen.

It sounds somewhat attractive to me, but we should understand more 
clearly the goals we'll reach with it, as well as the semantics of the 
new feature.

In order to deliver on the promise of seamless-ness, I think the islands 
should be able to believe that every one of them starts with position 1, 
and that they all have no gaps. I.e. every primitive would have to 
behave that way, at least as long as the relevant global variable is 
non-nil.



  parent reply	other threads:[~2016-03-25  0:11 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20160322022539.16038.77264@vcs.savannah.gnu.org>
     [not found] ` <E1aiC0q-0004DL-40@vcs.savannah.gnu.org>
2016-03-22 12:08   ` [Emacs-diffs] widen-limits c331b66: Implement buffer-widen-limits functionality Stefan Monnier
2016-03-22 19:44     ` Vitalie Spinu
2016-03-22 19:56       ` Drew Adams
2016-03-22 22:42         ` Vitalie Spinu
2016-03-23  0:44           ` Drew Adams
2016-03-23  7:16             ` Andreas Röhler
2016-03-23 11:58               ` Vitalie Spinu
2016-03-23 13:02                 ` Andreas Röhler
2016-03-23 14:17                   ` Vitalie Spinu
2016-03-23 15:34                     ` Eli Zaretskii
2016-03-23 17:24                       ` Andreas Röhler
2016-03-23 17:55                         ` Eli Zaretskii
2016-03-23 18:53                           ` Andreas Röhler
2016-03-23 21:57                             ` Drew Adams
2016-03-23 22:13                               ` Vitalie Spinu
2016-03-23 23:03                                 ` Drew Adams
2016-03-24  3:38                                 ` Eli Zaretskii
2016-03-24 12:24                                   ` Dmitry Gutov
2016-03-24 15:56                                     ` Eli Zaretskii
2016-03-24 18:55                                       ` Removing prog-indentation-context (was: [Emacs-diffs] widen-limits c331b66: Implement buffer-widen-limits functionality) Stefan Monnier
2016-03-25  0:53                                         ` Removing prog-indentation-context Dmitry Gutov
2016-03-25  1:29                                           ` Dmitry Gutov
2016-03-25  2:09                                           ` Stefan Monnier
2016-03-25 11:38                                             ` Dmitry Gutov
2016-03-26 22:29                                               ` John Wiegley
2016-03-28  1:03                                                 ` Dmitry Gutov
2016-03-25 15:45                                           ` Vitalie Spinu
2016-03-28 21:37                                             ` Dmitry Gutov
2016-03-28 22:08                                               ` Stefan Monnier
2016-03-28 22:55                                                 ` Dmitry Gutov
2016-03-28 23:24                                                   ` Stefan Monnier
2016-03-28  1:03                                       ` [Emacs-diffs] widen-limits c331b66: Implement buffer-widen-limits functionality Dmitry Gutov
2016-03-24  3:37                               ` Eli Zaretskii
2016-03-23 17:14                     ` Andreas Röhler
2016-03-24  0:03                       ` Vitalie Spinu
2016-03-24  0:37                         ` Drew Adams
2016-03-24  2:36                           ` Vitalie Spinu
2016-03-24 13:53                             ` Drew Adams
2016-03-24 13:57                               ` Dmitry Gutov
2016-03-24 14:31                                 ` Drew Adams
2016-03-24 14:56                                   ` Stefan Monnier
2016-03-24 15:13                                     ` Drew Adams
2016-03-24 15:20                                       ` Stefan Monnier
2016-03-24  7:00                         ` Andreas Röhler
2016-03-23 14:29                 ` Drew Adams
2016-03-23 21:16                 ` A vision for multiple major modes [was: Re: [Emacs-diffs] widen-limits c331b66:] Alan Mackenzie
2016-03-23 21:58                   ` Vitalie Spinu
2016-03-24 17:44                     ` Alan Mackenzie
2016-03-24 20:43                       ` Vitalie Spinu
2016-03-23 22:34                   ` Dmitry Gutov
2016-03-24 18:38                     ` Alan Mackenzie
2016-03-24 20:22                       ` Vitalie Spinu
2016-03-25  0:11                       ` Dmitry Gutov [this message]
2016-03-27 12:09                         ` Alan Mackenzie
2016-03-27 22:59                           ` Dmitry Gutov
2016-03-29  0:07                             ` Alan Mackenzie
2016-04-01  1:15                               ` Dmitry Gutov
2016-04-05 16:29                                 ` Alan Mackenzie
2016-04-05 22:52                                   ` Dmitry Gutov
2016-04-18 21:32                                     ` Alan Mackenzie
2016-03-28 13:00                       ` Filipp Gunbin
2016-03-25 18:20                   ` Phillip Lord

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a79d408a-20f4-acc8-6ebc-dd8ee61531b8@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=acm@muc.de \
    --cc=andreas.roehler@online.de \
    --cc=drew.adams@oracle.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    --cc=spinuvit@gmail.com \
    /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 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).