From dbf3ad8414ac528991bbb3b43610a5479b4b356c Mon Sep 17 00:00:00 2001 From: Koushien Date: Fri, 5 Jan 2018 21:36:12 -0800 Subject: [PATCH] Support Emacs-style C-(a|e|k|u) in cmdline By default, C-c in Vimperator copies selection if present. We reimplement this. --- src/commandline_frame.ts | 44 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/commandline_frame.ts b/src/commandline_frame.ts index ae232fcc..c8f21333 100644 --- a/src/commandline_frame.ts +++ b/src/commandline_frame.ts @@ -105,11 +105,47 @@ clInput.addEventListener("keydown", function (keyevent) { history(1) break - // Clear input on ^C + case "a": + if (keyevent.ctrlKey) { + keyevent.preventDefault() + keyevent.stopPropagation() + setCursor() + } + break + + case "e": + if (keyevent.ctrlKey){ + keyevent.preventDefault() + keyevent.stopPropagation() + setCursor(clInput.value.length) + } + break + + case "u": + if (keyevent.ctrlKey){ + keyevent.preventDefault() + keyevent.stopPropagation() + clInput.value = clInput.value.slice(clInput.selectionStart, clInput.value.length) + setCursor() + } + break + + case "k": + if (keyevent.ctrlKey){ + keyevent.preventDefault() + keyevent.stopPropagation() + clInput.value = clInput.value.slice(0, clInput.selectionStart) + } + break + + // Clear input on ^C if there is no selection // Todo: hard mode: vi style editing on cli, like set -o mode vi // should probably just defer to another library case "c": - if (keyevent.ctrlKey) hide_and_clear() + if (keyevent.ctrlKey && + ! clInput.value.substring(clInput.selectionStart, clInput.selectionEnd)) { + hide_and_clear() + } break case "f": @@ -173,6 +209,10 @@ async function hide_and_clear(){ isVisible = false } +function setCursor(n = 0) { + clInput.setSelectionRange(n, n, "none") +} + function tabcomplete(){ let fragment = clInput.value let matches = state.cmdHistory.filter((key)=>key.startsWith(fragment))