帶你見識一下傳說中的Emacs

本文經過與VSCode做對比,來簡單地介紹Emacs的基本功能、特色,以及一些插件。本文所說的Emacs指的是GNU Emacs,下文簡稱Emacs。git

基本概念

  • Emacs是一個文本編輯器,就像VSCode那樣。它能夠用來寫代碼、Markdown,以及其它任何純文本;
  • 在Emacs中打開的每一個文件都有一個「主模式」(major mode),就像在VSCode中每一個文件均可以設置一種語言模式;
  • 除了主模式,在Emacs中還能夠同時啓用多個「次模式」(minor mode)。每個次模式均可以提供本身的個性化功能;
  • 能夠用一門叫ELisp的編程語言爲Emacs開發插件,擴展新功能。有許多現成的插件能夠安裝使用。

與VSCode對比

接下來經過與VSCode做對比,來直觀地感覺一下Emacs的基本功能。程序員

外觀

Emacs的官網上有一張應用截圖github

Emacs的官網截圖

第一眼看起來和VSCode仍是很是不同的正則表達式

VSCode的官網截圖

默認的Emacs界面上也會有菜單欄、工具欄,以及底下的狀態欄(在Emacs中其實這一行叫作mode line),這些元素在VSCode上也能夠找到。VSCode通常給人的印象還有側邊欄、資源管理器視圖,以及minimap視圖。Emacs的默認底色是白色,而VSCode則是黑色。shell

鍵盤操做

Emacs有着豐富的快捷鍵(在Emacs中稱之爲key binding),但一些常見的功能的快捷鍵與VSCode等其它軟件並不相同,以下表所示編程

Emacs VSCode
新建文件 ⌃x ⌃f ⌘n
打開文件或目錄 ⌃x ⌃f ⌘o
保存文件 ⌃x ⌃s ⌘s
另存爲 ⌃x ⌃w ⇧⌘s
撤銷 ⌃x u ⌘z
剪切 ⌃w ⌘x
複製 ⌥w ⌘c
粘貼 ⌃y ⌘v
查找 ⌃s ⌘f

在上表中,表示control鍵、表示Mac上的command鍵、表示shift鍵,表示Mac上的option鍵。此外,在Emacs中還可使用control鍵搭配pnbf來上下左右移動光標,不須要移動手臂即可以在編輯的文件中處處移動,提升效率。VSCode也可使用Emacs風格的快捷鍵,以下圖所示編程語言

文件管理

VSCode自帶美觀大方的標籤頁功能,此外還能夠將編輯器橫向及縱向拆分,以下圖所示編輯器

Emacs默認是沒有標籤頁的功能的,但也支持切割編輯器,好比在下圖中,就將編輯器分爲左右兩部分,而且左側還被分爲了上下兩部分,這三個區域能夠展現相同或不一樣的三個文件。函數

默認的編程語言支持

VSCode支持很是多的編程語言,點擊窗口右下角的語言模式即可以看到這份清單工具

Emacs雖然沒有這麼一份清單,但支持的語言的數量也是不遑多讓的。不過僅僅是默認的Emacs的話,對編程語言的支持沒有VSCode那麼開箱即用。例如,比起Emacs,VSCode默認對JavaScript的支持就很好,不只僅有語法高亮、自動補全,而且還有基於變量類型、函數定義,以及導入的模塊等信息實現的智能補全,而Emacs只有平凡的基於文本的語法高亮和自動補全罷了。

搜索功能

除了按下⌘f在文件內搜索以外,VSCode左側工具欄中有一個名爲搜索的入口,能夠實如今打開的項目的全部文件中搜索特定內容的功能,而且還能用於替換。Emacs儘管沒有這麼一個GUI入口,但提供了grep命令來作到一樣的事情。

在Emacs中按下⌥x後輸入grep並按回車,便會在minibuffer中等待使用者的進一步輸入

顯然,這是直接調用了同名的命令行程序grep來實現搜索的,控制選項比VSCode的搜索功能要豐富許多。

集成git

