diff options
Diffstat (limited to 'xP/public')
-rw-r--r-- | xP/public/xP.js | 16 |
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') |