線上代碼編輯器CodeMirror簡介

来源:http://www.cnblogs.com/hf-z/archive/2016/08/26/5811997.html
-Advertisement-
Play Games

1.什麼是Code Mirror 最近做一個項目需要在網頁上實現一個代碼編輯器,支持語法高亮、自動縮進、智能提示等功能。發現Code Mirror剛好滿足所有需求。Code Mirror是由js寫的一款插件,其功能非常強大,用來實現網頁端代碼編輯器非常方便。如果想看效果圖,可移步到這裡 CodeOn ...


1.什麼是Code Mirror

最近做一個項目需要在網頁上實現一個代碼編輯器,支持語法高亮、自動縮進、智能提示等功能。發現Code Mirror剛好滿足所有需求。Code Mirror是由js寫的一款插件,其功能非常強大,用來實現網頁端代碼編輯器非常方便。如果想看效果圖,可移步到這裡----CodeOnline,這是我做的一個小項目,其中代碼編輯器的就是用Code Mirror實現的。

2.使用Code Mirror

下麵我將演示如何使用Code Mirror搭建一個簡易的代碼編輯器,並對其常用配置簡要介紹。

首先要到Code Mirror官網下載此插件,然後在網頁中引入即可。如下代碼即實現了一個可以高亮顯示Java代碼的編輯器:

 1 <!--
 2 最簡單的CodeMirror編輯器
 3 -->
 4 
 5 <!DOCTYPE
 6 html>
 7 
 8 <html>
 9 
10 <!--下麵兩個是使用Code Mirror必須引入的-->
11 <link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
12 <script src="codemirror-5.12/lib/codemirror.js"></script>
13 
14 <!--Java代碼高亮必須引入-->
15 <script src="codemirror-5.12/clike.js"></script>
16 
17 <head>
18 <title>CodeMirrorTest</title>
19 </head>
20 <body>
21 <textarea id="code"></textarea>
22 </body>
23 <script type="text/javascript">
24 //根據DOM元素的id構造出一個編輯器
25     var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
26                 mode:"text/x-java" //實現Java代碼高亮
27         });
28 </script>
29 </html>

如要顯示行號,只需在構造editor時加上

lineNumbers:true

var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
                mode:"text/x-java", //實現Java代碼高亮
                lineNumbers:true
        });

 

當然,如此簡單的編輯器還能不滿足我們的需求,接下來我們要為這個編輯器加上如下功能:

  • 更改主題
  • 綁定Vim
  • 摺疊代碼
  • 全屏模式
  • 括弧匹配
  • 智能提示

更改主題:

Code Mirror提供了很多種主題,在codemirror-5.12/theme/seti.css可以看到所有主題,我們準備使用seti這個主題,首先需將其引入:

<link rel="stylesheet" href="codemirror-5.12/theme/seti.css">

而後在構造editor時加入參數

theme:"seti"

完整代碼如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
 4 <script src="codemirror-5.12/lib/codemirror.js"></script>
 5 <script src="codemirror-5.12/clike.js"></script>
 6 
 7 <!--引入css文件,用以支持主題-->
 8 <link rel="stylesheet" href="codemirror-5.12/theme/seti.css">
 9 <head>
10 <title>CodeMirror Test</title>
11 </head>
12 <body>
13 <textarea id="code"></textarea>
14 </body>
15 <script type="text/javascript">
16     var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
17         mode:"text/x-java",
18         lineNumbers:true,
19         theme:"seti"
20     });
21 </script>
22 </html>

最後各種其他功能的實現方法與之類似,稍微註意的是需要引入的文件不同,我將實現各個功能所需的文件均寫在瞭如下代碼中:

 1 <!DOCTYPE html>
 2 <html>
 3 <link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
 4 <script src="codemirror-5.12/lib/codemirror.js"></script>
 5 <script src="codemirror-5.12/clike.js"></script>
 6 
 7 <!--引入css文件,用以支持主題-->
 8 <link rel="stylesheet" href="codemirror-5.12/theme/eclipse.css">
 9 <link rel="stylesheet" href="codemirror-5.12/theme/seti.css">
