Exemplo n.º 1
0
/* cv_delfini():
 *	Finish vi delete action
 */
libedit_private void
cv_delfini(EditLine *el)
{
	int size;
	int action = el->el_chared.c_vcmd.action;

	if (action & INSERT)
		el->el_map.current = el->el_map.key;

	if (el->el_chared.c_vcmd.pos == 0)
		/* sanity */
		return;

	size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos);
	if (size == 0)
		size = 1;
	el->el_line.cursor = el->el_chared.c_vcmd.pos;
	if (action & YANK) {
		if (size > 0)
			cv_yank(el, el->el_line.cursor, size);
		else
			cv_yank(el, el->el_line.cursor + size, -size);
	} else {
		if (size > 0) {
			c_delafter(el, size);
			re_refresh_cursor(el);
		} else  {
			c_delbefore(el, -size);
			el->el_line.cursor += size;
		}
	}
	el->el_chared.c_vcmd.action = NOP;
}
Exemplo n.º 2
0
/* cv_action():
 *	Handle vi actions.
 */
static el_action_t
cv_action(EditLine *el, wint_t c)
{

	if (el->el_chared.c_vcmd.action != NOP) {
		/* 'cc', 'dd' and (possibly) friends */
		if (c != (wint_t)el->el_chared.c_vcmd.action)
			return CC_ERROR;

		if (!(c & YANK))
			cv_undo(el);
		cv_yank(el, el->el_line.buffer,
		    (int)(el->el_line.lastchar - el->el_line.buffer));
		el->el_chared.c_vcmd.action = NOP;
		el->el_chared.c_vcmd.pos = 0;
		if (!(c & YANK)) {
			el->el_line.lastchar = el->el_line.buffer;
			el->el_line.cursor = el->el_line.buffer;
		}
		if (c & INSERT)
			el->el_map.current = el->el_map.key;

		return CC_REFRESH;
	}
	el->el_chared.c_vcmd.pos = el->el_line.cursor;
	el->el_chared.c_vcmd.action = c;
	return CC_ARGHACK;
}
Exemplo n.º 3
0
/* vi_yank_end():
 *	Vi yank to end of line
 *	[Y]
 */
libedit_private el_action_t
/*ARGSUSED*/
vi_yank_end(EditLine *el, wint_t c __attribute__((__unused__)))
{

	cv_yank(el, el->el_line.cursor,
	    (int)(el->el_line.lastchar - el->el_line.cursor));
	return CC_REFRESH;
}
Exemplo n.º 4
0
/* vi_change_to_eol():
 *	Vi change to end of line
 *	[C]
 */
libedit_private el_action_t
/*ARGSUSED*/
vi_change_to_eol(EditLine *el, wint_t c __attribute__((__unused__)))
{

	cv_undo(el);
	cv_yank(el, el->el_line.cursor,
	    (int)(el->el_line.lastchar - el->el_line.cursor));
	(void) ed_kill_line(el, 0);
	el->el_map.current = el->el_map.key;
	return CC_REFRESH;
}
Exemplo n.º 5
0
/* c_delafter():
 *	Delete num characters after the cursor
 */
libedit_private void
c_delafter(EditLine *el, int num)
{

	if (el->el_line.cursor + num > el->el_line.lastchar)
		num = (int)(el->el_line.lastchar - el->el_line.cursor);

	if (el->el_map.current != el->el_map.emacs) {
		cv_undo(el);
		cv_yank(el, el->el_line.cursor, num);
	}

	if (num > 0) {
		wchar_t *cp;

		for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
			*cp = cp[num];

		el->el_line.lastchar -= num;
	}
}