文件
mynode/packages/editor/CodeMirror/editorCommands/cutOrCopyText.ts
chen 301194963b
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
feat: Initial clean release of CHM
2026-11-04 11:29:39 +08:00

48 行
1.2 KiB
TypeScript

import { isolateHistory } from '@codemirror/commands';
import { Command } from '@codemirror/view';
export enum ClipboardAction {
Cut = 'cut',
Copy = 'copy',
}
type OnWriteClipboard = (text: string)=> void;
const cutOrCopyText = (onWriteClipboard: OnWriteClipboard, action: ClipboardAction): Command => (view) => {
const state = view.state;
const selections = state.selection.ranges.map(range => (
state.sliceDoc(range.from, range.to)
));
const nonEmptySelections = selections.filter(s => !!s);
const cutTransactions = [];
if (nonEmptySelections.length > 0) {
onWriteClipboard(nonEmptySelections.join('\n'));
cutTransactions.push(state.replaceSelection(''));
} else {
const selectedLine = state.doc.lineAt(state.selection.main.anchor);
onWriteClipboard(`${selectedLine.text}\n`);
cutTransactions.push({
changes: [{
from: selectedLine.from,
to: Math.min(selectedLine.to + 1, state.doc.length),
insert: '',
}],
});
}
cutTransactions.push({
annotations: [isolateHistory.of('full')],
userEvent: 'delete.cut',
});
if (action === ClipboardAction.Cut) {
view.dispatch(...cutTransactions);
}
return true;
};
export default cutOrCopyText;