来源 https://www.jianshu.com/u/a27b97f900f7html
先来一篇有趣的简介:Emacs和Vim:神的编辑器和编辑器之神 - 51CTO.COMnode
做为一个彻头彻尾的emacs新手,尽管有些薄弱的编程经验,但上手这么一个黑客级别的编辑器仍是不免一段阵痛期。虽然网上有不少很是好的教程,好比这篇著名的文章,一年成为Emacs高手(像神同样使用编辑器),虽然提供了一个很好的学习框架,但具体的学习内容仍是须要你本身寻找。这篇教程,在某种意义上能够被视为按照那个学习框架进行的学习实践。python
在实践过程当中,我发现相关基础知识的优秀教程散布在互联网的各个角落,缺少一个有条理的组织,更别提有些排名靠前的教程早已过期,里面提到的操做和方法已经不适用于最新版的emacs。git
虽然emacs能够做为一个简单的文本编辑器开箱即用,但陡峭的学习曲线主要体如今让它发挥最大功效的个性化定制之中。这篇教程整理了我在配置emacs过程当中学到的知识,方便新手按部就班的学习。建议你将它做为一个有内在结构的课程来对待。整个教程大约会花掉你18个小时。github
我学习emacs的初衷是为了作日程管理,记笔记,而且写研究论文。个人学习和研究常常涉及到各类编程语言,特别是各类统计软件,好比R,SAS,Stata,Matlab等,固然还有Python。虽然R和Python都支持“文学编程”模式[1],但若是想将多种语言整合进一个文档的话,emacs的org-babel模式无疑是第一选择。而既然是想写研究论文,对于Latex的支持必不可少。因此,我配置的emacs会以方便“文学编程”,多格式导出(主要是Latex和html)以及各类文档模板为重点,主要围绕emacs的两个插件org和auctex来展开,可能还会涉及到知识整理,以及同Evernote互动的内容。另外,许多配置步骤在Unix系统下会方便不少,但很不幸,我使用的是windows。shell
因此,若是你是emacs小白,但有一点编程经验,有同我相似的需求,而且也使用windows,那么这篇文章就是为你量身定制的。欢迎阅读!编程
这个教程自己就借鉴了许多高手的配置。我坚信“授人以鱼不如授人以渔”的格言。我相信我对你最大的帮助是这篇教程自己,而不是那些配置文档。但愿做为新手的你,在阅读完这篇教程后,能得到足够的信心和动力来打造一个独属于你的emacs。windows
请注意我使用了“学习”而不是“阅读”。这意味着你须要本身动手,实践那些优秀教程提到的操做。本身写一些代码,而不是单纯的复制粘帖。浏览器
凡是附在“参考”后的文章,尽管大部分是英语文章,都请你仔细阅读。固然,你能够先浏览我写在后面的笔记和总结,来得到一个初步理解。你甚至能够只阅读个人总结来基本理解我要谈的事情,这看上去会节省你大量的时间,但其实你在不知不觉中错过了不少我没说起但对你很重要的细节。No pain, no gain...若是你坚持不读参考文章,请至少记得它们的标题。等你遇到问题时,至少知道该用什么样的关键词来搜索答案。安全
附在“延伸阅读”后的文章都颇有价值,有助于你深刻理解前文提到的概念。加了“必读”标签的请优先阅读。标签"TD"表明文章中出现了不少我还没说起的技术细节(Technique details),须要更多的背景知识。因此,若是你在阅读中感到困惑,能够先跳过,等学习完整个教程后再来阅读。所以,TD还有一层TODO的意味……
在阅读我给出的文章时,你可能但愿完成一个“知识闭环”后再回来继续学习。所谓“知识闭环”,就是持续了解阅读过程当中遇到的新概念,直到再也不遇到新的概念为止。显然,这会耗费大量的精力,并且你的疑问一般会在后续的教程中获得解决。我在撰写这个教程时,并没假定你完成了“知识闭环”后再继续学习,因此,建议你只对最大的疑惑作扩展阅读,好比选择性的浏览文章中包含的超连接。
官网:http://ftp.gnu.org/gnu/emacs/windows/
打开网页后,顶部是一段关于如何安装的说明文档。
总结:
C:\emacs\bin
)。你可能须要先了解下环境变量和命令行的基本知识。搜索关键词“windows环境变量PATH”,“启动cmd”emacs -nw
[2],以终端模式来运行emacs;只输入emacs
,以GUI模式来运行bin\addpm.exe
,这样会自动生成配置文件.emac
和目录.emacs.d
,而且在启动菜单里添加应用程序快捷方式。另外,官方文档里说还会添加注册表的相关条目。不过在个人电脑上,注册表并未新增相应条目emacs的安装路径\bin\runemacs.exe --debug-init
。加了flag --debug-init
,是为了方便调试(debug)配置文件。不推荐为emacs.exe
创建快捷方式,由于会额外启动一个命令行窗口。请选择24以上的版本
延伸阅读: FAQ 3.2
我的推荐
下面这两个版本能够省去大部分配置的麻烦事。不过多劳多得,请自行选择
打开emacs,同时按下Ctrl
和h
,而后键入t
,阅读新手教程,熟悉界面,基本术语和操做。
请不要跳过这一步!(但不要求熟练掌握)
本文后面的部分已经假定你阅读了这个教程,因此默认遵循emacs的术语规范。
C
表明Ctrl
键。M
表明Alt
键。RET
表明Enter
键(回车键)。C-x
表明同时按下Ctrl
和x
。C-x d RET
表明先同时按下Ctrl
和x
,再按下d
,最后再按下RET
。我在后文的按键描述中,会常常省略最后一步的回车操做。另外,请留意描述所用的英文字母的大小写。
Emacs里的大部分地方都支持自动补全,快捷键是TAB
。
你可能会奇怪,为何配置emacs还须要编程?通常配置一个程序,不都是经过菜单栏打开一个对话框,而后修改里面提供的选项么?在emacs里,的确有这么一套配置系统,详见Emacs's Customization Tutorial。但我的不推荐使用。由于,第一,里面提供的选项并不彻底,许多配置只能经过编程才能作到;第二,它也是经过在你的配置文件中加入一些代码来实现的。
配置emacs的全部代码构成了一个配置文档。Emacs的配置文档是用elisp语言写的。elisp是lisp的一种方言。至于lisp语言,有人说它是黑客的语言。不过你并不须要彻底理解elisp才能配置emacs。至少我对elisp谈不上熟练。不过我却是看过一些lisp语言的入门教程,因此可以看得懂elisp的官方帮助文档。你能够参考Learn X in Y minutes来快速入个门。因为elisp的函数命名规则大部分都很直观,因此只要了解了基本语法,大部分配置语句对你来讲都会变得很直白。下面列出几个配置文档时的经常使用函数,只是让你熟悉下elisp的语法。更多的函数会在用到时讲解。
参考set
(set 'a 5)
至关于a=5参考setq
'
参考let
let
的意义在于批量执行函数时定义共享参数。考虑下面这个使用情景,你但愿连续调用函数A,B,C,它们都接受一个字符串参数s,s表明某个路径。A负责打印字符串s,并提示接下来要利用s作什么事情;B负责切换到s指定的位置而后执行一些操做;C负责将s加入到某个全局列表中。你固然能够不用let
,在调用函数前加上一句(set 's 一个字符串)
便可。但这时定义的s会成为全局变量,进而污染你的变量空间。参考The Emacs Initialization File
.emacs
, init.el
,虽然本质上它们都是elisp脚本(像python脚本那样)。Ctrl
+q
,Shift
+Ctrl
+q
),这对调试配置文档很重要。固然,在你熟悉emacs后,emacs也许会成为你的惟一编辑器Shift
+Ctrl
+q
,反注释时请用Ctrl
+q
。前者会保证在每一行代码前都加一个;
,后者则是,若是本行代码以;
开头,就删掉一个;
,若是不以;
开头,则添加一个;
。容易理解,当代码块中包含注释时,你确定不但愿在注释掉代码的同时反注释掉那些注释。接下来,让咱们先来了解emacs在哪里寻找配置文档,以及会具体选择哪一种格式。
参考How Emacs Finds Your Init File,了解emacs启动时配置文件的加载规则
echo %userprofile%
来查看HOME[3] %userprofile%
的值设置为HOME,通常是C:\Users\your-user-name\AppData\Roaming
一般,emacs会优先加载.emacs
,若是找不到,而且存在文件夹.emacs.d
,会尝试加载其中的init.el
基于前面的介绍,一个比较好的安装配置方案以下:
将emacs的压缩包解压到某个路径
运行bin路径下的runemacs.exe
c-x d ~ RET
,编辑区域左上角的文件路径即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路径。因为前面已经从新设定HOME,因此这行代码至关于调用C:/emacs/.emacs.d/
下的init.el
。关于load
命令,后面有详细解释.emacs
文件,保证emacs利用init.el
启动这样作的好处是,除了能够自定义.emacs.d
所在的路径,还能够方便的备份整个文件夹,由于插件一般会被安装到这个文件夹下。若是须要换到其余电脑甚至平台时,只须要把整个文件夹复制过去,而后相似于上述步骤那样,想办法让真正的init.el
发挥做用便可。
使用init.el
而不是.emacs
来配置,能够保证配置文件的结构化和模块化,方便维护。
最后规定后文要常常用到的几个代指
~
代指重定义后的emacs的HOME路径user-emacs-directory
指代~\emacs.d
,该路径能够在启动emacs后经过C-h v user-emacs-directory
来查看。init.el
代指user-emacs-directory
下的版本,是咱们要配置的版本 延伸阅读:
从这个章节开始,对于提到的非emacs程序,都假定这些程序的主要可执行文件(exe)所在路径已经被添加到系统的环境变量PATH中。 对于python,R,pandoc,cygwin等,网上有不少安装并配置环境变量的教程。仍不熟悉基本操做的能够先看看“延伸阅读”的第一篇文章。
在向init.el
写入任何代码以前,先打开emacs试用一下。键入M-x python
,若是没报错的话,就成功进入了python模式。Emacs并不自带python,那它是怎么知道去哪里调用python.exe
的呢?
参考Emacs: Set Environment Variables within Emacs
原来Emacs继承了windows的环境变量PATH。输入M-x getenv RET PATH
查看PATH[4]。
实际上,当你在emacs中运行shell时[5],各个指令的搜索路径是PATH。而当emacs自身须要寻找某个可执行文件时,好比python,搜索路径是exec-path
,而默认,在windows平台下,emacs会直接拷贝系统的环境变量。也就是所说,在init.el
中修改emacs的PATH副本并不会同时修改exec-path
。
当咱们安装了一些只想同emacs结合使用的软件时,若是不想修改系统的环境变量,能够在init.el
中加入:
(setenv "PATH" (concat "C:/Program Files (x86)/Notepad++" ";" (getenv "PATH") ) )
这样,你就能够在emacs中打开一个shell,而后键入notepad++
来调用它了。注意,这个修改并不会在exec-path
中追加相应的路径。若是你但愿emacs也能调用notepad++,还须要同步修改exec-path
,具体方法请参见原文。
若是你像我同样不想同步exec-path
,最简单的方案就是把相关程序的安装路径添加到系统的环境变量中。
延伸阅读:
对于任何软件,一个驾轻就熟的配置基本基本都要用到插件,好比Chrome。
对于emacs,新安装的插件常常要你本身去启动并配置。这是emacs上手难的重要缘由之一。考虑一个最简单的安装流程,你从网上下载了某个**.el
文件,而后在init.el
中load
这个文件。是否是load
那一步显得很别扭?而功能更强大的插件可能由更复杂的文件结构组成,须要你作更多的准备工做才能正常使用。这个时候,一个插件管理系统就很必要了。24以上的版本都集成了一个插件管理器elpa
,能够方便的经过M-x list-packages
来安装插件。不过别高兴的太早,经过elpa
安装的插件一般仍须要你手动来加载和配置。
注意,是加载,而不是激活。回忆下你是怎么使用Chrome的插件系统:安装插件,插件的图标出如今浏览器地址栏的右侧,点击插件的图标来使用插件(激活其功能),有的插件甚至默认激活。这个过程当中,全部加载和初始化配置的工做都由软件自动完成,你惟一须要作的就是选择用不用(激活)而已。
然而,elpa
要求你本身完成加载和配置的步骤。通常来讲,常见的载入命令有,require
,load
,autoload
等。而所谓的配置就是初始化一些参数。
emacs通常称“插件”为"package"或者"library"。本质上,它们都提供一堆定义好的函数,来实现一些操做,进而实现某个功能。这里多说几句。在emacs中,连移动光标这种最底层的操做都有对应的函数。好比,你在emacs中能够键入C-f
来将光标向右移动一个字符,同时也可键入M-x forward-char
来实现。任何复杂的功能,好比给文档生成一个目录,均可以被分解为一个个操做,或者说调用一个个函数,而这些函数顺序执行下来功能就获得了实现。
当emacs想要加载某个插件时,归根到底须要定位并运行一个(也许是一些)脚本文件,那个脚本里定义了实现插件功能所需的变量和函数。emacs将它们转变为可供本身使用的对象(elisp object),放到运行环境中等待调用。而脚本自身还能够在内部进一步加载其余脚本。下面,来了解加载脚本的几个语句,load
,require
,load-file
,autoload
。
参考Emacs Lisp's Library System: What's require, load, load-file, autoload, feature?
load
一个位于硬盘上的文件,意味着执行这个文件里的全部elisp语句,而后将执行结果放进emacs的运行环境(provide '<symbol name>)
,将'<symbol name>
加入到features中去。'<symbol name>
通常就是插件的名字(require '<symbol name>)
会先查看features里面是否存在<symbol name>
。若是存在,语句执行完毕。若是不存在,基于它来猜一个文件名,或者由require
的第二个参数直接指定文件名,而后load
文件。注意,load
完成后,require
函数会再一次查看features列表中是否存在'<symbol name>
,若是发现仍是不存在,视参数<soft-flag>
来决定是否报错require
的意义在于避免重复加载。好比,某个插件的启动脚本中须要用到另外一个插件提供的某个函数。那么它就会require
这个插件,保证插件已被载入,而后再执行后续语句。load
会搜索load-path
,load-file
须要指定文件路径,autoload
在一个函数被call后再load
指定文件延伸阅读 Required Feature
其实,连整个emacs的启动均可以归纳为一句话:加载一系列脚本。只不过这些脚本有的是内置的(built in),有的是你安装的插件包含的,有的是你本身写的。
配置emacs归根结底是在配置各类各样的脚本。
接下来,请思考以下问题。
你能够在init.el
就load
各类各样的脚本,使得emacs在启动时就把整个使用过程当中可能用到的函数一次性准备好。但这样真的好么?
参考Autoload
autoload
告诉emacs某个地方有一个定义好的函数,而且告诉emacs,先别加载,只要记住在调用这个函数时去哪里寻找它的定义便可前面介绍了几种加载机制。加载的目的在于定义变量和函数以供使用。任何插件,只有先被加载才能被使用。并且一般,你都但愿先加载一个插件,再来配置它。考虑以下情景。
你的插件中定义了一个变量a,默认值是1,插件内定义的许多函数都在内部使用了a。你但愿在本身使用这些函数时,用到的a的值是2。有两种实现途径。一种是直接到插件的脚本文件中修改a的值为2。这叫作"hard coding",有不少坏处。好比,每次更新插件,都要从新修改。另外一种方法是,等这个插件已经被加载后,修改相应的elisp object。那天然,你得先让这个对象存在于emacs中,而后才能修改。因此要先加载,让须要配置的变量获得定义,再去修改变量的值。
下面,让咱们来看看这些脚本文件究竟长什么样子。打开emacs内置插件的文件夹,emacs安装路径\share\emacs\24.4.91\lisp
,你会看到一些子文件夹,一些后缀名为gz
的压缩文件,以及一些后缀名为elc
的文件。压缩文件中存放的实际上是同名的.el
文件,也就是前面一直在提的脚本。.elc
是这个脚本编译好的版本,能够加快载入速度,不适合人类阅读。因此,若是你想查看一个插件的源代码,请查看.el
文件。.el
被放在压缩包是为了不源代码被修改,进而形成各类问题。另外,加载插件时,老是会优先加载编译好的版本,其默认的文件扩展名即.elc
;若是不存在,才会加载.el
或者其余格式的文件。
延伸阅读
有了前面铺垫的基础概念后,让咱们来学习使用elpa。Elpa(Emacs package system)也是一个插件,只不过它是管理插件的插件。在emacs24和更高的版本中,elpa是一个内置插件,脚本文件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
autoload
)。直接键入M-x list-packages
便可调用package-archives
,请先(require 'package)
。该原则适用于其余插件的配置。也就是说,若是你想在init.el
中修改某个插件的某个变量的值,请保证emacs在执行这条修改语句时,相关变量已经获得定义插件名.el
为了保证你能够自行试验后文的操做,如今请你到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
init.el
中加入(load 某某插件-autoloads)
来加载该插件require
的方式来加载插件,而且还但愿require
这个autoloads文件,会出现一个问题。autoloads的结尾并无(provide '某某插件-autoloads)
,因此require
必定会报错。并且这样作也没什么意义。由于你的目的在于将插件自己的名字放到features列表中,而不是“插件名-autoloads”。因此,请load
而不是require
autoloads文件(require 'auto-complete)
而不是(load 'auto-complete-autoloads)
。不过,这样作有两个坏处。第一,有些插件可能会指导elpa在生成autoloads文件时加入一些配置代码。在这种情形下,有可能你经过load
这个autoloads文件能成功初始化插件,而直接load
或者require
插件的主脚本则不能。第二,autoloads由autoload
函数构成,autoload
的好处如前所述,能够轻便化emacs的启动下面来谈一个很重要的变量,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" 此处省略若干行
中文部分是我本身加上的,告诉你我为了节省空间,删掉了许多行。
每次使用elpa安装插件后,这个值都会发生改变。好比,在初次使用elpa安装完ack插件后,
load-path
会变为:
("~/.emacs.d/elpa/ack-1.3/" "c:/emacs/share/emacs/24.4.91/site-lisp" "c:/emacs/share/emacs/site-lisp" 此处省略若干行
请自行把~
脑补为HOME路径。
经过对比,不难发现,emacs在启动时,会将user-emacs-directory/elpa
路径下的的全部文件夹加入到load-path
的头部。因为elpa的默认安装路径是~/.emacs.d/elpa
,因此第一行会是~/.emacs.d/elpa/ack-1.3/
。你用elpa安装的任何插件,其所在路径都会位于load-path
头部。我想强调,这个位置,很是重要。
在emacs24及更高的版本中,emacs自带了一个org插件,位于emacs安装路径\share\emacs\24.4.91\lisp\org
,这个插件后面会详细讲解。每次启动emacs,这个路径都会被添加到load-path
中。在emacs中键入M-x org-mode
会调用org插件,让编辑区域进入org模式。
org插件有不少相关插件。假设如今,你想经过elpa安装某个相关插件,好比,bog,执行以下操做:
M-x list-packages RET
,出现选择编码的提示,键入RET
C-s Extensions for research notes in Org mode
,而后键入C-s RET
你会在新出现的窗口看到语句Requires: org-8.0.0, dash-2.5.0
,代表该插件依赖额外的两个插件org和dash。elpa会智能的安装全部依赖插件。注意,尽管你的emacs自带org,elpa仍是会选择安装本身的插件源中的版本。因此,最后load-path
会变为:
("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
所含的路径中寻找。而后使用第一个找到的脚本。也就是说,此后你调用org插件时,使用的都会是elpa安装的版本,即插件的一个版本'shadow'了另外一个版本。
'shadow'现象很常见。除了前面提到的'shadow'内置插件,elpa安装的插件的新版本会'shadow'旧版本。请记住一个很是有用的命令,list-load-path-shadows
,它能够总结全部插件当前的'shadow'状态。如今,请你本身键入M-x list-load-path-shadows RET
,而后阅读下返回的信息。
'shadow'之因此发生,是由于load-path
中包含了同一个插件多个版本的脚本路径,哪一个版本排在前面就使用哪一个。
总结下,在配置插件时,请时常反问本身以下问题:
最后,学习下修改load-path
的经常使用操做。
add-to-list
的语法。延伸阅读
整套配置文件的思路参考Emacs配置文件——新手攻略。
虽然说是新手攻略,仍是太简洁了些。不过,请你大概阅读一遍,并将做者的配置文件下载到本地,解压,而后将emacs.d-master
文件夹下的文件全部文件拷贝到你的user-emacs-directory
。这会覆盖你本身的init.el
,没关系,固然你为了保险能够备份下。下面用以前创建的专门用来调试配置文档的快捷方式运行emacs。emacs会按照init.el
的指导自动安装并配置相关插件。但不知你的运行结果怎样,个人会报错。
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")
。注意,根据require
和load
的语法规则,我把switch-window-autoloads
从一个符号(Symbol)改为了一个字符串(String)。
顺便检查下同文件夹下的其余配置文档,更正相同的错误。关闭emacs再次运行。你会发现,后续还会在各类各样的init文档中出现一样的错误。请一一更正。
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",发现只有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版本,仍是内置的,都没有"contrib directory"。Google后发现,这个目录里包含了许多org用户写的插件,由于不是org官方开发者写的,因此没被包含在前面的两个版本中。
到这里,也许你会觉得org-exp-blocks也在"contrib directory"中。恭喜你,上当了。
参考Org-mode Contributed Packages
作完以上操做,再次启动emacs,应该能顺利进入欢迎界面了。不过,要知道,仍是有不少未被'Moved to core'但很是有用的插件,通常只包含在org官网提供的beta版本中。那应该怎样获取呢?
参考Org官网
pwd
,记住当前的工做路径。或者你也能够经过cd
命令来切换到你想要的工做路径git clone git://orgmode.org/org-mode.git
。等待beta版本的org被下载到本地。提示:也许在你的git中,粘帖操做被绑定为鼠标右键user-emacs-directory
。重命名那步没什么特别含义,只是为了区分。若是你选择拷贝到其余路径,请自行调整后续命令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-contrib\lisp
添加到load-path
,由于这个目录即前面所说的"contrib directory"。在第一行下面额外添加代码:(add-to-list 'load-path (expand-file-name "org-beta\\org-contrib\\lisp" user-emacs-directory))
M-x pwd
,返回路径若是不是org-beta所在的那个,就切换过去。具体操做,键入C-x d ~ RET .emacs.d/org-mode/ RET
M-x pwd
,确认路径正确。而后键入M-! make
。注意,Alt
和!
要一块儿按,即同时键入Alt
,Shift
和数字键1
。make命令源于Cygwin中的automake模块,它会把org-beta的全部核心脚本编译好,而后创建帮助文档的索引M-x org-version RET
,返回信息中包含的路径若是是org-beta,即代表'shadow'成功如今,请你执行以下操做:
user-emacs-directory
下的elpa
文件夹你会发现,竟然又报错了!出错语句是配置文档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)))
。我想你已经猜到了,这必定跟使用beta版本的org有关。注释掉init-org.el
中的头两行代码,让emacs使用elpa版本的org。而后打开emacs键入M-x list-packages
来强制刷新下插件列表。最后再次删掉elpa
文件夹并运行emacs。若是之后你想使用beta版本,记得反注释掉头两行代码。
一阵繁忙的下载后,emacs应该能不报错的完成初始化。可是看看编译记录(complied log),发现有大量的warning信息。请把log保存下来,以便之后分析。把光标切换到complied log区域,键入C-x C-f
,而后选择合适的路径和文件名,键入RET
保存log。
后文中我会以init.log
来代指这个文件。
恭喜,如今你已经拥有了一个功能很是强大的emacs了。赶快探索下吧。
最后补充下我我的偏好的额外设置。
init.el
关闭烦人的警示音。禁止启动后的欢迎页面。
;; Turn off sound alarms completely (setq ring-bell-function 'ignore) ;; disable welcome page (setq inhibit-startup-message t)
在custom-set-variables
区域添加代码,让emacs启动后自动全屏。请注意括号的匹配。
(custom-set-variables 其余代码 '(initial-frame-alist (quote ((fullscreen . maximized)))) )
当你经过emacs的自定义系统(本篇最开始提到)修改emacs设置后,emacs自动将相关代码添加到init.el
的custom-set-variables
区域。这里咱们直接添加代码来实现功能。
安装Emacs Speaks Statistics: ESS,使org模式下能够运行R,SAS等(固然,你要额外安装这些统计软件)
参考Installing ESS on your system
ess-14.09
放到user-emacs-directory
,而后运行emacs并切换工做路径到ess-14.09
,最后makeinit.el
中添加(add-to-list 'load-path (expand-file-name "ess-14.09" user-emacs-directory)) (load "ess-autoloads")
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 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)
导出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
xelatex
语句bibtex
命令能够生成.bbl
文件,这个文件用来生成参考文献列表。放到中间是由于,它须要借助第一个xelatex
生成的.aux
文件,一个临时辅助文件,来实现转换。原理很简单。文献信息存储在格式为bibtex的.bib
文件中。根据不一样的文献引用标准和具体的引用条目(由.aux
提供),.bib
内的信息在通过筛选、重组后被放入.bbl
文件,用来生成最终的文献引用内容-shell-escape
容许latex运行"shell command",进而容许调用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使用环境下的解决方案,不保证其余环境也适用。
其实方案很简单,安装最新版本的bibtex2html便可,目前是1.98。这里只是给不熟悉Unix开发环境的同窗们指个路。
bibtexdir
cd
到bibtexdir
./configure
,等待程序运行完毕make
,等待程序运行完毕make install
,这会把bibtex2html安装到cygwin64所在路径\usr\local\bin
bibtexdir
目录下会出现'bib2bib.exe','bibtex2html.exe' ,'aux2bib'bibtex2html
能够调用相关.exe
文件init-auctex.el
使用Sumatra PDF(请下载并安装)来预览PDF。最大的好处是,能够从PDF逆向定位TEX。即你编译完.tex
文档并调用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文件夹来实现开机自启。个人电脑上,startup的路径:
C:\Users\xiaohang\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
延伸阅读 windows下自定义配置的说明
通过以上配置,你的emacs应该已经比较好用了。不过在emacs世界里,此时的你还只是个初入江湖的小虾米。在至关的一段时间内,你会纠结于emacs复杂的按键组合,为想方设法也不能安装好一个小插件而抓狂。我想说,这都是正常现象。在这些痛苦中,你慢慢成长,从读官方文档开始,一点点熟悉elisp,开始欣赏emacs的设计,甚至能本身写一个小插件。因而,你使用emacs愈来愈顺手,愈来愈想打造一个独属于本身的配置,最大化你在各个场景下的使用效率。
而个人教程到这里也要告一段落了。我已经把本身所知悉数传授给了你,从这里开始,咱们处在同一个起跑线上。但我想,这套教程并不会结束,由于我还有不少承诺没同你兑现呢,好比分析init.log
,好比讲解org模式。不过,相信你通过前面的学习,已经能靠依靠本身探索emacs中的大部分事物了。而我,也会逐渐积累本身的使用心得。
我计划以下呈现后续的教程:围绕一个具体的使用情景,我会向你描述个人插件选择,配置和操做习惯。
最后,若是你以为这篇文章不错,请点击下方的喜欢按钮,谢谢支持!
好了,朋友们,下期再见~