editor-action
ja
Visual Studio Codeのキーボードショートカットを参考に作成
ページタイトルは、VScodeのアクションが、editor.actionなどに集約されていることから由来
ほとんどの関数名は、VSCodeを真似ている
末尾に「Action」をつけたりつけなかったりは、それが影響したりしている
少しずつVSCodeのコマンドを追加していきたい
キーボード操作に依存しているから、1つのactionがOSごとに違う挙動をすることが起こりうる
これを果たしてactionと呼んでいいのだろうか?
Actions
insertLineBefore
Insert Line Above
行を上に挿入
insertLineAfter
Insert Line Below
行を下に挿入
clipboardCutAction
Cut
切り取り
clipboardCopyAction
Copy
コピー
copyLinesDownAction
Copy Line Down
行を下へコピー
goToLine
Go to Line...
行に移動...
linkAction
選択範囲をリンクにする
複数行の場合、各行をリンクする
unlinkAction
選択範囲をアンリンクする
---
KEYCODE
import
code:script.js
import { unlink } from '../utils/script.js'
import { linkText } from '../link-text/script.js'
import { replaceText } from '../replace-text/script.js'
import { getText } from '/api/code/takker/scrapbox-access-nodes@0.1.0/script.js'
import { position } from '/api/code/takker/scrapbox-cursor-position-6/script.js'
import { scrapboxDOM } from '/api/code/takker/scrapbox-dom-accessor/script.js'
import { insertText } from '/api/code/takker/scrapbox-insert-text-2/script.js'
import { press } from '/api/code/takker/scrapbox-keyboard-emulation-2/script.js'
import { goHeadLine } from '/api/code/takker/scrapbox-motion-emulation/script.js'
import { selection } from '/api/code/takker/scrapbox-selection-3/script.js'
const _currentLineText = () => {
const { line } = position()
const text = getText(line)
return text
}
const _copyLineText = () => {
const text = _currentLineText()
navigator.clipboard.writeText(text + '\n')
return text
}
const _selectLine = () => {
press('End')
press('Home', { shiftKey: true })
press('Home', { shiftKey: true })
}
export const insertLineAfter = (e) => {
e.preventDefault()
press('End')
press('Enter')
}
export const insertLineBefore = (e) => {
e.preventDefault()
press('Home')
press('Enter')
press('ArrowUp')
}
export const clipboardCutAction = (e) => {
if (selection._selectMode) return
e.preventDefault()
_copyLineText()
insertText('.') // dummy
_selectLine()
press('Delete')
press('Delete')
}
export const clipboardCopyAction = (e) => {
if (selection._selectMode) return
e.preventDefault()
_copyLineText()
}
export const copyLinesDownAction = (e) => {
// TODO: 行の途中から選択したときに、行の先頭からコピーさせる
e.preventDefault()
const text = selection._selectMode ? selection.text : _copyLineText()
console.log(text, selection.range)
if (selection._selectMode) {
press('ArrowRight')
press('End')
}
insertLineAfter(e)
_selectLine() // 行頭にスペースが入るときに除ける
insertText(text)
}
export const goToLine = (e) => {
e.preventDefault()
const pageLinesLength = scrapbox.Page.lines.length
const lineNo = window.prompt(
Type a line number between 1 and ${pageLinesLength} to navigate to.
)
if (lineNo < 1 || pageLinesLength < lineNo) return
// TODO: goLine() がコケるので適当に実装
goHeadLine()
for (let i = 2; i <= lineNo; i++) {
press('ArrowDown')
}
}
export const linkAction = (e) => {
if (!selection._selectMode) return
e.preventDefault()
insertText(linkText(selection.text))
}
export const unlinkAction = (e) => {
if (!selection._selectMode) return
e.preventDefault()
const unlinked = unlink(selection.text)
if (selection.text === unlinked) return
insertText(unlinked)
}
export const insertTextAction = (text) => {
return (e) => {
e.preventDefault()
insertText(text)
}
}
export const replaceAction = (e) => {
if (!selection._selectMode) return
e.preventDefault()
insertText(replaceText(selection.text))
}