any-rule/src/useQuickPick.ts

103 lines
3.7 KiB
TypeScript
Raw Normal View History

import { ExtensionContext, workspace, languages, window, TextDocument, Position, Range, Selection } from "vscode";
2020-02-21 01:17:23 +08:00
import { Rule } from './interface';
// import { slugify } from 'transliteration';
import insertLog from './insertLog';
import showResultMessage from './showResultMessage';
2020-02-21 01:17:23 +08:00
export default function (context: ExtensionContext, RULES: Rule[]) {
// commands.registerCommand('functions.insertRegex', insertRule);
// 不确定是不是都兼容"*", 保守
2020-03-09 13:34:43 +08:00
let { supportedLanguages, triggerStringEnd } = getConfig();
workspace.onDidChangeConfiguration(() => {
const config = getConfig();
supportedLanguages = config.supportedLanguages;
triggerStringEnd = config.triggerStringEnd;
});
const disposable = languages.registerCompletionItemProvider(supportedLanguages.split(','), {
2020-02-21 01:17:23 +08:00
provideCompletionItems(document, position) {
const { triggerString } = getConfig();
// 如果为空表示关闭
if (!triggerString) return [];
2020-02-21 01:17:23 +08:00
const linePrefix = document.lineAt(position).text.substr(0, position.character);
if (!linePrefix.endsWith(triggerString)) return [];
2020-02-21 01:17:23 +08:00
// 滞后执行
setTimeout(() => {
// showQuickPick
window.showQuickPick(RULES.map(({ examples, title, rule }) => {
// const match = title.match(/\((.+)\)/);
return {
label: title,
// description: null !== match ? match[1] : '',
rule: String(rule), // 非标准字段, 仅仅为了传值
detail: `例如: ${examples.join(' 或 ')}`
};
}), {
placeHolder: '请输入关键词',
// onDidSelectItem(item){
// console.log(item)
// }
}).then(item => {
if (!item) return
insertRule(document, position, item.rule);
2020-02-22 01:08:31 +08:00
// 日志
insertLog({
rule: item.rule,
title: item.label,
method: 'QuickPick'
});
2020-02-28 09:57:46 +08:00
showResultMessage(item.label, item.rule);
2020-02-22 01:08:31 +08:00
});
2020-02-23 01:33:01 +08:00
}, 10)
return [];
2020-02-21 01:17:23 +08:00
},
resolveCompletionItem(item) {
return item;
}
}, triggerStringEnd);
2020-02-21 01:17:23 +08:00
context.subscriptions.push(disposable);
}
function insertRule(document: TextDocument, position: Position, ruleString: string) {
const { triggerString } = getConfig();
const editor = window.activeTextEditor;
if (void 0 === editor) return;
editor.edit(editBuilder => {
const line = document.lineAt(position);
// 起始, "zz."前面的位置
const startPostion = position.translate(0, -triggerString.length);
2020-02-21 15:30:38 +08:00
editBuilder.replace(new Range(startPostion, position), ruleString);
setTimeout(() => {
// 全选正则字符串
2020-02-21 15:30:38 +08:00
const endPostion = new Position(line.lineNumber, startPostion.character + ruleString.length);
editor.selection = new Selection(startPostion, endPostion);
}, 0);
2020-02-21 01:17:23 +08:00
});
}
// 获取配置
function getConfig() {
const configuration = workspace.getConfiguration();
2020-03-09 13:34:43 +08:00
const { triggerString } = configuration['any-rule'];
const { length } = triggerString;
const triggerStringStart = triggerString.substr(0, length - 1);
const triggerStringEnd = triggerString.substr(-1);
return {
2020-03-09 13:34:43 +08:00
triggerStringStart,
triggerStringEnd,
triggerString,
// 预留
supportedLanguages: '*'
}
}