10 <link rel="stylesheet" href="codemirror-5.12/theme/dracula.css">
11 
12 <!--引入js,綁定Vim-->
13 <link rel="stylesheet" href="codemirror-5.12/addon/dialog/dialog.css">
14 <script src="codemirror-5.12/keymap/vim.js"></script>
15 <script src="codemirror-5.12/addon/search/searchcursor.js"></script>
16 <!--改善vim輸入命令時的樣式-->
17 <script src="codemirror-5.12/addon/dialog/dialog.js"></script>
18 
19 <!--支持代碼摺疊-->
20 <link rel="stylesheet" href="codemirror-5.12/addon/fold/foldgutter.css"/>
21 <script src="codemirror-5.12/addon/fold/foldcode.js"></script>
22 <script src="codemirror-5.12/addon/fold/foldgutter.js"></script>
23 <script src="codemirror-5.12/addon/fold/brace-fold.js"></script>
24 <script src="codemirror-5.12/addon/fold/comment-fold.js"></script>
25 
26 <!--全屏模式-->
27 <link rel="stylesheet" href="codemirror-5.12/addon/display/fullscreen.css">
28 <script src="codemirror-5.12/addon/display/fullscreen.js"></script>
29 
30 <!--括弧匹配-->
31 <script src="codemirror-5.12/addon/edit/matchbrackets.js"></script>
32 
33 <!--自動補全-->
34 <link rel="stylesheet" href="codemirror-5.12/addon/hint/show-hint.css">
35 <script src="codemirror-5.12/addon/hint/show-hint.js"></script>
36 <script src="codemirror-5.12/addon/hint/anyword-hint.js"></script>
37 
38 <head>
39 <title>CodeMirror Test</title>
40 </head>
41 
42 <body>
43 <textarea id="code"></textarea>
44 </body>
45 <script type="text/javascript">
46     var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
47          //Java高亮顯示
48          mode:"text/x-java",
49 
50          //顯示行號
51          lineNumbers:true,
52 
53          //設置主題
54          theme:"seti",
55 
56          //綁定Vim
57          keyMap:"vim",
58 
59          //代碼摺疊
60          lineWrapping:true,
61          foldGutter: true,
62          gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
63 
64          //全屏模式
65          fullScreen:true,
66 
67           //括弧匹配
68           matchBrackets:true,
69 
70           智能提示 
71           extraKeys:{"Ctrl-Space":"autocomplete"}//ctrl-space喚起智能提示
72 });
73 </script>
74 </html>

其他說明:

  1. 在構造editor時相關的屬性大多數都可以動態的指定。如設置顯示行號可以不在構造editor時指出,只需構造出editor之後,調用
    editor.setOption("lineNumbers",true)
    即可,更改主題也類似的用
    editor.setOption("theme","seti")
    即可,非常方便。
  2. 可以用
    editor.getOption("屬性名")
    來獲取editor某屬性的值,在本例中
    editor.getOption("theme")
    將返回"seti"
  3. 無法用js的DOM操作獲取編輯器中的值,但可以用
    editor.getValeu()
    獲得其中的值,
    editor.setValue("value")
    來設置其中的值
  4. 可以自定義編輯器的大小,只需設置如下樣式即可:
    <style type="text/css">
         .CodeMirror{border:1px solid black;font-   size:15px;width:100px;height:100px}
    </style>
  5. 在extra中可綁定函數到按鍵上,例如:
    var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
        mode:"text/x-java",
        extraKeys:{
            "Ctrl-Space":"autocomplete",
            "Ctrl-F7":function () {
                        alert("綁定了Ctrl-F7");
                      },
            "Shift-Alt-Enter": function (cm) {
                       cm.setOption("fullScreen", !cm.getOption("fullScreen"));
                      }
        }
    });

需要註意的是,如果將esc鍵綁定了某函數,那麼Vim可能無法正常工作。

3.結語

Code Mirror非常強大,上面的例子說明瞭其基本的使用方法,足夠應付大多數使用場景,當然還有很多功能未能一一說明。如要深入學習,請閱讀其官方文檔。最後放一篇文章,該文章羅列了更多的配置項,傳送門:codeMirror配置。為了方便閱讀,摘抄如下:

options 可以使用的參數

CodeMirror函數和它的fromTextArea方法都可以使用一個配置對象作為第二個參數。

value: string | CodeMirror.Doc

編輯器的初始值(文本),可以是字元串或者CodeMirror文檔對象(不同於HTML文檔對象)。

mode: string | object


通用的或者在CodeMirror中使用的與mode相關聯的mime,當不設置這個值的時候,會預設使用第一個載入的mode定義文件。一般地,會使用關聯的mime類型來設置這個值;除此之外,也可以使用一個帶有name屬性的對象來作為值(如:{name: “javascript”, json: true})。可以通過訪問CodeMir

ror.modes和CodeMirror.mimeModes獲取定義的mode和MIME。


lineSeparator: string|null

