Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50326
  • 博文数量: 5
  • 博客积分: 83
  • 博客等级: 民兵
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-03 10:07
文章分类

全部博文(5)

文章存档

2013年(1)

2012年(4)

我的朋友

分类: LINUX

2012-05-03 10:53:06

    觉得这篇博文发表出来后,可能会引起一些争议,很多人眼中Emacs已经太陈旧了,根本无法和自己心目中的IDE齐驱并驾,最开始接触Emacs是在前年的这个时候,当时公司里面来了一群linux高人,当时还在做.NET的开发,天成的VS程序员看到了Emacs这个界面酷酷的编辑器悠然心动,最开始以为是VIM后来发现它叫Emacs。
    我认为Emacs迷人的地方在于他的扩展性以及unix哲学的渗透,不重复造轮子,以强大的扩展性和unix环境融为一体。Emacs的配置比较繁琐,研究起来也会话费大量的时间,但是他就像一个乐高玩具能拼凑出很多振奋人心的效果。
    下面介绍一下我的配置文件,这个配置文件是从网络上摘取的,由于没有深入研究过Elisp所以可能配置中有些问题出现,如果您发现了问题我将非常感谢您的纠正



首先汇总一下我将要使用到的各种插件
1. auto-complete-1.3.1  
2. cedet 1.0.1          
3. color-theme 6.6.0    
4. ecb 2.40             
5. yasnippet            
6. auto-complete-clang.el  

7. highlight symbol    
8. tabbar              
9. clang 根据自己的系统使用不同的命令安装如ubuntu下 sudo apt-get install clang 或者到   这里了解一下

10. cscope sudo apt-get install cscope
11. sudo apt-get install cscope-el 

以上是原材料,请按照里面的ReadMe等文件或者网上的帮助进行安装,安装过程还是比较简单的,有些插件直接复制到.emacs.d下就可以使用了但是如果编译一下效果可能会好一些,我把这些插件全部都安装到了~/.emacs.d/plugins/ 这个目录下,现在开始配置emacs 编辑~/.emacs这个文件就可以配置emacs了, 如果没有这个文件请手动创建一下,




点击(此处)折叠或打开

  1. (add-to-list 'load-path' "~/.emacs.d/plugins")
首先我添加了emacs插件的加载路径,大多数插件在这个目录下面。



