tritask-vscodeの区切りジャンプ処理
code:ts
function jumpToSeparator(command: string) {
const editor = getEditor();
const doc = editor.document;
const lineCount = doc.lineCount;
const curPos = CursorPositioner.current();
// 区切り行を自力で探す.
// - 区切り行 = -- が存在する行.
// - Why 自力? -> Symbol を作り込むのは大変だし Jump to Next Symbol 的なコマンドもサポートされてないから.
const lineNumberOfSeparators = [];
for (let curLineNumber = 0; curLineNumber < lineCount; curLineNumber++) {
const line = doc.lineAt(curLineNumber).text;
if (line.length < LEN_BEFORE_DESCRIPTION) {
continue;
}
if (line.indexOf('--') == -1) {
continue;
}
lineNumberOfSeparators.push(curLineNumber);
}
if (lineNumberOfSeparators.length == 0) {
return;
}
// up down
// Case1 x o(1)
// -1-
// Case2 o(1) o(2)
// -2-
// Case3 o(2) o(3)
// -3-
// Case4 o(3) x
//
// up(上の区切り)時は下から見ていって最初にヒットした区切りにジャンプ.
// down(下の区切り)時は上から見ていって最初にヒットした区切りにジャンプ.
let destLineNumber = -1;
if (command == 'up') {
for (let i = lineNumberOfSeparators.length - 1; i >= 0; i--) {
const lineNumberofSeparator = lineNumberOfSeparatorsi; const cursorLineNumber = curPos.line;
if (lineNumberofSeparator < cursorLineNumber) {
destLineNumber = lineNumberofSeparator;
break;
}
}
} else if (command == 'down') {
for (let i = 0; i < lineNumberOfSeparators.length; i++) {
const lineNumberofSeparator = lineNumberOfSeparatorsi; const cursorLineNumber = curPos.line;
if (cursorLineNumber < lineNumberofSeparator) {
destLineNumber = lineNumberofSeparator;
break;
}
}
}
if (destLineNumber == -1) {
return;
}
const newPos = curPos.with(destLineNumber, curPos.character);
const sel = new vscode.Selection(newPos, newPos);
editor.selection = sel;
const range = new vscode.Range(newPos, newPos);
editor.revealRange(range, vscode.TextEditorRevealType.Default);
}