天天看點

老祁講科技|我為什麼說Vim比VSCode更好用

作者:祁平錄頻道
老祁講科技|我為什麼說Vim比VSCode更好用

Github 被微軟收購後迎來了一個相當重要的功能更新,叫做 Codespaces。

有了它,你就可以直接在你的倉庫裡寫代碼,而用不着在自己的電腦上本地程式設計了。你可以通過浏覽器來操控一台運作 VSCode 的超快伺服器來運作代碼、提供服務和更新代碼。

Vim 曾經是可移植性最強的文本編輯器,因為你可以在幾乎所有的伺服器機器上找到它,并通過 SSH 在終端使用它。

現在,VSCode 也有了一些這樣的功能。

你不僅可以在 Github 中運作 VSCode,而且微軟還提供了一個可以自服務的 VSCode 版本,叫做 Open VSCode Server。你可以用它将 VSCode 安裝到一台伺服器上,并在你想要的任何端口上為應用提供服務。然後你可以在自己的浏覽器中通路伺服器位址,并以和 Codespaces 中一樣的操作來使用 VSCode,但卻是免費的。

微軟走向開源世界

微軟的 xterm.js(用于 VSCode 自己的終端)是作為微軟自己獨有的開源項目釋出的,它萌生了一大堆各種各樣基于浏覽器的終端;現在你在幾乎每一個伺服器托管網站上都能找到一個終端。

這家公司曾長期反對開源模式,但如今他們已經擁抱了開源世界。在 Web 開發領域,他們正在占據主導地位。微軟擁有 Ubuntu、Github、npmjs.com,我很少能見到不用 VSCode 的開發者。

當他們開始讓 VSCode 也變得有這麼強的可移植性之後,甚至我自己也開始嘗試 Open VSCode 了。我想看看自己是否喜歡遠端寫代碼的感覺,能不能體會到它那不怎麼清爽的 GUI 的優點。

在我每月租金 5 英鎊的廉價伺服器上運作二進制檔案後,它幾乎立即崩潰了,我隻能重新啟動。

Vim 還是更勝一籌

Vim 比任何 GUI 編輯器都更有優勢,原因是顯而易見的。它輕巧快速,你可以在伺服器上通過 SSH 寫代碼,所有事情都可以在終端中完成。它的應用非常廣泛,可移植性和可配置性極佳。

這些原因你可能都已經聽過了,是以我想談談我喜歡它的一些個人理由,以及一些 VSCode 可能更擅長的領域。

它很難用?

當我剛開始就提到 Vim 很難用時,“麻瓜們”就都被拒之門外了——我是在開玩笑。

實際上,學習 Vim 比學習樂器要容易得多,但很多人都能學會演奏樂器;它也比學習閱讀和寫作容易得多,後者是一件非常困難的事情,但幾乎每個人都能做到。

用起來比較難當然不應該成為阻擋程式員使用的障礙。學習各種各樣困難的東西就是我們的安身立命之本。

學習比較困難的東西是有一些好處的,但這些好處與你學習的這件事本身并無直接聯系。你在這一過程中可以獲得一些元技能。

我的兒子尤裡最近學會了騎自行車,這對他來說很困難,因為騎自行車不是你可以一點點學會的東西。學習騎車時會有一個類似于信仰之躍的時刻,你還沒在心理上做好準備的時候就必須在行動上嘗試,并冒着從車上摔下來的風險。

還有一件事也讓自行車學起來更難:在你學會騎自行車之前,自行車對你來說毫無用處。是以他之前喜歡踩着滑闆車到處走,因為滑闆車學起來容易得多,學習過程也更有趣。

但自從尤裡學會騎自行車後就再也沒碰過他的滑闆車,因為它太慢了,而且沒什麼樂趣。雖然他沒有意識到,但學車的過程中其實也學到了一些元經驗。

首先,有時學習一些東西需要來一次信仰之躍,你必須冒着風險來邁出那一步。還有,有些東西在你學會之前毫無用處...... 然後突然間它們就變得如此迷人了。

VSCode 就像是文本編輯器中的滑闆車一樣,而 Vim 則是自行車。

Vim 不是異步的

為什麼這是個優勢?嗯,這就是它如此之快的原因所在。Vim 隻有大約 7MB 的空間占用,并且同時隻會做一件事。

它不會掃描你的目錄來尋找函數定義,它不會穿越文法樹給你提供複雜的自動完成建議,它不會計算你光标的上下文并向文檔 API 送出請求,它不會對每一行代碼做 git blame,它不會自動下載下傳每個檔案的文法。

