亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網(wǎng)站 > 軟件應(yīng)用 > 正文

使用 CodeMirror 打造屬于自己的帶高亮顯示的在線代碼編輯器

2024-09-06 19:17:04
字體:
供稿:網(wǎng)友

前提

寫這個(gè)的目的是因?yàn)橹绊?xiàng)目里用到過 CodeMirror,覺得作為一款在線代碼編輯器還是不錯(cuò),也看到過有些網(wǎng)站用到過在線代碼編輯,當(dāng)然我不知道他們是用什么做的,這里我把公司項(xiàng)目里用到的那部分抽出來,單獨(dú)寫篇博客,并把抽出來的那部分代碼提交到 GitHub 去(地址),以防日后可能會(huì)再次用到(沒準(zhǔn)畢業(yè)設(shè)計(jì)里可能用的到)。

簡單介紹

CodeMirror 是一款在線的支持語法高亮的代碼編輯器。官網(wǎng): http://codemirror.net/

可能光看官網(wǎng),第一眼覺得那些在線編輯器有點(diǎn)丑,反正第一眼給我的感覺就是這樣子,但是經(jīng)過自己的細(xì)調(diào),也能打造出一款精美的在線代碼編輯器。

官網(wǎng)可以把它下載下來。

下載后,解壓開得到的文件夾中,lib 下是放的是核心庫和核心 css,mode 下放的是各種支持語言的語法定義,theme 目錄下是支持的主題樣式。一般在開發(fā)中,添加 lib 下的引用和 mode 下的引用就夠了。

如何使用

下面兩個(gè)是使用 Code Mirror 必須引入的:

<link rel="stylesheet" href="codemirror-5.31.0/lib/codemirror.css" rel="external nofollow" /><script src="codemirror-5.31.0/lib/codemirror.js"></script>

接下來要引用的就是在 mode 目錄下編輯器中要編輯的語言對應(yīng)的 js 文件,這里以 Groovy 為例:

<!--groovy代碼高亮--><script src="codemirror-5.31.0/mode/groovy/groovy.js"></script>

如果你想讓 Java 代碼也支持代碼高亮,則需要引入我從網(wǎng)上下載下來的 clike.js(我已經(jīng)放到我的 GitHub 去了)

<!--Java代碼高亮必須引入--><script src="codemirror-5.31.0/clike.js"></script>

引用的文件用于支持對應(yīng)語言的語法高亮。

然后前面說了第一次進(jìn)入 Code Mirror 官網(wǎng),覺得那些編輯器比較丑,那可能是主題比較丑,我這里推薦一款還不錯(cuò)的主題,只需按照如下引入即可:

<!--引入css文件,用以支持主題--><link rel="stylesheet" href="codemirror-5.31.0/theme/dracula.css" rel="external nofollow" />

如果你還想讓你的編輯器支持代碼行折疊,請按照如下進(jìn)行操作:

<!--支持代碼折疊--><link rel="stylesheet" href="codemirror-5.31.0/addon/fold/foldgutter.css" rel="external nofollow" /><script src="codemirror-5.31.0/addon/fold/foldcode.js"></script><script src="codemirror-5.31.0/addon/fold/foldgutter.js"></script><script src="codemirror-5.31.0/addon/fold/brace-fold.js"></script><script src="codemirror-5.31.0/addon/fold/comment-fold.js"></script>

是不是這樣引入就好了呢,當(dāng)然不是啦

創(chuàng)建編輯器

在實(shí)際項(xiàng)目中,一般都不會(huì)直接把 body 整個(gè)內(nèi)容作為編輯器的容器。而最常用的,是使用 textarea。這里我在 里使用個(gè) textarea,

<!-- begin code --><textarea class="form-control" id="code" name="code"></textarea><!-- end code-->

接下來就是創(chuàng)建編輯器了。

//根據(jù)DOM元素的id構(gòu)造出一個(gè)編輯器var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});

是不是有點(diǎn)單調(diào)?

沒錯(cuò),我還可以在里面給他設(shè)置些屬性:(充分利用我一開始引入的那些文件)

