日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Emacs 安装配置使用教程

發(fā)布時間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Emacs 安装配置使用教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Emacs 安裝配置使用教程

來源?https://www.jianshu.com/u/a27b97f900f7

?

序|Preface

先來一篇有趣的簡介:Emacs和Vim:神的編輯器和編輯器之神 - 51CTO.COM

為何寫這篇教程?

作為一個徹頭徹尾的emacs新手,盡管有些薄弱的編程經(jīng)驗,但上手這么一個黑客級別的編輯器還是難免一段陣痛期。雖然網(wǎng)上有很多非常好的教程,比如這篇著名的文章,一年成為Emacs高手(像神一樣使用編輯器),雖然提供了一個很好的學習框架,但具體的學習內(nèi)容還是需要你自己尋找。這篇教程,在某種意義上可以被視為按照那個學習框架進行的學習實踐。

在實踐過程中,我發(fā)現(xiàn)相關基礎知識的優(yōu)秀教程散布在互聯(lián)網(wǎng)的各個角落,缺乏一個有條理的組織,更別提有些排名靠前的教程早已過時,里面提到的操作和方法已經(jīng)不適用于最新版的emacs。

雖然emacs可以作為一個簡單的文本編輯器開箱即用,但陡峭的學習曲線主要體現(xiàn)在讓它發(fā)揮最大功效的個性化定制之中。這篇教程整理了我在配置emacs過程中學到的知識,方便新手循序漸進的學習。建議你將它作為一個有內(nèi)在結構的課程來對待。整個教程大約會花掉你18個小時。

誰該閱讀這篇教程?

我學習emacs的初衷是為了做日程管理,記筆記,并且寫研究論文。我的學習和研究經(jīng)常涉及到各種編程語言,特別是各種統(tǒng)計軟件,比如R,SAS,Stata,Matlab等,當然還有Python。雖然R和Python都支持“文學編程”模式[1],但如果想將多種語言整合進一個文檔的話,emacs的org-babel模式無疑是第一選擇。而既然是想寫研究論文,對于Latex的支持必不可少。所以,我配置的emacs會以方便“文學編程”,多格式導出(主要是Latex和html)以及各種文檔模板為重點,主要圍繞emacs的兩個插件org和auctex來展開,可能還會涉及到知識整理,以及同Evernote互動的內(nèi)容。另外,許多配置步驟在Unix系統(tǒng)下會方便很多,但很不幸,我使用的是windows。

所以,如果你是emacs小白,但有一點編程經(jīng)驗,有同我類似的需求,并且也使用windows,那么這篇文章就是為你量身定制的。歡迎閱讀!

為什么不直接使用高手寫好的配置?

這個教程本身就借鑒了許多高手的配置。我堅信“授人以魚不如授人以漁”的格言。我相信我對你最大的幫助是這篇教程本身,而不是那些配置文檔。希望作為新手的你,在閱讀完這篇教程后,能獲得足夠的信心和動力來打造一個獨屬于你的emacs。

如何學習這篇教程?

請注意我使用了“學習”而不是“閱讀”。這意味著你需要自己動手,實踐那些優(yōu)秀教程提到的操作。自己寫一些代碼,而不是單純的復制粘帖。

凡是附在“參考”后的文章,盡管大部分是英語文章,都請你仔細閱讀。當然,你可以先瀏覽我寫在后面的筆記和總結,來獲得一個初步理解。你甚至可以只閱讀我的總結來基本理解我要談的事情,這看上去會節(jié)省你大量的時間,但其實你在不知不覺中錯過了很多我沒提及但對你很重要的細節(jié)。No pain, no gain...如果你堅持不讀參考文章,請至少記得它們的標題。等你遇到問題時,至少知道該用什么樣的關鍵詞來搜索答案。

附在“延伸閱讀”后的文章都很有價值,有助于你深入理解前文提到的概念。加了“必讀”標簽的請優(yōu)先閱讀。標簽"TD"代表文章中出現(xiàn)了很多我還沒提及的技術細節(jié)(Technique details),需要更多的背景知識。所以,如果你在閱讀中感到困惑,可以先跳過,等學習完整個教程后再來閱讀。因此,TD還有一層TODO的意味……

在閱讀我給出的文章時,你可能希望完成一個“知識閉環(huán)”后再回來繼續(xù)學習。所謂“知識閉環(huán)”,就是持續(xù)了解閱讀過程中遇到的新概念,直到不再遇到新的概念為止。顯然,這會耗費大量的精力,而且你的疑問通常會在后續(xù)的教程中得到解決。我在撰寫這個教程時,并沒假定你完成了“知識閉環(huán)”后再繼續(xù)學習,所以,建議你只對最大的疑惑做擴展閱讀,比如選擇性的瀏覽文章中包含的超鏈接。

下載安裝|Download and Installation

官網(wǎng):http://ftp.gnu.org/gnu/emacs/windows/

打開網(wǎng)頁后,頂部是一段關于如何安裝的說明文檔。

