scrapbox-cursor-jumper-2
2021-06-08 23:45:50 deprecated
scrapbox editorのcursorを移動させるAPI
使用できる関数一覧
任意の位置に飛ぶ
jumpTo()
行頭に飛ぶ
jumpToHead()
行末に飛ぶ
jumpToLast()
最初の非空白文字に飛ぶ
jumpToHeadWithoutBlank()
最後の非空白文字に飛ぶ
jumpToLastWithoutBlank()
関数名を変更した
任意の位置に飛ぶ関数 jumpTo()
を追加した
2021-03-14 21:59:26
execClick()
の引数の形式を少し変えた
sleep()
を execClick()
の中に含め、すべての関数を非同期化した
dependencies
script.jsimport {press} from '../scrapbox-keyboard-emulation-2/script.js';
import {sleep} from '../sleep/script.js';
import {mimicClick as execClick} from '../scrapbox-pointer-emulation@0.1.0/script.js';
任意の位置
script.jsexport async function jumpTo(charObj, metaKeys) {
// 一旦行頭に移動する
await jumpToHead(charObj.line, metaKeys);
// 目的の位置にcursorを移動する
for (let i = 0; i < charObj.index; i++) {
press('ArrowRight', metaKeys);
}
}
行頭行末移動
行頭のY座標は top
を押す
前の行との境界ギリギリだが、問題はなさそう
もし前の行と誤認識してしまうようであれば、数px下にずらす
行末
画像がある行の行末に確実に飛ぶように、クリック位置を12px6px1pxだけ右にずらしてある
もう少し少なめにしても飛ばせるかも
12→6にしてみた
1で十分みたい
文字のみならずらさなくても飛べる
Y座標を top
から少しずらしてある
ずらさなくてもいいかもしれない
bottom
は使えない
アイコン記法など、bottomが次の行に被るくらい伸びているときがあるので
script.jsexport async function jumpToHead(lineObj, metaKeys) {
const {left, top} = lineObj.DOM.getBoundingClientRect();
//console.log({left, top, lineObj});
await execClick(lineObj.DOM, {X: left, Y: top, ...metaKeys});
}
こいつバグってるみたい
[]
が行末にある行に移動する際に lineObj.lastChar.DOM is undefined
になる
script.jsexport async function jumpToLast(lineObj, metaKeys) {
const {right, top, height} = lineObj.lastChar.DOM.getBoundingClientRect();
//console.log({right, top, lineObj});
await execClick(lineObj.DOM, {X: right + 1, Y: top + height / 2, ...metaKeys});
}
非空白文字を除いた場所に移動
script.jsexport async function jumpToHeadWithoutBlank(lineObj, metaKeys) {
const {left, top} = lineObj.headNonBlankChar.DOM.getBoundingClientRect();
await execClick(lineObj.DOM, {X: left, Y: top, ...metaKeys});
}
export async function jumpToLastWithoutBlank(lineObj, metaKeys) {
const {right, top, height} = lineObj.lastNonBlankChar.DOM.getBoundingClientRect();
await execClick(lineObj.DOM, {X: right + 1, Y: top + height / 2, ...metaKeys});
}
テストコード
test.jsimport {
jumpTo,
jumpToHead,
jumpToLast,
jumpToHeadWithoutBlank,
jumpToLastWithoutBlank,
} from '/api/code/takker/scrapbox-cursor-jumper-2/script.js';
import {line as l} from '/api/code/takker/scrapbox-line-accessor/script.js';
import {scrapBindings} from '/api/code/takker/ScrapBindings/script.js';
const config = [];
for (let i = 0; i < 10; i++) {
config.push(
{key: `alt+g ${i}`, command: e => {
_log(`${e.key} is pressed.`);
l(i).DOM.scrollIntoView({block: 'center'});
jumpToHead(l(i));
return false;
},},
{key: `alt+x ${i}`, command: e => {
_log(`${e.key} is pressed.`);
l(i).DOM.scrollIntoView({block: 'center'});
jumpToLast(l(i));
return false;
},},
{key: `ctrl+alt+g ${i}`, command: e => {
_log(`${e.key} is pressed.`);
l(i).DOM.scrollIntoView({block: 'center'});
jumpToHeadWithoutBlank(l(i));
return false;
},},
{key: `ctrl+alt+x ${i}`, command: e => {
_log(`${e.key} is pressed.`);
l(i).DOM.scrollIntoView({block: 'center'});
jumpToLastWithoutBlank(l(i));
return false;
},},
);
}
(async () => {
await scrapBindings.install();
scrapBindings.push(...config);
_log('ready to start');
})();
function _log(msg, ...objects){
if (objects.length > 0) {
console.log(`[test-code] ${msg}`, objects);
return;
}
console.log(`[test-code] ${msg}`);
}