git能夠說已經成爲了平常開發中不可或缺的一個工具,若是可以在編輯器內方便地調用git的話會大大提升效率。VSCode經過左側工具欄的源代碼管理入口提供了這個功能,在Emacs中則是經過一個叫作VC dir的主模式提供這個功能。

在Emacs中按下快捷鍵⌃x v d,而後輸入使用git管理的項目的目錄地址,便會打開一個新的編輯區域

當處於這個模式下時,會有一些新的快捷鍵能夠用,好比將光標移動到顯示edited的行上按下等號鍵,能夠打開另外一個編輯區域查看該文件的修改內容;按下m鍵能夠選中光標所在行的文件,而後按v鍵打開一個新的編輯區域來填寫commit message,寫完以後按下⌃c ⌃c提交(即調用git commit命令);最後按下q鍵能夠退出VC dir模式的編輯區域。

集成終端

在VSCode中經過選中頂部菜單的「查看」,再點擊「集成終端」,即可以打開命令行,而後像平時在其它的終端模擬器中那樣使用命令。Emacs中也能夠打開終端,方法是按下快捷鍵⌥x而後輸入eshell並回車,而後Emacs便會在當前窗口中打開一個名爲*eshell*的編輯區域,顯示命令行提示符和閃爍的光標,並等待使用者的進一步交互。

有意思的是,這不是一個真正的命令行程序。好比在*eshell*中輸入which pwd,輸出結果是eshell/pwd is a compiled Lisp function in ‘em-dirs.el’.。也就是說,eshell中的某一些命令是Emacs從新實現的;此外,在*eshell*中能夠運行Emacs的擴展語言——ELisp。好比輸入(+ 1 1)並按下回車,會輸出2。

擴展能力

VSCode有一個插件市場

Emacs也有一個,不過得認可這個網頁確實沒有VSCode陣營的吸引人

在Emacs中按下⌥x後輸入package-install回車,Emacs會等待用戶輸入要安裝的插件的名字——能夠按下鍵(Mac上的tab鍵)讓Emacs嘗試自動補全。確認名字無誤後再按回車即可以安裝使用了——但通常還須要作一些微調。

炫酷的特性和插件

除了上面與VSCode對比的一些基本操做之外,Emacs還有自身的一些特點功能,更有世上的衆多優秀程序員爲Emacs貢獻了不勝枚舉的優秀插件,它們極大地擴展了Emacs的能力,提高了文字編輯這項活動的效率,甚至超越了文字編輯。

內置的功能

顏色主題

