diff --git a/package.json b/package.json index 55233bf..3397352 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,22 @@ ], "main": "./out/extension.js", "contributes": { + "configuration": { + "type": "object", + "title": "any-rule", + "properties": { + "AnyRule.triggerString": { + "type": "string", + "default": "zz.", + "description": "触发字符串" + }, + "AnyRule.supportedLanguages": { + "type": "string", + "default": "*, javascript, typescript, javascriptreact, typescriptreact, markdown, jsx, vue, html, json, plaintext, coffeescript", + "description": "如果您的文件格式未被支持, 请在此处添加(⚡添加成功后需要重启vscode)" + } + } + }, "commands": [ { "command": "extension.rule0", @@ -291,22 +307,6 @@ "typescript": "^3.3.1", "vscode-test": "^1.0.2" }, - "configuration": { - "type": "object", - "title": "Any Rule", - "properties": { - "anyRule.triggerString": { - "type": "string", - "default": "zz", - "description": "触发字符串" - }, - "anyRule.supportedLanguages": { - "type": "string", - "default": "javascript,typescript,javascriptreact,typescriptreact,vue,coffeescript", - "description": "激活AnyRule的文件类型,多个类型用逗号分隔" - } - } - }, "dependencies": { "transliteration": "^2.1.8" } diff --git a/src/constant.ts b/src/constant.ts deleted file mode 100644 index 9ea1fae..0000000 --- a/src/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const COMPLETION_TRIGGER_ID = 'zz.'; \ No newline at end of file diff --git a/src/useCommand.ts b/src/useCommand.ts index c370868..73cbee7 100644 --- a/src/useCommand.ts +++ b/src/useCommand.ts @@ -1,11 +1,11 @@ -import {window,version,commands,Range,ExtensionContext,extensions} from "vscode"; +import {window,commands,Range,ExtensionContext} from "vscode"; import { Rule } from './interface'; import insertLog from './insertLog'; import showResultMessage from './showResultMessage'; export default function (context: ExtensionContext, RULES: Rule[]) { RULES.forEach(({ title, rule }, index) => { - let disposable = commands.registerCommand(`extension.rule${index}`, () => { + const disposable = commands.registerCommand(`extension.rule${index}`, () => { const editor = window.activeTextEditor; if (editor) { const { selections } = editor; diff --git a/src/useQuickPick.ts b/src/useQuickPick.ts index 5cd2354..3a41e09 100644 --- a/src/useQuickPick.ts +++ b/src/useQuickPick.ts @@ -1,44 +1,52 @@ -import { ExtensionContext, version, CompletionItemKind, languages, env, Extension, window, commands, TextDocument, Position, Range, Selection, MarkdownString, extensions, Uri } from "vscode"; +import { ExtensionContext, workspace, languages, window, TextDocument, Position, Range, Selection } from "vscode"; import { Rule } from './interface'; -import { COMPLETION_TRIGGER_ID } from './constant'; // import { slugify } from 'transliteration'; import insertLog from './insertLog'; import showResultMessage from './showResultMessage'; export default function (context: ExtensionContext, RULES: Rule[]) { // commands.registerCommand('functions.insertRegex', insertRule); - - const disposable = languages.registerCompletionItemProvider('*', { + // 不确定是不是都兼容"*", 保守 + const { supportedLanguages, triggerStringEnd } = getConfig(); + const disposable = languages.registerCompletionItemProvider(supportedLanguages.split(','), { provideCompletionItems(document, position) { + const { triggerString } = getConfig(); + // 如果为空表示关闭 + if (!triggerString) return; + const linePrefix = document.lineAt(position).text.substr(0, position.character); - if (!linePrefix.endsWith(COMPLETION_TRIGGER_ID)) return; + if (!linePrefix.endsWith(triggerString)) return; - // showQuickPick - window.showQuickPick(RULES.map(({ examples, title, rule }, i) => { - // 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); + // 增加优先级 + setTimeout(() => { + // showQuickPick + window.showQuickPick(RULES.map(({ examples, title, rule }, i) => { + // 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); - // 日志 - insertLog({ - rule: item.rule, - title: item.label, - method: 'QuickPick' + // 日志 + insertLog({ + rule: item.rule, + title: item.label, + method: 'QuickPick' + }); + showResultMessage(item.label); }); - showResultMessage(item.label); - }); + }, 0) + return void 0; }, @@ -46,35 +54,41 @@ export default function (context: ExtensionContext, RULES: Rule[]) { resolveCompletionItem(item) { return item; } - }, '.'); + }, triggerStringEnd); 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); - // 起始 - const startPostion = new Position(line.lineNumber, line.text.indexOf(COMPLETION_TRIGGER_ID)); - // 结束(replace用) - const endPostion = new Position(line.lineNumber, startPostion.character + COMPLETION_TRIGGER_ID.length); + // 起始, "zz."前面的位置 + const startPostion = position.translate(0, -triggerString.length); - - // window.showInformationMessage( - // '' + startPostion.character - // , '' + endPostion.character - // ); - - editBuilder.replace(new Range(startPostion, endPostion), ruleString); + editBuilder.replace(new Range(startPostion, position), ruleString); setTimeout(() => { - // 结束(selection用) + // 全选正则字符串 const endPostion = new Position(line.lineNumber, startPostion.character + ruleString.length); editor.selection = new Selection(startPostion, endPostion); }, 0); }); } +// 获取配置 +function getConfig() { + const configuration = workspace.getConfiguration(); + const { triggerString, supportedLanguages = '*' } = configuration.AnyRule; + const { length } = triggerString; + const triggerStringStart = triggerString.substr(0, length - 1); + const triggerStringEnd = triggerString.substr(-1); + + return { + triggerStringStart, triggerStringEnd, triggerString, supportedLanguages + } +}