summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/ext/utfwidth.py18
-rw-r--r--ranger/gui/widgets/console.py4
2 files changed, 16 insertions, 6 deletions
diff --git a/ranger/ext/utfwidth.py b/ranger/ext/utfwidth.py
index bbc67deb..2881a2a0 100644
--- a/ranger/ext/utfwidth.py
+++ b/ranger/ext/utfwidth.py
@@ -27,14 +27,14 @@ def utf_byte_length(string):
 	if firstord < 0x01111111:
 		return 1
 	if firstord < 0x10111111:
-		return 0  # invalid
+		return 1  # invalid
 	if firstord < 0x11011111:
 		return min(2, len(string))
 	if firstord < 0x11101111:
 		return min(3, len(string))
 	if firstord < 0x11110100:
 		return min(4, len(string))
-	return 0  # invalid
+	return 1  # invalid
 
 def utf_char_width(string):
 	# XXX
@@ -45,6 +45,7 @@ def utf_char_width(string):
 		return WIDE
 
 def _utf_char_to_int(string):
+	# Squash the last 6 bits of each byte together to an integer
 	u = 0
 	for c in string:
 		u = (u << 6) | (ord(c) & 0b00111111)
@@ -56,9 +57,16 @@ def uwid(string):
 	width = 0
 	while i < end:
 		bytelen = utf_byte_length(string[i:])
-		if bytelen:
-			width += utf_char_width(string[i:i+bytelen])
-		else:
 			width += 1
 		i += bytelen
 	return width
+
+def uchars(string):
+	end = len(string)
+	i = 0
+	result = []
+	while i < end:
+		bytelen = utf_byte_length(string[i:])
+		result.append(string[i:i+bytelen])
+		i += bytelen
+	return result
diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py
index 30872639..5a538ce2 100644
--- a/ranger/gui/widgets/console.py
+++ b/ranger/gui/widgets/console.py
@@ -31,6 +31,7 @@ from ranger.ext.utfwidth import uwid
 from ranger.container.keymap import CommandArgs
 from ranger.ext.get_executables import get_executables
 from ranger.ext.direction import Direction
+from ranger.ext.utfwidth import uwid, uchars
 from ranger.container import History
 from ranger.container.history import HistoryEmptyException
 import ranger
@@ -264,7 +265,8 @@ class Console(Widget):
 			self.close()
 		pos = self.pos + mod
 
-		self.line = self.line[0:pos] + self.line[pos+1:]
+		chars = uchars(self.line)
+		self.line = ''.join(chars[0:pos] + chars[pos+1:])
 		self.move(right=mod)
 		self.on_line_change()
 
div>
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158