VSCode、Atom和Sublime為什麼不支持代碼標籤成對摺疊呢?
VSCode、Atom和Sublime這三款文本編輯器感覺是比較常被拿出來說的"現代"文本編輯器,各有優缺吧。
想提這個問題是最近轉而開始使用了VSCode,之前也使過Sublime和Atom,但是發現對於代碼標籤成對摺疊貌似都不支持。雖然理論上格式化一下代碼,標籤自然就具有相同的縮進也就能摺疊了。但是有些情況下格式化出了點問題,可能導致注釋或者一些沒被格式化包含的東西的indent為0,這時候代碼摺疊算是廢了一半。
所以想著問一問原因,如果有知友有好的解決方案,也希望分享一下。
剛好有一個合適的例子:Code folding issue · Issue #26226 · Microsoft/vscode
---
為了直觀一點,以兩個代碼片段為例吧。當然,這些代碼片段的問題都可以通過格式化解決,最多是得設置一下.jsbeautifyrc完成&的正常格式化。
&
&Toggle navigation&
&&
&&
&&
&
void test(){
// test
return;
}
Notepad++:
https://i.gyazo.com/f9a0d0d172e0670bdc15f1da93340346.pnghttps://i.gyazo.com/c1673d407426105add0307903c74dcad.png至於題中提到的三者皆無法正常摺疊。
在C語言的代碼片段中
VSCode:
https://i.gyazo.com/b9c9e4491249d3299bef202a337e0d95.pngAtom和Sublime直接沒有出現摺疊符號
在HTML代碼片段中
三者皆無出現摺疊符號
先賣個關子,我想問問,為啥編輯器就該知道按照你說的這樣來摺疊呢?為何現在的摺疊就是不對的呢?
void test(){
// test
return;
}
這段代碼之所以摺疊成
void test(){···}
更合理,是因為在你使用的這門編程語言里 { } 是個 block ,是個 lexical structure,把整個 block 的內容摺疊才是符合預期的。
簡言之這是一個 language-aware 的特性。而正如 @賀師俊 所說,按照 indentation 來摺疊則是相對和語言無關(某些語言除外),也是現在幾個主流編輯器首先支持的方式。
要實現樓主提出的方式,需要 1. 語言能夠提供這樣的信息 2. 編輯器支持 3. 語言和編輯器之間有一個通用的 protocol,類似於 LSP.
TLDR;
這個問題我們記錄在案的,請戳 [folding] language-aware folding · Issue #3422 · Microsoft/vscode
根據縮進進行摺疊顯然是一種與編輯目標(某種編程語言的源代碼)無關的特性。而你描述的方式則是相關的。作為通用的文本編輯器,支持前者是應有之義。這不是說就不能支持後者,但是按照通用文本編輯器的架構來說,通常只能以插件方式支持。
一個更重要的問題是,像你描述的摺疊方式需要考慮UI。比如單行多個嵌套標籤的摺疊UI是什麼樣子的?一半跨行呢?如何操作?仔細想想,就會發現要又清晰又好用,不是那麼容易的事情。相對來說,格式化後的代碼和嵌套結構是一致的,UI就很自然了。
此外編輯器必然要面對有問題的代碼,比如標籤不成對時?這時候,基於結構的摺疊也很可能廢掉大半。
類似的問題還有很多,比如基於縮進的摺疊和基於結構的縮進是否可以混用?如何混用?諸如此類。
總之,不是不能,但是要做好是不容易的。而文本編輯器本來就是希望要比IDE簡化,其核心不包含這樣的特性大概也是必然的吧。(相對來說,這三款編輯器中,VSCode有language service的設計,理論上或許可以在核心中包含通用的基於結構的摺疊?)
lambda-view 能夠完美的摺疊任何 JavaScript 代碼(滑稽臉):
因為它是工作在 AST 層面,它清楚代碼真正的結構。但遺憾的是,它只支持 JavaScript,而且也沒有編輯功能(專註於代碼閱讀)。所以並不能取代 VSCode/Atom/Sublime 等。
推薦閱讀:
※VScode如何根據不同文件類型設置諸如tab的長度、ruler位置等選項?
※Emacs 有什麼奇技淫巧?
※如彈鋼琴般使用 Emacs 是怎樣一種體驗?
※怎樣學習 Emacs?
※如何優雅地使用 LaTeX 編輯公式?
TAG:文本編輯器 | SublimeText | Atom文本編輯器 | VisualStudioCode |