int vireplacechars(UNUSED(char **args)) { ZLE_INT_T ch; int n = zmult, fail = 0, newchars = 0; if (n > 0) { int pos = zlecs; while (n-- > 0) { if (pos == zlell || zleline[pos] == ZWC('\n')) { fail = 1; break; } newchars++; INCPOS(pos); } n = pos - zlecs; } startvichange(1); /* check argument range */ if (n < 1 || fail) { if(vichgrepeat) vigetkey(); if(vichgflag) { free(vichgbuf); vichgbuf = NULL; vichgflag = 0; } return 1; } /* get key */ if((ch = vigetkey()) == ZLEEOF) { vichgflag = 0; return 1; } /* do change */ if (ch == ZWC('\r') || ch == ZWC('\n')) { /* <return> handled specially */ zlecs += n - 1; backkill(n - 1, CUT_RAW); zleline[zlecs++] = '\n'; } else { /* * Make sure we delete displayed characters, including * attach combining characters. n includes this as a raw * buffer offset. * Use shiftchars so as not to adjust the cursor position; * we are overwriting anything that remains directly. */ if (n > newchars) shiftchars(zlecs, n - newchars); else if (n < newchars) spaceinline(newchars - n); while (newchars--) zleline[zlecs++] = ch; zlecs--; } vichgflag = 0; return 0; }
void vireplacechars(void) { int ch; startvichange(1); /* get key */ if((ch = vigetkey()) == -1) { vichgflag = 0; feep(); return; } /* check argument range */ if (zmult < 0 || zmult + cs > findeol()) { vichgflag = 0; feep(); return; } /* do change */ if (ch == '\r' || ch == '\n') { /* <return> handled specially */ cs += zmult - 1; backkill(zmult - 1, 0); line[cs++] = '\n'; } else { while (zmult--) line[cs++] = ch; cs--; } vichgflag = 0; }
void vifindprevcharskip(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = -1; tailadd = 1; virepeatfind(); } }
void vifindnextchar(void) { if ((vfindchar = vigetkey()) != -1) { vfinddir = 1; tailadd = 0; virepeatfind(); } }