mode: "text/groovy",  //實(shí)現(xiàn)groovy代碼高亮mode: "text/x-java", //實(shí)現(xiàn)Java代碼高亮lineNumbers: true,	//顯示行號(hào)theme: "dracula",	//設(shè)置主題lineWrapping: true,	//代碼折疊foldGutter: true,gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],matchBrackets: true,	//括號(hào)匹配//readOnly: true,    //只讀

如果需要查看更多屬性,可以去官網(wǎng)查找,目前我只用到這些屬性!

下面也列舉些吧:

indentUnit: integer
縮進(jìn)單位,值為空格數(shù),默認(rèn)為2 。

smartIndent: boolean
自動(dòng)縮進(jìn),設(shè)置是否根據(jù)上下文自動(dòng)縮進(jìn)(和上一行相同的縮進(jìn)量)。默認(rèn)為true。

tabSize: integer
tab字符的寬度,默認(rèn)為4 。

indentWithTabs: boolean
在縮進(jìn)時(shí),是否需要把 n*tab寬度個(gè)空格替換成n個(gè)tab字符,默認(rèn)為false 。

electricChars: boolean
在輸入可能改變當(dāng)前的縮進(jìn)時(shí),是否重新縮進(jìn),默認(rèn)為true (僅在mode支持縮進(jìn)時(shí)有效)。

specialChars: RegExp
需要被占位符(placeholder)替換的特殊字符的正則表達(dá)式。最常用的是非打印字符。默認(rèn)為:/[/u0000-/u0019/u00ad/u200b-/u200f/u2028/u2029/ufeff]/。

specialCharPlaceholder: function(char) → Element
這是一個(gè)接收由specialChars選項(xiàng)指定的字符作為參數(shù)的函數(shù),此函數(shù)會(huì)產(chǎn)生一個(gè)用來顯示指定字符的DOM節(jié)點(diǎn)。默認(rèn)情況下,顯示一個(gè)紅點(diǎn)(•),這個(gè)紅點(diǎn)有一個(gè)帶有前面特殊字符編碼的提示框。

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
配置快捷鍵。默認(rèn)值為default,即 codemorrir.js 內(nèi)部定義。其它在key map目錄下。

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

lineWrapping: boolean
在長行時(shí)文字是換行(wrap)還是滾動(dòng)(scroll),默認(rèn)為滾動(dòng)(scroll)。

lineNumbers: boolean
是否在編輯器左側(cè)顯示行號(hào)。

firstLineNumber: integer
行號(hào)從哪個(gè)數(shù)開始計(jì)數(shù),默認(rèn)為1 。

lineNumberFormatter: function(line: integer) → string
使用一個(gè)函數(shù)設(shè)置行號(hào)。

gutters: array
用來添加額外的gutter(在行號(hào)gutter前或代替行號(hào)gutter)。值應(yīng)該是CSS名稱數(shù)組,每一項(xiàng)定義了用于繪制gutter背景的寬度(還有可選的背景)。為了能明確設(shè)置行號(hào)gutter的位置(默認(rèn)在所有其它gutter的右邊),也可以包含CodeMirror-linenumbers類。類名是用于傳給setGutterMarker的鍵名(keys)。

fixedGutter: boolean
設(shè)置gutter跟隨編輯器內(nèi)容水平滾動(dòng)(false)還是固定在左側(cè)(true或默認(rèn))。

scrollbarStyle: string
設(shè)置滾動(dòng)條。默認(rèn)為”native”,顯示原生的滾動(dòng)條。核心庫還提供了”null”樣式,此樣式會(huì)完全隱藏滾動(dòng)條。Addons可以設(shè)置更多的滾動(dòng)條模式。