明確指定編輯器使用的行分割符(換行符)。預設(值為null)情況下,文檔會被 CRLF(以及單獨的CR, LF)分割,單獨的LF會在所有的輸出中用作換行符(如:getValue)。當指定了換行字元串,行就只會被指定的串分割。

theme: string

配置編輯器的主題樣式。要使用主題,必須保證名稱為 .cm-s-[name] (name是設置的theme的值)的樣式是載入上了的。當然,你也可以一次載入多個主題樣式,使用方法和html和使用類一樣,如: theme: foo bar,那麼此時需要cm-s-foo cm-s-bar這兩個樣式都已經被載入上了。

indentUnit: integer

縮進單位,值為空格數,預設為2 。

smartIndent: boolean

自動縮進,設置是否根據上下文自動縮進(和上一行相同的縮進量)。預設為true。

tabSize: integer

tab字元的寬度,預設為4 。

indentWithTabs: boolean

在縮進時,是否需要把 n*tab寬度個空格替換成n個tab字元,預設為false 。

electricChars: boolean

在輸入可能改變當前的縮進時,是否重新縮進,預設為true (僅在mode支持縮進時有效)。

specialChars: RegExp

需要被占位符(placeholder)替換的特殊字元的正則表達式。最常用的是非列印字元。預設為:/[\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/。

specialCharPlaceholder: function(char) → Element

這是一個接收由specialChars選項指定的字元作為參數的函數,此函數會產生一個用來顯示指定字元的DOM節點。預設情況下,顯示一個紅點(•),這個紅點有一個帶有前面特殊字元編碼的提示框。

rtlMoveVisually: boolean

Determines whether horizontal cursor movement through right-to-left (Arabic, Hebrew) text is visual (pressing the left arrow moves the cursor left) or logical (pressing the left arrow moves to the next lower index in the string, which is visually right in right-to-left text). The default is false on Windows, and true on other platforms.(這段完全不曉得搞啥子鬼)

keyMap: string

配置快捷鍵。預設值為default,即 codemorrir.js 內部定義。其它在key map目錄下。

extraKeys: object

給編輯器綁定與前面keyMap配置不同的快捷鍵。

lineWrapping: boolean

在長行時文字是換行(wrap)還是滾動(scroll),預設為滾動(scroll)。

lineNumbers: boolean

是否在編輯器左側顯示行號。

firstLineNumber: integer

行號從哪個數開始計數,預設為1 。

lineNumberFormatter: function(line: integer) → string

使用一個函數設置行號。

gutters: array<string>

用來添加額外的gutter(在行號gutter前或代替行號gutter)。值應該是CSS名稱數組,每一項定義了用於繪製gutter背景的寬度(還有可選的背景)。為了能明確設置行號gutter的位置(預設在所有其它gutter的右邊),也可以包含CodeMirror-linenumbers類。類名是用於傳給setGutterMarker的鍵名(keys)。

fixedGutter: boolean

設置gutter跟隨編輯器內容水平滾動(false)還是固定在左側(true或預設)。

scrollbarStyle: string

設置滾動條。預設為”native”,顯示原生的滾動條。核心庫還提供了”null”樣式,此樣式會完全隱藏滾動條。Addons可以設置更多的滾動條模式。

coverGutterNextToScrollbar: boolean

當fixedGutter啟用,並且存在水平滾動條時,在滾動條最左側預設會顯示gutter,當此項設置為true時,gutter會被帶有CodeMirror-gutter-filler類的元素遮擋。

inputStyle: string

選擇CodeMirror處理輸入和焦點的方式。核心庫定義了textarea和contenteditable輸入模式。在移動瀏覽器上,預設是contenteditable,在桌面瀏覽器上,預設是textarea。在contenteditable模式下對IME和屏幕閱讀器支持更好。

readOnly: boolean|string

編輯器是否只讀。如果設置為預設的值 “nocursor”,那麼除了設置只讀外,編輯區域還不能獲得焦點。

showCursorWhenSelecting: boolean

在選擇時是否顯示游標,預設為false。

lineWiseCopyCut: boolean

啟用時,如果在複製或剪切時沒有選擇文本,那麼就會自動操作游標所在的整行。

undoDepth: integer

最大撤消次數,預設為200(包括選中內容改變事件) 。

historyEventDelay: integer

在輸入或刪除時引發歷史事件前的毫秒數。

tabindex: integer

編輯器的tabindex。

autofocus: boolean

是否在初始化時自動獲取焦點。預設情況是關閉的。但是,在使用textarea並且沒有明確指定值的時候會被自動設置為true。

低級選項

下麵的選項僅用於一些特殊情況。

dragDrop: boolean

是否允許拖放,預設為true。

allowDropFileTypes: array<string>

預設為null。當設置此項時,只接收包含在此數組內的文件類型拖入編輯器。文件類型為MIME名稱。

cursorBlinkRate: number

游標閃動的間隔,單位為毫秒。預設為530。當設置為0時,會禁用游標閃動。負數會隱藏游標。

cursorScrollMargin: number

當游標靠近可視區域邊界時,游標距離上方和下方的距離。預設為0 。

cursorHeight: number

游標高度。預設為1,也就是撐滿行高。對一些字體,設置0.85看起來會更好。

resetSelectionOnContextMenu: boolean

設置在選擇文本外點擊打開上下文菜單時,是否將游標移動到點擊處。預設為true。

workTime, workDelay: number

通過一個假的後臺線程高亮 workTime 時長,然後使用 timeout 休息 workDelay 時長。預設為200和300 。(完全不懂這個功能是在說啥)

pollInterval: number

指明CodeMirror向對應的textarea滾動(寫數據)的速度(獲得焦點時)。大多數的輸入都是通過事件捕獲,但是有的輸入法(如IME)在某些瀏覽器上並不會生成事件,所以使用數據滾動。預設為100毫秒。

flattenSpans: boolean

預設情況下,CodeMirror會將使用相同class的兩個span合併成一個。通過設置此項為false禁用此功能。

addModeClass: boolean

當啟用時(預設禁用),會給每個標記添加額外的表示生成標記的mode的以cm-m開頭的CSS樣式類。例如,XML mode產生的標記,會添加cm-m-xml類。

maxHighlightLength: number

當需要高亮很長的行時,為了保持響應性能,當到達某些位置時,編輯器會直接將其他行設置為純文本(plain text)。預設為10000,可以設置為Infinity來關閉此功能。

viewportMargin: integer

指定當前滾動到視圖中內容上方和下方要渲染的行數。這會影響到滾動時要更新的行數。通常情況下應該使用預設值10。可以設置值為Infinity始終渲染整個文檔。註意:這樣設置在處理大文檔時會影響性能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝composer: 1、在https://getcomposer.org/download/ 中下載 Composer-Setup.exe 2、安裝composer步驟如下: 至此,composer安裝完成。 安裝laravel: 安裝composer完成後,win+R >> cmd,調出命令行 ...
  • 一、抽象類 抽象類,只為繼承而出現,不定義具體的內容,只規定該有哪些東西 一般抽象類中只放置抽象方法,只規定了返回類型和參數 比如: 人 - 有吃飯,睡覺方法 男人 - 繼承人抽象類,必須實現吃飯,睡覺的方法主體 女人 - 繼承人抽象類,必須實現吃飯,睡覺方法的主體 抽象類中可以有普通屬性,通過子類 ...
  • HTML代碼: jquery代碼: 註:只要修改動畫時間就可以控制滾動的速度。 ...
  • 線上實例 使用方法 ...
  • 現象: 近期在微信中開發了一個電商的平臺,一切介面頁面處理完成後,正式佈置到公眾號,在公眾號上自定義菜單進行平臺時(如:.../index.html),發現了一個很有意思的問題:哪個頁面是從公眾號里點擊進入的平臺的,當切換一兩次頁面時,.../index.html這個頁面就切換不進了。 解決過程: ...
  • 享元模式 在JavaScript中,瀏覽器特別是移動端的瀏覽器分配的記憶體很有限,如何節省記憶體就成了一件非常有意義的事情。節省記憶體的一個有效方法是減少對象的數量。 享元模式(Flyweight),運行共用技術有效地支持大量細粒度的對象,避免大量擁有相同內容的小類的開銷(如耗費記憶體),使大家共用一個類( ...
  • 什麼是Ajax Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。 Ajax的全稱是Asynchronous JavaScript and XML,即非同步JavaScript+XML。它並不是新的編程語言,而是幾種原有技術的結合體。它由以下幾種技術組合而成,包括: HTML/X ...
  • 前言:找了上課時數據結構的教程來看,但是用的語言是c++,所以具體實現在網上搜大神的博客來看,我看到的大神們的博客都寫得特別好,不止講了最基本的思想和演算法實現,更多的是側重於實例運用,一邊看一邊在心裡隱隱歌頌大神的厲害,然後別人的厲害不是我的,所以到底看得各種受打擊+頭昏腦漲,寫這個系列是希望自己能 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...