完善代码补全功能

This commit is contained in:
fofolee
2022-03-31 17:25:05 +08:00
parent 17cf743e1f
commit f6b8bb2a8d
21 changed files with 1273 additions and 18 deletions

View File

@@ -1,107 +0,0 @@
<script type="text/javascript">
const programs = {
quickcommand: {
name: "quickcommand",
highlight: "javascript",
bin: "",
argv: "",
ext: "",
color: "#006e54",
},
shell: {
name: "shell",
bin: "bash",
argv: "",
ext: "sh",
color: "#89e051",
},
applescript: {
name: "applescript",
bin: "osascript",
argv: "",
ext: "scpt",
color: "#101F1F",
},
cmd: {
name: "cmd",
highlight: "bat",
bin: "",
argv: "",
ext: "bat",
color: "#C1F12E",
},
powershell: {
name: "powershell",
bin: "powershell",
argv: "-NoProfile -File",
ext: "ps1",
color: "#012456",
},
python: {
name: "python",
bin: "python",
argv: "-u",
ext: "py",
color: "#3572A5",
},
javascript: {
name: "javascript",
bin: "node",
argv: "",
ext: "js",
color: "#f1e05a",
},
ruby: {
name: "ruby",
bin: "ruby",
argv: "",
ext: "rb",
color: "#701516",
},
php: {
name: "php",
bin: "php",
argv: "",
ext: "php",
color: "#4F5D95",
},
c: {
name: "c",
bin: "gcc",
argv: "-o",
ext: "c",
color: "#555555",
},
csharp: {
name: "csharp",
bin: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\csc.exe",
argv: "/Nologo",
ext: "cs",
color: "#178600",
},
lua: {
name: "lua",
bin: "lua",
argv: "",
ext: "lua",
color: "#000080",
},
perl: {
name: "perl",
bin: "perl",
argv: "",
ext: "pl",
color: "#0298c3",
},
custom: {
name: "custom",
bin: "",
argv: "",
ext: "",
color: "#438eff",
},
};
export default {
programs,
};
</script>

View File

@@ -5,11 +5,17 @@
<script>
import * as monaco from "monaco-editor";
import { toRaw } from "vue";
import utoolsApi from "!raw-loader!../types/utools.api.d.ts";
import quickcommandApi from "!raw-loader!../types/quickcommand.api.d.ts";
import electronApi from "!raw-loader!../types/electron.d.ts";
import nodeApi from "!raw-loader!../types/node.api.d.ts";
import commonApi from "!raw-loader!../types/common.d.ts";
import importAll from "../api/importAll.js";
// 批量导入声明文件
let apis = importAll(
require.context("!raw-loader!../plugins/monaco/types/", false, /\.ts$/)
);
// 批量导入关键字补全
let languageCompletions = importAll(
require.context("../plugins/monaco/completions/", false, /\.js$/)
);
export default {
data() {
@@ -36,6 +42,10 @@ export default {
},
}
);
this.loadTypes();
this.registerLanguage();
},
loadTypes() {
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
noSemanticValidation: true,
noSyntaxValidation: false,
@@ -46,11 +56,82 @@ export default {
allowJs: true,
lib: [],
});
// 引入声明文件
monaco.languages.typescript.javascriptDefaults.addExtraLib(
quickcommandApi + utoolsApi + electronApi + nodeApi + commonApi,
Object.values(apis)
.map((x) => x.default)
.join("\n"),
"api.d.ts"
);
},
registerLanguage() {
let that = this;
const identifierPattern = "([a-zA-Z_]\\w*)";
let getTokens = (code) => {
let identifier = new RegExp(identifierPattern, "g");
let tokens = [];
let array1;
while ((array1 = identifier.exec(code)) !== null) {
tokens.push(array1[0]);
}
return Array.from(new Set(tokens));
};
let createDependencyProposals = (range, keyWords, editor, curWord) => {
let keys = [];
let tokens = getTokens(editor.getModel().getValue());
// 自定义变量、字符串
for (const item of tokens) {
if (item != curWord.word) {
keys.push({
label: item,
kind: monaco.languages.CompletionItemKind.Text,
documentation: "",
insertText: item,
range: range,
});
}
}
// 关键字、函数
Object.keys(keyWords).forEach((ItemKind) => {
keyWords[ItemKind].forEach((item) => {
keys.push({
label: item,
kind: monaco.languages.CompletionItemKind[ItemKind],
documentation: "",
insertText: item,
range: range,
});
});
});
return keys;
};
// 注册 applescript
monaco.languages.register({
id: "applescript",
});
// 注册自动补全
Object.keys(languageCompletions).forEach((language) => {
monaco.languages.registerCompletionItemProvider(language, {
provideCompletionItems: function (model, position) {
var word = model.getWordUntilPosition(position);
var range = {
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
startColumn: word.startColumn,
endColumn: word.endColumn,
};
return {
suggestions: createDependencyProposals(
range,
languageCompletions[language].default,
toRaw(that.editor),
word
),
};
},
});
});
},
getEditorValue() {
return toRaw(this.editor).getValue();
},