教程存檔Github
序|Preface
先來一篇有趣的簡介:Emacs和Vim:神的編輯器和編輯器之神 - 51CTO.COM
為何寫這篇教程?
作為一個(gè)徹頭徹尾的emacs新手麦箍,盡管有些薄弱的編程經(jīng)驗(yàn)霞篡,但上手這么一個(gè)黑客級別的編輯器還是難免一段陣痛期旬渠。雖然網(wǎng)上有很多非常好的教程恋日,比如這篇著名的文章祟偷,一年成為Emacs高手(像神一樣使用編輯器)芹橡,雖然提供了一個(gè)很好的學(xué)習(xí)框架讥耗,但具體的學(xué)習(xí)內(nèi)容還是需要你自己尋找有勾。這篇教程,在某種意義上可以被視為按照那個(gè)學(xué)習(xí)框架進(jìn)行的學(xué)習(xí)實(shí)踐古程。
在實(shí)踐過程中蔼卡,我發(fā)現(xiàn)相關(guān)基礎(chǔ)知識的優(yōu)秀教程散布在互聯(lián)網(wǎng)的各個(gè)角落,缺乏一個(gè)有條理的組織籍琳,更別提有些排名靠前的教程早已過時(shí)菲宴,里面提到的操作和方法已經(jīng)不適用于最新版的emacs。
雖然emacs可以作為一個(gè)簡單的文本編輯器開箱即用趋急,但陡峭的學(xué)習(xí)曲線主要體現(xiàn)在讓它發(fā)揮最大功效的個(gè)性化定制之中喝峦。這篇教程整理了我在配置emacs過程中學(xué)到的知識,方便新手循序漸進(jìn)的學(xué)習(xí)呜达。建議你將它作為一個(gè)有內(nèi)在結(jié)構(gòu)的課程來對待谣蠢。整個(gè)教程大約會花掉你18個(gè)小時(shí)。
誰該閱讀這篇教程查近?
我學(xué)習(xí)emacs的初衷是為了做日程管理眉踱,記筆記,并且寫研究論文霜威。我的學(xué)習(xí)和研究經(jīng)常涉及到各種編程語言谈喳,特別是各種統(tǒng)計(jì)軟件,比如R戈泼,SAS婿禽,Stata赏僧,Matlab等,當(dāng)然還有Python扭倾。雖然R和Python都支持“文學(xué)編程”模式[1]淀零,但如果想將多種語言整合進(jìn)一個(gè)文檔的話,emacs的org-babel模式無疑是第一選擇膛壹。而既然是想寫研究論文驾中,對于Latex的支持必不可少。所以模聋,我配置的emacs會以方便“文學(xué)編程”肩民,多格式導(dǎo)出(主要是Latex和html)以及各種文檔模板為重點(diǎn),主要圍繞emacs的兩個(gè)插件org和auctex來展開链方,可能還會涉及到知識整理此改,以及同Evernote互動的內(nèi)容。另外侄柔,許多配置步驟在Unix系統(tǒng)下會方便很多,但很不幸占调,我使用的是windows暂题。
所以,如果你是emacs小白究珊,但有一點(diǎn)編程經(jīng)驗(yàn)薪者,有同我類似的需求,并且也使用windows剿涮,那么這篇文章就是為你量身定制的言津。歡迎閱讀!
為什么不直接使用高手寫好的配置取试?
這個(gè)教程本身就借鑒了許多高手的配置悬槽。我堅(jiān)信“授人以魚不如授人以漁”的格言。我相信我對你最大的幫助是這篇教程本身瞬浓,而不是那些配置文檔初婆。希望作為新手的你,在閱讀完這篇教程后猿棉,能獲得足夠的信心和動力來打造一個(gè)獨(dú)屬于你的emacs磅叛。
如何學(xué)習(xí)這篇教程?
請注意我使用了“學(xué)習(xí)”而不是“閱讀”萨赁。這意味著你需要自己動手弊琴,實(shí)踐那些優(yōu)秀教程提到的操作。自己寫一些代碼杖爽,而不是單純的復(fù)制粘帖敲董。
凡是附在“參考”后的文章紫皇,盡管大部分是英語文章,都請你仔細(xì)閱讀臣缀。當(dāng)然坝橡,你可以先瀏覽我寫在后面的筆記和總結(jié),來獲得一個(gè)初步理解精置。你甚至可以只閱讀我的總結(jié)來基本理解我要談的事情计寇,這看上去會節(jié)省你大量的時(shí)間,但其實(shí)你在不知不覺中錯(cuò)過了很多我沒提及但對你很重要的細(xì)節(jié)脂倦。No pain, no gain...如果你堅(jiān)持不讀參考文章番宁,請至少記得它們的標(biāo)題。等你遇到問題時(shí)赖阻,至少知道該用什么樣的關(guān)鍵詞來搜索答案蝶押。
附在“延伸閱讀”后的文章都很有價(jià)值,有助于你深入理解前文提到的概念火欧。加了“必讀”標(biāo)簽的請優(yōu)先閱讀棋电。標(biāo)簽"TD"代表文章中出現(xiàn)了很多我還沒提及的技術(shù)細(xì)節(jié)(Technique details),需要更多的背景知識苇侵。所以赶盔,如果你在閱讀中感到困惑,可以先跳過榆浓,等學(xué)習(xí)完整個(gè)教程后再來閱讀于未。因此,TD還有一層TODO的意味……
在閱讀我給出的文章時(shí)陡鹃,你可能希望完成一個(gè)“知識閉環(huán)”后再回來繼續(xù)學(xué)習(xí)烘浦。所謂“知識閉環(huán)”,就是持續(xù)了解閱讀過程中遇到的新概念萍鲸,直到不再遇到新的概念為止闷叉。顯然,這會耗費(fèi)大量的精力脊阴,而且你的疑問通常會在后續(xù)的教程中得到解決片习。我在撰寫這個(gè)教程時(shí),并沒假定你完成了“知識閉環(huán)”后再繼續(xù)學(xué)習(xí)蹬叭,所以藕咏,建議你只對最大的疑惑做擴(kuò)展閱讀,比如選擇性的瀏覽文章中包含的超鏈接秽五。
下載安裝|Download and Installation
官網(wǎng):http://ftp.gnu.org/gnu/emacs/windows/
打開網(wǎng)頁后孽查,頂部是一段關(guān)于如何安裝的說明文檔。
總結(jié):
- 不需要安裝坦喘,解壓縮到某個(gè)路徑就可以了
- 為了方便全局調(diào)用盲再,請?zhí)砑觔in路徑到環(huán)境變量(比如我的西设,
C:\emacs\bin
)。你可能需要先了解下環(huán)境變量和命令行的基本知識答朋。搜索關(guān)鍵詞“windows環(huán)境變量PATH”贷揽,“啟動cmd” - 測試下,在cmd里梦碗,輸入
emacs -nw
[2]禽绪,以終端模式來運(yùn)行emacs;只輸入emacs
洪规,以GUI模式來運(yùn)行 - 文檔介紹了bin目錄下各個(gè)exe文件的功能印屁,也介紹了怎樣完全卸載,直接刪除就好
- 解壓縮完成后斩例,可以運(yùn)行
bin\addpm.exe
雄人,這樣會自動生成配置文件.emac
和目錄.emacs.d
,并且在啟動菜單里添加應(yīng)用程序快捷方式念赶。另外础钠,官方文檔里說還會添加注冊表的相關(guān)條目。不過在我的電腦上叉谜,注冊表并未新增相應(yīng)條目 - 可以在桌面上新建一個(gè)快捷方式(shortcut)珍坊,位置(location)填入
emacs的安裝路徑\bin\runemacs.exe --debug-init
。加了flag--debug-init
正罢,是為了方便調(diào)試(debug)配置文件。不推薦為emacs.exe
建立快捷方式驻民,因?yàn)闀~外啟動一個(gè)命令行窗口翻具。
請選擇24以上的版本
延伸閱讀: FAQ 3.2
其他版本
個(gè)人推薦
- 64 bit version
http://sourceforge.net/projects/emacsbinw64/
本人使用的版本,后面的配置都是基于這個(gè)版本
版本號:24.4.91
下面這兩個(gè)版本可以省去大部分配置的麻煩事回还。不過多勞多得裆泳,請自行選擇
- All-in-one Emacs Binary by Vincent Goulet
http://vgoulet.act.ulaval.ca/en/emacs/ - An Emacs Starter Kit for the Social Sciences by Kieran Healy
http://kieranhealy.org/resources/emacs-starter-kit/
基本操作
打開emacs,同時(shí)按下Ctrl
和h
柠硕,然后鍵入t
工禾,閱讀新手教程,熟悉界面蝗柔,基本術(shù)語和操作闻葵。
請不要跳過這一步!(但不要求熟練掌握)
本文后面的部分已經(jīng)假定你閱讀了這個(gè)教程癣丧,所以默認(rèn)遵循emacs的術(shù)語規(guī)范槽畔。
C
代表Ctrl
鍵。M
代表Alt
鍵胁编。RET
代表Enter
鍵(回車鍵)厢钧。C-x
代表同時(shí)按下Ctrl
和x
鳞尔。C-x d RET
代表先同時(shí)按下Ctrl
和x
,再按下d
早直,最后再按下RET
寥假。我在后文的按鍵描述中,會經(jīng)常省略最后一步的回車操作霞扬。另外糕韧,請留意描述所用的英文字母的大小寫。
Emacs里的大部分地方都支持自動補(bǔ)全祥得,快捷鍵是TAB
兔沃。
配置篇|Configuration
編程基礎(chǔ)
你可能會奇怪,為什么配置emacs還需要編程级及?一般配置一個(gè)程序乒疏,不都是通過菜單欄打開一個(gè)對話框,然后修改里面提供的選項(xiàng)么饮焦?在emacs里怕吴,的確有這么一套配置系統(tǒng),詳見Emacs's Customization Tutorial县踢。但個(gè)人不推薦使用转绷。因?yàn)楸蛤荆谝凰婷觯锩嫣峁┑倪x項(xiàng)并不完全,許多配置只能通過編程才能做到埋市;第二谴返,它也是通過在你的配置文件中加入一些代碼來實(shí)現(xiàn)的煞肾。
配置emacs的所有代碼構(gòu)成了一個(gè)配置文檔。Emacs的配置文檔是用elisp語言寫的嗓袱。elisp是lisp的一種方言籍救。至于lisp語言,有人說它是黑客的語言渠抹。不過你并不需要完全理解elisp才能配置emacs蝙昙。至少我對elisp談不上熟練。不過我倒是看過一些lisp語言的入門教程梧却,所以能夠看得懂elisp的官方幫助文檔奇颠。你可以參考Learn X in Y minutes來快速入個(gè)門。由于elisp的函數(shù)命名規(guī)則大部分都很直觀放航,所以只要了解了基本語法大刊,大部分配置語句對你來說都會變得很直白。下面列出幾個(gè)配置文檔時(shí)的常用函數(shù),只是讓你熟悉下elisp的語法缺菌。更多的函數(shù)會在用到時(shí)講解葫辐。
參考set
- 變量賦值。比如
(set 'a 5)
相當(dāng)于a=5
參考setq
- 這個(gè)其實(shí)就是為了偷懶伴郁,在一次執(zhí)行多個(gè)賦值操作時(shí)少打幾個(gè)
'
參考let
-
let
的意義在于批量執(zhí)行函數(shù)時(shí)定義共享參數(shù)耿战。考慮下面這個(gè)使用情景焊傅,你希望連續(xù)調(diào)用函數(shù)A剂陡,B,C狐胎,它們都接受一個(gè)字符串參數(shù)s鸭栖,s代表某個(gè)路徑。A負(fù)責(zé)打印字符串s握巢,并提示接下來要利用s做什么事情晕鹊;B負(fù)責(zé)切換到s指定的位置然后執(zhí)行一些操作;C負(fù)責(zé)將s加入到某個(gè)全局列表中暴浦。你當(dāng)然可以不用let
溅话,在調(diào)用函數(shù)前加上一句(set 's 一個(gè)字符串)
即可。但這時(shí)定義的s會成為全局變量歌焦,進(jìn)而污染你的變量空間飞几。
HOME
參考The Emacs Initialization File
- Emacs配置文檔常見的文件名有兩個(gè),
.emacs
独撇,init.el
屑墨,雖然本質(zhì)上它們都是elisp腳本(像python腳本那樣)。 - 你可以用任何文本編輯器來編輯他們纷铣。個(gè)人推薦使用Notepad++卵史,支持語法高亮,列編輯关炼。Notepad++可以很方便的進(jìn)行區(qū)域注釋(
Ctrl
+q
,Shift
+Ctrl
+q
)匣吊,這對調(diào)試配置文檔很重要儒拂。當(dāng)然,在你熟悉emacs后色鸳,emacs也許會成為你的唯一編輯器 - 當(dāng)你在使用Notepad++編寫自己的配置文檔時(shí)社痛,可能經(jīng)常需要執(zhí)行注釋或者反注釋某段代碼的操作。注釋時(shí)請用
Shift
+Ctrl
+q
命雀,反注釋時(shí)請用Ctrl
+q
蒜哀。前者會保證在每一行代碼前都加一個(gè);
,后者則是吏砂,如果本行代碼以;
開頭撵儿,就刪掉一個(gè);
乘客,如果不以;
開頭,則添加一個(gè);
淀歇。容易理解易核,當(dāng)代碼塊中包含注釋時(shí),你肯定不希望在注釋掉代碼的同時(shí)反注釋掉那些注釋浪默。
接下來牡直,讓我們先來了解emacs在哪里尋找配置文檔,以及會具體選擇哪種格式纳决。
參考How Emacs Finds Your Init File碰逸,了解emacs啟動時(shí)配置文件的加載規(guī)則
- Emacs會在系統(tǒng)中尋找一個(gè)名為HOME的變量,然后拷貝一個(gè)副本供自己使用阔加,并在其指定的路徑下尋找配置文件
- 各個(gè)平臺的默認(rèn)HOME路徑請參考
HOME and Startup Directories on MS-Windows - windows平臺饵史,在cmd使用
echo %userprofile%
來查看HOME[3] -
The MS-Windows System Registry介紹了emacs尋找默認(rèn)參數(shù)的路徑的先后順序
- 注意,環(huán)境變量是第一位的掸哑,如果沒有才會在注冊表中尋找约急。也就是說,如果環(huán)境變量和注冊表都包含HOME的話苗分,emacs會拷貝前者作為自己的副本厌蔽。這通常不是一個(gè)好消息。一方面摔癣,你希望盡量按照自己的意愿來設(shè)置emacs的HOME變量奴饮;另一方面,你可能已經(jīng)為別的應(yīng)用程序創(chuàng)建了系統(tǒng)級別的HOME择浊,以至于不得不把emacs的配置文件也放在那里
- 個(gè)人認(rèn)為戴卜,一個(gè)更合理的加載邏輯應(yīng)該是,順序檢測一系列路徑琢岩,后面檢測到的值覆蓋前面的投剥。這樣你就可以通過創(chuàng)建注冊表的方式來避免與系統(tǒng)環(huán)境變量的沖突
- 對于windows 7/8/8.1,如果你的環(huán)境變量和注冊表里都沒有HOME担孔,emacs會把
%userprofile%
的值設(shè)置為HOME江锨,一般是
C:\Users\your-user-name\AppData\Roaming
通常,emacs會優(yōu)先加載
.emacs
糕篇,如果找不到啄育,并且存在文件夾.emacs.d
,會嘗試加載其中的init.el
基于前面的介紹拌消,一個(gè)比較好的安裝配置方案如下:
將emacs的壓縮包解壓到某個(gè)路徑
運(yùn)行bin路徑下的
runemacs.exe
c-x d ~ RET
挑豌,編輯區(qū)域左上角的文件路徑即emacs的HOME。或者鍵入C-h v user-init-file
并查看返回值在HOME路徑下氓英,emacs會自動生成
.emacs.d
文件夾侯勉,如果沒有請自己建立-
在該文件夾下新建
init.el
,輸入如下代碼
;; This file is only for windows 7/8/8.1
;; The only thing it does is to set the HOME directories for emacs,
;; then trigger the init.el in the directory specified by HOME to
;; accomplish the true initialization
;; You should put this file in the default HOME directory right after
;; emacs is installed
(setenv "HOME" "C:/emacs/") ;; you can change this dir to the place you like
(load "~/.emacs.d/init.el")
```
- 最后一行代碼中债蓝,
~
代表emacs的HOME路徑壳鹤。由于前面已經(jīng)重新設(shè)定HOME,所以這行代碼相當(dāng)于調(diào)用C:/emacs/.emacs.d/
下的init.el
饰迹。關(guān)于load
命令芳誓,后面有詳細(xì)解釋 - 順便刪掉前面幾步中你見到的任何
.emacs
文件,保證emacs利用init.el
啟動
這樣做的好處是啊鸭,除了可以自定義.emacs.d
所在的路徑锹淌,還可以方便的備份整個(gè)文件夾,因?yàn)椴寮ǔ话惭b到這個(gè)文件夾下赠制。如果需要換到其他電腦甚至平臺時(shí)赂摆,只需要把整個(gè)文件夾復(fù)制過去,然后類似于上述步驟那樣钟些,想辦法讓真正的init.el
發(fā)揮作用即可烟号。
使用init.el
而不是.emacs
來配置,可以保證配置文件的結(jié)構(gòu)化和模塊化政恍,方便維護(hù)汪拥。
最后規(guī)定后文要經(jīng)常用到的幾個(gè)代指
-
~
代指重定義后的emacs的HOME路徑 -
user-emacs-directory
指代~\emacs.d
,該路徑可以在啟動emacs后通過C-h v user-emacs-directory
來查看篙耗。 -
init.el
代指user-emacs-directory
下的版本迫筑,是我們要配置的版本
延伸閱讀:
- General Variables 必讀
- DotEmacsDotD
- FAQ 3.4 3.5 3.6
- The Emacs Initialization File TD
- Summary: Sequence of Actions at Startup TD
PATH
從這個(gè)章節(jié)開始,對于提到的非emacs程序宗弯,都假定這些程序的主要可執(zhí)行文件(exe)所在路徑已經(jīng)被添加到系統(tǒng)的環(huán)境變量PATH中脯燃。 對于python,R蒙保,pandoc辕棚,cygwin等,網(wǎng)上有很多安裝并配置環(huán)境變量的教程邓厕。仍不熟悉基本操作的可以先看看“延伸閱讀”的第一篇文章逝嚎。
在向init.el
寫入任何代碼之前,先打開emacs試用一下邑狸。鍵入M-x python
懈糯,如果沒報(bào)錯(cuò)的話涤妒,就成功進(jìn)入了python模式单雾。Emacs并不自帶python,那它是怎么知道去哪里調(diào)用python.exe
的呢?
參考Emacs: Set Environment Variables within Emacs
原來Emacs繼承了windows的環(huán)境變量PATH硅堆。輸入M-x getenv RET PATH
查看PATH[4]屿储。
實(shí)際上,當(dāng)你在emacs中運(yùn)行shell時(shí)[5]渐逃,各個(gè)指令的搜索路徑是PATH够掠。而當(dāng)emacs自身需要尋找某個(gè)可執(zhí)行文件時(shí),比如python茄菊,搜索路徑是exec-path
疯潭,而默認(rèn),在windows平臺下面殖,emacs會直接拷貝系統(tǒng)的環(huán)境變量竖哩。也就是所說,在init.el
中修改emacs的PATH副本并不會同時(shí)修改exec-path
脊僚。
當(dāng)我們安裝了一些只想同emacs結(jié)合使用的軟件時(shí)相叁,如果不想修改系統(tǒng)的環(huán)境變量,可以在init.el
中加入:
(setenv "PATH"
(concat
"C:/Program Files (x86)/Notepad++" ";"
(getenv "PATH")
)
)
這樣辽幌,你就可以在emacs中打開一個(gè)shell增淹,然后鍵入notepad++
來調(diào)用它了。注意乌企,這個(gè)修改并不會在exec-path
中追加相應(yīng)的路徑虑润。如果你希望emacs也能調(diào)用notepad++,還需要同步修改exec-path
逛犹,具體方法請參見原文端辱。
如果你像我一樣不想同步exec-path
,最簡單的方案就是把相關(guān)程序的安裝路徑添加到系統(tǒng)的環(huán)境變量中虽画。
延伸閱讀:
加載
對于任何軟件舞蔽,一個(gè)得心應(yīng)手的配置基本基本都要用到插件,比如Chrome码撰。
對于emacs渗柿,新安裝的插件經(jīng)常要你自己去啟動并配置。這是emacs上手難的重要原因之一脖岛《淦埽考慮一個(gè)最簡單的安裝流程,你從網(wǎng)上下載了某個(gè)**.el
文件柴梆,然后在init.el
中load
這個(gè)文件陨溅。是不是load
那一步顯得很別扭?而功能更強(qiáng)大的插件可能由更復(fù)雜的文件結(jié)構(gòu)組成绍在,需要你做更多的準(zhǔn)備工作才能正常使用门扇。這個(gè)時(shí)候雹有,一個(gè)插件管理系統(tǒng)就很必要了。24以上的版本都集成了一個(gè)插件管理器elpa
臼寄,可以方便的通過M-x list-packages
來安裝插件霸奕。不過別高興的太早,通過elpa
安裝的插件通常仍需要你手動來加載和配置吉拳。
注意质帅,是加載,而不是激活留攒∶撼停回憶下你是怎么使用Chrome的插件系統(tǒng):安裝插件,插件的圖標(biāo)出現(xiàn)在瀏覽器地址欄的右側(cè)炼邀,點(diǎn)擊插件的圖標(biāo)來使用插件(激活其功能)盟庞,有的插件甚至默認(rèn)激活。這個(gè)過程中汤善,所有加載和初始化配置的工作都由軟件自動完成什猖,你唯一需要做的就是選擇用不用(激活)而已。
然而红淡,elpa
要求你自己完成加載和配置的步驟不狮。一般來說,常見的載入命令有在旱,require
摇零,load
,autoload
等桶蝎。而所謂的配置就是初始化一些參數(shù)驻仅。
emacs一般稱“插件”為"package"或者"library"。本質(zhì)上登渣,它們都提供一堆定義好的函數(shù)噪服,來實(shí)現(xiàn)一些操作,進(jìn)而實(shí)現(xiàn)某個(gè)功能胜茧。這里多說幾句粘优。在emacs中,連移動光標(biāo)這種最底層的操作都有對應(yīng)的函數(shù)呻顽。比如雹顺,你在emacs中可以鍵入C-f
來將光標(biāo)向右移動一個(gè)字符,同時(shí)也可鍵入M-x forward-char
來實(shí)現(xiàn)廊遍。任何復(fù)雜的功能嬉愧,比如給文檔生成一個(gè)目錄,都可以被分解為一個(gè)個(gè)操作喉前,或者說調(diào)用一個(gè)個(gè)函數(shù)没酣,而這些函數(shù)順序執(zhí)行下來功能就得到了實(shí)現(xiàn)揽惹。
當(dāng)emacs想要加載某個(gè)插件時(shí),歸根到底需要定位并運(yùn)行一個(gè)(也許是一些)腳本文件四康,那個(gè)腳本里定義了實(shí)現(xiàn)插件功能所需的變量和函數(shù)。emacs將它們轉(zhuǎn)變?yōu)榭晒┳约菏褂玫膶ο螅╡lisp object)狭握,放到運(yùn)行環(huán)境中等待調(diào)用闪金。而腳本自身還可以在內(nèi)部進(jìn)一步加載其他腳本。下面论颅,來了解加載腳本的幾個(gè)語句哎垦,load
,require
恃疯,load-file
漏设,autoload
。
參考Emacs Lisp's Library System: What's require, load, load-file, autoload, feature?
-
load
一個(gè)位于硬盤上的文件今妄,意味著執(zhí)行這個(gè)文件里的所有elisp語句郑口,然后將執(zhí)行結(jié)果放進(jìn)emacs的運(yùn)行環(huán)境 - Feature可以理解為“特色功能”,比如盾鳞,你在蘋果的App Store里查看應(yīng)用程序簡介時(shí)犬性,一般都會看到一個(gè)以Features開頭的段落。單數(shù)形式腾仅,feature乒裆,一般對應(yīng)一個(gè)插件的名字,因?yàn)橐话悴寮拿种苯颖砻魉鼘?shí)現(xiàn)的功能推励。復(fù)數(shù)形式鹤耍,features,是一個(gè)用來存儲feature的列表验辞,這個(gè)列表可以告訴emacs哪些插件經(jīng)被加載了稿黄。一般情況下,一個(gè)插件的啟動腳本的結(jié)尾會調(diào)用
(provide '<symbol name>)
跌造,將'<symbol name>
加入到features中去抛猖。'<symbol name>
一般就是插件的名字 -
(require '<symbol name>)
會先查看features里面是否存在<symbol name>
。如果存在鼻听,語句執(zhí)行完畢财著。如果不存在,基于它來猜一個(gè)文件名撑碴,或者由require
的第二個(gè)參數(shù)直接指定文件名撑教,然后load
文件。注意醉拓,load
完成后伟姐,require
函數(shù)會再一次查看features列表中是否存在'<symbol name>
收苏,如果發(fā)現(xiàn)還是不存在,視參數(shù)<soft-flag>
來決定是否報(bào)錯(cuò) -
require
的意義在于避免重復(fù)加載愤兵。比如鹿霸,某個(gè)插件的啟動腳本中需要用到另一個(gè)插件提供的某個(gè)函數(shù)。那么它就會require
這個(gè)插件秆乳,保證插件已被載入懦鼠,然后再執(zhí)行后續(xù)語句。 -
load
會搜索load-path
屹堰,load-file
需要指定文件路徑肛冶,autoload
在一個(gè)函數(shù)被call后再load
指定文件
延伸閱讀 Required Feature
其實(shí),連整個(gè)emacs的啟動都可以概括為一句話:加載一系列腳本扯键。只不過這些腳本有的是內(nèi)置的(built in)睦袖,有的是你安裝的插件包含的,有的是你自己寫的荣刑。
配置emacs歸根結(jié)底是在配置各種各樣的腳本馅笙。
接下來,請思考如下問題厉亏。
你可以在init.el
就load
各種各樣的腳本延蟹,使得emacs在啟動時(shí)就把整個(gè)使用過程中可能用到的函數(shù)一次性準(zhǔn)備好。但這樣真的好么叶堆?
參考Autoload
-
autoload
告訴emacs某個(gè)地方有一個(gè)定義好的函數(shù)阱飘,并且告訴emacs,先別加載虱颗,只要記住在調(diào)用這個(gè)函數(shù)時(shí)去哪里尋找它的定義即可 - 這樣做的一個(gè)好處是沥匈,避免在啟動emacs時(shí)因?yàn)閳?zhí)行過多代碼而效率低下,比如啟動慢忘渔,卡系統(tǒng)等高帖。想象一下,如果你安裝了大量的有關(guān)python開發(fā)的插件畦粮,而某次打開emacs只是希望寫點(diǎn)日記散址,你肯定不希望這些插件在啟動時(shí)就被加載,讓你白白等上幾秒宣赔,也不希望這些插件在你做文本編輯時(shí)搶占系統(tǒng)資源(內(nèi)存预麸,CPU時(shí)間等)。所以儒将,一個(gè)合理的配置應(yīng)該是吏祸,當(dāng)你打開某個(gè)python腳本,或者手動進(jìn)入python的編輯模式時(shí)钩蚊,才加載那些插件
- 一個(gè)簡單概括:“只注冊函數(shù)名而不定義函數(shù)本身”
前面介紹了幾種加載機(jī)制贡翘。加載的目的在于定義變量和函數(shù)以供使用蹈矮。任何插件,只有先被加載才能被使用鸣驱。而且通常泛鸟,你都希望先加載一個(gè)插件,再來配置它踊东”崩模考慮如下情景。
你的插件中定義了一個(gè)變量a递胧,默認(rèn)值是1,插件內(nèi)定義的許多函數(shù)都在內(nèi)部使用了a赡茸。你希望在自己使用這些函數(shù)時(shí)缎脾,用到的a的值是2。有兩種實(shí)現(xiàn)途徑占卧。一種是直接到插件的腳本文件中修改a的值為2遗菠。這叫做"hard coding",有很多壞處华蜒。比如辙纬,每次更新插件袜茧,都要重新修改涉瘾。另一種方法是叠蝇,等這個(gè)插件已經(jīng)被加載后呆细,修改相應(yīng)的elisp object逗宁。那自然形葬,你得先讓這個(gè)對象存在于emacs中合蔽,然后才能修改料皇。所以要先加載啥辨,讓需要配置的變量得到定義涡匀,再去修改變量的值。
下面溉知,讓我們來看看這些腳本文件究竟長什么樣子陨瘩。打開emacs內(nèi)置插件的文件夾,emacs安裝路徑\share\emacs\24.4.91\lisp
级乍,你會看到一些子文件夾舌劳,一些后綴名為gz
的壓縮文件,以及一些后綴名為elc
的文件玫荣。壓縮文件中存放的其實(shí)是同名的.el
文件蒿囤,也就是前面一直在提的腳本。.elc
是這個(gè)腳本編譯好的版本崇决,可以加快載入速度材诽,不適合人類閱讀底挫。所以,如果你想查看一個(gè)插件的源代碼脸侥,請查看.el
文件建邓。.el
被放在壓縮包是為了避免源代碼被修改,進(jìn)而造成各種問題睁枕。另外官边,加載插件時(shí),總是會優(yōu)先加載編譯好的版本外遇,其默認(rèn)的文件擴(kuò)展名即.elc
注簿;如果不存在,才會加載.el
或者其他格式的文件跳仿。
延伸閱讀
Elpa
有了前面鋪墊的基礎(chǔ)概念后诡渴,讓我們來學(xué)習(xí)使用elpa。Elpa(Emacs package system)也是一個(gè)插件菲语,只不過它是管理插件的插件妄辩。在emacs24和更高的版本中,elpa是一個(gè)內(nèi)置插件山上,腳本文件package.el
位于emacs安裝路徑\share\emacs\24.4.91\lisp\emacs-lisp
眼耀。有些插件因?yàn)橛啥鄠€(gè)腳本構(gòu)成,會被放在一個(gè)單獨(dú)的文件夾中佩憾。初始化這個(gè)腳本的主腳本的文件名通常由插件名
加上.el
構(gòu)成哮伟。注意,如果你修改了一個(gè)腳本文件妄帘,并且同名.elc
存在澈吨,那么必須重新編譯該腳本才能使改動生效。
參考Emacs: How to Install Packages Using ELPA, MELPA, Marmalade
- 默認(rèn)的插件安裝路徑是
~/.emacs.d/elpa
- 默認(rèn)情況下寄摆,elpa的相關(guān)函數(shù)已經(jīng)在啟動emacs時(shí)注冊(回憶
autoload
)谅辣。直接鍵入M-x list-packages
即可調(diào)用 - 由于在啟動時(shí)只是注冊函數(shù)名,所以elpa的啟動腳本并未加載婶恼。如果你想在配置文檔中修改腳本中定義的變量桑阶,比如
package-archives
,請先(require 'package)
勾邦。該原則適用于其他插件的配置蚣录。也就是說,如果你想在init.el
中修改某個(gè)插件的某個(gè)變量的值眷篇,請保證emacs在執(zhí)行這條修改語句時(shí)萎河,相關(guān)變量已經(jīng)得到定義 - 一般用來初始化該插件的主腳本的文件名都是
插件名.el
為了保證你可以自行試驗(yàn)后文的操作,現(xiàn)在請你到init.el
中添加一段代碼:
(require 'package)
;;; Standard package repositories
;; We include the org repository for completeness, but don't normally
;; use it.
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
;;; Also use Melpa for most packages
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("melpa-stable" . "http://melpa-stable.milkbox.net/packages/"))
上述代碼給elpa添加了幾個(gè)額外的插件來源。不用理會其中的語法虐杯,反正在后面配置init.el
時(shí)我會提醒你刪掉這段代碼玛歌。
需要注意,elpa智能但不傻瓜擎椰。
參考 Emacs 24 Package System Problems
- 安裝一個(gè)插件后支子,elpa會自動在插件所在目錄下生成一個(gè)autoloads文件。這個(gè)文檔本意是方便你調(diào)用插件的达舒。比如值朋,你可以在
init.el
中加入(load 某某插件-autoloads)
來加載該插件 - 如果你希望用
require
的方式來加載插件,并且還希望require
這個(gè)autoloads文件巩搏,會出現(xiàn)一個(gè)問題昨登。autoloads的結(jié)尾并沒有(provide '某某插件-autoloads)
,所以require
一定會報(bào)錯(cuò)贯底。而且這樣做也沒什么意義丰辣。因?yàn)槟愕哪康脑谟趯⒉寮旧淼拿址诺絝eatures列表中,而不是“插件名-autoloads”丈甸。所以糯俗,請load
而不是require
autoloads文件 - 當(dāng)然尿褪,你也可以直接加載插件的主腳本睦擂,比如
(require 'auto-complete)
而不是(load 'auto-complete-autoloads)
。不過杖玲,這樣做有兩個(gè)壞處顿仇。第一,有些插件可能會指導(dǎo)elpa在生成autoloads文件時(shí)加入一些配置代碼摆马。在這種情形下臼闻,有可能你通過load
這個(gè)autoloads文件能成功初始化插件,而直接load
或者require
插件的主腳本則不能囤采。第二述呐,autoloads由autoload
函數(shù)構(gòu)成,autoload
的好處如前所述蕉毯,可以輕便化emacs的啟動
load-path
下面來談一個(gè)很重要的變量乓搬,load-path
,其變量類別是“列表”代虾,作用范圍是“全局變量”进肯。打開emacs,鍵入C-h v load-path RET
棉磨。如果你是在剛安裝完emacs后鍵入這個(gè)命令江掩,得到的返回值應(yīng)該類似這樣:
("c:/emacs/share/emacs/24.4.91/site-lisp" "c:/emacs/share/emacs/site-lisp"
此處省略若干行
中文部分是我自己加上的,告訴你我為了節(jié)省空間,刪掉了許多行环形。
每次使用elpa安裝插件后策泣,這個(gè)值都會發(fā)生改變。比如斟赚,在初次使用elpa安裝完ack插件后着降,
load-path
會變?yōu)椋?/p>
("~/.emacs.d/elpa/ack-1.3/" "c:/emacs/share/emacs/24.4.91/site-lisp" "c:/emacs/share/emacs/site-lisp"
此處省略若干行
請自行把~
腦補(bǔ)為HOME路徑。
通過對比拗军,不難發(fā)現(xiàn)任洞,emacs在啟動時(shí),會將user-emacs-directory/elpa
路徑下的的所有文件夾加入到load-path
的頭部发侵。由于elpa的默認(rèn)安裝路徑是~/.emacs.d/elpa
交掏,所以第一行會是~/.emacs.d/elpa/ack-1.3/
。你用elpa安裝的任何插件刃鳄,其所在路徑都會位于load-path
頭部盅弛。我想強(qiáng)調(diào),這個(gè)位置叔锐,非常重要挪鹏。
在emacs24及更高的版本中,emacs自帶了一個(gè)org插件愉烙,位于emacs安裝路徑\share\emacs\24.4.91\lisp\org
讨盒,這個(gè)插件后面會詳細(xì)講解。每次啟動emacs步责,這個(gè)路徑都會被添加到load-path
中返顺。在emacs中鍵入M-x org-mode
會調(diào)用org插件,讓編輯區(qū)域進(jìn)入org模式蔓肯。
org插件有很多相關(guān)插件遂鹊。假設(shè)現(xiàn)在,你想通過elpa安裝某個(gè)相關(guān)插件蔗包,比如秉扑,bog,執(zhí)行如下操作:
- 鍵入
M-x list-packages RET
调限,出現(xiàn)選擇編碼的提示舟陆,鍵入RET
- 定位bog:鍵入
C-s Extensions for research notes in Org mode
,然后鍵入C-s RET
- 在emacs窗口左側(cè)旧噪,點(diǎn)擊光標(biāo)所在行出現(xiàn)的小個(gè)左箭頭吨娜,然后點(diǎn)擊bog
你會在新出現(xiàn)的窗口看到語句Requires: org-8.0.0, dash-2.5.0
,表明該插件依賴額外的兩個(gè)插件org和dash淘钟。elpa會智能的安裝所有依賴插件宦赠。注意,盡管你的emacs自帶org,elpa還是會選擇安裝自己的插件源中的版本勾扭。所以毡琉,最后load-path
會變?yōu)椋?/p>
("c:/emacs/.emacs.d/elpa/bog-0.6.0/"
"c:/emacs/.emacs.d/elpa/dash-20150311.2355/"
"c:/emacs/.emacs.d/elpa/org-20150316/"
"c:/emacs/.emacs.d/lisp"
"c:/emacs/share/emacs/24.4.91/site-lisp"
此處省略若干行
"c:/emacs/share/emacs/24.4.91/lisp/org"
此處省略若干行
elpa安裝的org排在了emacs自帶org的前面。
load-path
如其名字所示妙色,告訴emacs在加載任何腳本時(shí)桅滋,如果沒有指明腳本所在路徑,那么就去load-path
所含的路徑中尋找身辨。然后使用第一個(gè)找到的腳本丐谋。也就是說,此后你調(diào)用org插件時(shí)煌珊,使用的都會是elpa安裝的版本号俐,即插件的一個(gè)版本'shadow'了另一個(gè)版本。
'shadow'現(xiàn)象很常見定庵。除了前面提到的'shadow'內(nèi)置插件吏饿,elpa安裝的插件的新版本會'shadow'舊版本。請記住一個(gè)非常有用的命令蔬浙,list-load-path-shadows
猪落,它可以總結(jié)所有插件當(dāng)前的'shadow'狀態(tài)。現(xiàn)在畴博,請你自己鍵入M-x list-load-path-shadows RET
笨忌,然后閱讀下返回的信息。
'shadow'之所以發(fā)生绎晃,是因?yàn)?code>load-path中包含了同一個(gè)插件多個(gè)版本的腳本路徑蜜唾,哪個(gè)版本排在前面就使用哪個(gè)杂曲。
總結(jié)下庶艾,在配置插件時(shí),請時(shí)常反問自己如下問題:
- 當(dāng)我想加載一個(gè)插件時(shí)擎勘,emacs知不知道它的所在路徑咱揍?
- 當(dāng)我想修改插件定義的某個(gè)參數(shù)時(shí),是否已經(jīng)加載了這個(gè)插件棚饵?
- 會不會某個(gè)已經(jīng)存在的版本煤裙,shadow了我想使用的版本?
最后噪漾,學(xué)習(xí)下修改load-path
的常用操作硼砰。
- 優(yōu)先關(guān)注
add-to-list
的語法。
延伸閱讀
牛刀小試
整套配置文件的思路參考Emacs配置文件——新手攻略欣硼。
雖說是新手攻略题翰,還是太簡潔了些。不過,請你大概閱讀一遍豹障,并將作者的配置文件下載到本地冯事,解壓,然后將emacs.d-master
文件夾下的文件所有文件拷貝到你的user-emacs-directory
血公。這會覆蓋你自己的init.el
昵仅,不要緊,當(dāng)然你為了保險(xiǎn)可以備份下累魔。下面用之前建立的專門用來調(diào)試配置文檔的快捷方式運(yùn)行emacs摔笤。emacs會按照init.el
的指導(dǎo)自動安裝并配置相關(guān)插件。但不知你的運(yùn)行結(jié)果怎樣垦写,我的會報(bào)錯(cuò)籍茧。
Required feature ... was not provided
Debugger entered--Lisp error: (error "Required feature `switch-window-autoloads' was not provided")
require(switch-window-autoloads)
eval-buffer(#<buffer *load*-432260> nil "c:/emacs/.emacs.d/lisp/editing-utils/init-switch-window.el" nil t)
有了前面鋪墊的基礎(chǔ),你應(yīng)該能很好理解錯(cuò)誤的原因:應(yīng)該load
一個(gè)autoloads文檔梯澜,而不是require
寞冯。定位到出錯(cuò)的文檔,把(require 'switch-window-autoloads)
修改為(load "switch-window-autoloads")
晚伙。注意吮龄,根據(jù)require
和load
的語法規(guī)則,我把switch-window-autoloads
從一個(gè)符號(Symbol)改成了一個(gè)字符串(String)咆疗。
順便檢查下同文件夾下的其他配置文檔漓帚,更正相同的錯(cuò)誤。關(guān)閉emacs再次運(yùn)行午磁。你會發(fā)現(xiàn)尝抖,后續(xù)還會在各種各樣的init文檔中出現(xiàn)同樣的錯(cuò)誤。請一一更正迅皇。
"Cannot open load file" ... "org-exp"
Debugger entered--Lisp error: (file-error "Cannot open load file" "no such file or directory" "org-exp-blocks")
require(org-exp)
(progn (require (quote org-exp)) (require (quote org-clock)) (require (quote org-fstree)))
(lambda nil (progn (require (quote org-exp)) (require (quote org-clock)) (require (quote org-fstree))))()
eval-after-load(org (lambda nil (progn (require (quote org-exp)) (require (quote org-clock)) (require (quote org-fstree)))))
eval-buffer(#<buffer *load*-5658> nil "c:/emacs/.emacs.d/lisp/init-org.el" nil t)
這里的quote
指單引號字符'
昧辽。請打開文檔定位出錯(cuò)語句。然后Google搜索"org-exp"登颓,發(fā)現(xiàn)只有org-exp-blocks搅荞,估計(jì)"org-exp"是作者自己寫的吧。請注釋或刪除(require 'org-exp)
框咙。
在讀過org-exp-blocks的幫助文檔后咕痛,你可能非常想加載這個(gè)插件。不過請注意喇嘱,文檔中提到:
make sure that the path to org's contrib directory is in your load-path and add the following to your .emacs.
什么是"contrib directory"茉贡?檢索下本地的org插件所在文件夾,無論是elpa版本者铜,還是內(nèi)置的腔丧,都沒有"contrib directory"构蹬。Google后發(fā)現(xiàn),這個(gè)目錄里包含了許多org用戶寫的插件悔据,因?yàn)椴皇莖rg官方開發(fā)者寫的庄敛,所以沒被包含在前面的兩個(gè)版本中。
到這里科汗,也許你會以為org-exp-blocks也在"contrib directory"中藻烤。恭喜你,上當(dāng)了头滔。
參考Org-mode Contributed Packages
- 請看"Moved to core"那一部分怖亭,很容易找到下面這句話
"Org-exp-blocks is now part of the Org core. Link to raw file." - 也就是說,現(xiàn)在不用手動調(diào)用org-exp-blocks了坤检。所以兴猩,你其實(shí)什么也不用做
- 不得不說,有點(diǎn)坑爹早歇。吃一塹長一智倾芝,請記住這個(gè)頁面,以后配置文件出現(xiàn)問題時(shí)箭跳,也許不是被'Moved to core'晨另,就是被'Obsolete'了
做完以上操作,再次啟動emacs谱姓,應(yīng)該能順利進(jìn)入歡迎界面了借尿。不過,要知道屉来,還是有很多未被'Moved to core'但非常有用的插件路翻,一般只包含在org官網(wǎng)提供的beta版本中。那應(yīng)該怎樣獲取呢茄靠?
Build Org
- 想獲得官方的beta版本茂契,需要用到工具Git。下載并安裝好嘹黔。
- 用桌面上出現(xiàn)的Git快捷方式打開Git账嚎,鍵入
pwd
莫瞬,記住當(dāng)前的工作路徑儡蔓。或者你也可以通過cd
命令來切換到你想要的工作路徑 - 記住當(dāng)前的工作路徑疼邀。鍵入
git clone git://orgmode.org/org-mode.git
喂江。等待beta版本的org被下載到本地。提示:也許在你的git中旁振,粘帖操作被綁定為鼠標(biāo)右鍵 - 將工作路徑下的org-mode文件夾重名為org-beta获询,拷貝到
user-emacs-directory
涨岁。重命名那步?jīng)]什么特別含義,只是為了區(qū)分吉嚣。如果你選擇拷貝到其他路徑梢薪,請自行調(diào)整后續(xù)命令 - 打開
init-org.el
,在第一行加入(add-to-list 'load-path (expand-file-name "org-beta\\lisp" user-emacs-directory))
尝哆,相信你不用查閱幫助文檔也能理解expand-file-name
的作用秉撇。這行代碼將org-beta的核心腳本所在路徑添加到load-path
,相當(dāng)于讓beta版本'shadow'其他版本 - 你還需要把org-beta目錄下下的
org-contrib\lisp
添加到load-path
秋泄,因?yàn)檫@個(gè)目錄即前面所說的"contrib directory"琐馆。在第一行下面額外添加代碼:(add-to-list 'load-path (expand-file-name "org-beta\\org-contrib\\lisp" user-emacs-directory))
- 到這步,你應(yīng)該可以正常使用emacs了恒序。不過瘦麸,為了真正的“安裝”org-beta,請繼續(xù)執(zhí)行下述操作
- 額外下載并安裝Cygwin歧胁。參考Cygwin詳解“Cygwin在線安裝指南”一節(jié)滋饲。一定要執(zhí)行“Cygwin中模塊的各種分類”一節(jié)提到的操作,即安裝Devel這個(gè)部分的模塊喊巍,因?yàn)橐玫狡渲械腶utomake模塊了赌。記得安裝完后配置環(huán)境變量
- 打開emacs,鍵入
M-x pwd
玄糟,返回路徑如果不是org-beta所在的那個(gè)勿她,就切換過去。具體操作阵翎,鍵入C-x d ~ RET .emacs.d/org-mode/ RET
- 切換后逢并,再次鍵入
M-x pwd
,確認(rèn)路徑正確郭卫。然后鍵入M-! make
砍聊。注意,Alt
和!
要一起按贰军,即同時(shí)鍵入Alt
玻蝌,Shift
和數(shù)字鍵1
。make命令源于Cygwin中的automake模塊词疼,它會把org-beta的所有核心腳本編譯好俯树,然后建立幫助文檔的索引 - 打開emacs,鍵入
M-x org-version RET
贰盗,返回信息中包含的路徑如果是org-beta许饿,即表明'shadow'成功 - 前面幾步的操作也適用于編譯其他插件
現(xiàn)在,請你執(zhí)行如下操作:
- 刪掉
user-emacs-directory
下的elpa
文件夾 - 重新運(yùn)行emacs舵盈,讓emacs在更正后的配置文檔的指導(dǎo)下重新初始化
你會發(fā)現(xiàn)陋率,居然又報(bào)錯(cuò)了球化!出錯(cuò)語句是配置文檔org-magit-autoloads
中的(eval-after-load "org" '(progn (org-add-link-type "magit" 'org-magit-open 'org-magit-export) (add-hook 'org-store-link-functions 'org-magit-store-link)))
。我想你已經(jīng)猜到了瓦糟,這一定跟使用beta版本的org有關(guān)筒愚。注釋掉init-org.el
中的頭兩行代碼,讓emacs使用elpa版本的org菩浙。然后打開emacs鍵入M-x list-packages
來強(qiáng)制刷新下插件列表锨能。最后再次刪掉elpa
文件夾并運(yùn)行emacs。如果以后你想使用beta版本芍耘,記得反注釋掉頭兩行代碼址遇。
一陣繁忙的下載后,emacs應(yīng)該能不報(bào)錯(cuò)的完成初始化斋竞。但是看看編譯記錄(complied log)倔约,發(fā)現(xiàn)有大量的warning信息。請把log保存下來坝初,以便以后分析浸剩。把光標(biāo)切換到complied log區(qū)域,鍵入C-x C-f
鳄袍,然后選擇合適的路徑和文件名绢要,鍵入RET
保存log。
后文中我會以init.log
來代指這個(gè)文件拗小。
恭喜重罪,現(xiàn)在你已經(jīng)擁有了一個(gè)功能非常強(qiáng)大的emacs了。趕快探索下吧哀九。
最后補(bǔ)充下我個(gè)人偏好的額外設(shè)置剿配。
init.el
關(guān)閉煩人的警示音。禁止啟動后的歡迎頁面阅束。
;; Turn off sound alarms completely
(setq ring-bell-function 'ignore)
;; disable welcome page
(setq inhibit-startup-message t)
在custom-set-variables
區(qū)域添加代碼呼胚,讓emacs啟動后自動全屏。請注意括號的匹配息裸。
(custom-set-variables
其他代碼
'(initial-frame-alist (quote ((fullscreen . maximized))))
)
當(dāng)你通過emacs的自定義系統(tǒng)(本篇最開始提到)修改emacs設(shè)置后蝇更,emacs自動將相關(guān)代碼添加到init.el
的custom-set-variables
區(qū)域。這里我們直接添加代碼來實(shí)現(xiàn)功能呼盆。
安裝Emacs Speaks Statistics: ESS年扩,使org模式下可以運(yùn)行R,SAS等(當(dāng)然宿亡,你要額外安裝這些統(tǒng)計(jì)軟件)
參考Installing ESS on your system
- 同編譯org-beta的步驟類似常遂。我把
ess-14.09
放到user-emacs-directory
,然后運(yùn)行emacs并切換工作路徑到ess-14.09
挽荠,最后make - 在
init.el
中添加
(add-to-list 'load-path (expand-file-name "ess-14.09" user-emacs-directory))
(load "ess-autoloads")
- 運(yùn)行emacs克胳,鍵入
M-x R
。如果能進(jìn)入R session圈匆,那么就是安裝成功 -
(load "ess-autoloads")
是最小配置漠另,如果你希望用到ess的全部功能,請加載ess-site.el
(注意load-path
)
init-org.el
開啟org模式下的代碼高亮跃赚;導(dǎo)出代碼塊時(shí)不運(yùn)行代碼笆搓;跳過運(yùn)行代碼塊時(shí)的確認(rèn)步驟(可能有安全風(fēng)險(xiǎn))。在注釋;; Various preferences
下方添加代碼
;; Various preferences
(setq
其他代碼
;; turn on the syntax highlight in the org mode
org-src-fontify-natively t
;; when exporting the org file, do not evaluate the code block if the exports header is both
org-export-babel-evaluate nil
;; skip the confirmation step when evaluate a code block
org-confirm-babel-evaluate nil)
導(dǎo)出PDF時(shí)代碼高亮使用minted纬傲,在上面的代碼塊下方添加
;; Include the latex-exporter
(require 'ox-latex)
;; Add minted to the defaults packages to include when exporting.
;; set snippet-flat to nil to exclude minted for latex preview
;; see http://orgmode.org/worg/org-tutorials/org-latex-preview.html
(add-to-list 'org-latex-packages-alist '("" "minted" nil))
;; Tell the latex export to use the minted package for source
;; code coloration.
(setq org-latex-listings 'minted)
;; Let the exporter use the -shell-escape option to let latex
;; execute external programs.
;; This obviously and can be dangerous to activate!
;; multiple compile in order to generate everything
(setq org-latex-pdf-process
'("xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
"bibtex %b"
"xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
"xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
參考Export org-mode code block and result with different styles
- 這段代碼要求你安裝了Latex和Python满败。推薦使用TeX Live和Anaconda。確保Latex安裝了minted插件叹括,Python安裝了Pygments插件算墨。另外請配置好環(huán)境變量
- Latex有時(shí)需要多次編譯才能正確導(dǎo)出所有元素。因此會出現(xiàn)三個(gè)
xelatex
語句 -
bibtex
命令可以生成.bbl
文件汁雷,這個(gè)文件用來生成參考文獻(xiàn)列表净嘀。放到中間是因?yàn)椋枰柚谝粋€(gè)xelatex
生成的.aux
文件侠讯,一個(gè)臨時(shí)輔助文件挖藏,來實(shí)現(xiàn)轉(zhuǎn)換。原理很簡單厢漩。文獻(xiàn)信息存儲在格式為bibtex的.bib
文件中膜眠。根據(jù)不同的文獻(xiàn)引用標(biāo)準(zhǔn)和具體的引用條目(由.aux
提供)鳞上,.bib
內(nèi)的信息在經(jīng)過篩選环戈、重組后被放入.bbl
文件,用來生成最終的文獻(xiàn)引用內(nèi)容 - 因?yàn)閙inted包依賴python莫矗,所以latex在編譯時(shí)需要調(diào)用外部程序python粱胜。latex覺得這種行為存在風(fēng)險(xiǎn)柄驻,默認(rèn)禁止。
-shell-escape
允許latex運(yùn)行"shell command"焙压,進(jìn)而允許調(diào)用python
另外鸿脓,如果你想在org模式下用RefTex來引用文獻(xiàn),有一個(gè)插件'ox-bibtex'涯曲,它可以在導(dǎo)出到Latex和HTML時(shí)自動生成參考文獻(xiàn)附錄野哭。'ox-bibtex'在org-contrib中。所以如果要啟用這個(gè)插件幻件,請配合啟用org-beta后再加載這個(gè)插件拨黔。
用這個(gè)插件導(dǎo)出Latex時(shí),如果你遵照前面的配置绰沥,應(yīng)該一切正常篱蝇。HTML導(dǎo)出功能需要用到bibtex2html贺待。許多人在使用這項(xiàng)功能時(shí)都會遇到錯(cuò)誤Executing bibtex2html failed
。參考
Emacs: unifying citations between html and latex in org-mode零截,問題在于不能使用臨時(shí)文件麸塞。這個(gè)問題最終也沒得到很好解決。下面我給出一個(gè)windows8.1+texlive 2014使用環(huán)境下的解決方案涧衙,不保證其他環(huán)境也適用哪工。
bibtex2html
其實(shí)方案很簡單,安裝最新版本的bibtex2html即可弧哎,目前是1.98雁比。這里只是給不熟悉Unix開發(fā)環(huán)境的同學(xué)們指個(gè)路。
- 先去下載最新的開發(fā)者版本bibtex2html-1.98.tar.gz撤嫩,解壓到本地文件夾中偎捎,比如
bibtexdir
- 運(yùn)行cygwin,
cd
到bibtexdir
- 鍵入
./configure
非洲,等待程序運(yùn)行完畢 - 鍵入
make
鸭限,等待程序運(yùn)行完畢 - 如果你希望cygwin能在內(nèi)部調(diào)用bibtex2html,再鍵入
make install
两踏,這會把bibtex2html安裝到cygwin64所在路徑\usr\local\bin
- 現(xiàn)在败京,
bibtexdir
目錄下會出現(xiàn)'bib2bib.exe','bibtex2html.exe' 梦染,'aux2bib' - 將三個(gè)文件拷貝到系統(tǒng)環(huán)境變量PATH中的某個(gè)路徑赡麦,確保你在cmd中鍵入
bibtex2html
可以調(diào)用相關(guān).exe
文件 - 大功告成
init-auctex.el
使用Sumatra PDF(請下載并安裝)來預(yù)覽PDF。最大的好處是帕识,可以從PDF逆向定位TEX泛粹。即你編譯完.tex
文檔并調(diào)用Sumatra PDF預(yù)覽時(shí),在PDF中雙擊某個(gè)位置肮疗,emacs會自動打開對應(yīng)的.tex
文件并定位過去晶姊。
參考Sync Emacs AUCTeX with Sumatra PDF,在(load "auctex-autoloads")
下面添加
;; run latex compiler with option -shell-escape
(setq LaTeX-command-style '(("" "%(PDF)%(latex) -shell-escape %S%(PDFout)")))
;; use Sumatra PDF to preview pdf
(setq TeX-source-correlate-mode t)
(setq TeX-source-correlate-method 'synctex)
(setq TeX-view-program-list
'(("Sumatra PDF" ("\"Sumatra安裝路徑/SumatraPDF.exe\" -reuse-instance"
(mode-io-correlate " -forward-search %b %n ") " %o"))))
請將Sumatra安裝路徑替換為你自己的安裝路徑伪货。并打開Sumatra的option界面们衙,按照參考文章的回答設(shè)置Set inverse search command line
。
其他配置
參考 Moving The Ctrl Key碱呼,綁定ctrl
到capslock
我采用AutoHotkey的方式蒙挑,并且將腳本放到startup文件夾來實(shí)現(xiàn)開機(jī)自啟。我的電腦上愚臀,startup的路徑:
C:\Users\xiaohang\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
延伸閱讀 windows下自定義配置的說明
初入江湖
經(jīng)過以上配置忆蚀,你的emacs應(yīng)該已經(jīng)比較好用了。不過在emacs世界里,此時(shí)的你還只是個(gè)初入江湖的小蝦米馋袜。在相當(dāng)?shù)囊欢螘r(shí)間內(nèi)男旗,你會糾結(jié)于emacs復(fù)雜的按鍵組合,為千方百計(jì)也不能安裝好一個(gè)小插件而抓狂桃焕。我想說剑肯,這都是正撑趺現(xiàn)象观堂。在這些痛苦中,你慢慢成長呀忧,從讀官方文檔開始师痕,一點(diǎn)點(diǎn)熟悉elisp,開始欣賞emacs的設(shè)計(jì)而账,甚至能自己寫一個(gè)小插件胰坟。于是,你使用emacs越來越順手泞辐,越來越想打造一個(gè)獨(dú)屬于自己的配置笔横,最大化你在各個(gè)場景下的使用效率。
而我的教程到這里也要告一段落了咐吼。我已經(jīng)把自己所知悉數(shù)傳授給了你吹缔,從這里開始,我們處在同一個(gè)起跑線上锯茄。但我想厢塘,這套教程并不會結(jié)束,因?yàn)槲疫€有很多承諾沒同你兌現(xiàn)呢肌幽,比如分析init.log
晚碾,比如講解org模式。不過喂急,相信你經(jīng)過前面的學(xué)習(xí)格嘁,已經(jīng)能靠依靠自己探索emacs中的大部分事物了。而我廊移,也會逐漸積累自己的使用心得糕簿。
我計(jì)劃如下呈現(xiàn)后續(xù)的教程:圍繞一個(gè)具體的使用情景,我會向你描述我的插件選擇画机,配置和操作習(xí)慣冶伞。
最后,如果你覺得這篇文章不錯(cuò)步氏,請點(diǎn)擊下方的喜歡按鈕响禽,謝謝支持!
好了,朋友們芋类,下期再見~