總結:

  • 不需要安裝,解壓縮到某個路徑就可以了
  • 為了方便全局調(diào)用,請?zhí)砑觔in路徑到環(huán)境變量(比如我的,C:\emacs\bin)。你可能需要先了解下環(huán)境變量和命令行的基本知識。搜索關鍵詞“windows環(huán)境變量PATH”,“啟動cmd”
  • 測試下,在cmd里,輸入emacs -nw[2],以終端模式來運行emacs;只輸入emacs,以GUI模式來運行
  • 文檔介紹了bin目錄下各個exe文件的功能,也介紹了怎樣完全卸載,直接刪除就好
  • 解壓縮完成后,可以運行bin\addpm.exe,這樣會自動生成配置文件.emac和目錄.emacs.d,并且在啟動菜單里添加應用程序快捷方式。另外,官方文檔里說還會添加注冊表的相關條目。不過在我的電腦上,注冊表并未新增相應條目
  • 可以在桌面上新建一個快捷方式(shortcut),位置(location)填入emacs的安裝路徑\bin\runemacs.exe --debug-init。加了flag --debug-init,是為了方便調(diào)試(debug)配置文件。不推薦為emacs.exe建立快捷方式,因為會額外啟動一個命令行窗口。

請選擇24以上的版本

延伸閱讀: FAQ 3.2

其他版本

個人推薦

  • 64 bit version
    http://sourceforge.net/projects/emacsbinw64/
    本人使用的版本,后面的配置都是基于這個版本
    版本號:24.4.91

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

  • 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,同時按下Ctrl和h,然后鍵入t,閱讀新手教程,熟悉界面,基本術語和操作。
請不要跳過這一步!(但不要求熟練掌握)
本文后面的部分已經(jīng)假定你閱讀了這個教程,所以默認遵循emacs的術語規(guī)范。

C代表Ctrl鍵。M代表Alt鍵。RET代表Enter鍵(回車鍵)。C-x代表同時按下Ctrl和x。C-x d RET代表先同時按下Ctrl和x,再按下d,最后再按下RET。我在后文的按鍵描述中,會經(jīng)常省略最后一步的回車操作。另外,請留意描述所用的英文字母的大小寫。

Emacs里的大部分地方都支持自動補全,快捷鍵是TAB。

配置篇|Configuration

編程基礎

你可能會奇怪,為什么配置emacs還需要編程?一般配置一個程序,不都是通過菜單欄打開一個對話框,然后修改里面提供的選項么?在emacs里,的確有這么一套配置系統(tǒng),詳見Emacs's Customization Tutorial。但個人不推薦使用。因為,第一,里面提供的選項并不完全,許多配置只能通過編程才能做到;第二,它也是通過在你的配置文件中加入一些代碼來實現(xiàn)的。

配置emacs的所有代碼構成了一個配置文檔。Emacs的配置文檔是用elisp語言寫的。elisp是lisp的一種方言。至于lisp語言,有人說它是黑客的語言。不過你并不需要完全理解elisp才能配置emacs。至少我對elisp談不上熟練。不過我倒是看過一些lisp語言的入門教程,所以能夠看得懂elisp的官方幫助文檔。你可以參考Learn X in Y minutes來快速入個門。由于elisp的函數(shù)命名規(guī)則大部分都很直觀,所以只要了解了基本語法,大部分配置語句對你來說都會變得很直白。下面列出幾個配置文檔時的常用函數(shù),只是讓你熟悉下elisp的語法。更多的函數(shù)會在用到時講解。

