takker99/ScrapBindings
takker99/ScrapBindings: Scrapbox UserScript for handling keyboard shortcut specified in Vim key notation
/takker/takker99/ScrapBindings
設定例
/takker/for-any-project#61937ef61280f0000061cd6f
/takker/takker99/ScrapBindings-settings
todo.icon
/scrapbox-userscript-std/行内にあるURLを範囲選択せずにscrapbox-url-customizerで変換したい
「う」でURLボタン起動したい
UserScript更新確認
2024/6/16 導入 v0.3.1
popupも統合できる!便利!yosider.icon*2
2024/11/3 v0.3.2
code:mod.ts
export * from "https://raw.githubusercontent.com/takker99/ScrapBindings/0.3.2/mod.ts";
code:config.ts
import { insertText, popupMenu } from '../scrapbox-userscript-std/dom.ts';
import { splitCodeBlock } from '../コードブロックを分割/script.ts';
const pd = (e: Event) => e.preventDefault();
const sp = (e: Event) => e.stopPropagation();
const clickPopup = (e: KeyboardEvent, buttonName: string | RegExp): void => {
const buttons = popupMenu()?.getElementsByClassName?.("button");
if (!buttons) return;
const button = ...buttons.find(
(button) => buttonName instanceof RegExp ?
buttonName.test(button.textContent ?? "") :
button.textContent === buttonName
);
if (!(button instanceof HTMLDivElement)) return;
if (e.target !== document.activeElement) return;
pd(e);sp(e);
button.click();
};
export const config = {
"u": (e: KeyboardEvent) => clickPopup(e, "URL"),
"う": (e: KeyboardEvent) => clickPopup(e, "URL"), // does not work
"4": (e: KeyboardEvent) => clickPopup(e, "$"),
"l": (e: KeyboardEvent) => clickPopup(e, "link authors"),
"<A-q>": (e: KeyboardEvent) => { pd(e); sp(e); insertText('todo.icon'); },
"<A-w>": (e: KeyboardEvent) => { pd(e); sp(e); insertText('done.icon'); },
"<C-Enter>": (e: KeyboardEvent) => { pd(e); sp(e); splitCodeBlock(); },
};
takker99/scrapbox-url-customizer
$...$を数式に変換するPopupMenu
論文著者名をリンクするPopupMenu
コードブロックを分割
todo.icon
done.icon
code:bindings.ts
import { Mousetrap } from "./mod.ts";
import {
useStatusBar,
addTextInputEventListener,
removeTextInputEventListener,
} from "../scrapbox-userscript-std/dom.ts";
import { config } from "./config.ts";
import { Scrapbox } from "../scrapbox-jp%2Ftypes/userscript.ts";
declare const scrapbox: Scrapbox;
const { render } = useStatusBar();
let animationId: number | undefined;
const onSequenceUpdate = (text: string) => {
if(animationId !== undefined) cancelAnimationFrame(animationId);
animationId = requestAnimationFrame(() => render(
{ type: "text", text, }
));
};
export const scrapBindings = new Mousetrap(
{
addEventListener: addTextInputEventListener,
removeEventListener: removeTextInputEventListener,
},
{
onSequenceUpdate,
},
);
const errors = scrapBindings.bind(config);
if(errors.size > 0) {
alert(...errors.entries().map(
(seq, messages) => `${seq}:\n${
messages.map((message) => - ${message}).join("\n")
}`
).join("\n"));
}
ScrapBindings