coverGutterNextToScrollbar: boolean
當(dāng)fixedGutter啟用,并且存在水平滾動(dòng)條時(shí),在滾動(dòng)條最左側(cè)默認(rèn)會(huì)顯示gutter,當(dāng)此項(xiàng)設(shè)置為true時(shí),gutter會(huì)被帶有CodeMirror-gutter-filler類的元素遮擋。
inputStyle: string
選擇CodeMirror處理輸入和焦點(diǎn)的方式。核心庫定義了textarea和contenteditable輸入模式。在移動(dòng)瀏覽器上,默認(rèn)是contenteditable,在桌面瀏覽器上,默認(rèn)是textarea。在contenteditable模式下對IME和屏幕閱讀器支持更好。

readOnly: boolean|string
編輯器是否只讀。如果設(shè)置為預(yù)設(shè)的值 “nocursor”,那么除了設(shè)置只讀外,編輯區(qū)域還不能獲得焦點(diǎn)。

showCursorWhenSelecting: boolean
在選擇時(shí)是否顯示光標(biāo),默認(rèn)為false。

lineWiseCopyCut: boolean
啟用時(shí),如果在復(fù)制或剪切時(shí)沒有選擇文本,那么就會(huì)自動(dòng)操作光標(biāo)所在的整行。

undoDepth: integer
最大撤消次數(shù),默認(rèn)為200(包括選中內(nèi)容改變事件) 。

historyEventDelay: integer
在輸入或刪除時(shí)引發(fā)歷史事件前的毫秒數(shù)。

tabindex: integer
編輯器的tabindex。

autofocus: boolean
是否在初始化時(shí)自動(dòng)獲取焦點(diǎn)。默認(rèn)情況是關(guān)閉的。但是,在使用textarea并且沒有明確指定值的時(shí)候會(huì)被自動(dòng)設(shè)置為true。

dragDrop: boolean
是否允許拖放,默認(rèn)為true。

allowDropFileTypes: array
默認(rèn)為null。當(dāng)設(shè)置此項(xiàng)時(shí),只接收包含在此數(shù)組內(nèi)的文件類型拖入編輯器。文件類型為MIME名稱。

cursorBlinkRate: number
光標(biāo)閃動(dòng)的間隔,單位為毫秒。默認(rèn)為530。當(dāng)設(shè)置為0時(shí),會(huì)禁用光標(biāo)閃動(dòng)。負(fù)數(shù)會(huì)隱藏光標(biāo)。

cursorScrollMargin: number
當(dāng)光標(biāo)靠近可視區(qū)域邊界時(shí),光標(biāo)距離上方和下方的距離。默認(rèn)為0 。

cursorHeight: number
光標(biāo)高度。默認(rèn)為1,也就是撐滿行高。對一些字體,設(shè)置0.85看起來會(huì)更好。

resetSelectionOnContextMenu: boolean
設(shè)置在選擇文本外點(diǎn)擊打開上下文菜單時(shí),是否將光標(biāo)移動(dòng)到點(diǎn)擊處。默認(rèn)為true。

workTime, workDelay: number
通過一個(gè)假的后臺(tái)線程高亮 workTime 時(shí)長,然后使用 timeout 休息 workDelay 時(shí)長。默認(rèn)為200和300 。(完全不懂這個(gè)功能是在說啥)

pollInterval: number
指明CodeMirror向?qū)?yīng)的textarea滾動(dòng)(寫數(shù)據(jù))的速度(獲得焦點(diǎn)時(shí))。大多數(shù)的輸入都是通過事件捕獲,但是有的輸入法(如IME)在某些瀏覽器上并不會(huì)生成事件,所以使用數(shù)據(jù)滾動(dòng)。默認(rèn)為100毫秒。

flattenSpans: boolean
默認(rèn)情況下,CodeMirror會(huì)將使用相同class的兩個(gè)span合并成一個(gè)。通過設(shè)置此項(xiàng)為false禁用此功能。

addModeClass: boolean
當(dāng)啟用時(shí)(默認(rèn)禁用),會(huì)給每個(gè)標(biāo)記添加額外的表示生成標(biāo)記的mode的以cm-m開頭的CSS樣式類。例如,XML mode產(chǎn)生的標(biāo)記,會(huì)添加cm-m-xml類。

