summaryrefslogtreecommitdiff
path: root/xP
diff options
context:
space:
mode:
Diffstat (limited to 'xP')
-rw-r--r--xP/public/xP.js16
1 files changed, 13 insertions, 3 deletions
diff --git a/xP/public/xP.js b/xP/public/xP.js
index 7fa6bf3..89c8e1c 100644
--- a/xP/public/xP.js
+++ b/xP/public/xP.js
@@ -129,6 +129,9 @@ class RelayRpc extends EventTarget {
// ---- Utilities --------------------------------------------------------------
+function utf8Encode(s) { return new TextEncoder().encode(s) }
+function utf8Decode(s) { return new TextDecoder().decode(s) }
+
// On macOS, the Alt/Option key transforms characters, which basically breaks
// all event.altKey shortcuts, so require combining them with Control as well
// on that system.
@@ -598,15 +601,22 @@ let Input = {
command: 'BufferComplete',
bufferName: bufferCurrent,
text: textarea.value,
- position: textarea.selectionEnd,
+ position: utf8Encode(
+ textarea.value.slice(0, textarea.selectionEnd)).length,
}).then(resp => {
if (!Input.stamp(textarea).every((v, k) => v === state[k]))
return
+ let preceding = utf8Encode(textarea.value).slice(0, resp.start)
+ let start = utf8Decode(preceding).length
+
// TODO: Somehow display remaining options, or cycle through.
- if (resp.completions.length)
+ if (resp.completions.length) {
textarea.setRangeText(resp.completions[0],
- resp.start, textarea.selectionEnd, 'end')
+ start, textarea.selectionEnd, 'end')
+ } else {
+ beep()
+ }
if (resp.completions.length === 1)
textarea.setRangeText(' ',
textarea.selectionStart, textarea.selectionEnd, 'end')