第一篇: 介紹編寫插件的準備和如何發佈.git
第二篇: 介紹插件簡單功能的具體編寫過程.github
第三篇: 介紹插件開發遇到的問題和解決的方案markdown
開發完之後就美滋滋地開始用了,在格式化以前本身寫的一個md,取名爲 1.md
時,忽然發現每格式化一次後,都會在空行後多出一個空行post
本身將文件刪減到只有兩行,依然發現還會多出空行,而後新建一個md文件,,取名爲 2.md
,將內容複製拷貝過去之後,發如今 2.md
中能夠正確地格式化。這就奇怪了,明明內容是同樣的啊,查看兩個文件描述,發現相差一個字節。優化
再想到1.md
是從以前的window
平臺拷貝過來,而2.md
是在osx
平臺新建的,因而去查了下資料,原來是兩個平臺的換行符是有差別的。ui
簡單地說, window
平臺下的換行符爲 \r\n
,而 osx
平臺的換行符爲\n
。所以,用一段正則統一兩個平臺的換行符便可。spa
const LINE_BREAK_EXP = /\r\n/g;
複製代碼
在這裏,稍微提一下。插件
\r
爲回車,做用是光標返回當前行首。code
\n
爲換行, 做用爲光標移動到下一行。regexp
這兩個符號是從打字機開始出現,後來繼承到電腦上。
而Unix
平臺認爲 \n
就闊以了,還省個字節,window
認爲 \r\n
纔是正統, osx
之前用 \r
,萬幸如今和 Unix
同樣了。
在格式化js代碼後,會將代碼段(用```包裹的代碼)中已經格式化過地代碼,再次格式化,出現問題。
例如:
function(){var a = 100; settimeout(function(){console.log('hello')}),100}
複製代碼
格式化之後
function(){
var a = 100;
settimeout(function(){
console.log('hello')
},100)
}
複製代碼
再次點擊格式化,
function(){
var a = 100;
settimeout(
function(){
console.log('hello')
}
,100)
}
複製代碼
這個問題就比較容易發現緣由, 是由於被格式化後的代碼段中出現了多行以4個空格或者tab開頭的行,他們也符合代碼塊(就是以空格或者tab開頭)的匹配規則,所以被重複格式化。
我沒有找到更好的正則匹配方式,所以個人思路是,將已經格式化過的代碼段從內容中移除,再執行格式化代碼塊,最後再補全內容。
在這裏補充一個格式化的辦法
function removeReplace(text: string, reg: RegExp, func: Function): string {
const _tempRegArr = text.match(reg)
if (_tempRegArr && _tempRegArr.length > 0) {
const _tempArr = [];
_tempRegArr.forEach((e, i) => {
const _reg = new RegExp(escapeStringRegexp(e), 'g');
_tempArr.push(e);
text = text.replace(_reg, `$mdFormatter$${i}$mdFormatter$`);
})
text = func(text);
const _mdformatterArr = text.match(/\$mdFormatter\$\d+\$mdFormatter\$/g)
_mdformatterArr.forEach((e, i) => {
const _reg = new RegExp(escapeStringRegexp(e), 'g');
text = text.replace(_reg, _tempArr[i]);
})
} else {
text = func(text);
}
return text
}
複製代碼
依然仍是有些不足滴,粗略說一些
1. 用戶每次點擊 command+shift+f
的時候,都會執行格式化,從效率角度,應當有個變量標記內容是否更改,若是沒有更改就直接返回。(已在0.2.1版本實現)
目前開發了一些功能,算是能夠用了,我的格式化了40篇md沒有什麼問題. 開發兩小時,修了兩天bug
在vscode插件裏查找
git地址在這裏~
代碼在這裏,star隨意,歡迎issues~, 也歡迎你們在vscode中使用,我會持續更新~