summaryrefslogtreecommitdiff
path: root/app-shells/fzy/files/fzy-add-utf-8-support.patch
blob: 886957379a83c6cf09f9e0ae6f32ed4bbd812649 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
From 8dd7a9f49c2b65f28025902106f364ff11d4170d Mon Sep 17 00:00:00 2001
From: syrrim <syrrim0@gmail.com>
Date: Mon, 23 Apr 2018 01:25:48 -0400
Subject: [PATCH] add utf-8 support to input, fixes #21

- non ascii bytes won't be ignored
- one can seek over and delete whole utf-8 codepoints at a time
- the cursor will be positioned properly around double width chars
---
 src/tty_interface.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/tty_interface.c b/src/tty_interface.c
index a7d506e..35f2919 100644
--- a/src/tty_interface.c
+++ b/src/tty_interface.c
@@ -7,6 +7,14 @@
 #include "tty_interface.h"
 #include "../config.h"
 
+static int isprint_unicode(char c){
+	return isprint(c) || c & (1<<7);
+}
+
+static int is_boundary(char c) {
+	return ~c & (1<<7) || c & (1<<6);
+}
+
 static void clear(tty_interface_t *state) {
 	tty_t *tty = state->tty;
 
@@ -95,7 +103,10 @@ static void draw(tty_interface_t *state) {
 		tty_moveup(tty, num_lines);
 	}
 
-	tty_setcol(tty, strlen(options->prompt) + state->cursor);
+	tty_setcol(tty, 0);
+	fputs(options->prompt, tty->fout);
+	for(size_t i=0; i<state->cursor; i++)
+		fputc(state->search[i], tty->fout);
 	tty_flush(tty);
 }
 
@@ -138,9 +149,13 @@ static void action_del_char(tty_interface_t *state) {
 		if(state->cursor == 0) {
 			return;
 		}
+		size_t original_cursor = state->cursor;
 
 		state->cursor--;
-		memmove(&state->search[state->cursor], &state->search[state->cursor + 1], length - state->cursor);
+		while(!is_boundary(state->search[state->cursor]) && state->cursor)
+			state->cursor--;
+
+		memmove(&state->search[state->cursor], &state->search[original_cursor], length - original_cursor + 1);
 	}
 }
 
@@ -178,13 +193,19 @@ static void action_next(tty_interface_t *state) {
 }
 
 static void action_left(tty_interface_t *state) {
-	if (state->cursor > 0)
+	if (state->cursor > 0){
 		state->cursor--;
+		while(!is_boundary(state->search[state->cursor]) && state->cursor)
+			state->cursor--;
+	}
 }
 
 static void action_right(tty_interface_t *state) {
-	if (state->cursor < strlen(state->search))
+	if (state->cursor < strlen(state->search)){
 		state->cursor++;
+		while(!is_boundary(state->search[state->cursor]))
+			state->cursor++;
+	}
 }
 
 static void action_beginning(tty_interface_t *state) {
@@ -315,7 +336,7 @@ static void handle_input(tty_interface_t *state, const char *s) {
 
 	/* No matching keybinding, add to search */
 	for (int i = 0; input[i]; i++)
-		if (isprint(input[i]))
+		if (isprint_unicode(input[i]))
 			append_search(state, input[i]);
 
 	/* We have processed the input, so clear it */