From 34aaa678b117c7fb44e57eabb959c5ba4819bc11 Mon Sep 17 00:00:00 2001 From: b1ek Date: Fri, 17 Mar 2023 16:08:49 +1000 Subject: [PATCH] Ctrl+backspace, register clipboard --- react/resume/package.json | 1 + react/resume/src/emulator/index.js | 2 + react/resume/src/emulator/zsh.js | 60 ++++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/react/resume/package.json b/react/resume/package.json index d8d8fc6..f37bf4a 100644 --- a/react/resume/package.json +++ b/react/resume/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@parcel/fs": "^2.8.3", + "copy-to-clipboard": "^3.3.3", "memfs": "^3.4.13", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/react/resume/src/emulator/index.js b/react/resume/src/emulator/index.js index ff2c345..c63a4fd 100644 --- a/react/resume/src/emulator/index.js +++ b/react/resume/src/emulator/index.js @@ -3,7 +3,9 @@ module.exports = (dom) => { terminal.writeln('Welcome to my online resume!') terminal.writeln('Type \033[1;32mhelp\033[0m for list of commands') + terminal.writeln('Use \033[1;33mAlt+C/V\033[0m to copy or paste'); terminal.writeln(''); require('./zsh')(terminal, dom); + require('./pastebuffer')(terminal, dom); } \ No newline at end of file diff --git a/react/resume/src/emulator/zsh.js b/react/resume/src/emulator/zsh.js index 36d0584..5daabd1 100644 --- a/react/resume/src/emulator/zsh.js +++ b/react/resume/src/emulator/zsh.js @@ -24,7 +24,14 @@ function text_prompt() { return prompt.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''); } -function pr_char(char) { +/** + * + * @param { string } char + * @param { KeyboardEvent } dom + */ +function pr_char(char, dom) { + if (dom.key.length != 1) return; + cmd += char; terminal.write(char); } @@ -99,20 +106,41 @@ function reset_cmd() { terminal.writeln(''); } +function cbackspace() { + let exploded = cmd.split(' '); + if (exploded.length >= 1) { + reprint_prompt(); + cmd = ''; + return; + } + exploded.pop(); + + cmd = exploded.join(' ') + ' '; + reprint_prompt(); + terminal.write(cmd); + return; + +} + +function backspace(isCtrl) { + if (terminal.buffer.active.cursorX <= text_prompt().length) return; + + if (isCtrl) { + return cbackspace(); + } + + terminal.write('\b \b'); + cmd = cmd.substring(0, cmd.length - 1); +} + /** @param { KeyboardEvent } dom */ function control_char(id, dom) { - const backspace = () => { - if (terminal.buffer.active.cursorX <= text_prompt().length) return; - terminal.write('\b \b'); - cmd = cmd.substring(0, cmd.length - 1); - } - switch (id) { // backspace case 8: - backspace(); + backspace(dom.ctrlKey); break; // enter @@ -135,11 +163,9 @@ function control_char(id, dom) { print_prompt(); break; } - - case 37: - backspace(); - break; + case 86: + if (dom.altKey) break; default: if (dom.ctrlKey && (dom.key.length == 1)) { @@ -160,16 +186,20 @@ function key(e) { /** @type {KeyboardEvent} */ const dom = e.domEvent; if (dom.key.length == 1 && !(dom.ctrlKey || dom.altKey)) { - pr_char(e.domEvent.key); + pr_char(e.domEvent.key, dom); } else { control_char(e.domEvent.keyCode, dom) } } -module.exports = (t, d) => { +function register(t, d) { terminal = t; dom = d; terminal.onKey(key); terminal.write(prompt); -} \ No newline at end of file +} + +register.pr_char = pr_char; + +module.exports = register; \ No newline at end of file