摘要:這次接到一個需求,要在瀏覽器的中支持自定義提示功能,如下所示可以看到,它可以根據用戶輸入的內容來一項一項排除,只顯示完全匹配的那一項。
這次接到一個需求,要在瀏覽器的IDE中支持自定義提示功能,如下所示:
可以看到,它可以根據用戶輸入的內容來一項一項排除,只顯示完全匹配的那一項。
項目的框架是Vue,編輯器用的是Monaco Editor。
vscode是我們經常在用的編輯器,它的前身是微軟的一個叫Monaco Workbench的項目,而Monaco Editor就是從這個項目中成長出來的一個web編輯器,他們很大一部分的代碼都是共用的,所以Monaco Editor和VSCode在編輯代碼,交互及UI上幾乎是一摸一樣的。不同的是,兩者的平臺不一樣,Monaco Editor基于瀏覽器,而VSCode基于electron,所以功能上VSCode更加健全,性能比較強大。
用法
安裝
npm install monaco-editor --save
使用
import * as monaco from "monaco-editor"; this.fileEditor = this.monaco.editor.create(document.getElementById("monaco"), { value: null, language: "sql" // 這里以sql為例 }) this.fileEditor.dispose(); // 使用完后銷毀
這里引入monaco要注意,在react中以下面方式引入:
import * as monaco from "monaco-editor/esm/vs/editor/editor.api";實現自定義提示功能
查看了資料后,發現在monaco中有提供一個提示功能的方法registerCompletionItemProvider,具體實現如下:
this.monaco.languages.registerCompletionItemProvider("sql", { // 這里以sql語言為例 provideCompletionItems () { return [{ label: "${_DB", // 顯示的提示內容 kind: this.monaco.languages.CompletionItemKind["Function"], // 用來顯示提示內容后的不同的圖標 insertText: "{_DB", // 選擇后粘貼到編輯器中的文字 detail: "" // 提示內容后的說明 }]; }, triggerCharacters: ["$"] // 觸發提示的字符,可以寫多個 });
以上的用法,我試了一下之后發現,雖然triggerCharacters的值是數組,可以有多個,但是里面的字符串只能識別一個字符。一開始的需求是輸入${_之后提示${_DB,但是由于不能識別多個字符,只能做到出現$就提示。
還有一個問題就是registerCompletionItemProvider的第一個參數只能是字符串,如果有多種語言只能疊加重復寫,恰巧我的需求是有多種語言,所以只能如下解決,也就是每種語言都寫了一遍:
["json", "yaml", "php", "go", "sql", "java", "markdown", "plaintext"].map(item => { this.monaco.languages.registerCompletionItemProvider(item, { provideCompletionItems () { return [{ label: "${_DB", kind: this.monaco.languages.CompletionItemKind["Function"], insertText: "{_DB", detail: "" }]; }, triggerCharacters: ["$"] }); });
需求是${_DB:key:value,也就是說在輸入${_DB后,再輸入一個:提示出key,在key之后輸入:提示value。
這里又碰到一個問題,需要知道當前輸入的內容來判斷是$還是:,而且后面兩個觸發提示的符號同是:,無法區分,只能通過識別:的位置來判斷是提示key還是value,所以還要知道當前輸入的:之前的內容。
那么只有在provideCompletionItems這一步判斷,但是查遍了資料沒有發現這樣的參數,provideCompletionItems只有model、position、token這幾個參數,后來發現model中的getLineContent方法可以獲取指定行的所有內容,而position可以獲取當前輸入行的行數和列數,于是就有了以下解決方法:
this.monaco.languages.registerCompletionItemProvider(item, { provideCompletionItems (model, position) { // 獲取當前行數 const line = position.lineNumber // 獲取當前列數 const column = position.column // 獲取當前輸入行的所有內容 const content = model.getLineContent(line) // 通過下標來獲取當前光標后一個內容,即為剛輸入的內容 const sym = content[column - 2] if (sym === "$") { return [{ label: "${_DB", kind: this.monaco.languages.CompletionItemKind["Function"], insertText: "{_DB", detail: "" }]; } return [{ label: ":abb", kind: this.monaco.languages.CompletionItemKind["Function"], insertText: "abb", detail: "" }, { label: ":bc", kind: this.monaco.languages.CompletionItemKind["Function"], insertText: "bc", detail: "" }]; }, triggerCharacters: ["$", ":"] });
能獲取光標后的第一個內容,后面的內容就都能獲取啦,如果識別到前面的內容是${_DB就提示key,否則提示value。
最后總結下來就是一定要多看文檔,勤于測試就能解決問題啦~
啦啦啦~ 交差去啦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105308.html
摘要:經過連續幾期的介紹,手寫編譯器系列進入了智能提示模塊,前幾期從詞法到文法語法,再到構造語法樹,錯誤提示等等,都是為智能提示做準備。 1 引言 詞法、語法、語義分析概念都屬于編譯原理的前端領域,而這次的目的是做 具備完善語法提示的 SQL 編輯器,只需用到編譯原理的前端部分。 經過連續幾期的介紹,《手寫 SQL 編譯器》系列進入了 智能提示 模塊,前幾期從 詞法到文法、語法,再到構造語法...
摘要:自從年月份對外公布以來,已經經過了個月的迭代,期間發布了幾十個正式版本,但一直沒有到,因為我們覺得是個里程碑版本,我們必須做的足夠完善才敢稱之為。 自從17年11月份對外公布以來,KPC已經經過了8個月的迭代,期間發布了幾十個正式版本,但一直沒有到1.0,因為我們覺得1.0是個里程碑版本,我們必須做的足夠完善才敢稱之為1.0。而如今我們有信心對外宣布:KPC 1.0終于來了! 其實距離...
摘要:宋體以像素為單位控制字號。將其設置為可隱藏窗格。是否已啟用自動刷新是否啟用自動拉取以像素為單位控制終端的字號,這是的默認值。要求工作區使用高于版本的。 用戶設置 打開 文件 > 首選項 > 用戶設置(U),(忽略覆蓋工作區提示) { // 一個制表符等于的空格數。該設置在 `editor.detectIndentation` 啟用時根據文件內容進行重寫。 editor.tabS...
閱讀 3197·2021-09-06 15:02
閱讀 2243·2019-08-30 15:48
閱讀 3439·2019-08-29 11:08
閱讀 3281·2019-08-26 13:55
閱讀 2440·2019-08-26 13:35
閱讀 3162·2019-08-26 12:11
閱讀 2598·2019-08-26 11:48
閱讀 881·2019-08-26 11:42