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
行を下へコピー
linkAction
選択範囲をリンクにする
複数行の場合、各行をリンクする
unlinkAction
選択範囲をアンリンクする
---
KEYCODE
import
log
2024-11-02 (2)
clipboardCutActionで、削除行の1つ下の行が更新されてしまう不具合を修正
2024-11-02
UserScriptをページ以外で読み込んだときにショートカットが利用できなくなる不具合を修正
code:script.js
import { unlink } from '../utils/script.js'
import { deleteLine } from '../delete-line/script.js'
import { linkText } from '../link-text/script.js'
import { replaceText } from '../replace-text/script.js'
import { getText, goHeadLine, goHeadWithoutBlank, goLine, deleteLines, insertText, press, takeCursor, takeSelection } from '/api/code/takker/scrapbox-userscript-std/mod.ts'
const _currentLineText = () => {
const { line } = takeCursor().getPosition()
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) => {
const selection = takeSelection()
if (selection.hasSelection()) return
e.preventDefault()
_copyLineText()
// deleteLinesは下の行を更新してしまうため使わない
deleteLine()
}
export const clipboardCopyAction = (e) => {
const selection = takeSelection()
if (selection.hasSelection()) return
e.preventDefault()
_copyLineText()
}
export const copyLinesDownAction = (e) => {
const selection = takeSelection()
// TODO: 行の途中から選択したときに、行の先頭からコピーさせる
e.preventDefault()
const text = selection.hasSelection() ? selection.getSelectedText() : _copyLineText()
if (selection.hasSelection()) {
press('ArrowRight')
press('End')
}
insertLineAfter(e)
_selectLine() // 行頭にスペースが入るときに除ける
insertText(text)
}
export const linkAction = (e) => {
const selection = takeSelection()
if (!selection.hasSelection()) return
e.preventDefault()
insertText(linkText(selection.getSelectedText()))
}
export const unlinkAction = (e) => {
const selection = takeSelection()
if (!selection.hasSelection()) return
e.preventDefault()
const unlinked = unlink(selection.getSelectedText())
if (selection.getSelectedText() === unlinked) return
insertText(unlinked)
}
export const insertTextAction = (text) => {
return (e) => {
e.preventDefault()
insertText(text)
}
}
export const replaceAction = (e) => {
const selection = takeSelection()
if (!selection.hasSelection()) return
e.preventDefault()
insertText(replaceText(selection.getSelectedText()))
}