Clipboard!
This commit is contained in:
parent
b02d5155bd
commit
9685568f90
30
codetab.ts
30
codetab.ts
@ -3,8 +3,8 @@ import { fontWidth, fontHeight } from "./font.ts";
|
|||||||
import { drawText } from "./builtins.ts";
|
import { drawText } from "./builtins.ts";
|
||||||
import { COLOR } from "./colors.ts";
|
import { COLOR } from "./colors.ts";
|
||||||
import {getSheet, setSheet} from "./sheet.ts";
|
import {getSheet, setSheet} from "./sheet.ts";
|
||||||
import { K, getKeyboardString, keyPressed, shiftKeyDown } from "./keyboard.ts";
|
import { K, ctrlKeyDown, getKeyboardString, keyPressed, shiftKeyDown } from "./keyboard.ts";
|
||||||
import { tokenize } from "./deps.ts";
|
import { clipboard, tokenize } from "./deps.ts";
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
scrollX: 0,
|
scrollX: 0,
|
||||||
@ -91,6 +91,19 @@ const state = {
|
|||||||
this.insertText("");
|
this.insertText("");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
async copy() {
|
||||||
|
const {code, anchor, focus} = this;
|
||||||
|
const selected = code.slice(Math.min(anchor,focus), Math.max(anchor,focus));
|
||||||
|
await clipboard.writeText(selected);
|
||||||
|
},
|
||||||
|
async cut() {
|
||||||
|
await this.copy();
|
||||||
|
this.insertText("");
|
||||||
|
},
|
||||||
|
async paste() {
|
||||||
|
|
||||||
|
this.insertText(await clipboard.readText());
|
||||||
|
},
|
||||||
scrollToCursor() {
|
scrollToCursor() {
|
||||||
const {focusY, focusX, scrollY, scrollX} = this;
|
const {focusY, focusX, scrollY, scrollX} = this;
|
||||||
const fh = fontHeight + 1;
|
const fh = fontHeight + 1;
|
||||||
@ -332,14 +345,14 @@ const drawCodeField = (code: string, x: number, y: number, w: number, h: number)
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const update = () => {
|
const update = async () => {
|
||||||
const { focus, focusX, focusY} = state;
|
const { focus, focusX, focusY} = state;
|
||||||
const keyboardString = getKeyboardString();
|
const keyboardString = getKeyboardString();
|
||||||
if (keyboardString) {
|
if (keyboardString) {
|
||||||
state.insertText(keyboardString);
|
state.insertText(keyboardString);
|
||||||
state.scrollToCursor();
|
state.scrollToCursor();
|
||||||
}
|
}
|
||||||
// TODO: Handle ctrl-C, ctrl-V, ctrl-X, ctrl-Z
|
// TODO: Handle ctrl-Z
|
||||||
// TODO: Make ctrl-/ do commenting out (take inspiration from tab)
|
// TODO: Make ctrl-/ do commenting out (take inspiration from tab)
|
||||||
|
|
||||||
if (keyPressed(K.ENTER)) {
|
if (keyPressed(K.ENTER)) {
|
||||||
@ -399,6 +412,15 @@ const update = () => {
|
|||||||
}
|
}
|
||||||
state.scrollToCursor();
|
state.scrollToCursor();
|
||||||
}
|
}
|
||||||
|
if (keyPressed("C") && ctrlKeyDown()) {
|
||||||
|
await state.copy();
|
||||||
|
}
|
||||||
|
if (keyPressed("X") && ctrlKeyDown()) {
|
||||||
|
await state.cut();
|
||||||
|
}
|
||||||
|
if (keyPressed("V") && ctrlKeyDown()) {
|
||||||
|
await state.paste();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const draw = () => {
|
const draw = () => {
|
||||||
|
@ -14,6 +14,7 @@ const colors = {
|
|||||||
CYAN: [0, 0.9, 0.9],
|
CYAN: [0, 0.9, 0.9],
|
||||||
LIGHTGRAY: [0.75, 0.75, 0.75],
|
LIGHTGRAY: [0.75, 0.75, 0.75],
|
||||||
REDDISH: [0.7, 1, 0.5],
|
REDDISH: [0.7, 1, 0.5],
|
||||||
|
DARKGREEN: [0, 0.6, 0.2],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const palette: Array<[number, number, number, number]> = Object.values(colors).map(val => [...val, 1]);
|
export const palette: Array<[number, number, number, number]> = Object.values(colors).map(val => [...val, 1]);
|
||||||
|
3
deno.lock
generated
3
deno.lock
generated
@ -41,7 +41,8 @@
|
|||||||
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin.js": "48911f26fff723a9c5f2f38e39be42fc65ed8dea6f2ba1f1acb464d3f0aa435b",
|
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin.js": "48911f26fff723a9c5f2f38e39be42fc65ed8dea6f2ba1f1acb464d3f0aa435b",
|
||||||
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin_aarch64.js": "ae4d795d93830b8a27714ab6c20b69b67f3d4ad3544c50e344558756cf2e92f3",
|
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin_aarch64.js": "ae4d795d93830b8a27714ab6c20b69b67f3d4ad3544c50e344558756cf2e92f3",
|
||||||
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_linux.js": "b064aedb175fee1a977937f07584238f313a1958f9869273e7e672c42f09932d",
|
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_linux.js": "b064aedb175fee1a977937f07584238f313a1958f9869273e7e672c42f09932d",
|
||||||
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_windows.js": "6ac603e03520c8c333e1475cb00f982adb1f8a99de7f4bb0b8953da66f210159"
|
"https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_windows.js": "6ac603e03520c8c333e1475cb00f982adb1f8a99de7f4bb0b8953da66f210159",
|
||||||
|
"https://raw.githubusercontent.com/Nisgrak/deno-clipboard/fix-deno-1.0.0/mod.ts": "85282325a499c75c6f9ed3603fc5f8baf4bf661a616add43b4e6f033def52680"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"specifiers": {
|
"specifiers": {
|
||||||
|
22
deps.ts
22
deps.ts
@ -1,17 +1,18 @@
|
|||||||
// dwm
|
// dwm
|
||||||
export {
|
export {
|
||||||
createWindow,
|
createWindow,
|
||||||
getProcAddress,
|
getProcAddress,
|
||||||
mainloop,
|
mainloop,
|
||||||
} from "https://deno.land/x/dwm@0.3.3/mod.ts";
|
} from "https://deno.land/x/dwm@0.3.3/mod.ts";
|
||||||
export * as gl from "https://deno.land/x/gluten@0.1.6/api/gles23.2.ts";
|
export * as gl from "https://deno.land/x/gluten@0.1.6/api/gles23.2.ts";
|
||||||
|
|
||||||
|
import { clipboard } from "https://raw.githubusercontent.com/Nisgrak/deno-clipboard/fix-deno-1.0.0/mod.ts";
|
||||||
// jsTokens
|
// jsTokens
|
||||||
import jsTokens from "npm:js-tokens";
|
import jsTokens from "npm:js-tokens";
|
||||||
export function tokenize(input: string): Iterable<Token> {
|
export function tokenize(input: string): Iterable<Token> {
|
||||||
// deno-lint-ignore no-explicit-any
|
// deno-lint-ignore no-explicit-any
|
||||||
return (jsTokens as any)(input);
|
return (jsTokens as any)(input);
|
||||||
};
|
}
|
||||||
type Token =
|
type Token =
|
||||||
| { type: "StringLiteral"; value: string; closed: boolean }
|
| { type: "StringLiteral"; value: string; closed: boolean }
|
||||||
| { type: "NoSubstitutionTemplate"; value: string; closed: boolean }
|
| { type: "NoSubstitutionTemplate"; value: string; closed: boolean }
|
||||||
@ -28,3 +29,12 @@ type Token =
|
|||||||
| { type: "WhiteSpace"; value: string }
|
| { type: "WhiteSpace"; value: string }
|
||||||
| { type: "LineTerminatorSequence"; value: string }
|
| { type: "LineTerminatorSequence"; value: string }
|
||||||
| { type: "Invalid"; value: string };
|
| { type: "Invalid"; value: string };
|
||||||
|
|
||||||
|
// clipboard
|
||||||
|
export { clipboard } from "https://raw.githubusercontent.com/Nisgrak/deno-clipboard/fix-deno-1.0.0/mod.ts";
|
||||||
|
try {
|
||||||
|
await clipboard.readText();
|
||||||
|
} catch (err) {
|
||||||
|
console.log("If you are running this on linux, please make sure you have 'xsel' installed.");
|
||||||
|
throw err;
|
||||||
|
}
|
6
index.ts
6
index.ts
@ -23,7 +23,7 @@ addToContext("play", () => {
|
|||||||
|
|
||||||
clearScreen();
|
clearScreen();
|
||||||
|
|
||||||
await mainloop((_t) => {
|
await mainloop(async (_t) => {
|
||||||
// TODO: use t
|
// TODO: use t
|
||||||
if (keyPressed(K.ESCAPE)) {
|
if (keyPressed(K.ESCAPE)) {
|
||||||
const modeTo = ({
|
const modeTo = ({
|
||||||
@ -51,11 +51,11 @@ await mainloop((_t) => {
|
|||||||
repl.draw();
|
repl.draw();
|
||||||
frame();
|
frame();
|
||||||
} else if (mode === "edit") {
|
} else if (mode === "edit") {
|
||||||
editmode.update();
|
await editmode.update();
|
||||||
editmode.draw();
|
editmode.draw();
|
||||||
frame();
|
frame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
refreshKeyboard();
|
refreshKeyboard();
|
||||||
refreshMouse();
|
refreshMouse();
|
||||||
});
|
}, false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user