文件
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

35 行
888 B
TypeScript

import { EditorSelection } from '@codemirror/state';
import { Command, EditorView } from '@codemirror/view';
const duplicateLine: Command = (editor: EditorView) => {
const state = editor.state;
const doc = state.doc;
const transaction = state.changeByRange(range => {
const currentLine = doc.lineAt(range.anchor);
let text, insertPos, selectionRange;
if (range.empty) {
text = `\n${currentLine.text}`;
insertPos = currentLine.to;
selectionRange = EditorSelection.cursor(currentLine.to + text.length);
} else {
text = doc.slice(range.from, range.to);
insertPos = range.to;
selectionRange = EditorSelection.range(range.to, range.to + text.length);
}
return {
range: selectionRange,
changes: [{
from: insertPos,
to: insertPos,
insert: text,
}],
};
});
editor.dispatch(transaction);
return true;
};
export default duplicateLine;