[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] [emacs] 01/02: Implement an `inhibit-read-only' text prope
From: |
Lars Ingebrigtsen |
Subject: |
[Emacs-diffs] [emacs] 01/02: Implement an `inhibit-read-only' text property |
Date: |
Sun, 16 Nov 2014 22:42:16 +0000 |
larsi pushed a commit to branch master
in repository emacs.
commit d1b04a9e7ada7070dbd84bb450411c1f169b3739
Author: Lars Magne Ingebrigtsen <address@hidden>
Date: Sun Nov 16 23:36:58 2014 +0100
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.
---
doc/lispref/ChangeLog | 4 ++++
doc/lispref/text.texi | 5 +++++
etc/NEWS | 3 +++
src/ChangeLog | 19 +++++++++++++++++++
src/buffer.c | 18 +++++++++++++-----
src/callint.c | 6 +++---
src/fileio.c | 2 +-
src/insdel.c | 4 +++-
src/intervals.h | 1 +
src/textprop.c | 5 +++++
10 files changed, 57 insertions(+), 10 deletions(-)
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index 9772391..b7423af 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,7 @@
+2014-11-16 Lars Magne Ingebrigtsen <address@hidden>
+
+ * text.texi (Special Properties): Mention `inhibit-read-only'.
+
2014-11-14 Paul Eggert <address@hidden>
* os.texi (Time of Day):
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index f21d2b7..d1a1e6f 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -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 address@hidden value
and then remove the property. @xref{Read Only Buffers}.
address@hidden inhibit-read-only
address@hidden 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 address@hidden @code{invisible} property can make a character invisible
diff --git a/etc/NEWS b/etc/NEWS
index 2172d07..b0e08d4 100644
--- a/etc/NEWS
+++ b/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
diff --git a/src/ChangeLog b/src/ChangeLog
index 7bb1666..d188898 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,22 @@
+2014-11-16 Lars Magne Ingebrigtsen <address@hidden>
+
+ * 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 <address@hidden>
* window.c (window_scroll_pixel_based): Avoid truncation/rounding
diff --git a/src/buffer.c b/src/buffer.c
index 80791a1..9bdbfb8 100644
--- a/src/buffer.c
+++ b/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;
}
diff --git a/src/callint.c b/src/callint.c
index 9a4573c..9467695 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -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;
diff --git a/src/fileio.c b/src/fileio.c
index 7d7b0b3..b8dec3a 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -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;
diff --git a/src/insdel.c b/src/insdel.c
index 463392d..3133ca4 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -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);
diff --git a/src/intervals.h b/src/intervals.h
index 4e7a177..bd1f49d 100644
--- a/src/intervals.h
+++ b/src/intervals.h
@@ -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)) \
diff --git a/src/textprop.c b/src/textprop.c
index 91ade8a..7ecac62 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -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. */