安裝第三方各式套件可說是 Emacs 的精隨,Emacs 發展到現在有成千上萬各式不同的套件,讓你擴充 Emacs 到手軟。安裝套件主要有兩種最簡單的方法,一是透過 Emacs 24 以後開始內建的 package.el
,二是手動安裝。以下分別介紹。
我個人喜歡以 package.el 為主,手動安裝為輔的方式。因為 package.el 太方便了,除非遇到 GNU ELPA 跟 MELPA 中都找不到的 package(現在很少了),否則根本不會想要手動安裝。
– ono hiroko
這是 Emacs 內建的一套套件管理系統,我們推薦新手用這種方法安裝套件,安裝套件不用再自己手動抓 el,而且也不用自己寫 (require '套件名)
非常方便。
透過 package.el
安裝的套件會被放在 ~/.emacs.d/elpa/
下。如果你用 git 管理你的 Emacs 設定檔,建議直接把 ~/.emacs.d/elpa/
也一起放進去,先不要考慮什麼為了省空間而用 Emacs Lisp 寫個自動從網路上抓 packages 的 function 之類的,因為很容易 dependancies 爆掉,與其那麼麻煩不如先全部放。
如果你有使用
use-package
這個第三方外掛來管理套件,有個ensure
選項可以自動檢查並安裝未安裝的套件。比如:(use-package magit :ensure t)
。– 9m9
Emacs 預設只有設定 GNU ELPA,這裡推薦可以加入 MELPA repository,這應該是目前最大的 Emacs package repository,方法也很簡單,在 ~/.emacs.d/init.el
中加入下面這幾行就好:
;; package.el 相關設定
(require 'package)
(package-initialize)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
我自己是一般情況用
melpa
套件比較多也比較新,當單一套件出問題時才改用melpa-stable
。例如web-mode
我就是用 stable 的,因為他新版常常爆炸。– ono hiroko
套用上面的設定後, M-x package-list-packages
就可以看到套件管理畫面了。
C-s
搜尋套件名稱i
標記為安裝d
標記為移除u
取消標記x
套用
我沒有提到
U
,因為我非常不推薦使用這指令。這個一按下去會自動把所有安裝的套件更新,並把舊的移掉,但這種行為非常容易讓你搞定好的環境爛掉。如果只按
i
來個別升級套件的話,這樣該套件的舊版的只會被標記成obsolete
(遺棄),當升級該套件後出問題,可以很容易的把新版u
移除掉,obsolete
則可以補回原本的位置繼續用。– ono hiroko
也有人用
M-x package-install <RET>
,再輸入套件名稱來安裝。順帶一提,如果發現找不到你要的套件的話,可以先檢查是不是有個
~/.emacs
在那邊騙你,有的話就把他的東西都抓進~/.emacs.d/init.el
——當然要看一下哪些要留哪些要丟啦——然後下M-x package-refresh-contents <RET>
再重新搜一次應該就有了。會特別提是因為我自己莫名被雷過,找了好久才發現。Orz– wildsky
有少數套件在 GNU ELPA 跟 MELPA 中都找不到,這時才會需要用到手動安裝。
除了少數比較複雜的 packages 要照著它的 README 做外,我們這裡介紹的是最最最最最基本的手動安裝方式。
我們假設要安裝一個叫做 kanata
的套件,下載下來後解壓縮,發現整個資料夾的名稱是 kanata/
,主程式放在 kanata/kanata.el
。
- 先在
~/.emacs.d/
下建立一個新的目錄(這裡以~/.emacs.d/packages/
為例),以便跟~/.emacs.d/elpa/
內的套件分開管理。 - 把整個資料夾
kanata/
扔進~/.emacs.d/packages/
中。 - 在你的設定檔中加上:
(add-to-list 'load-path "~/.emacs.d/packages/kanata") ;; 這樣 Emacs 才 require 得到這個 package
(require 'kanata) ;; 載入 kanata 這個 package
- 這樣應該就可以用了。可能有其他設定,這必須自己看一下它附帶的 README。
有一些細節我想還是提一下好,這在當你哪天要寫 package 時蠻重要的。
當你透過
add-to-list
把你的新套件路徑加入load-path
這個 variable 後,Emacs 在require
時就會在load-path
中的路徑搜尋裡面是否有擁有這個名稱的 package。也就是說,直到你require
某個套件之前,該套件還不會被載入。你可以打開隨便一個
*.el
來看,你會發現檔案尾端都一定會有一行(provide 'kanata)
之類的東西,這就是我們在require
時所用的該套件名稱。不要隨意修改
.el
的檔名,因為當你的套件檔名kanata.el
跟(provide 'kanata)
所提供的名稱不一致時,require
載入時就會出現錯誤。更細節的部份我也不懂,希望我沒講錯 orz。
– ono hiroko