Emacs:最好的Python編輯器?
本文是 realpython.com 繼《將Sublime Text 3打造為Python全棧開發環境及》和 《Vim與Python真乃天作之合》 ,又一篇關于如何配置Python IDE的文章。這一次,主角變成了與Vim同樣享有神器之稱的Emacs編輯器。譯者之前沒有接觸過Emacs,但是看完這篇文章之后,覺得與Vim和Sublime Text 3相比,最出彩的一個地方就是可以和IPython與Jupyter Notebook進行集成。按照本文的介紹配置完之后,確實會讓Emacs成為一個異常強大的Python IDE。
- 本文作者是Kyle Purdon ,是Bitly公司的一名應用開發工程師。譯文鏈接: http://codingpy.com/article/emacs-the-best-python-editor/ 。譯文如存在問題,可以通過網站評論區或微信公眾號“編程派”指出,謝謝支持!
安裝與基礎
安裝
Emacs安裝不是本文的重點,因此,這里推薦大家參考 ErgoEmacs 網站提供的 安裝指南 ,完成在Linux、Mac或Windows平臺的基本安裝。安裝完成之后,打開應用,你就會看到默認設置下地Emacs界面。
Emacs基礎
同樣,本文也不會過多介紹Emacs使用的基礎知識。學習Emacs最容易的方法,就是通過其自帶的教程。本文介紹的內容并不要求你知道如何使用Emacs;相反,本文的每一部分講述的都是你學習基礎知識后可以使用的。
你可以使用方向鍵將光標移動到標有“Emacs Tutorial”字樣的地方,然后按回車鍵,就可以打開自帶教程。然后,你將會看到下面這段話:
Emacs commands generally involve the CONTROL key (sometimes labeled CTRL or CTL) or the META key (sometimes labeled EDIT or ALT). Rather than write that in full each time, we'll use the following abbreviations: C-<chr> means hold the CONTROL key while typing the character <chr> Thus, C-f would be: hold the CONTROL key and type f. M-<chr> means hold the META or EDIT or ALT key down while typing <chr>. If there is no META, EDIT or ALT key, instead press and release the ESC key and then type <chr>. We write <ESC> for the ESC key.
接下來,本文還會繼續出現類似 C-x C-s 等按鍵命令。這些命令表示,要同時按下Control鍵和x鍵,然后再同時按下Control和s鍵。這正是使用Emacs編輯器的基本形式。了解更多基礎知識,你可以學習自帶教程或者GNU網站提供的這個教程 Guided Tour of Emacs 。
配置與插件包(packages)
Emacs的好處之一,就是配置簡單。Emacs配置的核心則是初始化文件(Initialization File)—— init.el 。
在Unix環境下,這個文件應該放置在 $HOME/.emacs.d/init.el 路徑。
$ touch ~/.emacs.d/init.el
同時,在Windows平臺,如果沒有設置 HOME 環境變量,該文件應該放置在 C:/.emacs.d/init.el 路徑。
本文將會與大家分享許多配置示例。那么如果你想繼續跟隨本文進行配置的話,請先創建init文件。如果不想的話,可以在結語部分直接查看最終的完整init文件。
插件包(packages)可以對Emacs進行自定義,需要從不同的代碼倉庫獲取。其中,最主要的Emacs插件包倉庫是 MELPA 倉庫。本文中提到的所有插件包都將從該倉庫獲取并安裝。
樣式(主題&更多)
首先,下面是一個插件包安裝示例代碼,其中安裝了一個主題插件。
;; init.el --- Emacs configuration ;; INSTALL PACKAGES ;; -------------------------------------- (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t) (package-initialize) (when (not package-archive-contents) (package-refresh-contents)) (defvar myPackages '(better-defaults material-theme)) (mapc #'(lambda (package) (unless (package-installed-p package) (package-install package))) myPackages) ;; BASIC CUSTOMIZATION ;; -------------------------------------- (setq inhibit-startup-message t) ;; hide the startup message (load-theme 'material t) ;; load material theme (global-linum-mode t) ;; enable line numbers globally ;; init.el ends here
配置示例代碼的第一部分是 ;; INSTALL PACKAGES ,安裝了 better-defaults 和 material-theme 共兩個插件包。 better-defaults 插件集合了一系列對Emacs默認配置的修改,為我們開始進一步自定義奠定了良好的基礎。 material-theme 插件則提供了一組自定義的樣式。
主題插件中,我個人更喜歡的就是這個 material-theme 插件,所以本文中我們將一直使用這個插件。
第二部分則是 ;; BASIC CUSTOMIZATION (基本自定義)。
- 禁用啟動消息(即顯示所有教程信息的頁面)。在你更熟悉Emacs之前,你可以不禁用。
- 加載 material 主題。
- 啟用全局顯示行號
全局啟用意味著這個功能對于Emacs打開的所有緩沖區(buffers)都適用。所以,如果你打開了Python文件、markdown文件或者是純文本文件,它們都將顯示行號。你還可以根據不同的模式(mode)啟用不同的功能,——例如,python模式、markdown模式和純文本模式。稍后我們將Emacs配置為Python IDE時還會講到。
現在我們已經有了一個完整的基礎配置文件,可以重啟Emacs,觀察變化。如果你將 init.el 文件放在了正確地路徑中,Emacs將會自動加載該文件。
另外,你也可以在命令行輸入 emacs -q --load <path to init.el> 命令,啟動Emacs。配置文件加載完成后,我們之前見到的Emacs窗口會變得更好看:
下面這張圖展示了一些Emacs本身自帶的基礎功能——包括簡單的文件檢索和Split Layouts。
我最喜歡的一個Emacs基礎功能,就是可以進行快速的遞歸文本檢索(recursive grep search)—— M-x rgrep 。舉個例子,假如你想在某個文件夾下以 .md 為擴展名的文件中,查找所有出現過 python 一詞的段落:
完成基礎配置之后,我們可以開始將Emacs配置為Python開發環境啦!
Elpy ——Python開發
Emacs自帶的python模式(python.el)支持縮進和語法高亮功能。。但是如果要與專門針對Python設計的IDE競爭的話,我們肯定還需要添加更多的功能。 elpy (Emacs Lisp Python Environment)插件可以說為我們提供了Python開發環境所需要的幾乎全部功能,包括:
- 自動縮進
- 語法高亮
- 自動補全
- 語法檢查
- REPL集成
- 虛擬環境支持,以及
- 更多其他功能
要想安裝并啟用 elpy 插件,我們需要進行一些配置,并使用你自己喜歡的方式(例如, pip 或 conda )安裝 flake8 和 jedi 這兩個Python工具包。
下面的配置可以安裝 elpy 插件包:
(defvar myPackages '(better-defaults elpy ;; add the elpy package material-theme))
現在我們這樣啟用這個插件:
(elpy-enable)
完成上面的配置之后,我們可以重啟Emacs,并打開一個Python文件,就可以查看新的配置是否生效。
上面這幅圖中顯示了以下幾種功能:
- 自動縮進
- 語法高亮
- 語法檢查(第三行的錯誤提示)
- 自動補全(第九行顯示的列表方法)
另外,假設我們想要運行這個腳本。在Python自帶的IDLE或Sublime Text中,你可以點擊一個運行當前腳本的按鈕。Emacs編輯器也是一樣,不過我們只需要Python緩沖區按下 C-c C-c 即可。
通常,我們會希望運行一個虛擬環境,然后再使用虛擬環境中安裝的工具包來執行代碼。要想在Emacs中使用虛擬環境,我們需要輸入 M-x pyvenv-activate ,然后根據提示操作。輸入 M-x pyvenv-deactivate 就可以關閉虛擬環境。Elpy插件還提供了調試虛擬環境、處理elpy插件可能出現的問題的接口。輸入 M-x elpy-config ,就會出現下面的信息,其中包含了有價值的調試信息。
到這里,我們已經介紹完在Emacs中實現Python IDE基礎功能的方法。接下來,我們來進一步完善Emacs的配置。
額外的Python功能
除了上面介紹的基本IDE功能之外,Emacs還針對Python語言提供了一些額外的功能。在這一部分,我們無法介紹全部的額外功能,但是肯定會涉及PEP8、IPython/Jupyter集成。不過在此之前,我們要快速梳理一下語法檢查配置。
更好的語法檢查(Flycheck v. Flymake)
默認情況下,安裝了Elpy插件的Emacs提供一個名叫 Flymake 的語法檢查插件。但是,我們還可以選擇另外一個名叫 Flycheck 的插件,后者支持實時語法檢查。幸運地是,從 Flymake 切換至 Flycheck 非常簡單:
(defvar myPackages '(better-defaults elpy flycheck ;; add the flycheck package material-theme))
以及
(when (require 'flycheck nil t) (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) (add-hook 'elpy-mode-hook 'flycheck-mode))
現在,我們就可以在編輯Python代碼的同時,獲得實時代碼檢查反饋了:
遵循PEP8規范
不管你喜不喜歡,PEP8都不會消失。如果你想遵循PEP8標準的全部或部分規范,你大概希望能夠實現自動化合規。 autopep8 插件就是解決之道。這個插件與Emacs無縫集成,因此當你保存文件時—— C-x C-s ——autopep8插件就會自動格式化代碼,并糾正所有不符合PEP8標準的錯誤(排除你不希望檢查的錯誤)。
首先,你需要通過你喜歡的方式安裝 autopep8 這個Python工具包,然后添加下面的Emacs配置代碼:
(defvar myPackages '(better-defaults elpy flycheck material-theme py-autopep8)) ;; add the autopep8 package
以及
(require 'py-autopep8) (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save)
現在我們保存Python示例文件,Autopep8插件就會自動糾正出現的錯誤:
IPython/Jupyter集成
接下來這個功能尤其強大:將Emacs與IPython REPL和Jupyter Notebooks集成。首先,我們將Emacs中標準的Python REPL集成替換為IPython版本:
(elpy-use-ipython)
現在如果我們按下 C-c C-c 再次運行Python代碼,我們使用的將是IPython REPL:
盡管做到目前這樣已經非常有用了,但是真正的神奇之處還在Emacs與Jupyter notebook之間的集成。這里,我們假設你已經知道如何啟動Jupyter Notebook服務器。要實現前面提到的集成,我們只需要再添加一些配置即可:
(defvar myPackages '(better-defaults ein ;; add the ein package (Emacs ipython notebook) elpy flycheck material-theme py-autopep8))
Jupyter提供的notebook網絡接口很好,但是要求我們離開Emacs編輯器才能使用:
不過,我們可以通過在Emacs中直接連接notebook服務器,并與服務器進行直接交互的方式,就可以完成網絡接口所提供的功能。
其他Emacs功能
前面我們已經介紹了所有Python IDE應具備的基礎功能(以及一些非常棒的額外功能),但是還有一些功能也是IDE需要支持的。首先就是git集成。
Git集成(Magit)
Magit 是MELPA倉庫中非常受歡迎的一個插件包,幾乎每一個使用Git的Emacs用戶都會安裝這個插件。這個插件極其強大,功能也特別全面,超出了本文的范圍。不過還好 Mastering Emacs網站 上有 一篇介紹Magit的好文 。下面這張圖就摘自Mastering Emacs網站的那篇文章,展示了Emacs中git集成的效果:
其他Emacs模式
與使用只針對Python的IDE相比,使用Emacs的一大好處就是它還能夠支持除Python外的其他語言。工作的時候,我通常要使用Python、Golang、JavaScript、Markdown、JSON以及其他語言。因此,只使用Emacs編輯器并且完美支持所有這些語言將會大大提高工作效率。Emacs編輯器支持以下語言:
- Python
- Golang
- Ruby
- Puppet
- Markdown
- Dockerfile
- YAML
- Web (HTML/JS/CSS)
- SASS
- NginX Config
- SQL
在終端使用Emacs按鍵組合
學會使用Emacs之后,你會希望在其他地方也能夠使用Emacs按鍵組合。只需要在bash提示符之后輸入 set -o emacs 即可實現。但是,Emacs的一個強大之處就是你可以在終端下以headless模式運行Emacs編輯器。這也是我本人的默認終端環境。要開啟headless模式,只需要輸入 emacs -nw 即可。
結語
正如你所見,Emacs明顯是最好的編輯器。老實說,市面上還有其他很好的Python IDE可供選擇,但是我會毫不猶豫地推薦你學習Vim或Emacs,因為基于這兩個編輯器配置的開發環境無疑是功能最為多樣化的。最后,為大家提供本文中完整的Emacs配置:
;; init.el --- Emacs configuration ;; INSTALL PACKAGES ;; -------------------------------------- (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t) (package-initialize) (when (not package-archive-contents) (package-refresh-contents)) (defvar myPackages '(better-defaults ein elpy flycheck material-theme py-autopep8)) (mapc #'(lambda (package) (unless (package-installed-p package) (package-install package))) myPackages) ;; BASIC CUSTOMIZATION ;; -------------------------------------- (setq inhibit-startup-message t) ;; hide the startup message (load-theme 'material t) ;; load material theme (global-linum-mode t) ;; enable line numbers globally ;; PYTHON CONFIGURATION ;; -------------------------------------- (elpy-enable) (elpy-use-ipython) ;; use flycheck not flymake with elpy (when (require 'flycheck nil t) (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) (add-hook 'elpy-mode-hook 'flycheck-mode)) ;; enable autopep8 formatting on save (require 'py-autopep8) (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save) ;; init.el ends here
希望這些配置能夠激起你學習并使用Emacs的熱情!
來自: http://www.codingpy.com/article/emacs-the-best-python-editor/