This is zle_move.c in view mode; [Download] [Up]
/* * $Id: zle_move.c,v 2.7 1996/10/15 20:16:35 hzoli Exp $ * * zle_move.c - editor movement * * This file is part of zsh, the Z shell. * * Copyright (c) 1992-1996 Paul Falstad * All rights reserved. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and to distribute modified versions of this software for any * purpose, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. * * In no event shall Paul Falstad or the Zsh Development Group be liable * to any party for direct, indirect, special, incidental, or consequential * damages arising out of the use of this software and its documentation, * even if Paul Falstad and the Zsh Development Group have been advised of * the possibility of such damage. * * Paul Falstad and the Zsh Development Group specifically disclaim any * warranties, including, but not limited to, the implied warranties of * merchantability and fitness for a particular purpose. The software * provided hereunder is on an "as is" basis, and Paul Falstad and the * Zsh Development Group have no obligation to provide maintenance, * support, updates, enhancements, or modifications. * */ #define ZLE #include "zsh.h" static vimarkcs[27], vimarkline[27]; /**/ void beginningofline(void) { if (zmult < 0) { zmult = -zmult; endofline(); return; } while (zmult--) { if (cs == 0) return; if (line[cs - 1] == '\n') if (!--cs) return; while (cs && line[cs - 1] != '\n') cs--; } } /**/ void endofline(void) { if (zmult < 0) { zmult = -zmult; beginningofline(); return; } while (zmult--) { if (cs >= ll) { cs = ll; return; } if (line[cs] == '\n') if (++cs == ll) return; while (cs != ll && line[cs] != '\n') cs++; } } /**/ void beginningoflinehist(void) { if (zmult < 0) { zmult = -zmult; endoflinehist(); return; } while (zmult) { if (cs == 0) break; if (line[cs - 1] == '\n') if (!--cs) break; while (cs && line[cs - 1] != '\n') cs--; zmult--; } if (zmult) { uphistory(); cs = 0; } } /**/ void endoflinehist(void) { if (zmult < 0) { zmult = -zmult; beginningoflinehist(); return; } while (zmult) { if (cs >= ll) { cs = ll; break; } if (line[cs] == '\n') if (++cs == ll) break; while (cs != ll && line[cs] != '\n') cs++; zmult--; } if (zmult) downhistory(); } /**/ void forwardchar(void) { cs += zmult; if (cs > ll) cs = ll; if (cs < 0) cs = 0; } /**/ void backwardchar(void) { cs -= zmult; if (cs > ll) cs = ll; if (cs < 0) cs = 0; } /**/ void setmarkcommand(void) { mark = cs; } /**/ void exchangepointandmark(void) { int x; x = mark; mark = cs; cs = x; if (cs > ll) cs = ll; } /**/ void vigotocolumn(void) { int x, y; if (zmult > 0) zmult--; findline(&x, &y); if (zmult >= 0) cs = x + zmult; else cs = y + zmult; if (cs > y) cs = y; if (cs < x) cs = x; } /**/ void vimatchbracket(void) { int ocs = cs, dir, ct; unsigned char oth, me; otog: if (cs == ll || line[cs] == '\n') { feep(); cs = ocs; return; } switch (me = line[cs]) { case '{': dir = 1; oth = '}'; break; case /*{*/ '}': virangeflag = -virangeflag; dir = -1; oth = '{'; /*}*/ break; case '(': dir = 1; oth = ')'; break; case ')': virangeflag = -virangeflag; dir = -1; oth = '('; break; case '[': dir = 1; oth = ']'; break; case ']': virangeflag = -virangeflag; dir = -1; oth = '['; break; default: cs++; goto otog; } ct = 1; while (cs >= 0 && cs < ll && ct) { cs += dir; if (line[cs] == oth) ct--; else if (line[cs] == me) ct++; } if (cs < 0 || cs >= ll) { feep(); cs = ocs; } else if(dir > 0 && virangeflag) cs++; } /**/ void viforwardchar(void) { int lim = findeol() - (bindtab == altbindtab); if (zmult < 0) { zmult = -zmult; vibackwardchar(); return; } if (cs >= lim) { feep(); return; } while (zmult-- && cs < lim) cs++; } /**/ void vibackwardchar(void) { if (zmult < 0) { zmult = -zmult; viforwardchar(); return; } if (cs == findbol()) { feep(); return; } while (zmult--) { cs--; if (cs < 0 || line[cs] == '\n') { cs++; break; } } } /**/ void viendofline(void) { int oldcs = cs; if (zmult<1) { feep(); return; } while(zmult--) { if (cs > ll) { cs = oldcs; feep(); return; } cs = findeol() + 1; } cs--; } /**/ void vibeginningofline(void) { cs = findbol(); } static int vfindchar, vfinddir, tailadd; /**/ void vifindnextchar(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = 1; tailadd = 0; virepeatfind(); } } /**/ void vifindprevchar(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = -1; tailadd = 0; virepeatfind(); } } /**/ void vifindnextcharskip(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = 1; tailadd = -1; virepeatfind(); } } /**/ void vifindprevcharskip(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = -1; tailadd = 1; virepeatfind(); } } /**/ void virepeatfind(void) { int ocs = cs; if (!vfinddir) { feep(); return; } if (zmult < 0) { zmult = -zmult; virevrepeatfind(); return; } while (zmult--) { do cs += vfinddir; while (cs >= 0 && cs < ll && line[cs] != vfindchar && line[cs] != '\n'); if (cs < 0 || cs >= ll || line[cs] == '\n') { feep(); cs = ocs; return; } } cs += tailadd; if (vfinddir == 1 && virangeflag) cs++; } /**/ void virevrepeatfind(void) { if (zmult < 0) { zmult = -zmult; virepeatfind(); return; } vfinddir = -vfinddir; virepeatfind(); vfinddir = -vfinddir; } /**/ void vifirstnonblank(void) { cs = findbol(); while (cs != ll && iblank(line[cs])) cs++; } /**/ void visetmark(void) { int ch; ch = getkey(0); if (ch < 'a' || ch > 'z') { feep(); return; } ch -= 'a'; vimarkcs[ch] = cs; vimarkline[ch] = histline; } /**/ void vigotomark(void) { int ch; ch = getkey(0); if (ch == c) ch = 26; else { if (ch < 'a' || ch > 'z') { feep(); return; } ch -= 'a'; } if (!vimarkline[ch]) { feep(); return; } if (curhist != vimarkline[ch]) { zmult = vimarkline[ch]; gotmult = 1; lastcmd |= ZLE_ARG; vifetchhistory(); if (histline != vimarkline[ch]) return; } cs = vimarkcs[ch]; if (cs > ll) cs = ll; } /**/ void vigotomarkline(void) { vigotomark(); vifirstnonblank(); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.