Annotation of 43BSDReno/contrib/emacs-18.55/src/cmds.c, revision 1.1

1.1     ! root        1: /* Simple built-in editing commands.
        !             2:    Copyright (C) 1985 Free Software Foundation, Inc.
        !             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 attempt to pass beginning or 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:   "If point is on line i, move to the start of line i + ARG.\n\
        !            73: If there isn't room, go as far as possible (no error).\n\
        !            74: Returns the count of lines left to move.\n\
        !            75: With positive ARG, a non-empty line at the end counts as one line\n\
        !            76:   successfully moved (for the return value).")
        !            77:   (n)
        !            78:      Lisp_Object n;
        !            79: {
        !            80:   int pos2 = point;
        !            81:   int pos;
        !            82:   int count, shortage, negp;
        !            83: 
        !            84:   if (NULL (n))
        !            85:     count = 1;
        !            86:   else
        !            87:     {
        !            88:       CHECK_NUMBER (n, 0);
        !            89:       count = XINT (n);
        !            90:     }
        !            91: 
        !            92:   negp = count <= 0;
        !            93:   pos = scan_buffer ('\n', pos2, count - negp, &shortage);
        !            94:   if (shortage > 0
        !            95:       && (negp
        !            96:          || (NumCharacters >= FirstCharacter
        !            97:              && CharAt (pos - 1) != '\n')))
        !            98:     shortage--;
        !            99:   SetPoint (pos);
        !           100:   return make_number (negp ? - shortage : shortage);
        !           101: }
        !           102: 
        !           103: DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line,
        !           104:   0, 1, "p",
        !           105:   "Move point to beginning of current line.\n\
        !           106: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           107: If scan reaches end of buffer, stop there without error.")
        !           108:   (n)
        !           109:      Lisp_Object n;
        !           110: {
        !           111:   if (NULL (n))
        !           112:     XFASTINT (n) = 1;
        !           113:   else
        !           114:     CHECK_NUMBER (n, 0);
        !           115: 
        !           116:   Fforward_line (make_number (XINT (n) - 1));
        !           117:   return Qnil;
        !           118: }
        !           119: 
        !           120: DEFUN ("end-of-line", Fend_of_line, Send_of_line,
        !           121:   0, 1, "p",
        !           122:   "Move point to end of current line.\n\
        !           123: With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
        !           124: If scan reaches end of buffer, stop there without error.")
        !           125:   (n)
        !           126:      Lisp_Object n;
        !           127: {
        !           128:   register int pos;
        !           129:   register int stop;
        !           130: 
        !           131:   if (NULL (n))
        !           132:     XFASTINT (n) = 1;
        !           133:   else
        !           134:     CHECK_NUMBER (n, 0);
        !           135: 
        !           136:   if (XINT (n) != 1)
        !           137:     Fforward_line (make_number (XINT (n) - 1));
        !           138: 
        !           139:   pos = point;
        !           140:   stop = NumCharacters + 1;
        !           141:   while (pos < stop && CharAt (pos) != '\n') pos++;
        !           142:   SetPoint (pos);
        !           143: 
        !           144:   return Qnil;
        !           145: }
        !           146: 
        !           147: DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
        !           148:   "Delete the following ARG characters (previous, with negative arg).\n\
        !           149: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           150: Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
        !           151: ARG was explicitly specified.")
        !           152:   (n, killflag)
        !           153:      Lisp_Object n, killflag;
        !           154: {
        !           155:   CHECK_NUMBER (n, 0);
        !           156: 
        !           157:   if (NULL (killflag))
        !           158:     {
        !           159:       if (XINT (n) < 0)
        !           160:        {
        !           161:          if (point + XINT (n) < FirstCharacter)
        !           162:            Fsignal (Qbeginning_of_buffer, Qnil);
        !           163:          else
        !           164:            del_range (point + XINT (n), point);
        !           165:        }
        !           166:       else
        !           167:        {
        !           168:          if (point + XINT (n) > NumCharacters + 1)
        !           169:            Fsignal (Qend_of_buffer, Qnil);
        !           170:          else
        !           171:            del_range (point, point + XINT (n));
        !           172:        }
        !           173:     }
        !           174:   else
        !           175:     {
        !           176:       call1 (Qkill_forward_chars, n);
        !           177:     }
        !           178:   return Qnil;
        !           179: }
        !           180: 
        !           181: DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
        !           182:   1, 2, "p\nP",
        !           183:   "Delete the previous ARG characters (following, with negative ARG).\n\
        !           184: Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
        !           185: Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
        !           186: ARG was explicitly specified.")
        !           187:   (n, killflag)
        !           188:      Lisp_Object n, killflag;
        !           189: {
        !           190:   CHECK_NUMBER (n, 0);
        !           191:   return Fdelete_char (make_number (-XINT (n)), killflag);
        !           192: }
        !           193: 
        !           194: DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
        !           195:   "Insert this character.  Prefix arg is repeat-count.")
        !           196:   (arg)
        !           197:      Lisp_Object arg;
        !           198: {
        !           199:   CHECK_NUMBER (arg, 0);
        !           200: 
        !           201:   while (XINT (arg) > 0)
        !           202:     {
        !           203:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           204:       SelfInsert (last_command_char, XFASTINT (arg) != 0);
        !           205:     }
        !           206:   return Qnil;
        !           207: }
        !           208: 
        !           209: DEFUN ("newline", Fnewline, Snewline, 0, 1, "P",
        !           210:   "Insert a newline.  With arg, insert that many newlines.\n\
        !           211: In Auto Fill mode, can break the preceding line if no numeric arg.")
        !           212:   (arg1)
        !           213:      Lisp_Object arg1;
        !           214: {
        !           215:   int flag;
        !           216:   Lisp_Object arg;
        !           217:   char c1 = '\n';
        !           218: 
        !           219:   arg = Fprefix_numeric_value (arg1);
        !           220: 
        !           221:   if (!NULL (bf_cur->read_only))
        !           222:     Fsignal (Qbuffer_read_only, Qnil);
        !           223: 
        !           224:   /* Inserting a newline at the end of a line
        !           225:      produces better redisplay in try_window_id
        !           226:      than inserting at the ebginning fo a line,
        !           227:      And the textual result is the same.
        !           228:      So if at beginning, pretend to be at the end.
        !           229:      Must avoid SelfInsert in that case since point is wrong.
        !           230:      Luckily SelfInsert's special features all do nothing in that case.  */
        !           231: 
        !           232:   flag = point > FirstCharacter && CharAt (point - 1) == '\n';
        !           233:   if (flag) PointLeft (1);
        !           234: 
        !           235:   while (XINT (arg) > 0)
        !           236:     {
        !           237:       if (flag)
        !           238:        InsCStr (&c1, 1);
        !           239:       else
        !           240:        SelfInsert ('\n', !NULL (arg1));
        !           241:       XFASTINT (arg)--;                /* Ok since old and new vals both nonneg */
        !           242:     }
        !           243: 
        !           244:   if (flag) PointRight (1);
        !           245: 
        !           246:   return Qnil;
        !           247: }
        !           248: 
        !           249: SelfInsert (c1, noautofill)
        !           250:      char c1;
        !           251:      int noautofill;
        !           252: {
        !           253:   extern Lisp_Object Fexpand_abbrev ();
        !           254:   int hairy = 0;
        !           255:   Lisp_Object tem;
        !           256:   register enum syntaxcode synt;
        !           257:   register int c = c1;
        !           258: 
        !           259:   if (!NULL (bf_cur->overwrite_mode)
        !           260:       && point <= NumCharacters
        !           261:       && c != '\n' && CharAt (point) != '\n'
        !           262:       && (CharAt (point) != '\t'
        !           263:          || XINT (bf_cur->tab_width) <= 0
        !           264:          || !((current_column () + 1) % XFASTINT (bf_cur->tab_width))))
        !           265:     {
        !           266:       del_range (point, point + 1);
        !           267:       hairy = 1;
        !           268:     }
        !           269:   if (!NULL (bf_cur->abbrev_mode)
        !           270:       && SYNTAX (c) != Sword
        !           271:       && NULL (bf_cur->read_only)
        !           272:       && point > FirstCharacter && SYNTAX (CharAt (point - 1)) == Sword)
        !           273:     {
        !           274:       tem = Fexpand_abbrev ();
        !           275:       if (!NULL (tem))
        !           276:        hairy = 1;
        !           277:     }
        !           278:   if ((c == ' ' || c == '\n')
        !           279:       && !noautofill
        !           280:       && !NULL (bf_cur->auto_fill_hook)
        !           281:       && current_column () > XFASTINT (bf_cur->fill_column))
        !           282:     {
        !           283:       if (c1 != '\n')
        !           284:        InsCStr (&c1, 1);
        !           285:       call0 (bf_cur->auto_fill_hook);
        !           286:       if (c1 == '\n')
        !           287:        InsCStr (&c1, 1);
        !           288:       hairy = 1;
        !           289:     }
        !           290:   else
        !           291:     InsCStr (&c1, 1);
        !           292:   synt = SYNTAX (c);
        !           293:   if ((synt == Sclose || synt == Smath)
        !           294:       && !NULL (Vblink_paren_hook) && INTERACTIVE)
        !           295:     {
        !           296:       call0 (Vblink_paren_hook);
        !           297:       hairy = 1;
        !           298:     }
        !           299:   return hairy;
        !           300: }
        !           301: 
        !           302: /* module initialization */
        !           303: 
        !           304: syms_of_cmds ()
        !           305: {
        !           306:   Qkill_backward_chars = intern ("kill-backward-chars");
        !           307:   staticpro (&Qkill_backward_chars);
        !           308: 
        !           309:   Qkill_forward_chars = intern ("kill-forward-chars");
        !           310:   staticpro (&Qkill_forward_chars);
        !           311: 
        !           312:   DEFVAR_LISP ("blink-paren-hook", &Vblink_paren_hook,
        !           313:     "Function called, if non-nil, whenever a char with closeparen syntax is self-inserted.");
        !           314:   Vblink_paren_hook = Qnil;
        !           315: 
        !           316:   defsubr (&Sforward_char);
        !           317:   defsubr (&Sbackward_char);
        !           318:   defsubr (&Sforward_line);
        !           319:   defsubr (&Sbeginning_of_line);
        !           320:   defsubr (&Send_of_line);
        !           321: 
        !           322:   defsubr (&Sdelete_char);
        !           323:   defsubr (&Sdelete_backward_char);
        !           324: 
        !           325:   defsubr (&Sself_insert_command);
        !           326:   defsubr (&Snewline);
        !           327: }
        !           328: 
        !           329: keys_of_cmds ()
        !           330: {
        !           331:   int n;
        !           332: 
        !           333:   defkey (GlobalMap, Ctl('M'), "newline");
        !           334:   defkey (GlobalMap, Ctl('I'), "self-insert-command");
        !           335:   for (n = 040; n < 0177; n++)
        !           336:     defkey (GlobalMap, n, "self-insert-command");
        !           337: 
        !           338:   defkey (GlobalMap, Ctl ('A'), "beginning-of-line");
        !           339:   defkey (GlobalMap, Ctl ('B'), "backward-char");
        !           340:   defkey (GlobalMap, Ctl ('D'), "delete-char");
        !           341:   defkey (GlobalMap, Ctl ('E'), "end-of-line");
        !           342:   defkey (GlobalMap, Ctl ('F'), "forward-char");
        !           343:   defkey (GlobalMap, 0177, "delete-backward-char");
        !           344: }

unix.superglobalmegacorp.com

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