summaryrefslogtreecommitdiff
path: root/shed_non_vi.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2023-04-01 20:41:59 -0400
committerJakob Kaivo <jkk@ung.org>2023-04-01 20:41:59 -0400
commita46ccd3ebd191c1b685b3c4e0f4c8802631303e1 (patch)
tree0d77e5eb05690db7605ad33df7b1f4d6a3e6d231 /shed_non_vi.c
parentd905faaa0a3180e20532eff6b1effbec06431d87 (diff)
integrate interactive command editing
Diffstat (limited to 'shed_non_vi.c')
-rw-r--r--shed_non_vi.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/shed_non_vi.c b/shed_non_vi.c
new file mode 100644
index 0000000..eda2cc6
--- /dev/null
+++ b/shed_non_vi.c
@@ -0,0 +1,99 @@
+#define _POSIX_C_SOURCE 200809L
+#include <ctype.h>
+#include <termios.h>
+#include <unistd.h>
+#include "shed.h"
+
+int shed_handle_non_vi(struct shed *e, struct termios *t, char c)
+{
+ if (c == t->c_cc[VEOF]) {
+ if (shed_eof(e) == 0) {
+ return 0;
+ }
+ }
+
+ if (c == t->c_cc[VINTR]) {
+ return shed_cancel(e);
+ }
+
+ if (c == t->c_cc[VEOL]) {
+ return shed_move_end(e);
+ }
+
+ if (c == t->c_cc[VERASE]) {
+ return shed_backspace(e);
+ }
+
+ if (c == t->c_cc[VQUIT]) {
+ /* ^\ */
+ return 1;
+ }
+
+ if (c == t->c_cc[VSTART]) {
+ /* ^Q */
+ return 1;
+ }
+
+ if (c == t->c_cc[VSTOP]) {
+ /* ^S */
+ return 1;
+ }
+
+ if (c == t->c_cc[VSUSP]) {
+ /* ^Z */
+ return 1;
+ }
+
+ if (c == '\033') {
+ char esc[2];
+ read(STDIN_FILENO, esc, 2);
+ if (esc[1] == 'C') {
+ return shed_move_forward(e);
+ }
+ if (esc[1] == 'D' && e->cur->pos > 0) {
+ return shed_move_backward(e);
+ }
+ return 1;
+ }
+
+ if (c == '\n') {
+ return shed_execute(e);
+ }
+
+ if (CTRL_A <= c && c <= CTRL_Z) {
+ switch (c) {
+ case CTRL_A: return shed_move_0(e);
+ case CTRL_B: return shed_move_backward(e);
+ case CTRL_C: return shed_cancel(e);
+ case CTRL_D: return shed_delete(e);
+ case CTRL_E: return shed_move_end(e);
+ case CTRL_F: return shed_move_forward(e);
+ case CTRL_G: break; // return abort(e)?
+ case CTRL_H: return shed_backspace(e);
+ case CTRL_I: break; // return complete_wordexp(e);
+ case CTRL_J: return shed_execute(e);
+ case CTRL_K: return shed_delete_toend(e);
+ case CTRL_L: return shed_redraw(e);
+ case CTRL_M: return shed_execute(e);
+ case CTRL_N: // return history_forward(e);
+ case CTRL_O: // return ??? /* ??? */
+ case CTRL_P: // return history_backward(e);
+ case CTRL_Q: // /* TTY START */
+ case CTRL_R: // return history_backsearch(e);
+ case CTRL_S: // /* TTY STOP */
+ case CTRL_T: break; // /* ??? */
+ case CTRL_U: return shed_erase(e);
+ case CTRL_V: break; // return quote(e);
+ case CTRL_W: return shed_worderase(e);
+ case CTRL_X: // /* ??? */
+ case CTRL_Y: // /* ??? */
+ case CTRL_Z: // /* ??? */
+ break;
+ }
+ return 1;
+ }
+
+ /* regular character */
+ shed_insert_char(e->cur, c);
+ return 1;
+}