maxHighlightLength: number
當(dāng)需要高亮很長的行時(shí),為了保持響應(yīng)性能,當(dāng)?shù)竭_(dá)某些位置時(shí),編輯器會(huì)直接將其他行設(shè)置為純文本(plain text)。默認(rèn)為10000,可以設(shè)置為Infinity來關(guān)閉此功能。

viewportMargin: integer
指定當(dāng)前滾動(dòng)到視圖中內(nèi)容上方和下方要渲染的行數(shù)。這會(huì)影響到滾動(dòng)時(shí)要更新的行數(shù)。通常情況下應(yīng)該使用默認(rèn)值10??梢栽O(shè)置值為Infinity始終渲染整個(gè)文檔。注意:這樣設(shè)置在處理大文檔時(shí)會(huì)影響性能。

如果你要設(shè)置代碼框的大小該怎么做呢?

editor.setSize('800px', '950px'); //設(shè)置代碼框的長寬

另外,如果你想給代碼框賦值,該怎么辦呢?

editor.setValue(""); //給代碼框賦值

editor.getValue(); //獲取代碼框的值

如果你再想在其他地方設(shè)置新的屬性,可以像下面這樣寫:

editor.setOption("readOnly", true); //類似這種

總結(jié)

上面就大概講了下 Code Mirror 怎么使用,那么我們來看看效果吧

我自我感覺還是可以的哈!

里面所有涉及的代碼在 GitHub 里可以下載:https://github.com/zhisheng17/CoderBlog/tree/master/CodeMirror