Emacs也能夠安裝顏色主題來改變外觀。我比較喜歡的一款主題是gruvbox-light-soft,只須要在Emacs的配置文件中寫上(load-theme 'gruvbox-light-soft t)便可啓用。在這個主題的倉庫主頁能夠看到一些效果圖。

將當前行居中或置頂

Emacs能夠用純鍵盤的操做,將光標當前所在的行移到窗口的中間來顯示。我特別喜歡這個功能,以前用VSCode時候一直想找這個功能的等價物,惋惜沒找着。在Emacs中,按下一次control+l,光標所在的行就會移動到窗口的中間;按下第二次,則移動到窗口的頂部展現;再按一次,會去到窗口的底部。若是再按一次,那麼就跟第一次同樣回到窗口的中間。每當Emacs正在編輯的內容已經去到屏幕上較低的位置時,我便會用這個功能校訂一下。

比起用鼠標拖動滾動條或者用滾輪來滾動,我更喜歡這種表意更清晰的方式。

純鍵盤選中一片區域

在Emacs中能夠用單擊鼠標右鍵的方式來選中一片區域。當按下鼠標右鍵的時候,從光標所在的位置開始,到鼠標點擊的位置結束的內容便會被選中。但我我的更喜歡純鍵盤的操做,首先是在要選中的內容的起點按下快捷鍵⌃@,這時候Emacs會在minibuffer中打印一條Mark set的消息。而後移動光標——用方向鍵仍是用一系列的快捷鍵,甚至直接跳轉到某一行也能夠——到待選中的內容的終點。這時候加在起點和終點間的內容便會被選中,它們會有特殊的背景色,以下動圖所示

由於按⌃@實在是太彆扭了,因此我將這個快捷鍵修改成了⌥␣。若是更喜歡鼠標操做的話,也能夠像在VSCode中那樣,在終點按住shift鍵再單擊鼠標左鍵。

矩形編輯

在VSCode中按住shiftoption鍵,再單擊鼠標右鍵並拖動就能夠選中一片矩形的區域,在Emacs中也支持這樣的矩形編輯的功能。像下圖這樣,先定位到要選中爲矩形區域的左上角按下⌃@,再移動光標到目標矩形區域的右下角,最後按下快捷鍵⌃x r k便可。

驚豔的插件

快速跳轉

Emacs自己支持跳轉到指定的某一行,只須要按下快捷鍵⌥g ⌥g而後輸入行號並回車便可。但我通常是不顯示行號的,因此這個功能其實比較少用。我使用一個名爲avy的插件來加強跳轉功能,主要用的是它提供的avy-goto-line函數。依照這個插件的文檔,我爲這個函數配置了快捷鍵⌥g f,所以當我想要快速地跳轉到屏幕上可見的區域中、離光標所在位置稍微有點遠的行時,我便按下這個快捷鍵,而後按照提示按下相應的英文字母鍵既可,具體效果參見下面的演示

發出HTTP請求

VSCode中有一個叫作REST Client的插件,Emacs中則是有一個叫作restclient.el的主模式。藉助於restclient.el即可以直接在一個文本文件中寫好本身要發出的HTTP請求的內容,而後一鍵觸發。以前我是用Insomnia這個工具的,儘管它很強大,但不少時候我不須要那麼強大的功能,並且Insomnia消耗內存比較多,因而我便回到restclient.el上了。restclient.el的效果大體以下圖所示

加強的git集成功能

儘管Emacs自帶了VC dir這個主模式,但我更喜歡用magit這個插件,尤爲是它的magit-discard功能,能夠在查看代碼的差別的過程當中方便地捨棄一些沒必要要的修改(例如添加一行console.log的調用)。例以下圖,經過按下n將光標移動到某一片修改上再按下k鍵,Emacs便會詢問使用者是否要「丟棄」這一塊改動。若是按下y,那麼這一塊被選中的區域的內容便會恢復到git當中未修改的狀態。

加強的文件內搜索功能

Emacs默認的搜索使用的是search-forward函數,插件swiper提供的功能更強大——不只能夠是字符串的徹底匹配,也能夠基於正則表達式來搜索,而且展現效果更直觀,以下圖所示

代碼片斷工具

VSCode自帶了一個「用戶代碼片斷」的功能(經過頂部菜單「Code」,再選中「首選項」能夠看到),能夠用來定義一些短語,這些短語會在被選中的時候展開爲完整的內容。Emacs有一個名爲yasnippet的插件也提供了相似的功能,但定義代碼片斷的語法不一樣。而且,yasnippet支持在短語的定義中嵌入ELisp代碼,擴展性遠遠高於只能使用字符串及佔位符的VSCode的等價功能。

其它

Emacs還有許多有意思的插件,好比dimmer.el,可讓當前沒有得到焦點的窗口顯示得黯淡一點;ledger-mode,能夠用Emacs來記帳。這裏就不一一列舉了,各位有興趣的話能夠本身摸索Emacs,相信會遇到本身喜歡的插件的。

總結

比起家大業大的VSCode,Emacs算不上是開箱即用。它沒有VSCode那麼友好的界面和平易近人的操做方式,人氣也沒有VSCode那麼旺,當遇到問題的時候可能沒那麼好求助到人,而且學習曲線(小衆的預設快捷鍵、冷門的擴展語言)也比較高。但Emacs的擴展能力很強,現有的插件已經很豐富了,能夠知足大部分的需求,遇到問題也能夠到有模有樣的論壇求助。若是喜歡折騰的話,Emacs會是一個不錯的選擇,至少我本身用得很開心。

閱讀原文

相關文章
相關標籤/搜索