但是 Vim 可以做所有這些事情...... 隻要你讓它做就行。

它隻做你讓它做的事

有些人喜歡自動功能,因為誰都希望自己的生活變得更容易。或者,也許你沒有時間或精力來處理這些小事情。

我想這取決于你覺得你對自己工作水準的感受,你是否有精力使用終端指令來 lint 你的檔案,或閱讀:help 來找出配置你的.vimrc 檔案的方法(我開始使用 Vim 時從未使用:help,一開始網際網路資源絕對是你的好朋友)。

但說實話,我認識的很多人會用不那麼有趣的方式來浪費他們的時間,比如漫無目的地刷 facebook,或者在 Netflix 上重新看幾集老友記之類。

有時我想做一些比較有互動性的事情,而不是從頭到尾都在寫代碼。如果我下班後或周末累了,過去我會玩音樂或電腦遊戲;現在我會在家裡修一些東西,或者用 Vim 做些修修補補。

我會思考一些可以在 Vimscript 中寫出來的小功能,或整合一個有用的指令行工具,甚至隻是閱讀一些我從未見過的:help……總之讓我有事情可做就行,不是什麼我必須完成的任務,但也不完全是浪費時間。

Vim 讓代碼寫起來就像打遊戲一樣

我深入了解 Vim 後就徹底不再玩電腦遊戲了,這是因為它的控制方式簡直就像遊戲一樣。Vim 有一個子產品化的結構,允許你使用各種指令的組合操作。這很像是你在格鬥遊戲中進行連擊的方式。

大多數指令有兩個、三個或四個部分。三部分結構的一個版本是這樣的:操作符(operator)- 文本對象(text object)- 動作(motion)。

操作符包括删除(delete)、更改(change)、視覺選擇(visual select)和替換(replace),每次選一個使用。

文本對象要麼在内部(inside)要麼在周圍(around)。

動作有很多種,我們稍後會具體讨論,現在我們可以把動作看作是指令的一種目标。舉個例子,我可以按 dib,意思是在塊内删除(delete inside block)。

其中操作符是 delete,文本對象是 inside,動作是 block。這樣就可以删除一個(括号)塊内的所有内容。

可選的組合數量很多:

di'——删除(delete)“單引号”内(inside)的内容。

da"——删除“雙引号”周圍(around)的内容。

dit——删除 html 标簽(tag)内的内容。

ci[——改變(change)[方括号] 内的内容。

正如我前面所說的,可供選擇的動作指令有很多,它們的表現也各不相同,具體取決于你是在三部分組合中使用(如上所述),還是在兩部分組合中使用(這時去掉文本對象,讓指令從光标位置向後運作)。

下面是你可以在上述三段式組合中使用的一些相關動作的清單。
--------------------------------------------------
| motions                           | key        |
|-----------------------------------|------------|
| word                              | w          |
| WORD (includes special chars)     | W          |
| block (of parentheses)            | b or (     |
| BLOCK (of curly braces)           | B or {     |
| brackets                          | [          |
| single quotes                     | '          |
| double quotes                     | "          |
| tag (html or xml <tag></tag>)     | t          |
| paragraph                         | p          |
| sentence                          | s          |
--------------------------------------------------           

這些指令可以讓你快速而輕松地改變一個函數的參數、一個字元串的内容或一個 if 塊的内容。一旦你學會了這些指令,在哪裡你都會想用一用。

其他文本編輯器都會讓人感到繁瑣和笨重,你會在每一個你能找到的環境中安裝“Vim 模式”。

關于動作的更多資訊

動作是你在 Vim 中使用最多的按鍵指令類型,因為它們可以單獨用來移動光标。有些動作可以單獨使用,而有些動作隻有在作為組合的一部分使用時才能發揮作用。

例如,w(forword)鍵會将光标一次向前跳過一個單詞,但'單引号不是一個單獨的動作,它的作用完全是另一回事。

有些動作會變成不同的類型,取決于它們是組合使用還是單獨使用。例如,在上面的三段式組合中,b 鍵的意思是塊,但當你單獨使用它時,它的意思是傳回(back),并且每次向後移動光标一個單詞。

Vim 的指令是上下文感覺的,也是子產品化的。不同的鍵意味着不同的操作,這取決于你何時使用它們以及光标位于何處。

它很像一種語言,你可以把這些指令看成一個句子:删除這些'單引号'内的内容(delete inside these ‘single quote’。