Annotation of 43BSD/contrib/emacs/src/cmds.c, revision 1.1

1.1     ! root        1: /* Simple built-in editing commands.
        !             2:    Copyright (C) 1985 Richard M. Stallman.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU Emacs General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU Emacs, but only under the conditions described in the
        !            15: GNU Emacs General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU Emacs so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            21: 
        !            22: #include "config.h"
        !            23: #include "lisp.h"
        !            24: #include "commands.h"
        !            25: #include "buffer.h"
        !            26: #include "syntax.h"
        !            27: 
        !            28: Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_hook;
        !            29: 
        !            30: 
        !            31: DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
        !            32:   "Move point right ARG characters (left if ARG negative).\n\
        !            33: On reaching end of buffer, stop and signal error.")
        !            34:   (n)
        !            35:      Lisp_Object n;
        !            36: {
        !            37:   if (NULL (n))
        !            38:     XFASTINT (n) = 1;
        !            39:   else
        !            40:     CHECK_NUMBER (n, 0);
        !            41: 
        !            42:   SetPoint (point + XINT (n));
        !            43:   if (point < FirstCharacter)
        !            44:     {
        !            45:       SetPoint (FirstCharacter);
        !            46:       Fsignal (Qbeginning_of_buffer, Qnil);
        !            47:     }
        !            48:   if (point > NumCharacters + 1)
        !            49:     {
        !            50:       SetPoint (NumCharacters + 1);
        !            51:       Fsignal (Qend_of_buffer, Qnil);
        !            52:     }
        !            53:   return Qnil;
        !            54: }
        !            55: 
        !            56: DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
        !            57:   "Move point left ARG characters (right if ARG negative).\n\
        !            58: On reaching end of buffer, stop and signal error.")
        !            59:   (n)
        !            60:      Lisp_Object n;
        !            61: {
        !            62:   if (NULL (n))
        !            63:     XFASTINT (n) = 1;
        !            64:   else
        !            65:     CHECK_NUMBER (n, 0);
        !            66: 
        !            67:   XSETINT (n, - XINT (n));
        !            68:   return Fforward_char (n);
        !            69: }
        !            70: 
        !            71: DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
        !            72:   "Move point forward past ARG newlines.\n\
        !            73: If ARG is zero, position after previous newline.\n\
        !            74: If ARG is negative, position after -ARG'th newline before that one.\n\
        !            75: If scan reaches end of buffer, stop there without error;\n\
        !            76:  value is count of lines left to move.")
        !            77:   (n)
        !            78:      Lisp_Object n;
        !            79: {
        !            80:   register int pos = point;
        !            81:   register int count, stop;
        !            82: 
        !            83:   if (NULL (n))
        !            84:     count = 1;
        !            85:   else
        !            86:     {
        !            87:       CHECK_NUMBER (n, 0);
        !            88:       count = XINT (n);
        !            89:     }
        !            90: 
        !            91:   stop = FirstCharacter;
        !            92:   if (count <= 0)
        !            93:     {
        !            94:       while (pos > stop && CharAt (pos - 1) != '\n')
        !            95:        pos--;
        !            96:     }
        !            97:   while (count < 0 && pos > stop)
        !            98:     {
        !            99:       count++;
        !           100:       pos--;
        !           101:       /* In this loop, pos is one less than the position of scan. */
        !           102:       while (--pos >= stop && CharAt (pos) != '\n');
        !           103:       pos++;
        !           104:     }
        !           105:   stop = NumCharacters;
        !           106:   while (count > 0 && pos <= stop)
        !           107:     {
        !           108:       count--;
        !           109:       pos--;
        !           110:       /* In this loop, pos is one less than the position of scan. */
        !           111:       while (++pos < stop && CharAt (pos) != '\n');
        !           112:       pos++;
        !           113:     }
        !           114:   SetPoint (pos);
        !           115:   return make_number (count);
        !           116: }
        !           117: 
        !           118: DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line,
        !           119:   0, 1, "p",
        !           120:   "Move point to beginning of current line.\n\
        !           121: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           122: If scan reaches end of buffer, stop there without error.")
        !           123:   (n)
        !           124:      Lisp_Object n;
        !           125: {
        !           126:   if (NULL (n))
        !           127:     XFASTINT (n) = 1;
        !           128:   else
        !           129:     CHECK_NUMBER (n, 0);
        !           130: 
        !           131:   Fforward_line (make_number (XINT (n) - 1));
        !           132:   return Qnil;
        !           133: }
        !           134: 
        !           135: DEFUN ("end-of-line", Fend_of_line, Send_of_line,
        !           136:   0, 1, "p",
        !           137:   "Move point to end of current line.\n\
        !           138: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           139: If scan reaches end of buffer, stop there without error.")
        !           140:   (n)
        !           141:      Lisp_Object n;
        !           142: {
        !           143:   register int pos;
        !           144:   register int stop;
        !           145: 
        !           146:   if (NULL (n))
        !           147:     XFASTINT (n) = 1;
        !           148:   else
        !           149:     CHECK_NUMBER (n, 0);
        !           150: 
        !           151:   if (XINT (n) != 1)
        !           152:     Fforward_line (make_number (XINT (n) - 1));
        !           153: 
        !           154:   pos = point;
        !           155:   stop = NumCharacters + 1;
        !           156:   while (pos < stop && CharAt (pos) != '\n') pos++;
        !           157:   SetPoint (pos);
        !           158: 
        !           159:   return Qnil;
        !           160: }
        !           161: 
        !           162: DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
        !           163:   "Delete the following ARG characters (previous, with negative arg).\n\
        !           164: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           165: Interactively, ARG is the prefix arg, and kill if ARG was explicitly specd.")
        !           166:   (n, killflag)
        !           167:      Lisp_Object n, killflag;
        !           168: {
        !           169:   CHECK_NUMBER (n, 0);
        !           170: 
        !           171:   if (NULL (killflag))
        !           172:     {
        !           173:       if (XINT (n) < 0)
        !           174:        {
        !           175:          if (point + XINT (n) < FirstCharacter)
        !           176:            Fsignal (Qbeginning_of_buffer, Qnil);
        !           177:          else
        !           178:            del_range (point + XINT (n), point);
        !           179:        }
        !           180:       else
        !           181:        {
        !           182:          if (point + XINT (n) > NumCharacters + 1)
        !           183:            Fsignal (Qend_of_buffer, Qnil);
        !           184:          else
        !           185:            del_range (point, point + XINT (n));
        !           186:        }
        !           187:     }
        !           188:   else
        !           189:     {
        !           190:       call1 (Qkill_forward_chars, n);
        !           191:     }
        !           192:   return Qnil;
        !           193: }
        !           194: 
        !           195: DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
        !           196:   1, 2, "p\nP",
        !           197:   "Delete the previous ARG characters (following, with negative ARG).\n\
        !           198: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           199: Interactively, ARG is the prefix arg, and kill if ARG was explicitly specd.")
        !           200:   (n, killflag)
        !           201:      Lisp_Object n, killflag;
        !           202: {
        !           203:   CHECK_NUMBER (n, 0);
        !           204:   return Fdelete_char (make_number (-XINT (n)), killflag);
        !           205: }
        !           206: 
        !           207: DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
        !           208:   "Insert this character.")
        !           209:   (arg)
        !           210:      Lisp_Object arg;
        !           211: {
        !           212:   CHECK_NUMBER (arg, 0);
        !           213:   if (XINT (arg) == 0
        !           214:       && last_command_char == ' '
        !           215:       && !NULL (bf_cur->auto_fill_hook)
        !           216:       && !NULL (bf_cur->read_only)
        !           217:       && current_column () > XFASTINT (bf_cur->fill_column))
        !           218:     Fapply (bf_cur->auto_fill_hook, Qnil);
        !           219: 
        !           220:   while (XINT (arg) > 0)
        !           221:     {
        !           222:       SelfInsert (last_command_char);
        !           223:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           224:     }
        !           225:   return Qnil;
        !           226: }
        !           227: 
        !           228: DEFUN ("newline", Fnewline, Snewline, 0, 1, "P",
        !           229:   "Insert a newline.  With arg, insert that many newlines.\n\
        !           230: In Auto Fill mode, can break the preceding line if no numeric arg.")
        !           231:   (arg1)
        !           232:      Lisp_Object arg1;
        !           233: {
        !           234:   int flag;
        !           235:   Lisp_Object arg;
        !           236: 
        !           237:   arg = Fprefix_numeric_value (arg1);
        !           238: 
        !           239:   if (!NULL (bf_cur->read_only))
        !           240:     Fsignal (Qbuffer_read_only, Qnil);
        !           241: 
        !           242:   if (NULL (arg1)
        !           243:       && !NULL (bf_cur->auto_fill_hook)
        !           244:       && current_column () > XFASTINT (bf_cur->fill_column))
        !           245:     Fapply (bf_cur->auto_fill_hook, Qnil);
        !           246: 
        !           247:   flag = point > FirstCharacter && CharAt (point - 1) == '\n';
        !           248:   if (flag) PointLeft (1);
        !           249: 
        !           250:   while (XINT (arg) > 0)
        !           251:     {
        !           252:       SelfInsert ('\n');
        !           253:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           254:     }
        !           255: 
        !           256:   if (flag) PointRight (1);
        !           257: 
        !           258:   return Qnil;
        !           259: }
        !           260: 
        !           261: SelfInsert (c1)
        !           262:      char c1;
        !           263: {
        !           264:   extern Lisp_Object Fexpand_abbrev ();
        !           265:   int hairy = 0;
        !           266:   Lisp_Object tem;
        !           267:   register enum syntaxcode synt;
        !           268:   register int c = c1;
        !           269: 
        !           270:   if (!NULL (bf_cur->overwrite_mode)
        !           271:       && point <= NumCharacters
        !           272:       && c != '\n' && CharAt (point) != '\n'
        !           273:       && (CharAt (point) != '\t'
        !           274:          || XINT (bf_cur->tab_width) <= 0
        !           275:          || !((current_column () + 1) % XFASTINT (bf_cur->tab_width))))
        !           276:     {
        !           277:       del_range (point, point + 1);
        !           278:       hairy = 1;
        !           279:     }
        !           280:   if (!NULL (bf_cur->abbrev_mode)
        !           281:       && SYNTAX (c) != Sword
        !           282:       && NULL (bf_cur->read_only)
        !           283:       && point > FirstCharacter && SYNTAX (CharAt (point - 1)) == Sword)
        !           284:     {
        !           285:       tem = Fexpand_abbrev ();
        !           286:       if (!NULL (tem))
        !           287:        hairy = 1;
        !           288:     }
        !           289:   if ((c == ' ' || c == '\n')
        !           290:       && !NULL (bf_cur->auto_fill_hook)
        !           291:       && current_column () > XFASTINT (bf_cur->fill_column))
        !           292:     {
        !           293:       InsCStr (&c1, 1);
        !           294:       Fapply (bf_cur->auto_fill_hook, Qnil);
        !           295:       hairy = 1;
        !           296:     }
        !           297:   else
        !           298:     InsCStr (&c1, 1);
        !           299:   synt = SYNTAX (c);
        !           300:   if ((synt == Sclose || synt == Smath)
        !           301:       && !NULL (Vblink_paren_hook) && INTERACTIVE)
        !           302:     {
        !           303:       Fapply (Vblink_paren_hook, Qnil);
        !           304:       hairy = 1;
        !           305:     }
        !           306:   return hairy;
        !           307: }
        !           308: 
        !           309: /* module initialization */
        !           310: 
        !           311: syms_of_cmds ()
        !           312: {
        !           313:   Qkill_backward_chars = intern ("kill-backward-chars");
        !           314:   staticpro (&Qkill_backward_chars);
        !           315: 
        !           316:   Qkill_forward_chars = intern ("kill-forward-chars");
        !           317:   staticpro (&Qkill_forward_chars);
        !           318: 
        !           319:   DefLispVar ("blink-paren-hook", &Vblink_paren_hook,
        !           320:     "Function called, if non-nil, whenever a char with closeparen syntax is self-inserted.");
        !           321:   Vblink_paren_hook = Qnil;
        !           322: 
        !           323:   defsubr (&Sforward_char);
        !           324:   defsubr (&Sbackward_char);
        !           325:   defsubr (&Sforward_line);
        !           326:   defsubr (&Sbeginning_of_line);
        !           327:   defsubr (&Send_of_line);
        !           328: 
        !           329:   defsubr (&Sdelete_char);
        !           330:   defsubr (&Sdelete_backward_char);
        !           331: 
        !           332:   defsubr (&Sself_insert_command);
        !           333:   defsubr (&Snewline);
        !           334: }
        !           335: 
        !           336: keys_of_cmds ()
        !           337: {
        !           338:   int n;
        !           339: 
        !           340:   defkey (GlobalMap, Ctl('M'), "newline");
        !           341:   defkey (GlobalMap, Ctl('I'), "self-insert-command");
        !           342:   for (n = 040; n < 0177; n++)
        !           343:     defkey (GlobalMap, n, "self-insert-command");
        !           344: 
        !           345:   defkey (GlobalMap, Ctl ('A'), "beginning-of-line");
        !           346:   defkey (GlobalMap, Ctl ('B'), "backward-char");
        !           347:   defkey (GlobalMap, Ctl ('D'), "delete-char");
        !           348:   defkey (GlobalMap, Ctl ('E'), "end-of-line");
        !           349:   defkey (GlobalMap, Ctl ('F'), "forward-char");
        !           350:   defkey (GlobalMap, 0177, "delete-backward-char");
        !           351: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.