VSCode、Atom和Sublime為什麼不支持代碼標籤成對摺疊呢?

VSCode、Atom和Sublime這三款文本編輯器感覺是比較常被拿出來說的"現代"文本編輯器,各有優缺吧。

想提這個問題是最近轉而開始使用了VSCode,之前也使過Sublime和Atom,但是發現對於代碼標籤成對摺疊貌似都不支持。雖然理論上格式化一下代碼,標籤自然就具有相同的縮進也就能摺疊了。但是有些情況下格式化出了點問題,可能導致注釋或者一些沒被格式化包含的東西的indent為0,這時候代碼摺疊算是廢了一半。

所以想著問一問原因,如果有知友有好的解決方案,也希望分享一下。

剛好有一個合適的例子:Code folding issue · Issue #26226 · Microsoft/vscode

---

為了直觀一點,以兩個代碼片段為例吧。當然,這些代碼片段的問題都可以通過格式化解決,最多是得設置一下.jsbeautifyrc完成&的正常格式化。

&


先賣個關子,我想問問,為啥編輯器就該知道按照你說的這樣來摺疊呢?為何現在的摺疊就是不對的呢?

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 |