[Top][All Lists]

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

Re: Controling modifications and cuting invisible ?

From: Stefan Monnier
Subject: Re: Controling modifications and cuting invisible ?
Date: 21 May 2003 19:08:02 -0400
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50

> The first one is: how to control precisely how the buffer can be
> modified ? So far, the only way I found was to clear the keymap with
> make-sparse-keymap, and redefine any single key remaining that can
> change something (i.e. ^j ^d etc.). This seems pretty dumb to me. What
> would be the "stylish" way ?

How about (setq buffer-read-only t) ?
You can also unbind C-x C-q so that people can't easily change the
read-only status.  If you want to be nastier, you can also use
the `read-only' text-property.  And if you really want to get nasty, you
can add to that the keymap trick you're already using plus
`modification-hooks', `insert-in-front-hooks' and `insert-behind-hooks'
text-properties plus an overlay with the same properties.  Oh and you can
also add some `keymap' and `local-map' properties with the keymap
you've devised.  That should keep the nasty guys out ;-)

> Also, I use the invisible attribute to hide data field in each line
> (basically the filename associated to a mp3), so that I can use those
> field when I invoke mpg321, while keeping a neat display for the
> user. This works pretty well, but for a reason I do not understand,
> cut/paste operation do not preserve this attribute ... Any clue ?

How do you add the attribute ?  I'd guess you're using overlays (which are
not really associated with the text but only with the locations).
If you use text-properties and it doesn't work, then you'll need to
give us more info so we can figure out what's wrong.

> And the last one: I use an overlay to highlight the current mp3. This
> is neat, but I was not able to find how to make the overlay to cover
> the complete line (i.e. all the width, even if the line stops before),
> without creating weird effect when the user modifies the
> buffer. Basically, to make the overlay as large as the window, I used
> something like:
> (move-overlay mp3play-current-overlay (point-at-bol) (1+ (point-at-eol)))

BTW (1+ (point-at-eol)) is the same as (point-at-bol 2), except when
(point-at-eol) == (point-max).

> the 1+ puting the \n in the overlay. This works as long as I do not
> move a line accross the overlay with the following code:
> (transpose-regions (line-beginning-position) (1+ (line-end-position))
>                    (line-beginning-position 2) (1+ (line-end-position 2)))
> Doing that make the overlay include the line I am moving ...

As mentioned, overlays are not associated with the text but only with
locations.  `transpose-regions' will remove some text from one place and
insert it at some other place, but Emacs has no idea that it's the same text
and that the overlay should be moved with it.  If you use text-properties,
it should work better (but it has other problems for this kind of use).

I suggest that you simply reset the overlay after each command.
Or better yet, just use hl-line-mode (or some other such mode, there are
plenty) which do nothing else than "mark the current line with an overlay".

> Any piece of answer for any of those question will be welcome :)

Tout le plaisir était pour moi,


reply via email to

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