changeset 74435:b18d856c25f1

(Qforce): New Lisp_Object. (Fdefine_abbrev): Do not overwrite non-system abbrevs with system abbrevs, unless 'force is applied. (syms_of_abbrev): Add Qforce.
author Glenn Morris <rgm@gnu.org>
date Tue, 05 Dec 2006 05:29:21 +0000
parents 2b464ae7b20e
children 3272b45bb643
files src/abbrev.c
diffstat 1 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/abbrev.c	Tue Dec 05 05:26:08 2006 +0000
+++ b/src/abbrev.c	Tue Dec 05 05:29:21 2006 +0000
@@ -83,7 +83,7 @@
 
 Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
 
-Lisp_Object Qsystem_type, Qcount;
+Lisp_Object Qsystem_type, Qcount, Qforce;
 
 DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
        doc: /* Create a new, empty abbrev table object.  */)
@@ -107,7 +107,7 @@
     XVECTOR (table)->contents[i] = make_number (0);
   return Qnil;
 }
-
+
 DEFUN ("define-abbrev", Fdefine_abbrev, Sdefine_abbrev, 3, 6, 0,
        doc: /* Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK.
 NAME must be a string.
@@ -123,7 +123,9 @@
 \(The default is zero.)
 
 SYSTEM-FLAG, if non-nil, says that this is a "system" abbreviation
-which should not be saved in the user's abbreviation file.  */)
+which should not be saved in the user's abbreviation file.
+Unless SYSTEM-FLAG is `force', a system abbreviation will not
+overwrite a non-system abbreviation of the same name.  */)
      (table, name, expansion, hook, count, system_flag)
      Lisp_Object table, name, expansion, hook, count, system_flag;
 {
@@ -131,6 +133,16 @@
   CHECK_VECTOR (table);
   CHECK_STRING (name);
 
+  /* If defining a system abbrev, do not overwrite a non-system abbrev
+     of the same name, unless 'force is used. */
+  if (!NILP (system_flag) && !EQ (system_flag, Qforce))
+    {
+      sym = Fintern_soft (name, table);
+
+      if (!NILP (SYMBOL_VALUE (sym)) &&
+          NILP (Fplist_get (XSYMBOL (sym)->plist, Qsystem_type))) return Qnil;
+    }
+
   if (NILP (count))
     count = make_number (0);
   else
@@ -640,6 +652,9 @@
   Qcount = intern ("count");
   staticpro (&Qcount);
 
+  Qforce = intern ("force");
+  staticpro (&Qforce);
+
   DEFVAR_LISP ("abbrev-table-name-list", &Vabbrev_table_name_list,
 	       doc: /* List of symbols whose values are abbrev tables.  */);
   Vabbrev_table_name_list = Fcons (intern ("fundamental-mode-abbrev-table"),