Annotation of GNUtools/emacs/src/cmds.c, revision 1.1

1.1     ! root        1: /* Simple built-in editing commands.
        !             2:    Copyright (C) 1985, 1990 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 1, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU Emacs is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU Emacs; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: #include "config.h"
        !            22: #include "lisp.h"
        !            23: #include "commands.h"
        !            24: #include "buffer.h"
        !            25: #include "syntax.h"
        !            26: 
        !            27: Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_hook;
        !            28: 
        !            29: 
        !            30: DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
        !            31:   "Move point right ARG characters (left if ARG negative).\n\
        !            32: On reaching end of buffer, stop and signal error.")
        !            33:   (n)
        !            34:      Lisp_Object n;
        !            35: {
        !            36:   if (NULL (n))
        !            37:     XFASTINT (n) = 1;
        !            38:   else
        !            39:     CHECK_NUMBER (n, 0);
        !            40: 
        !            41:   SET_PT (point + XINT (n));
        !            42:   if (point < BEGV)
        !            43:     {
        !            44:       SET_PT (BEGV);
        !            45:       Fsignal (Qbeginning_of_buffer, Qnil);
        !            46:     }
        !            47:   if (point > ZV)
        !            48:     {
        !            49:       SET_PT (ZV);
        !            50:       Fsignal (Qend_of_buffer, Qnil);
        !            51:     }
        !            52:   return Qnil;
        !            53: }
        !            54: 
        !            55: DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
        !            56:   "Move point left ARG characters (right if ARG negative).\n\
        !            57: On attempt to pass beginning or end of buffer, stop and signal error.")
        !            58:   (n)
        !            59:      Lisp_Object n;
        !            60: {
        !            61:   if (NULL (n))
        !            62:     XFASTINT (n) = 1;
        !            63:   else
        !            64:     CHECK_NUMBER (n, 0);
        !            65: 
        !            66:   XSETINT (n, - XINT (n));
        !            67:   return Fforward_char (n);
        !            68: }
        !            69: 
        !            70: DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
        !            71:   "If point is on line i, move to the start of line i + ARG.\n\
        !            72: If there isn't room, go as far as possible (no error).\n\
        !            73: Returns the count of lines left to move.\n\
        !            74: With positive ARG, a non-empty line traversed at end of buffer \n\
        !            75:  counts as one line successfully moved (for the return value).")
        !            76:   (n)
        !            77:      Lisp_Object n;
        !            78: {
        !            79:   int pos2 = point;
        !            80:   int pos;
        !            81:   int count, shortage, negp;
        !            82: 
        !            83:   if (NULL (n))
        !            84:     count = 1;
        !            85:   else
        !            86:     {
        !            87:       CHECK_NUMBER (n, 0);
        !            88:       count = XINT (n);
        !            89:     }
        !            90: 
        !            91:   negp = count <= 0;
        !            92:   pos = scan_buffer ('\n', pos2, count - negp, &shortage);
        !            93:   if (shortage > 0
        !            94:       && (negp
        !            95:          || (ZV > BEGV && pos != pos2
        !            96:              && FETCH_CHAR (pos - 1) != '\n')))
        !            97:     shortage--;
        !            98:   SET_PT (pos);
        !            99:   return make_number (negp ? - shortage : shortage);
        !           100: }
        !           101: 
        !           102: DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line,
        !           103:   0, 1, "p",
        !           104:   "Move point to beginning of current line.\n\
        !           105: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           106: If scan reaches end of buffer, stop there without error.")
        !           107:   (n)
        !           108:      Lisp_Object n;
        !           109: {
        !           110:   if (NULL (n))
        !           111:     XFASTINT (n) = 1;
        !           112:   else
        !           113:     CHECK_NUMBER (n, 0);
        !           114: 
        !           115:   Fforward_line (make_number (XINT (n) - 1));
        !           116:   return Qnil;
        !           117: }
        !           118: 
        !           119: DEFUN ("end-of-line", Fend_of_line, Send_of_line,
        !           120:   0, 1, "p",
        !           121:   "Move point to end of current line.\n\
        !           122: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           123: If scan reaches end of buffer, stop there without error.")
        !           124:   (n)
        !           125:      Lisp_Object n;
        !           126: {
        !           127:   register int pos;
        !           128:   register int stop;
        !           129: 
        !           130:   if (NULL (n))
        !           131:     XFASTINT (n) = 1;
        !           132:   else
        !           133:     CHECK_NUMBER (n, 0);
        !           134: 
        !           135:   if (XINT (n) != 1)
        !           136:     Fforward_line (make_number (XINT (n) - 1));
        !           137: 
        !           138:   pos = point;
        !           139:   stop = ZV;
        !           140:   while (pos < stop && FETCH_CHAR (pos) != '\n') pos++;
        !           141:   SET_PT (pos);
        !           142: 
        !           143:   return Qnil;
        !           144: }
        !           145: 
        !           146: DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
        !           147:   "Delete the following ARG characters (previous, with negative arg).\n\
        !           148: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           149: Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
        !           150: ARG was explicitly specified.")
        !           151:   (n, killflag)
        !           152:      Lisp_Object n, killflag;
        !           153: {
        !           154:   CHECK_NUMBER (n, 0);
        !           155: 
        !           156:   if (NULL (killflag))
        !           157:     {
        !           158:       if (XINT (n) < 0)
        !           159:        {
        !           160:          if (point + XINT (n) < BEGV)
        !           161:            Fsignal (Qbeginning_of_buffer, Qnil);
        !           162:          else
        !           163:            del_range (point + XINT (n), point);
        !           164:        }
        !           165:       else
        !           166:        {
        !           167:          if (point + XINT (n) > ZV)
        !           168:            Fsignal (Qend_of_buffer, Qnil);
        !           169:          else
        !           170:            del_range (point, point + XINT (n));
        !           171:        }
        !           172:     }
        !           173:   else
        !           174:     {
        !           175:       call1 (Qkill_forward_chars, n);
        !           176:     }
        !           177:   return Qnil;
        !           178: }
        !           179: 
        !           180: DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
        !           181:   1, 2, "p\nP",
        !           182:   "Delete the previous ARG characters (following, with negative ARG).\n\
        !           183: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           184: Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
        !           185: ARG was explicitly specified.")
        !           186:   (n, killflag)
        !           187:      Lisp_Object n, killflag;
        !           188: {
        !           189:   CHECK_NUMBER (n, 0);
        !           190:   return Fdelete_char (make_number (-XINT (n)), killflag);
        !           191: }
        !           192: 
        !           193: DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
        !           194:   "Insert this character.  Prefix arg is repeat-count.")
        !           195:   (arg)
        !           196:      Lisp_Object arg;
        !           197: {
        !           198:   CHECK_NUMBER (arg, 0);
        !           199: 
        !           200:   while (XINT (arg) > 0)
        !           201:     {
        !           202:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           203:       self_insert_internal (last_command_char, XFASTINT (arg) != 0);
        !           204:     }
        !           205:   return Qnil;
        !           206: }
        !           207: 
        !           208: DEFUN ("newline", Fnewline, Snewline, 0, 1, "P",
        !           209:   "Insert a newline.  With arg, insert that many newlines.\n\
        !           210: In Auto Fill mode, can break the preceding line if no numeric arg.")
        !           211:   (arg1)
        !           212:      Lisp_Object arg1;
        !           213: {
        !           214:   int flag;
        !           215:   Lisp_Object arg;
        !           216:   char c1 = '\n';
        !           217: 
        !           218:   arg = Fprefix_numeric_value (arg1);
        !           219: 
        !           220:   if (!NULL (current_buffer->read_only))
        !           221:     Fsignal (Qbuffer_read_only, Qnil);
        !           222: 
        !           223:   /* Inserting a newline at the end of a line
        !           224:      produces better redisplay in try_window_id
        !           225:      than inserting at the ebginning fo a line,
        !           226:      And the textual result is the same.
        !           227:      So if at beginning, pretend to be at the end.
        !           228:      Must avoid self_insert_internal in that case since point is wrong.
        !           229:      Luckily self_insert_internal's special features all do nothing in that case.  */
        !           230: 
        !           231:   flag = point > BEGV && FETCH_CHAR (point - 1) == '\n';
        !           232:   if (flag)
        !           233:     SET_PT (point - 1);
        !           234: 
        !           235:   while (XINT (arg) > 0)
        !           236:     {
        !           237:       if (flag)
        !           238:        insert (&c1, 1);
        !           239:       else
        !           240:        self_insert_internal ('\n', !NULL (arg1));
        !           241:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           242:     }
        !           243: 
        !           244:   if (flag)
        !           245:     SET_PT (point + 1);
        !           246: 
        !           247:   return Qnil;
        !           248: }
        !           249: 
        !           250: self_insert_internal (c1, noautofill)
        !           251:      char c1;
        !           252:      int noautofill;
        !           253: {
        !           254:   extern Lisp_Object Fexpand_abbrev ();
        !           255:   int hairy = 0;
        !           256:   Lisp_Object tem;
        !           257:   register enum syntaxcode synt;
        !           258:   register int c = c1;
        !           259: 
        !           260:   if (!NULL (current_buffer->overwrite_mode)
        !           261:       && point < ZV
        !           262:       && c != '\n' && FETCH_CHAR (point) != '\n'
        !           263:       && (FETCH_CHAR (point) != '\t'
        !           264:          || XINT (current_buffer->tab_width) <= 0
        !           265:          || !((current_column () + 1) % XFASTINT (current_buffer->tab_width))))
        !           266:     {
        !           267:       del_range (point, point + 1);
        !           268:       hairy = 1;
        !           269:     }
        !           270:   if (!NULL (current_buffer->abbrev_mode)
        !           271:       && SYNTAX (c) != Sword
        !           272:       && NULL (current_buffer->read_only)
        !           273:       && point > BEGV && SYNTAX (FETCH_CHAR (point - 1)) == Sword)
        !           274:     {
        !           275:       tem = Fexpand_abbrev ();
        !           276:       if (!NULL (tem))
        !           277:        hairy = 1;
        !           278:     }
        !           279:   if ((c == ' ' || c == '\n')
        !           280:       && !noautofill
        !           281:       && !NULL (current_buffer->auto_fill_hook)
        !           282:       && current_column () > XFASTINT (current_buffer->fill_column))
        !           283:     {
        !           284:       if (c1 != '\n')
        !           285:        insert (&c1, 1);
        !           286:       call0 (current_buffer->auto_fill_hook);
        !           287:       if (c1 == '\n')
        !           288:        insert (&c1, 1);
        !           289:       hairy = 1;
        !           290:     }
        !           291:   else
        !           292:     insert (&c1, 1);
        !           293:   synt = SYNTAX (c);
        !           294:   if ((synt == Sclose || synt == Smath)
        !           295:       && !NULL (Vblink_paren_hook) && FROM_KBD)
        !           296:     {
        !           297:       call0 (Vblink_paren_hook);
        !           298:       hairy = 1;
        !           299:     }
        !           300:   return hairy;
        !           301: }
        !           302: 
        !           303: /* module initialization */
        !           304: 
        !           305: syms_of_cmds ()
        !           306: {
        !           307:   Qkill_backward_chars = intern ("kill-backward-chars");
        !           308:   staticpro (&Qkill_backward_chars);
        !           309: 
        !           310:   Qkill_forward_chars = intern ("kill-forward-chars");
        !           311:   staticpro (&Qkill_forward_chars);
        !           312: 
        !           313:   DEFVAR_LISP ("blink-paren-hook", &Vblink_paren_hook,
        !           314:     "Function called, if non-nil, whenever a char with closeparen syntax is self-inserted.");
        !           315:   Vblink_paren_hook = Qnil;
        !           316: 
        !           317:   defsubr (&Sforward_char);
        !           318:   defsubr (&Sbackward_char);
        !           319:   defsubr (&Sforward_line);
        !           320:   defsubr (&Sbeginning_of_line);
        !           321:   defsubr (&Send_of_line);
        !           322: 
        !           323:   defsubr (&Sdelete_char);
        !           324:   defsubr (&Sdelete_backward_char);
        !           325: 
        !           326:   defsubr (&Sself_insert_command);
        !           327:   defsubr (&Snewline);
        !           328: }
        !           329: 
        !           330: keys_of_cmds ()
        !           331: {
        !           332:   int n;
        !           333: 
        !           334:   ndefkey (Vglobal_map, Ctl('M'), "newline");
        !           335:   ndefkey (Vglobal_map, Ctl('I'), "self-insert-command");
        !           336:   for (n = 040; n < 0177; n++)
        !           337:     ndefkey (Vglobal_map, n, "self-insert-command");
        !           338: 
        !           339:   ndefkey (Vglobal_map, Ctl ('A'), "beginning-of-line");
        !           340:   ndefkey (Vglobal_map, Ctl ('B'), "backward-char");
        !           341:   ndefkey (Vglobal_map, Ctl ('D'), "delete-char");
        !           342:   ndefkey (Vglobal_map, Ctl ('E'), "end-of-line");
        !           343:   ndefkey (Vglobal_map, Ctl ('F'), "forward-char");
        !           344:   ndefkey (Vglobal_map, 0177, "delete-backward-char");
        !           345: }

unix.superglobalmegacorp.com

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