從零開始——Emacs 安裝配置使用教程 2015

教程存檔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è)人推薦

下面這兩個(gè)版本可以省去大部分配置的麻煩事回还。不過多勞多得裆泳,請自行選擇

更多版本

基本操作

打開emacs,同時(shí)按下Ctrlh柠硕,然后鍵入t工禾,閱讀新手教程,熟悉界面蝗柔,基本術(shù)語和操作闻葵。
請不要跳過這一步!(但不要求熟練掌握)
本文后面的部分已經(jīng)假定你閱讀了這個(gè)教程癣丧,所以默認(rèn)遵循emacs的術(shù)語規(guī)范槽畔。

C代表Ctrl鍵。M代表Alt鍵胁编。RET代表Enter鍵(回車鍵)厢钧。C-x代表同時(shí)按下Ctrlx鳞尔。C-x d RET代表先同時(shí)按下Ctrlx,再按下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+qShift+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ī)則

  1. 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
  1. 通常,emacs會優(yōu)先加載.emacs糕篇,如果找不到啄育,并且存在文件夾.emacs.d,會嘗試加載其中的init.el

  2. 基于前面的介紹拌消,一個(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下的版本迫筑,是我們要配置的版本

延伸閱讀:

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.elload這個(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摇零,loadautoload等桶蝎。而所謂的配置就是初始化一些參數(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è)語句哎垦,loadrequire恃疯,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.elload各種各樣的腳本延蟹,使得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而不是requireautoloads文件
  • 當(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的常用操作硼砰。

參考Modifying List Variables

  • 優(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ù)requireload的語法規(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

參考Org官網(wǎng)

  • 想獲得官方的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.elcustom-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 LiveAnaconda。確保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è)路。

參考Github上的說明文檔

  • 先去下載最新的開發(fā)者版本bibtex2html-1.98.tar.gz撤嫩,解壓到本地文件夾中偎捎,比如bibtexdir
  • 運(yùn)行cygwin,cdbibtexdir
  • 鍵入./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碱呼,綁定ctrlcapslock

我采用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)擊下方的喜歡按鈕响禽,謝謝支持!

好了,朋友們芋类,下期再見~


  1. R-markdown, iPython-notebook ?

  2. 選項(xiàng)nw代表"no window" ?

  3. 你也可以使用powershell支持的cd ~來直接切換到主目錄隆嗅,從而得知主路徑的位置…… ?

  4. 這些命令也可以:M-: (getenv "PATH"),C-h v initial-environment ?

  5. M-x shell來激活一個(gè)shell。你可以把它簡單理解為一個(gè)運(yùn)行在emacs里面的cmd侯繁。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胖喳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贮竟,更是在濱河造成了極大的恐慌丽焊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咕别,死亡現(xiàn)場離奇詭異技健,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惰拱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門雌贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偿短,你說我怎么就攤上這事欣孤。” “怎么了昔逗?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵降传,是天一觀的道長。 經(jīng)常有香客問我纤子,道長搬瑰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任控硼,我火速辦了婚禮泽论,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卡乾。我一直安慰自己翼悴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布幔妨。 她就那樣靜靜地躺著鹦赎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误堡。 梳的紋絲不亂的頭發(fā)上古话,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音锁施,去河邊找鬼陪踩。 笑死杖们,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肩狂。 我是一名探鬼主播摘完,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傻谁!你這毒婦竟也來了孝治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤审磁,失蹤者是張志新(化名)和其女友劉穎谈飒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力图,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步绸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年掺逼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吃媒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕喘,死狀恐怖赘那,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氯质,我是刑警寧澤募舟,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站闻察,受9級特大地震影響拱礁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕漂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一呢灶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钉嘹,春花似錦鸯乃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陈辱,卻和暖如春奖年,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沛贪。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工陋守, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍堰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓嗅义,卻偏偏與公主長得像屏歹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子之碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容