点击(此处)折叠或打开

  1. ;;-------------------------------------------------------------
  2. ;;Auto complete
  3. ;;-------------------------------------------------------------
  4. (add-to-list 'load-path "~/.emacs.d/plugins/auto-complete-1.3.1/")
  5. (require 'auto-complete-config)
  6. (add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/auto-complete-1.3.1//ac-dict")
  7. (ac-config-default)
然后载入了AutoComplete 这里的配置在用emacs M-x -》 load-file =》.../auto-complete-1.3.1/etc/install.el 后会给出一个正确的配置,一般使用这个即可




点击(此处)折叠或打开

  1. ;;-------------------------------------------------------------
  2. ;;yasnippet
  3. ;;-------------------------------------------------------------
  4. (add-to-list 'load-path
  5. "~/.emacs.d/plugins/yasnippet")
  6. (require 'yasnippet)
  7. (yas/global-mode 1)
载入yasnippet 这是一个模板补全工具 简单来说 for【tab】 就会自动帮你补全出一个for的大概结构,支持自定义模板。





点击(此处)折叠或打开

  1. (require 'auto-complete-clang)
  2. (setq ac-auto-start nil)
  3. (setq ac-quick-help-delay 0.5)
  4. (define-key ac-mode-map [(control tab)] 'auto-complete)
载入auto complete clang 可以使用clang当做语法解释器给Auto complete使用



点击(此处)折叠或打开

  1. (defun my-ac-config ()
  2. (setq ac-clang-flags (split-string "-I/usr/include -I/usr/local/include -I/usr/include/c++/4.6 -I/home/cc/Documents/trunk/tools/x86/cppunit/include -I/home/cc/Documents/trunk/tools/x86/TinyXML -I/home/cc/Documents/trunk/tools/x86/libpcap-1.2.1/build/include -I/home/cc/Documents/trunk/Utility/Header -I/home/cc/Documents/trunk/Comm/Header "))
  3. (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
  4. (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
  5. (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
  6. (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
  7. (add-hook 'css-mode-hook 'ac-css-mode-setup)
  8. (add-hook 'auto-complete-mode-hook 'ac-common-setup)
  9. (global-auto-complete-mode t))
  10. (defun my-ac-cc-mode-setup ()
  11. (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
  12. (add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
  13. (my-ac-config)
然后紧接着对补全模式进行配置,在第2行配置了要扫描的头文件的路径,补全的时候会根据这些文件中的符号进行补全,下面的add-hook 如果不需要可以去掉




点击(此处)折叠或打开

  1. ;;-------------------------------------------------------------
  2. ;;language config
  3. ;;-------------------------------------------------------------
  4. (ansi-color-for-comint-mode-on)
  5. (set-language-environment 'Chinese-GB)
  6. (set-keyboard-coding-system 'utf-8)
  7. (set-clipboard-coding-system 'utf-8)
  8. (set-terminal-coding-system 'utf-8)
  9. (set-buffer-file-coding-system 'utf-8)
  10. (set-default-coding-systems 'utf-8)
  11. (set-selection-coding-system 'utf-8)
  12. (modify-coding-system-alist 'process "*" 'utf-8)
  13. (setq default-process-coding-system '(utf-8 . utf-8))
  14. (setq-default pathname-coding-system 'utf-8)
  15. (set-file-name-coding-system 'utf-8)
  16. (setq ansi-color-for-comint-mode t) ;;处理shell-mode乱码,好像没作用
  17. ;;-------------------------------------------------------------
  18. ;;Common config
  19. ;;-------------------------------------------------------------
  20. (auto-image-file-mode t);打开图片显示功能
  21. (display-time-mode 1);显示时间,格式如下
  22. (setq display-time-24hr-format t)
  23. (setq display-time-day-and-date t)
  24. (transient-mark-mode t);允许临时设置标记
  25. (setq frame-title-format '("" buffer-file-name "@emacs" ));在标题栏显示buffer名称
  26. ;(setq default-fill-column 80);默认显示 80列就换行
  27. (set-scroll-bar-mode nil) ; 取消滚动栏
  28. (tool-bar-mode nil) ; 取消工具栏
  29. (ido-mode t)
  30. (setq visible-bell t)
  31. (setq inhibit-startup-message t)
  32. (setq gnus-inhibit-startup-message t)
  33. (fset 'yes-or-no-p 'y-or-n-p)
  34. (setq mouse-yank-at-point t)
  35. (setq kill-ring-max 200)
  36. (setq auto-save-mode nil)
  37. (setq x-select-enable-clipboard t)
  38. (setq user-full-name "JamesChen")
  39. (setq user-mail-address "chenpengsmail@qq.com")
  40. (setq global-font-lock-mode t)
  41. (setq-default kill-whole-line t)
  42. (setq show-paren-mode t)
  43. (setq show-paren-style 'parenthesis)
  44. (setq mouse-avoidance-mode 'animate)
  45. (setq auto-image-file-mode t)
  46. (setq default-major-mode 'text-mode)
  47. ;;(add-hook 'text-mode-hook 'turn-on-auto-fill) ; 设置缺省主模式是text,,并进入auto-fill次模式.而不是基本模式fundamental-mode
  48. ;;(setq-default auto-fill-function 'do-auto-fill)
  49. (setq-default indent-tabs-mode nil)
  50. (setq default-tab-width 8)
  51. (setq tab-stop-list ())
  52. ;;不用 TAB 字符来indent, 这会引起很多奇怪的错误。编辑 Makefile 的时候也不用担心,因为 makefile-mode 会把 TAB 键设置成真正的 TAB 字符,并且加亮显示的。注:还没搞清楚
  53. (setq column-number-mode t)
  54. (setq line-number-mode t) ; 显示行号
  55. (setq display-time-24hr-format t)
  56. (setq display-time-day-and-date t)
  57. (display-time) ; 显示时间
  58. (setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")
  59. (setq sentence-end-double-space nil) ; 设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。
  60. (setq enable-recursive-minibuffers t) ; 可以递归的使用 minibuffer
  61. (setq scroll-margin 3 scroll-conservatively 10000)
  62. ;;防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
  63. (setq track-eol t) ; 当光标在行尾上下移动的时候,始终保持在行尾。
  64. (setq Man-notify-method 'pushy) ; 当浏览 man page 时,直接跳转到 man buffer。
  65. (setq next-line-add-newlines nil) ; Emacs 21 中已经是缺省设置。按 C-n 或向下键时不添加新行。
  66. (setq speedbar-show-unknown-files t);;可以显示所有目录以及文件
  67. (setq dframe-update-speed nil);;不自动刷新,手动 g 刷新
  68. (setq speedbar-update-flag nil)
  69. (setq speedbar-use-images nil);;不使用 image 的方式
  70. (setq speedbar-verbosity-level 0)
  71. (setq time-stamp-active t)
  72. (setq time-stamp-warn-inactive t)
  73. (setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S JamesChen") ; 设置时间戳,标识出最后一次保存文件的时间。
  74. (setq dired-recursive-copies 'top)
  75. (setq dired-recursive-deletes 'top) ;让 dired 可以递归的拷贝和删除目录。
  76. (setq gdb-many-windows t)
这里是我对emacs的一些配置大多数收集自网络





点击(此处)折叠或打开

  1. ;;------------------------------------------------
  2. ;;cedet 安装
  3. ;;------------------------------------------------
  4. (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
  5. (load-file "~/.emacs.d/plugins/cedet-1.0.1/common/cedet.el")
  6. (require 'cedet)
  7. ;;(semantic-load-enable-minimum-features)
  8. (semantic-load-enable-code-helpers)
  9. ;;(semantic-load-enable-guady-code-helpers)
  10. ;(semantic-load-enable-excessive-code-helpers)
  11. ;(semantic-load-enable-semantic-debugging-helpers)
  12. ;(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
  13. ;(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
  14. ;(define-key-after (lookup-key global-map [menu-bar tools])
  15. ; [speedbar]
  16. ; '("Speedbar" .
  17. ; speedbar-frame-mode)
  18. ; [calendar])
  19. ;; 指定semantic临时文件的路径,避免到处都是临时文件
  20. (setq semanticdb-default-save-directory "~/backups/emacs/semantic")
  21. ;;;;C/C++语言启动时自动加载semantic对/usr/include的索引数据库
  22. (setq semanticdb-search-system-databases t)
  23. (add-hook 'c-mode-common-hook
  24. (lambda ()
  25. (setq semanticdb-project-system-databases
  26. (list (semanticdb-create-database
  27. semanticdb-new-database-class
  28. "/usr/include")))))
  29. (enable-visual-studio-bookmarks) ;开启高亮书签
  30. (require 'eassist nil 'noerror) ;开启头文件和源文件之间的跳转功能
  31. (require 'semantic-tag-folding nil 'noerror) ;;使用semantic的代码折叠功能


这里导入并配置了 cedet 这是一个强大的工具,提供了各式各样的插件,各种高亮 跳转后的高亮 代码折叠 智能补全 等等。。。。 这里只开启了比较基本的功能 因为这个插件有一个缺点就是非资源速度慢。。。 我没有使用它的代码补全功能 曾经使用过,感觉速度确实不太给力。






点击(此处)折叠或打开

  1. ;;-----------------------------------------------------------------------
  2. ;;加载tabbar
  3. ;;-----------------------------------------------------------------------
  4. (require 'tabbar)
  5. (tabbar-mode)
  6. ;;-----------------------------------------------------------------------
  7. ;;加载xcscope
  8. ;;-----------------------------------------------------------------------
  9. (require 'xcscope)
  10. ;; C-c s a 设定初始化的目录,一般是你代码的根目录
  11. ;; C-s s I 对目录中的相关文件建立列表并进行索引
  12. ;; C-c s s 序找符号
  13. ;; C-c s g 寻找全局的定义
  14. ;; C-c s c 看看指定函数被哪些函数所调用
  15. ;; C-c s C 看看指定函数调用了哪些函数
  16. ;; C-c s e 寻找正则表达式
  17. ;; C-c s f 寻找文件
  18. ;; C-c s i 看看指定的文件被哪些文件include
  19. ;;-----------------------------------------------------------------------
  20. ;;highlight-symbol
  21. ;;-----------------------------------------------------------------------
  22. (require 'highlight-symbol)
  23. ;;-----------------------------------------------------------------------
  24. ;;加载主题插件
  25. ;;-----------------------------------------------------------------------
  26. ;;COLOR_THEME
  27. (add-to-list 'load-path "~/.emacs.d/plugins/color-theme-6.6.0")
  28. (load-file "~/.emacs.d/plugins/color-theme-6.6.0/color-theme.el")
  29. (require 'color-theme)
  30. (color-theme-initialize)
  31. (color-theme-calm-forest)
  32. ;;-------------------------------------------------------------
  33. ;;set GDB config
  34. ;;-------------------------------------------------------------
  35. (setq gdb-use-separate-io-buffer t)
  36. ;;-------------------------------------------------------------
  37. ;;c / c++ config
  38. ;;-------------------------------------------------------------
  39. (defun my-c-mode-common-hook ()
  40. (setq default-tab-width 4)
  41. (setq tab-width 4)
  42. (setq c-basic-offset 4)
  43. (hs-minor-mode t)
  44. )
  45. (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
  46. (load-library "hideshow")
  47. (add-hook 'c-mode-hook 'hs-minor-mode)
  48. (add-hook 'c++-mode-hook 'hs-minor-mode)
  49. (add-hook 'java-mode-hook 'hs-minor-mode)
  50. (add-hook 'perl-mode-hook 'hs-minor-mode)
  51. (add-hook 'php-mode-hook 'hs-minor-mode)
  52. (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
  53. ;;能把一个代码块缩起来,需要的时候再展开
  54. ;; M-x hs-minor-mode
  55. ;; C-c @ ESC C-s show all
  56. ;; C-c @ ESC C-h hide all
  57. ;; C-c @ C-s show block
  58. ;; C-c @ C-h hide block
  59. ;; C-c @ C-c toggle hide/show
  60. ;; C语言设置
  61. (defun my-c-mode-hook ()
  62. (c-set-style "cc-mode"))
  63. (add-hook 'c-mode-hook 'my-c-mode-hook)
  64. ;; C++设置
  65. (defun my-c++-mode-hook ()
  66. (c-set-style "stroustrup"))
  67. (add-hook 'c++-mode-hook 'my-c++-mode-hook)
  68. (add-hook 'c-mode-hook 'my-c++-mode-hook)
  69. ;;--------------------------------------------------------------
  70. ;;bakup
  71. ;;--------------------------------------------------------------
  72. (setq auto-save-default nil) ;不生成 #filename# 文件
  73. (setq make-backup-files t) ;设定不产生备份文件
  74. (setq auto-save-mode nil) ;自动保存模式
  75. ;;(setq-default make-backup-files t) ; 不生成临时文件
  76. (setq delete-old-versions t)
  77. (setq version-control 'never) ; 启用版本控制,即可以备份多次
  78. (setq kept-old-versions 2) ; 备份最原始的版本两次,及第一次编辑前的
  79. ; 文档,和第二次编辑前的文档
  80. (setq kept-new-versions 1) ; 备份最新的版本1次,理解同上
  81. (setq delete-old-versions t) ;删掉不属于以上3中版本的版本
  82. (setq backup-directory-alist '((" " . "~/backups/emacs/"))) ; 设置备份文件的路径
  83. (setq backup-by-copying t) ;备份设置方法,直接拷贝
  84. ;; Emacs 中,改变文件时,默认都会产生备份文件(以 ~ 结尾的文件)。可以完
  85. ;; 全去掉
  86. ;; (并不可取),也可以制定备份的方式。这里采用的是,把所有的文件备份都
  87. ;; 放在一
  88. ;; 个固定的地方("~/backups")。对于每个备份文件,保留最原始的两个版本和
  89. ;; 最新的
  90. ;; 1个版本。并且备份的时候,备份文件是复本,而不是原件。
这里导入了一下琐碎的插件 xcscope 是一个跳转工具,可以再代码定义见和头文件间进行跳转
开启了 color-theme 并 选择了 (color-theme-calm-forest)主题可以通过
color-theme-select命令选择喜欢的主题 然后按d键将会自动帮你生成选择此主题的elisp代码





点击(此处)折叠或打开

  1. ;;--------------------------------------------------------------
  2. ;;HOT KEY
  3. ;;--------------------------------------------------------------
  4. ;;保留F3、F4、F5、F6、F7、F8 for Xrefactory
  5. (global-set-key [f1] 'shell) ; 进入shell
  6. ;(global-set-key "\C-\;c" 'compile) ; 编译
  7. ;(global-set-key "\C-\'d" 'gdb) ; 调试
  8. ;(global-set-key "\C-\'f" 'hs-hide-block) ; 折叠
  9. ;(global-set-key "\C-\'o" 'hs-show-block) ; 展开
  10. ;(global-set-key "\C-\'n" 'highlight-symbol-next) ; 查找下一个符号
  11. ;(global-set-key "\C-\'p" 'highlight-symbol-prev) ; 查找上一个符号
  12. ;(global-set-key "\C-\'h" 'highlight-symbol-at-point) ; 高亮所有
  13. ;(global-set-key "\C-\'u" 'highlight-symbol-remove-all) ; 取消高亮
  14. (global-set-key [(control f6)] 'highlight-symbol-at-point);;高亮所有当前符号
  15. (global-set-key [f6] 'highlight-symbol-next);;查找下一个当前符号
  16. (global-set-key [(meta f6)] 'highlight-symbol-prev);;查找上一个当前符号
  17. (global-set-key [(control shift f6)] 'highlight-symbol-remove-all);;去除所有高亮
  18. ;(define-key global-map "\M-pi" 'cscope-set-initial-directory)
  19. ;(define-key global-map "\M-pi" 'cscope-unset-initial-directory)
  20. ;(define-key global-map "\M-pi" 'cscope-find-this-symbol)
  21. ;(define-key global-map "\M-pi" 'cscope-find-global-definition)
  22. ;(define-key global-map [(control f7)] 'cscope-find-global-definition-no-prompting)
  23. ;(define-key global-map [(control f8)] 'cscope-pop-mark)
  24. ;(define-key global-map [(control f9)] 'cscope-next-symbol)
  25. ;(define-key global-map [(control f10)] 'cscope-next-file)
  26. ;(define-key global-map [(control f11)] 'cscope-prev-symbol)
  27. ;(define-key global-map [(control f12)] 'cscope-prev-file)
  28. ;(define-key global-map [(meta f9)] 'cscope-display-buffer)
  29. ;(define-key global-map [(meta f10)] 'cscope-display-buffer-toggle)
  30. (setq compile-command "make -f Makefile") ; 编译
  31. (global-set-key [f9] 'compile) ; 编译
  32. (global-set-key [C-f9] 'gdb) ; 调试
  33. (global-set-key (kbd "M-\[") 'hs-hide-block) ; 隐藏块
  34. (global-set-key (kbd "M-\]") 'hs-show-block) ; 显示块
  35. (global-set-key [C-f11] 'comment-or-uncomment-region) ; 注释 / 取消注释
  36. ;;(global-set-key [f7] 'c-indent-line-or-region) ; 格式化代码
  37. (global-set-key [C-tab] 'other-window) ; 切换窗口
  38. (global-set-key [M-return] 'delete-other-windows) ; 关闭其他窗
  39. (global-set-key (kbd "C-x C-b") 'ibuffer);; 显示buffer列表
  40. (global-set-key "\C-x\C-j" 'dired-jump);; 跳转到当前目录的Dired
  41. ;(global-set-key "\C-xj"
  42. ;'jump-to-register);; 跳转到寄
  43. ;存器指定的位置
  44. (global-set-key (kbd "S-") 'set-mark-command) ;用shift+space 来
  45. ;setmark 了, C-@ 很不好按。
  46. ;(global-set-key "\C-xg"
  47. ;'cscope-find-global-definition-no-prompting)
  48. ;;; 跳转到全局定义
  49. (global-set-key [C-=] 'my-indent-or-complete) ;自动补全或缩进
  50. (global-set-key "\C-xk" 'kill-this-buffer) ; 关闭当前buffer
  51. (global-set-key "\C-\\" 'auto-complete)
  52. (global-set-key (kbd "S-") 'tabbar-backward-group)
  53. (global-set-key (kbd "S-") 'tabbar-forward-group)
  54. (global-set-key (kbd "S-") 'tabbar-backward)
  55. (global-set-key (kbd "S-") 'tabbar-forward)
  56. (global-set-key [f12] 'semantic-ia-fast-jump) ; 智能跳转 跳转到定义
  57. (global-set-key [M-S-f12] 'semantic-analyze-proto-impl-toggle) ;在函数的声明和实现之间来回跳转
  58. (global-set-key [M-f12] 'eassist-switch-h-cpp) ;头文件和源文件之间跳转的快捷键
  59. ;;文本界面下禁用此代码折叠
  60. (when (and window-system (require 'semantic-tag-folding nil 'noerror))
  61. (global-semantic-tag-folding-mode 1)
  62. (global-set-key (kbd "C-?") 'global-semantic-tag-folding-mode)
  63. (define-key semantic-tag-folding-mode-map (kbd "C-c , -") 'semantic-tag-folding-fold-block)
  64. (define-key semantic-tag-folding-mode-map (kbd "C-c , +") 'semantic-tag-folding-show-block)
  65. (define-key semantic-tag-folding-mode-map (kbd "C-_") 'semantic-tag-folding-fold-all)
  66. (define-key semantic-tag-folding-mode-map (kbd "C-+") 'semantic-tag-folding-show-all))
最后绑定了常用的快捷键,emacs的快捷键绑定一直让我有点吃不消 ,谁有好帖子可以推荐一下呢,请原谅这里风格的不不统一 


阅读(16766) | 评论(6) | 转发(4) |
给主人留下些什么吧!~~

devafree2013-01-10 18:53:25

自动补齐功能总是无法生效,逐一排查后发现问题好像是出在了yasnippet上,换成老一点yasnippet-0.6.1c.tar.bz2就OK了(虚拟机PC环境:suse linux 10.1)

anonymous_chars2012-12-16 20:31:02

不不,emacs在我们这种喜欢折腾的人眼中永远不会陈旧,因为这是一种哲学与信仰,尽管现在已经有了很多的成熟功能强大的IDE了,
如用一些脚本语言(ruby/python/javascript),我会用ctags加hippie-expand.

JamesChen19882012-06-13 14:54:26

☆彼岸★花开: linux下写C/C++程序用vim好还是emacs方便?.....
看习惯吧应该是  VIM貌似较多 但是Emacs个人感觉插件比较灵活

JamesChen19882012-05-07 08:58:04

☆彼岸★花开: linux下写C/C++程序用vim好还是emacs方便?.....
看自己喜欢吧  我觉得vim更轻量级,有很多插件也有VIM版本 比如 Clang 的那个,Emacs的Elisp比较好玩而且插件似乎更多一些

☆彼岸★花开2012-05-06 10:42:12

linux下写C/C++程序用vim好还是emacs方便?