簡介
這是基于 Vue 3 開發的 CodeMirror 組件。該組件基于 CodeMirror 5 開發,僅支持 Vue 3。
除了支持官方提供的各種語法模式外,還額外添加了日志輸出展示模式,開箱即用,但不一定適用于所有場景。
如需完整文檔和更多使用案例,請查閱 codemirror-editor-vue3 的官方文檔。
安裝
npm install codemirror-editor-vue3 codemirror@^5 -Syarn add codemirror-editor-vue3 codemirror@">=5.64.0 <6"pnpm i codemirror-editor-vue3 codemirror@^5 -S
如果你的項目需要支持 TypeScript,則還需要安裝 @types/codemirror 依賴。
npm install @types/codemirror -D
注冊全局組件
不推薦全局注冊組件,這會導致模板中的類型提示無法正確獲取。
main.js:
import { createApp } from "vue";
import App from "./App.vue";
import { InstallCodeMirror } from "codemirror-editor-vue3";const app = createApp(App);
app.use(InstallCodeMirror);
app.mount("#app");
全局注冊的組件名稱是Codemirror,或者您可以自定義組件名稱,例如:
app.use(InstallCodeMirror, { componentName: "customName" });
在組件中使用
<template><Codemirrorv-model:value="code":options="cmOptions"borderplaceholder="test placeholder":height="200"@change="change"/>
</template><script>
import Codemirror from "codemirror-editor-vue3";// placeholder
import "codemirror/addon/display/placeholder.js";// language
import "codemirror/mode/javascript/javascript.js";
// placeholder
import "codemirror/addon/display/placeholder.js";
// theme
import "codemirror/theme/dracula.css";import { ref } from "vue";
export default {components: { Codemirror },setup() {const code = ref(`
var i = 0;
for (; i < 9; i++) {console.log(i);// more statements
}`);return {code,cmOptions: {mode: "text/javascript", // Language modetheme: "dracula", // Theme},};},
};
</script>
語法高亮
常用語法
- javascript
- json
- css
- html
- apl
- yaml
更多的案例正在逐漸增加,您也可以參考文檔來實現更多的語言模式。
自定義語法高亮
自定義語法文件custom-js-mode
import { javascript } from "codemirror/mode/javascript/javascript";export function defineCustomMode(CodeMirror) {CodeMirror.defineMode("custom-javascript", function(config, parserConfig) {const jsMode = CodeMirror.getMode(config, "text/javascript");return {startState: function() {return {jsState: jsMode.startState(),};},token: function(stream, state) {if (stream.match(/^$([^$]*)\]/)) {return "bracket-content";}if (stream.match(/^[A-Za-z_][A-Za-z0-9_]*(?=\s*$|\s*[({=;])/)) {return "english-word";}return jsMode.token(stream, state.jsState);},indent: jsMode.indent,electricInput: jsMode.electricInput,fold: jsMode.fold,closeBrackets: jsMode.closeBrackets,};});
}
在組件中使用自定義語法模式
<template><Codemirrorv-model:value="code":options="cmOptions"borderplaceholder="test placeholder":height="200"@change="change"/>
</template><script>
import Codemirror from "codemirror-editor-vue3";// placeholder
import "codemirror/addon/display/placeholder.js";// language
import "codemirror/mode/javascript/javascript.js";
// placeholder
import "codemirror/addon/display/placeholder.js";
// theme
// import "codemirror/theme/dracula.css";
import "codemirror/theme/dracula.css";// 引入自定義模式
import { defineCustomMode } from "./custom-js-mode"; // 替換為你實際路徑// 注冊自定義模式
defineCustomMode(window.CodeMirror);import { ref } from "vue";
export default {components: { Codemirror },setup() {const code = ref(`[一級渠道]ROW_MAX()`);return {code,cmOptions: {// mode: "log", // Language mode// theme: "default", // Theme// mode: "text/javascript", // Language mode// theme: "dracula", // Thememode: "custom-javascript", // Language modetheme: "dracula", // Theme},};},
};
</script>
<style>/* 在 style 部分添加以下樣式 */
.cm-s-dracula span.cm-variable {color: rgba(141,213,121,0.8) !important;
}.cm-s-dracula span.cm-english-word {color: rgba(216,78,224,0.8) !important;
}
</style>
配置項
name | description | type | default |
---|---|---|---|
value(v-model) | Editor content | string | “” |
options | Configuration options of codemirror5 | EditorConfiguration | DEFAULT_OPTIONS |
placeholder | Editor placeholder content to introduce codemirror related files | string | “” |
border | Whether to display editor borders | boolean | false |
width | Width | string | 100% |
height | Height | string | 100% |
original-style | Using the original style, disable the second modification of the style for this component (but does not affect width, height, and border) | boolean | false |
KeepCursorInEnd | Always keep the mouse position on the last line | boolean | false |
merge | Merge mode, can also be used as diff pattern | boolean | false |
事件
定義組件事件
下面三個僅僅是這個組件封裝的事件。請參考更多事件代碼鏡像事件
event name | description | params |
---|---|---|
change | value or instance changes | (value: string, cm: Editor) => void |
input | input | (value: string) => void |
ready | The Codemirror component is mounted | (cm: Editor) => void |
Codemirror事件
以下事件是codemiror5的官方事件。您可以使用該組件直接通過組件綁定事件,例如:
<Codemirrorv-model:value="code":options="{ mode: 'text/x-vue', theme: 'default' }"borderplaceholder="test-placeholder":height="200"@change="onChange"@blur="onBlur"@focus="onFocus"@scroll="onScroll"
/>
全部事件
CodeMirror 提供了豐富的事件系統,使得開發者可以監聽編輯器中的各種行為,并在這些行為發生時執行自定義的邏輯。以下是每個事件的簡要說明和使用案例:
1. changes
- 描述:當文檔內容發生變化時觸發。
- 參數:
instance
:當前 CodeMirror 實例。changeObj
:包含變化信息的對象。
editor.on('changes', function(instance, changeObj) {console.log("Changes detected:", changeObj);
});
2. scroll
- 描述:當滾動條位置改變時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('scroll', function(instance) {console.log("Scroll position changed");
});
3. beforeChange
- 描述:在文檔變更之前觸發,允許阻止變更。
- 參數:
instance
:當前 CodeMirror 實例。changeObj
:變更對象,可修改以影響變更。
editor.on('beforeChange', function(instance, changeObj) {console.log("Before change", changeObj.from, changeObj.to, changeObj.text);
});
4. cursorActivity
- 描述:光標或選區變化時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('cursorActivity', function(instance) {console.log("Cursor or selection changed");
});
5. keyHandled
- 描述:當一個鍵被處理后觸發。
- 參數:
instance
:當前 CodeMirror 實例。name
:按鍵名稱。event
:原生鍵盤事件。
editor.on('keyHandled', function(instance, name, event) {console.log("Key handled:", name);
});
6. inputRead
- 描述:每當從輸入中讀取到字符時觸發。
- 參數:
instance
:當前 CodeMirror 實例。changeObj
:包含變更信息的對象。
editor.on('inputRead', function(instance, changeObj) {console.log("Input read:", changeObj.text.join(""));
});
7. electricInput
- 描述:當點擊輸入(如自動縮進)發生時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('electricInput', function(instance, line) {console.log("Electric input on line:", line);
});
8. beforeSelectionChange
- 描述:在選擇變化前觸發,允許修改選擇范圍。
- 參數:
instance
:當前 CodeMirror 實例。obj
:包含舊的新的選擇信息。
editor.on('beforeSelectionChange', function(instance, obj) {console.log("Before selection change:", obj.ranges);
});
9. viewportChange
- 描述:當視口變化時觸發(比如滾動導致可見行變化)。
- 參數:
instance
:當前 CodeMirror 實例。from
:新的起始行號。to
:新的結束行號。
editor.on('viewportChange', function(instance, from, to) {console.log("Viewport changed from", from, "to", to);
});
10. swapDoc
- 描述:當文檔被替換時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('swapDoc', function(instance) {console.log("Document swapped");
});
11. gutterClick
- 描述:當點擊行號區域時觸發。
- 參數:
instance
:當前 CodeMirror 實例。line
:點擊的行號。gutter
:被點擊的邊欄類型。clickEvent
:鼠標事件。
editor.on('gutterClick', function(instance, line, gutter, clickEvent) {console.log("Gutter clicked at line:", line);
});
12. gutterContextMenu
- 描述:當右鍵點擊行號區域時觸發。
- 參數:
instance
:當前 CodeMirror 實例。line
:右鍵點擊的行號。gutter
:被點擊的邊欄類型。contextMenuEvent
:鼠標事件。
editor.on('gutterContextMenu', function(instance, line, gutter, contextMenuEvent) {console.log("Gutter context menu opened at line:", line);
});
13. focus
- 描述:當編輯器獲得焦點時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('focus', function(instance) {console.log("Editor focused");
});
14. blur
- 描述:當編輯器失去焦點時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('blur', function(instance) {console.log("Editor blurred");
});
15. refresh
- 描述:當編輯器刷新(重新計算布局)時觸發。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('refresh', function(instance) {console.log("Editor refreshed");
});
16. optionChange
- 描述:當選項更改時觸發。
- 參數:
instance
:當前 CodeMirror 實例。option
:更改的選項名。
editor.on('optionChange', function(instance, option) {console.log("Option changed:", option);
});
17. scrollCursorIntoView
- 描述:當嘗試將光標滾動到視圖中時觸發。
- 參數:
instance
:當前 CodeMirror 實例。event
:事件對象。
editor.on('scrollCursorIntoView', function(instance, event) {console.log("Scrolling cursor into view");
});
18. update
- 描述:當編輯器更新時觸發(包括任何可能需要重新繪制的內容變化)。
- 參數:
instance
當前 CodeMirror 實例。
editor.on('update', function(instance) {console.log("Editor updated");
});
常用方法
CodeMirror 提供了豐富的 API 方法,允許開發者與編輯器進行交互、查詢和修改其狀態。以下是一些常用的 CodeMirror 方法及其簡要說明:
基本方法
-
getValue()
- 獲取當前文檔的全部內容。
var content = editor.getValue();
-
setValue(content)
- 設置整個文檔的內容。
editor.setValue("新的內容");
-
replaceSelection(replacement, collapse)
- 替換當前選中的文本或在光標位置插入文本。
editor.replaceSelection("插入的文本", "end"); // 在光標后插入文本
-
focus()
- 讓編輯器獲得焦點。
editor.focus();
-
setOption(option, value)
- 動態設置選項。
editor.setOption("readOnly", true);
-
getOption(option)
- 獲取當前選項的值。
var readOnly = editor.getOption("readOnly");
光標和選擇
-
getCursor(startOrEnd)
- 獲取主光標的位置。可以指定獲取開始(
"start"
)或結束("end"
)位置,默認為主光標位置。
var cursor = editor.getCursor(); // 獲取主光標位置
- 獲取主光標的位置。可以指定獲取開始(
-
setCursor(line, ch, options)
- 設置光標位置到特定行和列(從0開始計數)。
editor.setCursor(2, 5); // 移動光標到第3行第6個字符
-
somethingSelected()
- 檢查是否有文本被選中。
if (editor.somethingSelected()) {console.log("有文本被選中"); }
文檔操作
-
lineCount()
- 返回文檔總行數。
var lines = editor.lineCount();
-
getLine(n)
- 獲取特定行的文本內容。
var lineContent = editor.getLine(0); // 獲取第一行的內容
-
markText(from, to, className)
- 標記一段文本,并可為其應用樣式。
var marker = editor.markText({line: 1, ch: 0}, {line: 1, ch: 5}, {className: "styled-background"});
滾動和視圖控制
-
scrollIntoView(pos, margin)
- 將指定位置滾動到視圖中,可選地添加一個額外的邊距。
editor.scrollIntoView({line: 10, ch: 0}, 10); // 滾動到第11行并留出10px邊距
-
refresh()
- 刷新編輯器視圖,通常在DOM元素大小改變后調用。
editor.refresh();
高級功能
-
addKeyMap(map, bottom)
- 添加自定義快捷鍵映射。
editor.addKeyMap({"Ctrl-Space": completeFromHint()});
-
on(event, handler)
- 注冊事件監聽器。
editor.on('change', function(instance, changeObj) {console.log("文檔發生了變化:", changeObj); });
這些只是CodeMirror提供的部分API方法,更多高級功能如搜索、替換、注釋等也都有相應的API支持。具體使用時可以根據項目需求查閱官方文檔以獲得更詳細的說明和示例代碼。由于CodeMirror版本更新可能會帶來API的變化,請確保參考的是適用于您所使用的CodeMirror版本的文檔。
參考文檔
https://github.com/rennzhang/codemirror-editor-vue3