doesn't work at all it seems
On Thu, Jul 21, 2011 at 10:01:12PM +0400, Alexander Polakov wrote:
> * Dmitrij D. Czarkoff <czark...@gmail.com> [110721 14:49]:
> > Hello!
> >
> > I tried both documentation and google, and I could only figure out how to
> > enable arrow keys in emacs mode of ksh.
> >
> > Is there a way to enable them in vi mode? Same goes for HOME and END
> > buttons.
>
> Try the patch below.
>
> You probably wonder why cursor movement is done in such a strange way,
> reimplementing both domove() and vi_cmd(), but I couldn't find a better
> way to go to "end of line + one".
>
> diff --git a/vi.c b/vi.c
> index 0bac6be..c1a7b7d 100644
> --- a/vi.c
> +++ b/vi.c
> @@ -247,6 +247,48 @@ x_vi(char *buf, size_t len)
> return es->linelen;
> }
>
> +static void keypad(int ch) {
> + int cur = 0;
> + char cmd;
> +
> + switch (ch) {
> + case 'D': /* left */
> + cur--;
> + break;
> + case 'C': /* right */
> + cur++;
> + break;
> + case 'A': /* up */
> + cmd = 'k';
> + vi_cmd(1, &cmd);
> + break;
> + case 'B': /* down */
> + cmd = 'j';
> + vi_cmd(1, &cmd);
> + break;
> + case 'H': /* home */
> + es->cursor = 0;
> + break;
> + case 'F': /* end */
> + es->cursor = es->linelen;
> + break;
> + default:
> + vi_error();
> + return;
> + }
> + if ((cur += es->cursor) >= 0) {
> + if (cur > es->linelen && cur != 0) {
> + cur--;
> + vi_error();
> + }
> + es->cursor = cur;
> + } else
> + vi_error();
> +
> + refresh(0);
> + return;
> +}
> +
> static int
> vi_hook(int ch)
> {
> @@ -261,6 +303,15 @@ vi_hook(int ch)
> state = VLIT;
> ch = '^';
> }
> +
> + if (ch == '\033') {
> + if (x_getc() == '[')
> + keypad(x_getc());
> + else /* unknown sequence */
> + vi_error();
> + return 0;
> + }
> +
> switch (vi_insert(ch)) {
> case -1:
> vi_error();
>
> --
> Alexander Polakov | plhk.ru