VS Code markdown格式化的外掛編寫(3)[解難反思]

慕逸發表於2018-12-25

前言

第一篇: 介紹編寫外掛的準備和如何釋出.

第二篇: 介紹外掛簡單功能的具體編寫過程.

第三篇: 介紹外掛開發遇到的問題和解決的方案


解決問題

換行符

問題描述

開發完以後就美滋滋地開始用了,在格式化之前自己寫的一個md,取名為 1.md 時,突然發現每格式化一次後,都會在空行後多出一個空行

解決過程

自己將檔案刪減到只有兩行,依然發現還會多出空行,然後新建一個md檔案,,取名為 2.md ,將內容複製拷貝過去以後,發現在 2.md 中可以正確地格式化。這就奇怪了,明明內容是一樣的啊,檢視兩個檔案描述,發現相差一個位元組。

再想到1.md是從之前的window平臺拷貝過來,而2.md是在osx平臺新建的,於是去查了下資料,原來是兩個平臺的換行符是有差異的。

簡單地說, window 平臺下的換行符為 \r\n,而 osx 平臺的換行符為\n 。因此,用一段正則統一兩個平臺的換行符即可。

const LINE_BREAK_EXP = /\r\n/g;
複製程式碼

在這裡,稍微提一下。

  1. \r 為回車,作用是游標返回當前行首。

  2. \n 為換行, 作用為游標移動到下一行。

這兩個符號是從打字機開始出現,後來繼承到電腦上。

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開頭)的匹配規則,因此被重複格式化。

我沒有找到更好的正則匹配方式,因此我的思路是,將已經格式化過的程式碼段從內容中移除,再執行格式化程式碼塊,最後再補全內容。

反思優化

依然還是有些不足滴,粗略說兩個

  1. 使用者每次點選 command+shift+f 的時候,都會執行格式化,從效率角度,應當有個變數標記內容是否更改,如果沒有更改就直接返回。

  2. 目前只支援js的格式化,我想應該也有其他格式的程式碼的庫,作為後續可以擴充套件的功能。


目前開發了一些功能,算是可以用了,個人格式化了40篇md沒有什麼問題. 開發兩小時,修了兩天bug

VS Code markdown格式化的外掛編寫(3)[解難反思]

在vscode外掛裡查詢

VS Code markdown格式化的外掛編寫(3)[解難反思]

git地址在這裡~

程式碼在這裡,star隨意,歡迎issues~, 也歡迎大家在vscode中使用,我會持續更新~

相關文章