*** empty log message ***
[bpt/emacs.git] / src / abbrev.c
index e371797..bdb8dc6 100644 (file)
@@ -1,12 +1,12 @@
 /* Primitives for word-abbrev mode.
    Copyright (C) 1985, 1986, 1993, 1996, 1998, 2001, 2002, 2003, 2004,
 /* Primitives for word-abbrev mode.
    Copyright (C) 1985, 1986, 1993, 1996, 1998, 2001, 2002, 2003, 2004,
-                 2005, 2006 Free Software Foundation, Inc.
+                 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -83,7 +83,7 @@ EMACS_INT last_abbrev_point;
 
 Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
 
 
 Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
 
-Lisp_Object Qsystem_type, Qcount;
+Lisp_Object Qsystem_type, Qcount, Qforce;
 \f
 DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
        doc: /* Create a new, empty abbrev table object.  */)
 \f
 DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
        doc: /* Create a new, empty abbrev table object.  */)
@@ -107,10 +107,10 @@ DEFUN ("clear-abbrev-table", Fclear_abbrev_table, Sclear_abbrev_table, 1, 1, 0,
     XVECTOR (table)->contents[i] = make_number (0);
   return Qnil;
 }
     XVECTOR (table)->contents[i] = make_number (0);
   return Qnil;
 }
-\f
+
 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.
 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.
+NAME must be a string, and should be lower-case.
 EXPANSION should usually be a string.
 To undefine an abbrev, define it with EXPANSION = nil.
 If HOOK is non-nil, it should be a function of no arguments;
 EXPANSION should usually be a string.
 To undefine an abbrev, define it with EXPANSION = nil.
 If HOOK is non-nil, it should be a function of no arguments;
@@ -123,7 +123,9 @@ usage-count, which is incremented each time the abbrev is used.
 \(The default is zero.)
 
 SYSTEM-FLAG, if non-nil, says that this is a "system" abbreviation
 \(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;
 {
      (table, name, expansion, hook, count, system_flag)
      Lisp_Object table, name, expansion, hook, count, system_flag;
 {
@@ -131,6 +133,16 @@ which should not be saved in the user's abbreviation file.  */)
   CHECK_VECTOR (table);
   CHECK_STRING (name);
 
   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
   if (NILP (count))
     count = make_number (0);
   else
@@ -640,6 +652,9 @@ syms_of_abbrev ()
   Qcount = intern ("count");
   staticpro (&Qcount);
 
   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"),
   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"),
@@ -664,7 +679,7 @@ for any particular abbrev defined in both.  */);
 
   DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_text,
               doc: /* The exact text of the last abbrev expanded.
 
   DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_text,
               doc: /* The exact text of the last abbrev expanded.
-nil if the abbrev has already been unexpanded.  */);
+A value of nil means the abbrev has already been unexpanded.  */);
 
   DEFVAR_INT ("last-abbrev-location", &last_abbrev_point,
              doc: /* The location of the start of the last abbrev expanded.  */);
 
   DEFVAR_INT ("last-abbrev-location", &last_abbrev_point,
              doc: /* The location of the start of the last abbrev expanded.  */);