static const char *prompt_backspace(Vis *vis, const char *keys, const Arg *arg) { Win *prompt = vis->win; Text *txt = prompt->file->text; size_t size = text_size(txt); size_t pos = view_cursor_get(prompt->view); char c; if (pos == size && (pos == 1 || (size >= 2 && text_byte_get(txt, size-2, &c) && c == '\n'))) { prompt_restore(prompt); prompt_hide(prompt); } else { vis_operator(vis, VIS_OP_DELETE); vis_motion(vis, VIS_MOVE_CHAR_PREV); } return keys; }
static const char *replace(Vis *vis, const char *keys, const Arg *arg) { if (!keys[0]) return NULL; const char *next = vis_keys_next(vis, keys); if (!next) return NULL; size_t len = next - keys; char key[len+1]; memcpy(key, keys, len); key[len] = '\0'; vis_operator(vis, VIS_OP_REPLACE); vis_motion(vis, VIS_MOVE_NOP); vis_keys_inject(vis, next, key); vis_keys_inject(vis, next+len, "<Escape>"); return next; }
static const char *operator_filter(Vis *vis, const char *keys, const Arg *arg) { vis_operator(vis, VIS_OP_FILTER, arg->s); return keys; }
static const char *operator(Vis *vis, const char *keys, const Arg *arg) { vis_operator(vis, arg->i); return keys; }