Implement an `inhibit-read-only' text property
* doc/lispref/text.texi (Special Properties): Mention `inhibit-read-only'. * src/buffer.c (Fbarf_if_buffer_read_only): Don't raise an error if the text at POSITION (new optional argument) has the `inhibit-read-only' text property set. * src/callint.c (Fcall_interactively): Pass in nil as argument to Fbarf_if_buffer_read_only. * src/fileio.c (Finsert_file_contents): Ditto. * src/insdel.c (prepare_to_modify_buffer_1): Pass start region in. * src/intervals.h (INTERVAL_WRITABLE_P): Check the `inhibit-read-only' text property. * src/textprop.c (verify_interval_modification): Check buffer readedness after the last interval.
This commit is contained in:
parent
c94988f4b7
commit
d1b04a9e7a
10 changed files with 56 additions and 9 deletions
|
@ -1,3 +1,7 @@
|
|||
2014-11-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
|
||||
|
||||
* text.texi (Special Properties): Mention `inhibit-read-only'.
|
||||
|
||||
2014-11-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* os.texi (Time of Day):
|
||||
|
|
|
@ -3241,6 +3241,11 @@ possible to remove a @code{read-only} property unless you know the
|
|||
special trick: bind @code{inhibit-read-only} to a non-@code{nil} value
|
||||
and then remove the property. @xref{Read Only Buffers}.
|
||||
|
||||
@item inhibit-read-only
|
||||
@kindex inhibit-read-only @r{(text property)}
|
||||
If a character has the property @code{inhibit-read-only}, and the
|
||||
buffer is read-only, editing the character in question is allowed.
|
||||
|
||||
@item invisible
|
||||
@kindex invisible @r{(text property)}
|
||||
A non-@code{nil} @code{invisible} property can make a character invisible
|
||||
|
|
3
etc/NEWS
3
etc/NEWS
|
@ -107,6 +107,9 @@ non-native NS fullscreen. The default is nil. Set to t to enable
|
|||
animation when entering and leaving fullscreen. For native OSX fullscreen
|
||||
this has no effect.
|
||||
|
||||
*** A new text property `inhibit-read-only' can be used in read-only
|
||||
buffers to allow certain parts of the text to be writable.
|
||||
|
||||
|
||||
* Editing Changes in Emacs 25.1
|
||||
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
2014-11-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
|
||||
|
||||
* intervals.h (INTERVAL_WRITABLE_P): Check the `inhibit-read-only'
|
||||
text property.
|
||||
|
||||
* callint.c (Fcall_interactively): Pass in nil as argument to
|
||||
Fbarf_if_buffer_read_only.
|
||||
|
||||
* fileio.c (Finsert_file_contents): Ditto.
|
||||
|
||||
* insdel.c (prepare_to_modify_buffer_1): Pass start region in.
|
||||
|
||||
* textprop.c (verify_interval_modification): Check buffer
|
||||
readedness after the last interval.
|
||||
|
||||
* buffer.c (Fbarf_if_buffer_read_only): Don't raise an error if
|
||||
the text at POSITION (new optional argument) has the
|
||||
`inhibit-read-only' text property set.
|
||||
|
||||
2014-11-16 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* window.c (window_scroll_pixel_based): Avoid truncation/rounding
|
||||
|
|
16
src/buffer.c
16
src/buffer.c
|
@ -2184,12 +2184,20 @@ set_buffer_if_live (Lisp_Object buffer)
|
|||
}
|
||||
|
||||
DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
|
||||
Sbarf_if_buffer_read_only, 0, 0, 0,
|
||||
doc: /* Signal a `buffer-read-only' error if the current buffer is read-only. */)
|
||||
(void)
|
||||
Sbarf_if_buffer_read_only, 0, 1, 0,
|
||||
doc: /* Signal a `buffer-read-only' error if the current buffer is read-only.
|
||||
If the text under POSITION (which defaults to point) has the
|
||||
`inhibit-read-only' text property set, the error will not be raised. */)
|
||||
(Lisp_Object pos)
|
||||
{
|
||||
if (NILP (pos))
|
||||
XSETFASTINT (pos, PT);
|
||||
else
|
||||
CHECK_NUMBER (pos);
|
||||
|
||||
if (!NILP (BVAR (current_buffer, read_only))
|
||||
&& NILP (Vinhibit_read_only))
|
||||
&& NILP (Vinhibit_read_only)
|
||||
&& NILP (Fget_text_property (pos, Qinhibit_read_only, Qnil)))
|
||||
xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
|
||||
return Qnil;
|
||||
}
|
||||
|
|
|
@ -448,13 +448,13 @@ invoke it. If KEYS is omitted or nil, the return value of
|
|||
{
|
||||
if (! (*p == 'r' || *p == 'p' || *p == 'P'
|
||||
|| *p == '\n'))
|
||||
Fbarf_if_buffer_read_only ();
|
||||
Fbarf_if_buffer_read_only (Qnil);
|
||||
p++;
|
||||
}
|
||||
record_then_fail = 1;
|
||||
}
|
||||
else
|
||||
Fbarf_if_buffer_read_only ();
|
||||
Fbarf_if_buffer_read_only (Qnil);
|
||||
}
|
||||
}
|
||||
/* Ignore this for semi-compatibility with Lucid. */
|
||||
|
@ -865,7 +865,7 @@ invoke it. If KEYS is omitted or nil, the return value of
|
|||
XSETINT (args[i], marker_position (args[i]));
|
||||
|
||||
if (record_then_fail)
|
||||
Fbarf_if_buffer_read_only ();
|
||||
Fbarf_if_buffer_read_only (Qnil);
|
||||
|
||||
Vthis_command = save_this_command;
|
||||
Vthis_original_command = save_this_original_command;
|
||||
|
|
|
@ -3471,7 +3471,7 @@ by calling `format-decode', which see. */)
|
|||
error ("Cannot do file visiting in an indirect buffer");
|
||||
|
||||
if (!NILP (BVAR (current_buffer, read_only)))
|
||||
Fbarf_if_buffer_read_only ();
|
||||
Fbarf_if_buffer_read_only (Qnil);
|
||||
|
||||
val = Qnil;
|
||||
p = Qnil;
|
||||
|
|
|
@ -1797,9 +1797,11 @@ prepare_to_modify_buffer_1 (ptrdiff_t start, ptrdiff_t end,
|
|||
ptrdiff_t *preserve_ptr)
|
||||
{
|
||||
struct buffer *base_buffer;
|
||||
Lisp_Object temp;
|
||||
|
||||
XSETFASTINT (temp, start);
|
||||
if (!NILP (BVAR (current_buffer, read_only)))
|
||||
Fbarf_if_buffer_read_only ();
|
||||
Fbarf_if_buffer_read_only (temp);
|
||||
|
||||
bset_redisplay (current_buffer);
|
||||
|
||||
|
|
|
@ -197,6 +197,7 @@ set_interval_plist (INTERVAL i, Lisp_Object plist)
|
|||
/* Is this interval writable? Replace later with cache access. */
|
||||
#define INTERVAL_WRITABLE_P(i) \
|
||||
(i && (NILP (textget ((i)->plist, Qread_only)) \
|
||||
|| !NILP (textget ((i)->plist, Qinhibit_read_only)) \
|
||||
|| ((CONSP (Vinhibit_read_only) \
|
||||
? !NILP (Fmemq (textget ((i)->plist, Qread_only), \
|
||||
Vinhibit_read_only)) \
|
||||
|
|
|
@ -2298,6 +2298,11 @@ verify_interval_modification (struct buffer *buf,
|
|||
}
|
||||
}
|
||||
|
||||
if (i->position + LENGTH (i) < end
|
||||
&& (!NILP (BVAR (current_buffer, read_only))
|
||||
&& NILP (Vinhibit_read_only)))
|
||||
xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
|
||||
|
||||
i = next_interval (i);
|
||||
}
|
||||
/* Keep going thru the interval containing the char before END. */
|
||||
|
|
Loading…
Add table
Reference in a new issue