首页 > 代码库 > Emacs安装配置全攻略之一编译安装简单配置

Emacs安装配置全攻略之一编译安装简单配置

/******************************************************************************************************************************************/

 原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb_driver/article/details/29407717,作者:gqb666  
/******************************************************************************************************************************************/

一、编译安装

1. 准备工作

(1)安装svn、ssh
sudo apt-get install ssh subversion


(2)安装texinfo(为了编译man包)
sudo apt-get install texinfo

(3)安装编译所需的支持包,依环境而定
sudo apt-get build-dep emacs21 libgtk2.0-dev xserver-xorg-dev xorg-dev libncurses5 libncurses5-dev libidl.dev

2. cvs最新的emacs源码
http://ftp.gnu.org/pub/gnu/emacs/

3. 编译、安装
创建目录:/opt/emacs24,将emacs安装到这里
sudo mkdir /opt/emacs24
注:最好指定一个安装目录,要不然编译出来的binary会被分散装到不同的地方

cd ~/emacs
./configure --prefix=/opt/emacs24 --enable-font-backend --with-xft --with-freetype --with-x-toolkit=gtk


参数解释:
–prefix=/opt/emacs24 指定emacs安装目录,默认为/usr/local
–enable-font-backend 让emacs支持雅黑字体
–with-freetype 支持freetype字体
–with-x-toolkit=gtk 指定环境为gtk

没有错误则继续:
make bootstrap
make info

编译完后,试运行一下 src/emacs -q,没有问题就可以安装了:
sudo make install

清理:
make clean

4. 添加你的安装路径
安装完后要在/usr/local/bin做一个链接(因为/opt/emacs24/bin/不在PATH变量中)

