generated at
scrapbox-cursor-jumper-2
2021-06-08 23:45:50 deprecated
hr
scrapbox editorのcursorを移動させるAPI

使用できる関数一覧
任意の位置に飛ぶ
jumpTo()
行頭に飛ぶ
jumpToHead()
行末に飛ぶ
jumpToLast()
最初の非空白文字に飛ぶ
jumpToHeadWithoutBlank()
最後の非空白文字に飛ぶ
jumpToLastWithoutBlank()

前versionのscrapbox-line-clickerからの変更点
関数名を変更した
任意の位置に飛ぶ関数 jumpTo() を追加した
行のDOMではなくscrapbox line objectを受け取るようにした

2021-03-14 21:59:26
execClick() の引数の形式を少し変えた
sleep() execClick() の中に含め、すべての関数を非同期化した

dependencies
script.js
import {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.js
export 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.js
export 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.js
export 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.js
export 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}); }

hr
テストコード
test.js
import { 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}`); }

#2021-06-08 23:46:03
#2021-03-14 21:54:13
#2020-12-18 07:42:54