參考set

  • 變量賦值。比如(set 'a 5)相當于a=5

參考setq

  • 這個其實就是為了偷懶,在一次執(zhí)行多個賦值操作時少打幾個'

參考let

  • let的意義在于批量執(zhí)行函數(shù)時定義共享參數(shù)。考慮下面這個使用情景,你希望連續(xù)調(diào)用函數(shù)A,B,C,它們都接受一個字符串參數(shù)s,s代表某個路徑。A負責打印字符串s,并提示接下來要利用s做什么事情;B負責切換到s指定的位置然后執(zhí)行一些操作;C負責將s加入到某個全局列表中。你當然可以不用let,在調(diào)用函數(shù)前加上一句(set 's 一個字符串)即可。但這時定義的s會成為全局變量,進而污染你的變量空間。

HOME

參考The Emacs Initialization File

  • Emacs配置文檔常見的文件名有兩個,.emacs, init.el,雖然本質上它們都是elisp腳本(像python腳本那樣)。
  • 你可以用任何文本編輯器來編輯他們。個人推薦使用Notepad++,支持語法高亮,列編輯。Notepad++可以很方便的進行區(qū)域注釋(Ctrl+q,Shift+Ctrl+q),這對調(diào)試配置文檔很重要。當然,在你熟悉emacs后,emacs也許會成為你的唯一編輯器
  • 當你在使用Notepad++編寫自己的配置文檔時,可能經(jīng)常需要執(zhí)行注釋或者反注釋某段代碼的操作。注釋時請用Shift+Ctrl+q,反注釋時請用Ctrl+q。前者會保證在每一行代碼前都加一個;,后者則是,如果本行代碼以;開頭,就刪掉一個;,如果不以;開頭,則添加一個;。容易理解,當代碼塊中包含注釋時,你肯定不希望在注釋掉代碼的同時反注釋掉那些注釋。

接下來,讓我們先來了解emacs在哪里尋找配置文檔,以及會具體選擇哪種格式。

參考How Emacs Finds Your Init File,了解emacs啟動時配置文件的加載規(guī)則

  • Emacs會在系統(tǒng)中尋找一個名為HOME的變量,然后拷貝一個副本供自己使用,并在其指定的路徑下尋找配置文件
    • 各個平臺的默認HOME路徑請參考
      HOME and Startup Directories on MS-Windows
    • windows平臺,在cmd使用echo %userprofile%來查看HOME[3]
    • The MS-Windows System Registry介紹了emacs尋找默認參數(shù)的路徑的先后順序
      • 注意,環(huán)境變量是第一位的,如果沒有才會在注冊表中尋找。也就是說,如果環(huán)境變量和注冊表都包含HOME的話,emacs會拷貝前者作為自己的副本。這通常不是一個好消息。一方面,你希望盡量按照自己的意愿來設置emacs的HOME變量;另一方面,你可能已經(jīng)為別的應用程序創(chuàng)建了系統(tǒng)級別的HOME,以至于不得不把emacs的配置文件也放在那里
      • 個人認為,一個更合理的加載邏輯應該是,順序檢測一系列路徑,后面檢測到的值覆蓋前面的。這樣你就可以通過創(chuàng)建注冊表的方式來避免與系統(tǒng)環(huán)境變量的沖突
      • 對于windows 7/8/8.1,如果你的環(huán)境變量和注冊表里都沒有HOME,emacs會把%userprofile%的值設置為HOME,一般是
        C:\Users\your-user-name\AppData\Roaming
  • 通常,emacs會優(yōu)先加載.emacs,如果找不到,并且存在文件夾.emacs.d,會嘗試加載其中的init.el

  • 基于前面的介紹,一個比較好的安裝配置方案如下:

    • 將emacs的壓縮包解壓到某個路徑

    • 運行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)重新設定HOME,所以這行代碼相當于調(diào)用C:/emacs/.emacs.d/下的init.el。關于load命令,后面有詳細解釋
    • 順便刪掉前面幾步中你見到的任何.emacs文件,保證emacs利用init.el啟動

    這樣做的好處是,除了可以自定義.emacs.d所在的路徑,還可以方便的備份整個文件夾,因為插件通常會被安裝到這個文件夾下。如果需要換到其他電腦甚至平臺時,只需要把整個文件夾復制過去,然后類似于上述步驟那樣,想辦法讓真正的init.el發(fā)揮作用即可。
    使用init.el而不是.emacs來配置,可以保證配置文件的結構化和模塊化,方便維護。

    最后規(guī)定后文要經(jīng)常用到的幾個代指

    • ~代指重定義后的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

    從這個章節(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,如果沒報錯的話,就成功進入了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]

    實際上,當你在emacs中運行shell時[5],各個指令的搜索路徑是PATH。而當emacs自身需要尋找某個可執(zhí)行文件時,比如python,搜索路徑是exec-path,而默認,在windows平臺下,emacs會直接拷貝系統(tǒng)的環(huán)境變量。也就是所說,在init.el中修改emacs的PATH副本并不會同時修改exec-path。

    當我們安裝了一些只想同emacs結合使用的軟件時,如果不想修改系統(tǒng)的環(huán)境變量,可以在init.el中加入:

    (setenv "PATH"(concat"C:/Program Files (x86)/Notepad++" ";" (getenv "PATH") ) )

    這樣,你就可以在emacs中打開一個shell,然后鍵入notepad++來調(diào)用它了。注意,這個修改并不會在exec-path中追加相應的路徑。如果你希望emacs也能調(diào)用notepad++,還需要同步修改exec-path,具體方法請參見原文。

    如果你像我一樣不想同步exec-path,最簡單的方案就是把相關程序的安裝路徑添加到系統(tǒng)的環(huán)境變量中

    延伸閱讀:

    • Windows Environment Variables Tutorial 必讀
    • Environment Variables

    加載

    對于任何軟件,一個得心應手的配置基本基本都要用到插件,比如Chrome。

    對于emacs,新安裝的插件經(jīng)常要你自己去啟動并配置。這是emacs上手難的重要原因之一。考慮一個最簡單的安裝流程,你從網(wǎng)上下載了某個**.el文件,然后在init.el中l(wèi)oad這個文件。是不是load那一步顯得很別扭?而功能更強大的插件可能由更復雜的文件結構組成,需要你做更多的準備工作才能正常使用。這個時候,一個插件管理系統(tǒng)就很必要了。24以上的版本都集成了一個插件管理器elpa,可以方便的通過M-x list-packages來安裝插件。不過別高興的太早,通過elpa安裝的插件通常仍需要你手動來加載和配置。

    注意,是加載,而不是激活。回憶下你是怎么使用Chrome的插件系統(tǒng):安裝插件,插件的圖標出現(xiàn)在瀏覽器地址欄的右側,點擊插件的圖標來使用插件(激活其功能),有的插件甚至默認激活。這個過程中,所有加載和初始化配置的工作都由軟件自動完成,你唯一需要做的就是選擇用不用(激活)而已。

    然而,elpa要求你自己完成加載和配置的步驟。一般來說,常見的載入命令有,require,load,autoload等。而所謂的配置就是初始化一些參數(shù)。

    emacs一般稱“插件”為"package"或者"library"。本質上,它們都提供一堆定義好的函數(shù),來實現(xiàn)一些操作,進而實現(xiàn)某個功能。這里多說幾句。在emacs中,連移動光標這種最底層的操作都有對應的函數(shù)。比如,你在emacs中可以鍵入C-f來將光標向右移動一個字符,同時也可鍵入M-x forward-char來實現(xiàn)。任何復雜的功能,比如給文檔生成一個目錄,都可以被分解為一個個操作,或者說調(diào)用一個個函數(shù),而這些函數(shù)順序執(zhí)行下來功能就得到了實現(xiàn)。

    當emacs想要加載某個插件時,歸根到底需要定位并運行一個(也許是一些)腳本文件,那個腳本里定義了實現(xiàn)插件功能所需的變量和函數(shù)。emacs將它們轉變?yōu)榭晒┳约菏褂玫膶ο?#xff08;elisp object),放到運行環(huán)境中等待調(diào)用。而腳本自身還可以在內(nèi)部進一步加載其他腳本。下面,來了解加載腳本的幾個語句,load,require,load-file,autoload。

    參考Emacs Lisp's Library System: What's require, load, load-file, autoload, feature?

    • load一個位于硬盤上的文件,意味著執(zhí)行這個文件里的所有elisp語句,然后將執(zhí)行結果放進emacs的運行環(huán)境
    • Feature可以理解為“特色功能”,比如,你在蘋果的App Store里查看應用程序簡介時,一般都會看到一個以Features開頭的段落。單數(shù)形式,feature,一般對應一個插件的名字,因為一般插件的名字直接表明它實現(xiàn)的功能。復數(shù)形式,features,是一個用來存儲feature的列表,這個列表可以告訴emacs哪些插件經(jīng)被加載了。一般情況下,一個插件的啟動腳本的結尾會調(diào)用(provide '<symbol name>),將'<symbol name>加入到features中去。'<symbol name>一般就是插件的名字
    • (require '<symbol name>)會先查看features里面是否存在<symbol name>。如果存在,語句執(zhí)行完畢。如果不存在,基于它來猜一個文件名,或者由require的第二個參數(shù)直接指定文件名,然后load文件。注意,load完成后,require函數(shù)會再一次查看features列表中是否存在'<symbol name>,如果發(fā)現(xiàn)還是不存在,視參數(shù)<soft-flag>來決定是否報錯
    • require的意義在于避免重復加載。比如,某個插件的啟動腳本中需要用到另一個插件提供的某個函數(shù)。那么它就會require這個插件,保證插件已被載入,然后再執(zhí)行后續(xù)語句。
    • load會搜索load-path,load-file需要指定文件路徑,autoload在一個函數(shù)被call后再load指定文件

    延伸閱讀 Required Feature

    其實,連整個emacs的啟動都可以概括為一句話:加載一系列腳本。只不過這些腳本有的是內(nèi)置的(built in),有的是你安裝的插件包含的,有的是你自己寫的。

    配置emacs歸根結底是在配置各種各樣的腳本。

    接下來,請思考如下問題。
    你可以在init.el就load各種各樣的腳本,使得emacs在啟動時就把整個使用過程中可能用到的函數(shù)一次性準備好。但這樣真的好么?

    參考Autoload

    • autoload告訴emacs某個地方有一個定義好的函數(shù),并且告訴emacs,先別加載,只要記住在調(diào)用這個函數(shù)時去哪里尋找它的定義即可
    • 這樣做的一個好處是,避免在啟動emacs時因為執(zhí)行過多代碼而效率低下,比如啟動慢,卡系統(tǒng)等。想象一下,如果你安裝了大量的有關python開發(fā)的插件,而某次打開emacs只是希望寫點日記,你肯定不希望這些插件在啟動時就被加載,讓你白白等上幾秒,也不希望這些插件在你做文本編輯時搶占系統(tǒng)資源(內(nèi)存,CPU時間等)。所以,一個合理的配置應該是,當你打開某個python腳本,或者手動進入python的編輯模式時,才加載那些插件
    • 一個簡單概括:“只注冊函數(shù)名而不定義函數(shù)本身”

    前面介紹了幾種加載機制。加載的目的在于定義變量和函數(shù)以供使用。任何插件,只有先被加載才能被使用。而且通常,你都希望先加載一個插件,再來配置它。考慮如下情景。

    你的插件中定義了一個變量a,默認值是1,插件內(nèi)定義的許多函數(shù)都在內(nèi)部使用了a。你希望在自己使用這些函數(shù)時,用到的a的值是2。有兩種實現(xiàn)途徑。一種是直接到插件的腳本文件中修改a的值為2。這叫做"hard coding",有很多壞處。比如,每次更新插件,都要重新修改。另一種方法是,等這個插件已經(jīng)被加載后,修改相應的elisp object。那自然,你得先讓這個對象存在于emacs中,然后才能修改。所以要先加載,讓需要配置的變量得到定義,再去修改變量的值。

    下面,讓我們來看看這些腳本文件究竟長什么樣子。打開emacs內(nèi)置插件的文件夾,emacs安裝路徑\share\emacs\24.4.91\lisp,你會看到一些子文件夾,一些后綴名為gz的壓縮文件,以及一些后綴名為elc的文件。壓縮文件中存放的其實是同名的.el文件,也就是前面一直在提的腳本。.elc是這個腳本編譯好的版本,可以加快載入速度,不適合人類閱讀。所以,如果你想查看一個插件的源代碼,請查看.el文件。.el被放在壓縮包是為了避免源代碼被修改,進而造成各種問題。另外,加載插件時,總是會優(yōu)先加載編譯好的版本,其默認的文件擴展名即.elc;如果不存在,才會加載.el或者其他格式的文件。

    延伸閱讀

    • Features TD
    • How Programs Do Loading TD
    • Libraries of Lisp Code for Emacs TD
    • Byte Compilation TD

    Elpa

    有了前面鋪墊的基礎概念后,讓我們來學習使用elpa。Elpa(Emacs package system)也是一個插件,只不過它是管理插件的插件。在emacs24和更高的版本中,elpa是一個內(nèi)置插件,腳本文件package.el位于emacs安裝路徑\share\emacs\24.4.91\lisp\emacs-lisp。有些插件因為由多個腳本構成,會被放在一個單獨的文件夾中。初始化這個腳本的主腳本的文件名通常由插件名加上.el構成。注意,如果你修改了一個腳本文件,并且同名.elc存在,那么必須重新編譯該腳本才能使改動生效。

    參考Emacs: How to Install Packages Using ELPA, MELPA, Marmalade

    • 默認的插件安裝路徑是~/.emacs.d/elpa
    • 默認情況下,elpa的相關函數(shù)已經(jīng)在啟動emacs時注冊(回憶autoload)。直接鍵入M-x list-packages即可調(diào)用
    • 由于在啟動時只是注冊函數(shù)名,所以elpa的啟動腳本并未加載。如果你想在配置文檔中修改腳本中定義的變量,比如package-archives,請先(require 'package)。該原則適用于其他插件的配置。也就是說,如果你想在init.el中修改某個插件的某個變量的值,請保證emacs在執(zhí)行這條修改語句時,相關變量已經(jīng)得到定義
    • 一般用來初始化該插件的主腳本的文件名都是插件名.el

    為了保證你可以自行試驗后文的操作,現(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添加了幾個額外的插件來源。不用理會其中的語法,反正在后面配置init.el時我會提醒你刪掉這段代碼。

    需要注意,elpa智能但不傻瓜。

    參考 Emacs 24 Package System Problems

    • 安裝一個插件后,elpa會自動在插件所在目錄下生成一個autoloads文件。這個文檔本意是方便你調(diào)用插件的。比如,你可以在init.el中加入(load 某某插件-autoloads)來加載該插件
    • 如果你希望用require的方式來加載插件,并且還希望require這個autoloads文件,會出現(xiàn)一個問題。autoloads的結尾并沒有(provide '某某插件-autoloads),所以require一定會報錯。而且這樣做也沒什么意義。因為你的目的在于將插件本身的名字放到features列表中,而不是“插件名-autoloads”。所以,請load而不是requireautoloads文件
    • 當然,你也可以直接加載插件的主腳本,比如(require 'auto-complete)而不是(load 'auto-complete-autoloads)。不過,這樣做有兩個壞處。第一,有些插件可能會指導elpa在生成autoloads文件時加入一些配置代碼。在這種情形下,有可能你通過load這個autoloads文件能成功初始化插件,而直接load或者require插件的主腳本則不能。第二,autoloads由autoload函數(shù)構成,autoload的好處如前所述,可以輕便化emacs的啟動

    load-path

    下面來談一個很重要的變量,load-path,其變量類別是“列表”,作用范圍是“全局變量”。打開emacs,鍵入C-h v load-path RET。如果你是在剛安裝完emacs后鍵入這個命令,得到的返回值應該類似這樣:

    ("c:/emacs/share/emacs/24.4.91/site-lisp" "c:/emacs/share/emacs/site-lisp" 此處省略若干行

    中文部分是我自己加上的,告訴你我為了節(jié)省空間,刪掉了許多行。

    每次使用elpa安裝插件后,這個值都會發(fā)生改變。比如,在初次使用elpa安裝完ack插件后,
    load-path會變?yōu)?#xff1a;

    ("~/.emacs.d/elpa/ack-1.3/" "c:/emacs/share/emacs/24.4.91/site-lisp" "c:/emacs/share/emacs/site-lisp" 此處省略若干行

    請自行把~腦補為HOME路徑。

    通過對比,不難發(fā)現(xiàn),emacs在啟動時,會將user-emacs-directory/elpa路徑下的的所有文件夾加入到load-path的頭部。由于elpa的默認安裝路徑是~/.emacs.d/elpa,所以第一行會是~/.emacs.d/elpa/ack-1.3/。你用elpa安裝的任何插件,其所在路徑都會位于load-path頭部。我想強調(diào),這個位置,非常重要。

    在emacs24及更高的版本中,emacs自帶了一個org插件,位于emacs安裝路徑\share\emacs\24.4.91\lisp\org,這個插件后面會詳細講解。每次啟動emacs,這個路徑都會被添加到load-path中。在emacs中鍵入M-x org-mode會調(diào)用org插件,讓編輯區(qū)域進入org模式。

    org插件有很多相關插件。假設現(xiàn)在,你想通過elpa安裝某個相關插件,比如,bog,執(zhí)行如下操作:

    • 鍵入M-x list-packages RET,出現(xiàn)選擇編碼的提示,鍵入RET
    • 定位bog:鍵入C-s Extensions for research notes in Org mode,然后鍵入C-s RET
    • 在emacs窗口左側,點擊光標所在行出現(xiàn)的小個左箭頭,然后點擊bog

    你會在新出現(xiàn)的窗口看到語句Requires: org-8.0.0, dash-2.5.0,表明該插件依賴額外的兩個插件org和dash。elpa會智能的安裝所有依賴插件。注意,盡管你的emacs自帶org,elpa還是會選擇安裝自己的插件源中的版本。所以,最后load-path會變?yōu)?#xff1a;

    ("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在加載任何腳本時,如果沒有指明腳本所在路徑,那么就去load-path所含的路徑中尋找。然后使用第一個找到的腳本。也就是說,此后你調(diào)用org插件時,使用的都會是elpa安裝的版本,即插件的一個版本'shadow'了另一個版本。

    'shadow'現(xiàn)象很常見。除了前面提到的'shadow'內(nèi)置插件,elpa安裝的插件的新版本會'shadow'舊版本。請記住一個非常有用的命令,list-load-path-shadows,它可以總結所有插件當前的'shadow'狀態(tài)。現(xiàn)在,請你自己鍵入M-x list-load-path-shadows RET,然后閱讀下返回的信息。

    'shadow'之所以發(fā)生,是因為load-path中包含了同一個插件多個版本的腳本路徑,哪個版本排在前面就使用哪個。

    總結下,在配置插件時,請時常反問自己如下問題:

    • 當我想加載一個插件時,emacs知不知道它的所在路徑?
    • 當我想修改插件定義的某個參數(shù)時,是否已經(jīng)加載了這個插件?
    • 會不會某個已經(jīng)存在的版本,shadow了我想使用的版本?

    最后,學習下修改load-path的常用操作。

    參考Modifying List Variables

    • 優(yōu)先關注add-to-list的語法。

    延伸閱讀

    • Library Search TD
    • How to Install Emacs Packages Manually
    • ELPA

    牛刀小試

    整套配置文件的思路參考Emacs配置文件——新手攻略。

    雖說是新手攻略,還是太簡潔了些。不過,請你大概閱讀一遍,并將作者的配置文件下載到本地,解壓,然后將emacs.d-master文件夾下的文件所有文件拷貝到你的user-emacs-directory。這會覆蓋你自己的init.el,不要緊,當然你為了保險可以備份下。下面用之前建立的專門用來調(diào)試配置文檔的快捷方式運行emacs。emacs會按照init.el的指導自動安裝并配置相關插件。但不知你的運行結果怎樣,我的會報錯。

    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)

    有了前面鋪墊的基礎,你應該能很好理解錯誤的原因:應該load一個autoloads文檔,而不是require。定位到出錯的文檔,把(require 'switch-window-autoloads)修改為(load "switch-window-autoloads")。注意,根據(jù)require和load的語法規(guī)則,我把switch-window-autoloads從一個符號(Symbol)改成了一個字符串(String)。

    順便檢查下同文件夾下的其他配置文檔,更正相同的錯誤。關閉emacs再次運行。你會發(fā)現(xiàn),后續(xù)還會在各種各樣的init文檔中出現(xiàn)同樣的錯誤。請一一更正。

    "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指單引號字符'。請打開文檔定位出錯語句。然后Google搜索"org-exp",發(fā)現(xiàn)只有org-exp-blocks,估計"org-exp"是作者自己寫的吧。請注釋或刪除(require 'org-exp)。

    在讀過org-exp-blocks的幫助文檔后,你可能非常想加載這個插件。不過請注意,文檔中提到:

    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),這個目錄里包含了許多org用戶寫的插件,因為不是org官方開發(fā)者寫的,所以沒被包含在前面的兩個版本中。

    到這里,也許你會以為org-exp-blocks也在"contrib directory"中。恭喜你,上當了。

    參考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了。所以,你其實什么也不用做
    • 不得不說,有點坑爹。吃一塹長一智,請記住這個頁面,以后配置文件出現(xiàn)問題時,也許不是被'Moved to core',就是被'Obsolete'了

    做完以上操作,再次啟動emacs,應該能順利進入歡迎界面了。不過,要知道,還是有很多未被'Moved to core'但非常有用的插件,一般只包含在org官網(wǎng)提供的beta版本中。那應該怎樣獲取呢?

    Build Org

    參考Org官網(wǎng)

    • 想獲得官方的beta版本,需要用到工具Git。下載并安裝好。
    • 用桌面上出現(xiàn)的Git快捷方式打開Git,鍵入pwd,記住當前的工作路徑。或者你也可以通過cd命令來切換到你想要的工作路徑
    • 記住當前的工作路徑。鍵入git clone git://orgmode.org/org-mode.git。等待beta版本的org被下載到本地。提示:也許在你的git中,粘帖操作被綁定為鼠標右鍵
    • 將工作路徑下的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,相當于讓beta版本'shadow'其他版本
    • 你還需要把org-beta目錄下下的org-contrib\lisp添加到load-path,因為這個目錄即前面所說的"contrib directory"。在第一行下面額外添加代碼:(add-to-list 'load-path (expand-file-name "org-beta\\org-contrib\\lisp" user-emacs-directory))
    • 到這步,你應該可以正常使用emacs了。不過,為了真正的“安裝”org-beta,請繼續(xù)執(zhí)行下述操作
    • 額外下載并安裝Cygwin。參考Cygwin詳解“Cygwin在線安裝指南”一節(jié)。一定要執(zhí)行“Cygwin中模塊的各種分類”一節(jié)提到的操作,即安裝Devel這個部分的模塊,因為要用到其中的automake模塊。記得安裝完后配置環(huán)境變量
    • 打開emacs,鍵入M-x pwd,返回路徑如果不是org-beta所在的那個,就切換過去。具體操作,鍵入C-x d ~ RET .emacs.d/org-mode/ RET
    • 切換后,再次鍵入M-x pwd,確認路徑正確。然后鍵入M-! make。注意,Alt和!要一起按,即同時鍵入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文件夾
    • 重新運行emacs,讓emacs在更正后的配置文檔的指導下重新初始化

    你會發(fā)現(xiàn),居然又報錯了!出錯語句是配置文檔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有關。注釋掉init-org.el中的頭兩行代碼,讓emacs使用elpa版本的org。然后打開emacs鍵入M-x list-packages來強制刷新下插件列表。最后再次刪掉elpa文件夾并運行emacs。如果以后你想使用beta版本,記得反注釋掉頭兩行代碼。

    一陣繁忙的下載后,emacs應該能不報錯的完成初始化。但是看看編譯記錄(complied log),發(fā)現(xiàn)有大量的warning信息。請把log保存下來,以便以后分析。把光標切換到complied log區(qū)域,鍵入C-x C-f,然后選擇合適的路徑和文件名,鍵入RET保存log。

    后文中我會以init.log來代指這個文件。

    恭喜,現(xiàn)在你已經(jīng)擁有了一個功能非常強大的emacs了。趕快探索下吧。

    最后補充下我個人偏好的額外設置。

    init.el

    關閉煩人的警示音。禁止啟動后的歡迎頁面。

    ;; 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)))))

    當你通過emacs的自定義系統(tǒng)(本篇最開始提到)修改emacs設置后,emacs自動將相關代碼添加到init.el的custom-set-variables區(qū)域。這里我們直接添加代碼來實現(xiàn)功能。

    安裝Emacs Speaks Statistics: ESS,使org模式下可以運行R,SAS等(當然,你要額外安裝這些統(tǒng)計軟件)

    參考Installing ESS on your system

    • 同編譯org-beta的步驟類似。我把ess-14.09放到user-emacs-directory,然后運行emacs并切換工作路徑到ess-14.09,最后make
    • 在init.el中添加
    (add-to-list 'load-path (expand-file-name "ess-14.09" user-emacs-directory)) (load "ess-autoloads")
    • 運行emacs,鍵入M-x R。如果能進入R session,那么就是安裝成功
    • (load "ess-autoloads")是最小配置,如果你希望用到ess的全部功能,請加載ess-site.el(注意load-path)

    init-org.el

    開啟org模式下的代碼高亮;導出代碼塊時不運行代碼;跳過運行代碼塊時的確認步驟(可能有安全風險)。在注釋;; Various preferences下方添加代碼

    ;; Various preferences (setq 其他代碼;; turn on the syntax highlight in the org modeorg-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)

    導出PDF時代碼高亮使用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有時需要多次編譯才能正確導出所有元素。因此會出現(xiàn)三個xelatex語句
    • bibtex命令可以生成.bbl文件,這個文件用來生成參考文獻列表。放到中間是因為,它需要借助第一個xelatex生成的.aux文件,一個臨時輔助文件,來實現(xiàn)轉換。原理很簡單。文獻信息存儲在格式為bibtex的.bib文件中。根據(jù)不同的文獻引用標準和具體的引用條目(由.aux提供),.bib內(nèi)的信息在經(jīng)過篩選、重組后被放入.bbl文件,用來生成最終的文獻引用內(nèi)容
    • 因為minted包依賴python,所以latex在編譯時需要調(diào)用外部程序python。latex覺得這種行為存在風險,默認禁止。-shell-escape允許latex運行"shell command",進而允許調(diào)用python

    另外,如果你想在org模式下用RefTex來引用文獻,有一個插件'ox-bibtex',它可以在導出到Latex和HTML時自動生成參考文獻附錄。'ox-bibtex'在org-contrib中。所以如果要啟用這個插件,請配合啟用org-beta后再加載這個插件。
    用這個插件導出Latex時,如果你遵照前面的配置,應該一切正常。HTML導出功能需要用到bibtex2html。許多人在使用這項功能時都會遇到錯誤Executing bibtex2html failed。參考
    Emacs: unifying citations between html and latex in org-mode,問題在于不能使用臨時文件。這個問題最終也沒得到很好解決。下面我給出一個windows8.1+texlive 2014使用環(huán)境下的解決方案,不保證其他環(huán)境也適用。

    bibtex2html

    其實方案很簡單,安裝最新版本的bibtex2html即可,目前是1.98。這里只是給不熟悉Unix開發(fā)環(huán)境的同學們指個路。

    參考Github上的說明文檔

    • 先去下載最新的開發(fā)者版本bibtex2html-1.98.tar.gz,解壓到本地文件夾中,比如bibtexdir
    • 運行cygwin,cd到bibtexdir
    • 鍵入./configure,等待程序運行完畢
    • 鍵入make,等待程序運行完畢
    • 如果你希望cygwin能在內(nèi)部調(diào)用bibtex2html,再鍵入make install,這會把bibtex2html安裝到cygwin64所在路徑\usr\local\bin
    • 現(xiàn)在,bibtexdir目錄下會出現(xiàn)'bib2bib.exe','bibtex2html.exe' ,'aux2bib'
    • 將三個文件拷貝到系統(tǒng)環(huán)境變量PATH中的某個路徑,確保你在cmd中鍵入bibtex2html可以調(diào)用相關.exe文件
    • 大功告成

    init-auctex.el

    使用Sumatra PDF(請下載并安裝)來預覽PDF。最大的好處是,可以從PDF逆向定位TEX。即你編譯完.tex文檔并調(diào)用Sumatra PDF預覽時,在PDF中雙擊某個位置,emacs會自動打開對應的.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界面,按照參考文章的回答設置Set inverse search command line。

    其他配置

    參考 Moving The Ctrl Key,綁定ctrl到capslock

    我采用AutoHotkey的方式,并且將腳本放到startup文件夾來實現(xiàn)開機自啟。我的電腦上,startup的路徑:
    C:\Users\xiaohang\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

    延伸閱讀 windows下自定義配置的說明

    初入江湖

    經(jīng)過以上配置,你的emacs應該已經(jīng)比較好用了。不過在emacs世界里,此時的你還只是個初入江湖的小蝦米。在相當?shù)囊欢螘r間內(nèi),你會糾結于emacs復雜的按鍵組合,為千方百計也不能安裝好一個小插件而抓狂。我想說,這都是正常現(xiàn)象。在這些痛苦中,你慢慢成長,從讀官方文檔開始,一點點熟悉elisp,開始欣賞emacs的設計,甚至能自己寫一個小插件。于是,你使用emacs越來越順手,越來越想打造一個獨屬于自己的配置,最大化你在各個場景下的使用效率。

    而我的教程到這里也要告一段落了。我已經(jīng)把自己所知悉數(shù)傳授給了你,從這里開始,我們處在同一個起跑線上。但我想,這套教程并不會結束,因為我還有很多承諾沒同你兌現(xiàn)呢,比如分析init.log,比如講解org模式。不過,相信你經(jīng)過前面的學習,已經(jīng)能靠依靠自己探索emacs中的大部分事物了。而我,也會逐漸積累自己的使用心得。

    我計劃如下呈現(xiàn)后續(xù)的教程:圍繞一個具體的使用情景,我會向你描述我的插件選擇,配置和操作習慣。

    最后,如果你覺得這篇文章不錯,請點擊下方的喜歡按鈕,謝謝支持!

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


  • R-markdown, iPython-notebook

  • 選項nw代表"no window"

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

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

  • M-x shell來激活一個shell。你可以把它簡單理解為一個運行在emacs里面的cmd。


  • ========================== End

    ?

    總結

    以上是生活随笔為你收集整理的Emacs 安装配置使用教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。