cd /usr/local/bin
sudo ln -s /opt/emacs24/bin/* ./

链接好后,在终端中输入emacs就可以启动emacs了。

二、功能插件配置(代码阅读神器)

emacs变成类似sourceinsight代码浏览器

所需软件:
cscope-15.5.tar.gz    http://sourceforge.net/projects/cscope
ecb-2.32.tar.gz          http://sourceforge.net/projects/ecb


但是对于一般安装的GNU emacs来说还需要三个额外的包支持即eieio, semantic,  speedbar 
http://sourceforge.net/projects/cedet 
将这三个包的下载并拷贝到/opt/emacs24/下
eieio-0.17.tar.gz
semantic-1.4.4.tar.gz
speedbar-0.14beta4.tar.gz

安装ecb和三个支持包:
#cd /opt/emacs24/site-lisp 
#tar zxfv ecb-2.32.tar.gz 
#tar zxfv eieio-0.17.tar.gz 
#tar zxfv semantic-1.4.4.tar.gz 
#tar zxfv speedbar-0.14beta4.tar.gz

做四个连接 
ln -s ecb-2.32 ecb 
ln -s eieio-0.17 eieio 
ln -s semantic-1.4.4 semantic
ln -s speedbar-0.14beta4 speedbar 

然后修改 
site-start.el文件(有些系统如ubuntu,site-start.el文件在/etc/emacs目录下) 
添加以下五行 
(setq load-path (append load-path ‘("/opt/emacs24/site-lisp/eieio"))) 
(setq load-path (append load-path ‘("/opt/emacs24/site-lisp/semantic"))) 
(setq load-path (append load-path ‘("/opt/emacs24/site-lisp/speedbar"))) 
(setq load-path (append load-path ‘("/opt/emacs24/site-lisp/ecb"))) 
(require ‘ecb) 

重新启动一下emacs 
M-x ecb-activate 

看看出现了什么

cscope安装更为简单
$tar zxfv cscope-15.5.tar.gz 
$cd cscope-15.5
$./configure 
$make 
#make install 

然后把contrib/xcscope/目录下的cscope-indexer复制到PATH目录比如/usr/local/bin 
然后把xcscope.el复制到 
/opt/emacs24/site-lisp 
修改/opt/emacs24/site-lisp/site-start.el 
添加 
(require ‘xcscope) 
重新启动emacs 并且打开一个C文件看看有什么变化? 
上述的两个软件的使用说明看看他们自带的文档,非常清楚

三、ECB操作键

(Emacs_command_tables.pdf http://download.csdn.net/detail/gqb666/7534613)

  以下是一些简单的键绑定,更多信息可以在ecb-minor-mode文档中查找(C-h a ecb-minor-mode )。

首先列出的是一些基本键映射前缀,即一些具体的命令键是由此基础上添加:

keybinding
C-c
C-c .
C-c . f
C-c . g跳转类( goto )
C-c . l布局类( layout )
C-c . m

 窗口最大化类(maximize)

(1) 跳转类命令( goto,    前缀: C-c . g 

key
跳转位置
C-c . g 1编辑区1
C-c . g 2编辑区2
C-c . g aanalyse窗口
C-c . g bspeedbar窗口
C-c . g ccompilation窗口
C-c . g ddirectories窗口
C-c . g hhistory窗口
C-c . g l上次编辑
C-c . g mmethods窗口
C-c . g ssources窗口

(2)布局类( layout, 前缀 C-c . l )

key操作
C-c . l c更改布局
C-c . l r重新布局
C-c . l t布局锁定开关
C-c . l w锁定可见的ECB窗口

 (3)窗口最大化类( maximize, 前缀C-c . m )

key操作窗口
C-c . m aanalyse窗口
C-c . m bspeedbar窗口
C-c . m ddirectories窗口
C-c . m hhistory窗口
C-c . m mmethods窗口
C-c . m ssources窗口

四、.emacs配置文件

(config.emacs http://download.csdn.net/detail/gqb666/7534621)

附上.emacs配置文件放到用户目录:cd ~,保存为.emacs即可有多功能插件如显示行号等。

;;查看根目录,按C-X C-F后按~,这时建立配置文件.emacs或_emacs.或者直接把此文件复制到根目录下

;; 语言环境字符集设置
;;这一部份主要用在linux 环境下,windows下没什么作用
;;(set-language-environment 'Chinese-GB)
;;(set-keyboard-coding-system 'utf-8)
;;(set-clipboard-coding-system 'utf-8)
;;(set-terminal-coding-system 'utf-8)
;;(set-buffer-file-coding-system 'utf-8)
;;(set-default-coding-systems 'utf-8)
;;(set-selection-coding-system 'utf-8)
;;(modify-coding-system-alist 'process "*" 'utf-8)
;;(setq default-process-coding-system '(utf-8 . utf-8))
;;(setq-default pathname-coding-system 'utf-8)
;;(set-file-name-coding-system 'utf-8)
;;(setq ansi-color-for-comint-mode t) ;;处理shell-mode乱码,好像没作用

;; 设置窗口界面
;;(set-foreground-color "grey")
;;(set-background-color "black")
;;(set-cursor-color "grey")
;;(set-mouse-color "gold1")

;; 显示行列号
(setq column-number-mode t)
(setq line-number-mode t)
(global-linum-mode t)
;; 设置显示格式 
(setq display-line-number-format "%4d|")

;; 关闭启动时的`开机画面'
(setq inhibit-startup-message t)

;; 关闭gnus启动时的画面
(setq gnus-inhibit-startup-message t)

;; 语法加亮
(global-font-lock-mode 't)

;; 语法高亮。除shell-mode和text-mode之外的模式中使用语法高亮
(setq font-lock-maximum-decoration t)
(setq font-lock-global-modes '(not shell-mode text-mode))
(setq font-lock-verbose t)
(setq font-lock-maximum-size '((t . 1048576) (vm-mode . 5250000)))

;; 把c语言风格设置为k&r风格 
(add-hook 'c-mode-hook 
'(lambda () 
(c-set-style "k&r")))

;; 把c++语言风格设置为stroustrup风格 
(add-hook 'c++-mode-hook 
'(lambda() 
(c-set-style "stroustrup")))

;; 括号匹配
;; 括号匹配时显示另一端的括号,而不是跳过去
(show-paren-mode t)
(setq show-paren-style 'parentheses)

;; 标题拦显示buffer的名字
(setq frame-title-format "emacs@%b")

;; Shell 使用 ansi color
(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

;; 使用Win下的选择习惯
;; 用shift+方向键进行选择
(pc-selection-mode)

;; 让Emacs可以直接打开和显示图片。 
(require 'thumbs) 
(auto-image-file-mode t)

;; 设置显示时间
(display-time-mode 1);;启用时间显示设置,在minibuffer上面的那个杠上
(setq display-time-24hr-format t);;时间使用24小时制
(setq display-time-day-and-date t);;时间显示包括日期和具体时间
(setq display-time-use-mail-icon t);;时间栏旁边启用邮件设置
(setq display-time-interval 10);;时间的变化频率

;; 取消滚动栏
;;(set-scroll-bar-mode nil)

;; 取消工具栏
;;(tool-bar-mode nil)

;; 设置打开文件的缺省路径
(setq default-directory "F:/")

;; 改变Emacs固执的要你回答 yes 的行为。按 y 或空格键表示 yes,n 表示 no
(fset 'yes-or-no-p 'y-or-n-p)

;; 不用TAB字符来indent, 这会引起很多奇怪的错误。编辑Makefile的时候也不用担心,因为 makefile-mode会把TAB键设置成真正的TAB字符,并且加亮显示的
(setq-default indent-tabs-mode nil)
(setq default-tab-width 8)
(setq tab-stop-list ())

;; 设置sentence-end可以识别中文标点。不用在 fill 时在句号后插入两个空格
(setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")
(setq sentence-end-double-space nil)

;; 光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线
;;(setq mouse-avoidance-mode 'animate)

;; 打开压缩文件时自动解压缩
(auto-compression-mode 1)

;; 在行首C-k时,同时删除该行
(setq-default kill-whole-line t)

;; 设定不产生备份文件
(setq make-backup-files nil)

;; 自动保存模式
(setq auto-save-mode nil)

;; 不生成临时文件
(setq-default make-backup-files nil)

;; 允许emacs和外部其他程序的粘贴
(setq x-select-enable-clipboard t)

;; 使用鼠标中键可以粘贴
;;(setq mouse-yank-at-point t)

;; 设置有用的个人信息,这在很多地方有用
(setq user-full-name "XXXXXX")
(setq user-mail-address "XXXXXX@163.com")

;; 自动的在文件末增加一新行
;;(setq require-final-newline t)

;; 设置home键指向buffer开头,end键指向buffer结尾
(global-set-key [home] 'beginning-of-buffer)
(global-set-key [end] 'end-of-buffer)

;; 调用Lisp扩展包
;; 加载ido.el
(require 'ido)
(ido-mode t)

;; 所见即所得做表格
(autoload 'table-insert "table" "WYGIWYS table editor")

;; C-F5, 设置编译命令; F5, 保存所有文件然后编译当前窗口文件
;; M-x gdb启动gdb, C-c C-n是Next line,C-c C-s是step in
(defun du-onekey-compile ()
  "Save buffers and start compile"
  (interactive)
  (save-some-buffers t)
  (switch-to-buffer-other-window "*compilation*")
  (compile compile-command))
  (global-set-key [C-f5] 'compile)
  (global-set-key [f5] 'du-onekey-compile)

;; F6设置为在Emacs中调用gdb
(global-set-key [f6] 'gdb)

;; C-F4, 设置跳到上一个错误,F4跳到下一个错误
(global-set-key [C-f4] 'previous-error)
(global-set-key [f4] 'next-error)

;; 目的是开一个shell的小buffer,用于更方便地测试程序(也就是运行程序了),我经常会用到。
;; F8就是另开一个buffer然后打开shell,C-f8则是在当前的buffer打开shell
(defun open-eshell-other-buffer ()
  "Open eshell in other buffer"
  (interactive)
  (split-window-vertically)
  (eshell))
(global-set-key [(f8)] 'open-eshell-other-buffer)
(global-set-key [C-f8] 'eshell)

;; 设置F9调用speedbar命令
;; 使用 n 和 p 可以上下移动,
;; + 展开目录或文件进行浏览,- 收缩,RET 访问目录或文件,g 更新 speedbar
(setq speedbar-show-unknown-files t);;可以显示所有目录以及文件
(setq dframe-update-speed nil);;不自动刷新,手动 g 刷新
(setq speedbar-update-flag nil)
;;(setq speedbar-use-images nil);;不使用 image 的方式
(setq speedbar-verbosity-level 0) 
(global-set-key [f9] 'speedbar)

;; 设置[C-f9]为调用dired命令
(global-set-key [C-f9] 'dired)
;; 让dired 可以递归的拷贝和删除目录
(setq dired-recursive-copies 'top)
(setq dired-recursive-deletes 'top)

;; 设置F10为撤销
;;(global-set-key [f10] 'undo)

;; 设置F11快捷键指定Emacs 的日历系统
;;(global-set-key [f11] 'calendar)

;; 设置F12 快速察看日程安排
;;(global-set-key [f12] 'list-bookmarks)

;; 设置时间戳,标识出最后一次保存文件的时间
(setq time-stamp-active t)
(setq time-stamp-warn-inactive t)
(setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S chunyu")

;; 设置C-g为goto-line
(global-set-key (kbd "C-g") 'goto-line)

;; 设置M-空格 来setmark了,这样我就不用按 C-@ 来 setmark 了, C-@ 很不好按
(global-set-key (kbd "M-<SPC>") 'set-mark-command)

;; 设置阴历显示,在 calendar 上用 pC 显示阴历
(setq calendar-remove-frame-by-deleting t)
(setq calendar-week-start-day 1)            ; 设置星期一为每周的第一天
(setq mark-diary-entries-in-calendar t)     ; 标记calendar上有diary的日期
(setq mark-holidays-in-calendar nil)        ; 为了突出有diary的日期,calendar上不标记节日
(setq view-calendar-holidays-initially nil) ; 打开calendar的时候不显示一堆节日

;; 去掉不关心的节日,设定自己在意的节日,在 calendar 上用 h 显示节日
(setq christian-holidays nil)
(setq hebrew-holidays nil)
(setq islamic-holidays nil)
(setq solar-holidays nil)
(setq general-holidays '((holiday-fixed 1 1 "元旦")
                         (holiday-fixed 2 14 "情人节")
                         (holiday-fixed 3 14 "白色情人节")
                         (holiday-fixed 4 1 "愚人节")
                         (holiday-fixed 5 1 "劳动节")
                         (holiday-float 5 0 2 "母亲节")
                         (holiday-fixed 6 1 "儿童节")
                         (holiday-float 6 0 3 "父亲节")
                         (holiday-fixed 7 1 "建党节")
                         (holiday-fixed 8 1 "建军节")
                         (holiday-fixed 9 10 "教师节")
                         (holiday-fixed 10 1 "国庆节")
                         (holiday-fixed 12 25 "圣诞节")))

;; Calendar模式支持各种方式来更改当前日期
;; (这里的“前”是指还没有到来的那一天,“后”是指已经过去的日子)
;;  q      退出calendar模式
;; C-f     让当前日期向前一天
;; C-b     让当前日期向后一天
;; C-n     让当前日期向前一周
;; C-p     让当前日期向后一周
;; M-}     让当前日期向前一个月
;; M-{     让当前日期向后一个月
;; C-x ]   让当前日期向前一年
;; C-x [   让当前日期向后一年
;; C-a     移动到当前周的第一天
;; C-e     移动到当前周的最后一天
;; M-a     移动到当前月的第一天
;; M-e     多动到当前月的最后一天
;; M-<     移动到当前年的第一天
;; M->     移动到当前年的最后一天

;; Calendar模式支持移动多种移动到特珠日期的方式
;; g d     移动到一个特别的日期
;;  o      使某个特殊的月分作为中间的月分
;;  .      移动到当天的日期
;; p d     显示某一天在一年中的位置,也显示本年度还有多少天。
;; C-c C-l 刷新Calendar窗口

;; Calendar支持生成LATEX代码。
;; t m     按月生成日历
;; t M     按月生成一个美化的日历
;; t d     按当天日期生成一个当天日历
;; t w 1   在一页上生成这个周的日历
;; t w 2   在两页上生成这个周的日历
;; t w 3   生成一个ISO-SYTLE风格的当前周日历
;; t w 4   生成一个从周一开始的当前周日历
;; t y     生成当前年的日历

;; EMACS Calendar支持配置节日:
;; h       显示当前的节日
;; x       定义当天为某个节日
;; u       取消当天已被定义的节日
;; e       显示所有这前后共三个月的节日。
;; M-x holiday  在另外的窗口的显示这前后三个月的节日。


;; 另外,还有一些特殊的,有意思的命令:
;; S       显示当天的日出日落时间(是大写的S)
;; p C     显示农历可以使用
;; g C     使用农历移动日期可以使用

;;========== CC-Mode配置 begin ==========

;; CC-mode配置  http://cc-mode.sourceforge.net/
;;(add-to-list 'load-path "~/lisp/cc-mode")
;;(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)

;; 我的C/C++语言编辑策略
(defun my-c-mode-common-hook()
  (setq tab-width 4 indent-tabs-mode nil)
  (c-toggle-auto-hungry-state 1)
  ;;按键定义
  (define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
  (define-key c-mode-base-map [(return)] 'newline-and-indent)
  ;;(define-key c-mode-base-map [(f5)] 'compile)
  (define-key c-mode-base-map [(meta \`)] 'c-indent-command)
  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)

;;预处理设置
  (setq c-macro-shrink-window-flag t)
  (setq c-macro-preprocessor "cpp")
  (setq c-macro-cppflags " ")
  (setq c-macro-prompt-flag t)
  (setq hs-minor-mode t)
  (setq abbrev-mode t)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

;; 我的C++语言编辑策略
(defun my-c++-mode-hook()
  (setq tab-width 4 indent-tabs-mode nil)
  (c-set-style "stroustrup")
)

;; 导入cedet
;;(load-file "~/lisp/cedet/common/cedet.el")
;; 配置Semantic的检索范围
(setq semanticdb-project-roots 
	  (list
        (expand-file-name "/")))
;;自定义自动补齐命令,如果在单词中间就补齐,否则就是tab
(defun my-indent-or-complete ()
   (interactive)
   (if (looking-at "\\>")
 	  (hippie-expand nil)
 	  (indent-for-tab-command))
 )
(global-set-key [(control tab)] 'my-indent-or-complete)
;; hippie的自动补齐策略,优先调用了senator的分析结果
(autoload 'senator-try-expand-semantic "senator")
(setq hippie-expand-try-functions-list
 	  '(
		senator-try-expand-semantic
		try-expand-dabbrev
		try-expand-dabbrev-visible
		try-expand-dabbrev-all-buffers
		try-expand-dabbrev-from-kill
		try-expand-list
		try-expand-list-all-buffers
		try-expand-line
                try-expand-line-all-buffers
                try-complete-file-name-partially
                try-complete-file-name
                try-expand-all-abbrevs
                try-complete-lisp-symbol-partially
                try-complete-lisp-symbol
                try-expand-whole-kill
        )
)

;; ========== CC-Mode配置 end ==========

;; 五笔输入法设置,用快捷键C-\ (同时按住 Ctrl和反斜线键)唤出五笔字型输入法了
;;(add-to-list 'load-path "~/lisp/wubi")
;;(require 'wubi)
;;(register-input-method "chinese-wubi" "Chinese-GB" 'quail-use-package "wubi" "wubi")
;;(wubi-load-local-phrases)
;;(setq default-input-method "chinese-wubi")
;; 设置快捷键,Ctrl-+来唤出add-wubi增加词组、Ctrl--来唤出del-wubi删除一个词组
;;(global-set-key [?\C-+] 'add-wubi)
;;(global-set-key [?\C--] 'del-wubi)

;; cscope设置,使用cscope浏览源代码
;;(add-to-list 'load-path  "~/lisp/cscope") ;; 将软件包所在的路径加到 EMACS的load-path
;;(require 'xcscope) ;; 加载相应的软件
;;C-c s a             设定初始化的目录,一般是你代码的根目录
;;C-s s I             对目录中的相关文件建立列表并进行索引
;;C-c s s             序找符号
;;C-c s g             寻找全局的定义
;;C-c s c             看看指定函数被哪些函数所调用
;;C-c s C             看看指定函数调用了哪些函数
;;C-c s e             寻找正则表达式
;;C-c s f             寻找文件
;;C-c s i             看看指定的文件被哪些文件include

;; tabbar设置
;;(add-to-list 'load-path  "~/lisp/tabbar")
;;(require 'tabbar)
;;(tabbar-mode)

;; ========== cedet设置 ==========

;;(add-to-list 'load-path "~/lisp/cedet/speedbar")
;;(add-to-list 'load-path "~/lisp/cedet/eieio")
;;(add-to-list 'load-path "~/lisp/cedet/semantic")
;;(add-to-list 'load-path "~/lisp/cedet/common")
;;(require 'cedet)

;;(add-to-list 'load-path "~/lisp/ecb")
;;(require 'ecb)

;; Ecb的操作:
;; C-c . g d 目录列表窗口
;; C-c . g s 源码窗口
;; C-c . g m 方法和变量窗口
;; C-c . g h 历史窗口
;; C-c . g l 最后选择过的编辑窗口
;; C-c . g 1 编辑窗口1
;; C-c . g n 编辑窗口n
;; C-c . l c 选择版面
;; C-c . l r 重画版面
;; C-c . l t 拴牢版面(锁定版面)
;; C-c . l w 拴牢可见的ecb窗口
;; C-c . \   拴牢编绎窗口

;; 其中l为小写字母(L),大家别看错!!

;; ========== cedet设置结束 ==========

;; emacs的默认compile命令是调用make -k,我把它改成了mingw32-make -f MakeFile。你也可以把它改成其他的,比如gcc之类的
(setq compile-command "mingw32-make -f MakeFile")

;; 把一个代码块缩起来,需要的时候再展开
(load-library "hideshow") 
(add-hook 'c-mode-hook 'hs-minor-mode)
(add-hook 'c++-mode-hook 'hs-minor-mode)
(add-hook 'java-mode-hook 'hs-minor-mode)
(add-hook 'perl-mode-hook 'hs-minor-mode)
(add-hook 'php-mode-hook 'hs-minor-mode)
(add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
;;  M-x              hs-minor-mode
;;  C-c @ ESC C-s    show all
;;  C-c @ ESC C-h    hide all
;;  C-c @ C-s        show block
;;  C-c @ C-h        hide block
;;  C-c @ C-c toggle hide/show

;;输入左边的括号,就会自动补全右边的部分.包括(), "", [] , {} , 等等
(defun my-c-mode-auto-pair ()
  (interactive)
  (make-local-variable 'skeleton-pair-alist)
  (setq skeleton-pair-alist  '(
    (?` ?` _ "''")
    (?\( ?  _ " )")
    (?\[ ?  _ " ]")
    (?{ \n > _ \n ?} >)))
  (setq skeleton-pair t)
  (local-set-key (kbd "(") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "{") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "`") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "[") 'skeleton-pair-insert-maybe))
(add-hook 'c-mode-hook 'my-c-mode-auto-pair)
(add-hook 'c++-mode-hook 'my-c-mode-auto-pair)
(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(ecb-options-version "2.32"))
(custom-set-faces
  ;; custom-set-faces was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 )
;;AUCTEX  2012-06-11
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
(setq TeX-auto-save t)
(setq TeX-parse-self t)
(setq-default TeX-master nil)