slackline_emacs.c - lchat - A line oriented chat front end for ii.
(HTM) git clone git://git.suckless.org/lchat
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
slackline_emacs.c (1866B)
---
1 /*
2 * Copyright (c) 2022-2023 Tom Schwindl <schwindl@posteo.de>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 #include <stdio.h>
18 #include <ctype.h>
19 #include <stddef.h>
20 #include <stdlib.h>
21
22 #include "slackline.h"
23 #include "slackline_internals.h"
24
25 void
26 sl_emacs(struct slackline *sl, int key)
27 {
28 char tmp;
29
30 switch (key) {
31 case ESC_KEY:
32 sl->esc = ESC;
33 break;
34 case CTRL_A: /* start of line */
35 sl_move(sl, HOME);
36 break;
37 case CTRL_B: /* previous char */
38 sl_move(sl, LEFT);
39 break;
40 case CTRL_D: /* delete char in front of the cursor or exit */
41 if (sl->rcur < sl->rlen) {
42 sl_move(sl, RIGHT);
43 sl_backspace(sl);
44 } else {
45 exit(EXIT_SUCCESS);
46 }
47 break;
48 case CTRL_E: /* end of line */
49 sl_move(sl, END);
50 break;
51 case CTRL_F: /* next char */
52 sl_move(sl, RIGHT);
53 break;
54 case CTRL_K: /* delete line from cursor to end */
55 for (int i = sl->rlen - sl->rcur; i > 0; --i) {
56 sl_move(sl, RIGHT);
57 sl_backspace(sl);
58 }
59 break;
60 case CTRL_T: /* swap last two chars */
61 if (sl->rcur >= 2) {
62 tmp = *sl_postoptr(sl, sl->rcur-1);
63 sl->buf[sl->rcur-1] = *sl_postoptr(sl, sl->rcur-2);
64 sl->buf[sl->rcur-2] = tmp;
65 }
66 break;
67 default:
68 break;
69 }
70 }