文章原創(chuàng),轉(zhuǎn)載務(wù)必請注明原創(chuàng)地址

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
91精品啪aⅴ在线观看国产| 亚洲美女在线视频| 黄网站免费久久| 欧美日韩精品一区二区三区在线观看| 亚洲av无码一区二区三区网址| 欧美精产国品一二三区| 免费视频观看成人| 蜜桃av成人| 国产一区二区三区电影在线观看| 国产在线精品一区二区中文| 亚洲一区精彩视频| 四虎永久免费影库二三区| 日韩中文欧美在线| 日韩欧美一级二级| 91精品视频免费看| 超碰97国产精品人人cao| 久久本道综合色狠狠五月| 日本激情视频网站| 国产免费黄色片| 91av中文字幕| 亚洲专区欧美专区| 92国产精品久久久久首页| 成人av网在线| 在线观看一区欧美| 丁香六月激情综合| 亚洲一区二区在线播放| 黄色大片网站在线观看| 精品无人区卡一卡二卡三乱码免费卡| 欧美视频三区在线播放| 欧洲亚洲女同hd| 日韩精品视频网址| 日韩中文字幕在线一区| 国产盗摄视频一区二区三区| 色视频在线观看在线播放| 午夜神马福利影院| 中文字幕在线精品| 老司机av在线免费看| 97久久精品视频| 91av日本| 久久夜色精品国产噜噜亚洲av| 国产传媒一区二区三区| 欧美精品一二区| 不卡av一区二区| 日韩美女在线看| 中国china体内裑精亚洲片| 国产中文字字幕乱码无限| 亚洲一二三在线| 久久亚洲成人av| 免费aⅴ网站| 狠狠操精品视频| av成人老司机| 成人看片黄a免费看在线| 欧美艳星介绍134位艳星| 4hu四虎永久在线影院成人| 高清免费电影在线观看| 伦理电影国产精品| 免费在线观看一区| 日韩中文字幕| 欧美性极品少妇| 在线看黄色av| 欧美另类videos粗暴黑人| 国产粉嫩在线观看| 一区二区三区中文字幕在线观看| 欧美激情精品久久久六区热门| 日韩大片欧美大片| 51精品国自产在线| 亚洲欧美国产一本综合首页| 亚洲欧美变态国产另类| av在线中文| 黄色羞羞视频在线观看| 久久视频精品在线观看| 亚洲精品久久久久avwww潮水| 成人亚洲精品7777| 99久久精品免费看国产四区| 国产毛片久久久久| 欧美黄色大片在线观看| 免费网站成人| 国产一区二区三区不卡在线观看| 一个人看的www视频免费在线观看| 99热在线观看免费精品| 日韩在线不卡av| 久久激情一区| 久久精品91久久久久久再现| 免费毛片一区二区三区| 国产精品久久毛片a| 一区二区不卡久久精品| 日本爱爱免费视频| 国产精品欧美在线观看| 久久久精品国产99久久精品芒果| 久久久久久久久亚洲精品| 丰满岳乱妇一区二区| 九九视频免费看| 亚洲中文字幕一区二区| 国产视频在线观看一区| 欧美精品一级二级| 成人av网址在线| 天天操天天射天天| 欧美成人禁片在线www| 国产精品区一区二区三| 国产情侣激情自拍| 久久精品国产一区二区三区肥胖| 国产精品日韩欧美大师| 刘亦菲久久免费一区二区| 992tv免费直播在线观看| 国产二级片在线| 丝袜亚洲精品中文字幕一区| 台湾成人免费视频| 69xxx免费视频| 国产伦精品一区二区三区在线观看| 久热精品视频在线播放| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲mm色国产网站| 欧美人与性动交α欧美精品济南到| 亚洲精品一区二区三区四区| 日韩在线一区二区三区四区| 日日狠狠久久| 在线不卡中文字幕播放| 51精品国产黑色丝袜高跟鞋| 99re视频这里只有精品| 99视频在线播放| 亚洲2区在线| 国产一区av在线| 91久久国产综合久久91猫猫| 欧美一级特黄aaaaaa在线看片| 日韩精品免费看| 国模吧一区二区三区| 在线观看你懂的视频| 国内精品一区二区三区四区| 老司机免费在线视频| 黑人精品欧美一区二区蜜桃| 亚洲午夜电影网| 日本黄色大片在线观看| 欧美日韩另类视频| 99九九99九九九视频精品| 色先锋av男人资源先锋影院| 日韩精品一区二区三区在线观看| 多人啪嗒啪嗒在线观看免费| 亚洲精品aaa| 国产欧美精品在线播放| 国产成人一区二区三区影院在线| 性色88av老女人视频| 欧美在线观看日本一区| 性欧美高清come| 欧美成人性战久久| 精品国偷自产一区二区三区| 国内精品久久久久国产盗摄免费观看完整版| 成人高潮a毛片免费观看网站| 日本美女一区| 自产国语精品视频| 九九久久精品| 天堂av中文在线| 中文字幕中文字幕在线中一区高清| 欧美日韩不卡| 日韩不卡一二三| 欧美天堂一区| 国产一级大片| 91豆麻精品91久久久久久| 国产一区二区在线播放视频| 国产精品女主播在线观看| 日本综合一区二区三区| 国产亚洲精品久久久久久青梅| 一级免费视频| 色香蕉成人二区免费| 欧美成人milf| 久久久久久av| 最新国产麻豆精品| 精品丝袜久久| 18被视频免费观看视频| 最新电影电视剧在线观看免费观看| 国内精品免费| 婷婷伊人综合中文字幕| 国产午夜视频在线观看| 国产精品一区二区欧美| 青青草视频在线观看免费| 欧美日韩国产综合在线| 波多野结衣视频一区二区| 一区二区视频观看| 国产精品乱码人人做人人爱| 色综合视频在线观看| 成人精品3d动漫| 久久99精品久久久久久| 99久久国产热无码精品免费| 国产盗摄一区二区| 五月天激情开心网| 精品一区二区三区五区六区| bestiality新另类大全| 久久永久免费| 日韩成人av影视| 精品一区二区在线视频| 色777狠狠狠综合伊人| 欧美国产日韩另类| 亚洲免费电影在线观看| 午夜欧美一区二区三区免费观看| 成人免费在线视频网| 亚洲国产欧美日韩在线观看第一区| 国产精品专区第二| 欧美三级电影在线播放| 欧美日韩国产黄色| 国产天堂视频| 欧美亚洲高清一区二区三区不卡| 欧美日韩一级片网站| 天使と恶魔の榨精在线播放| 蘑菇福利视频一区播放| 国产wwwwwww| 麻豆久久久av免费| 成人免费在线一区二区三区| 懂色av粉嫩av蜜乳av| 国产小视频在线高清播放| 国产精品成人va在线观看| 天天色天天操天天做| jizzjizzjizz欧美| www.男人天堂.com| 成人做爰www免费看视频网站| 97色伦图片97色伦在线电影| 欧美日韩中文精品| 粉嫩精品久久99综合一区| 免费观影入口看日本视频| 91久久精品国产91久久性色| 女人被爽到呻吟gif动态图下载| 99久久久久国产精品| 妺妺窝人体色www在线观看| 中文av资源| 亚洲高清视频在线| 97超碰青青草| 亚洲精品成人少妇| 欧美区在线播放| 黄色大片网站| 一本久久知道综合久久| eeuss影院在线播放| 亚洲日本网址| 黄色免费在线观看网站| www.av中文字幕| 亚洲成人动漫在线观看| 韩漫成人漫画| 黄页免费观看| 午夜羞羞小视频在线观看| 国产一区二区三区朝在线观看| 欧美性猛片aaaaaaa做受| 精品成a人在线观看| 国产激情视频网址| jizz日本大全| 亚州视频一区二区三区| 国产精品国产三级欧美二区| 亚洲AV无码国产成人久久| 亚洲精品承认| 欧美一区二区三区视频免费播放| 国产一区二区三区成人| 亚洲国产精品suv| 欧美性潮喷xxxxx免费视频看| 午夜精品久久久久久久99| 国产亚洲精品久久久久久无几年桃| 日本成a人片在线观看| 亚洲欧美国产精品专区久久| 神马午夜在线视频| 日本aa在线| 超碰97国产在线| 在线观看亚洲免费视频| 免费不卡av在线| 国产福利视频导航| 91久热免费在线视频| 国产精品91一区二区三区| 日日草天天草| 日本女优天堂99伊人| 精品无人区卡一卡二卡三乱码免费卡| 欧美激情 一区| 91麻豆国产福利在线观看| 日韩欧美一区二区三区免费观看| 久久99精品国产自在现线小黄鸭| 91蜜桃在线免费视频| 国产麻豆天美果冻无码视频| 中文字幕在线观看第一页| 中文乱码人妻一区二区三区视频| 蜜桃a∨噜噜一区二区三区| sm性调教片在线观看| 免费不卡中文字幕视频| 亚洲福利精品在线| 狠狠色狠狠色综合| 污视频在线免费| 国产精品日韩欧美一区| 舔足天天操天天射| 在线视频一区观看| 成人在线视频成人| 欧美精品一区在线发布| 亚洲精品免费一二三区| 久久精品视频6| 欧美日本在线看| 欧美精品videossex变态| 亚洲精品不卡在线观看| 欧美日本在线| 欧美精品亚洲| 亚洲精品av在线| 午夜视频免费在线观看| 中文字幕人成高视频| 亚洲激情成人| 久草资源在线观看| 天堂8在线视频| 熟女丰满老熟女熟妇| 日韩av电影在线网| 大香煮伊手机一区| 色yeye香蕉凹凸一区二区av| 亚洲欧美综合在线观看| 9.1人成人免费视频网站| 婷婷六月天在线| 日韩综合久久| 国产女人爽到高潮a毛片| 国产无套粉嫩白浆内谢| 青梅竹马是消防员在线| 少妇性l交大片| 国产激情一区二区三区四区| 韩国欧美国产一区| 国产国语性生话播放| 精品久久无码中文字幕| 高清在线视频不卡| 一本色道久久综合亚洲精品图片| 精品一区二区三区自拍图片区| 91成人精品| 国产成人香蕉在线视频网站| 日韩精品一区三区| 国产模特av私拍大尺度| 青青操夜夜操| 欧美色精品在线视频| 91久久国语露脸精品国产高跟| 老司机99精品99| 香港日本三级视频| 亚洲第一精品电影| 成人天堂入口网站| 日本精品在线观看| 亚洲最大激情网|