slackline_emacs.c - lchat - A line oriented chat front end for ii. | |
git clone git://git.suckless.org/lchat | |
Log | |
Files | |
Refs | |
README | |
--- | |
slackline_emacs.c (1866B) | |
--- | |
1 /* | |
2 * Copyright (c) 2022-2023 Tom Schwindl <[email protected]> | |
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 WARRANT… | |
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE F… | |
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 … | |
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 exi… | |
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-… | |
64 sl->buf[sl->rcur-2] = tmp; | |
65 } | |
66 break; | |
67 default: | |
68 break; | |
69 } | |
70 } |