覺得這篇博文發表出來后,可能會引起一些爭議,很多人眼中Emacs已經太陳舊了,根本無法和自己心目中的IDE齊驅並駕,最開始接觸Emacs是在前年的這個時候,當時公司里面來了一群linux高人,當時還在做.NET的開發,天成的VS程序員看到了Emacs這個界面酷酷的編輯器悠然心動,最開始以為是VIM后來發現它叫Emacs。
我認為Emacs迷人的地方在於他的擴展性以及unix哲學的滲透,不重復造輪子,以強大的擴展性和unix環境融為一體。Emacs的配置比較繁瑣,研究起來也會話費大量的時間,但是他就像一個樂高玩具能拼湊出很多振奮人心的效果。
下面介紹一下我的配置文件,這個配置文件是從網絡上摘取的,由於沒有深入研究過Elisp所以可能配置中有些問題出現,如果您發現了問題我將非常感謝您的糾正
。

首先匯總一下我將要使用到的各種插件
1. auto-complete-1.3.1 http://cx4a.org/software/auto-complete/
2. cedet 1.0.1 http://cedet.sourceforge.net/
4. ecb 2.40 http://ecb.sourceforge.net/
5. yasnippet http://https://github.com/capitaomorte/yasnippet
6. auto-complete-clang.el http://https://github.com/brianjcj/auto-complete-clang/blame/master/auto-complete-clang.el
7. highlight symbol http://nschum.de/src/emacs/highlight-symbol/
8. tabbar http://emacswiki.org/emacs/tabbar.el
9. clang 根據自己的系統使用不同的命令安裝如ubuntu下 sudo apt-get install clang 或者到 http://clang.llvm.org/get_started.html 這里了解一下
10. cscope sudo apt-get install cscope
11. sudo apt-get install cscope-el
以上是原材料,請按照里面的ReadMe等文件或者網上的幫助進行安裝,安裝過程還是比較簡單的,有些插件直接復制到.emacs.d下就可以使用了但是如果編譯一下效果可能會好一些,我把這些插件全部都安裝到了~/.emacs.d/plugins/ 這個目錄下,現在開始配置emacs 編輯~/.emacs這個文件就可以配置emacs了, 如果沒有這個文件請手動創建一下,
點擊(此處)折疊或打開
- (add-to-list 'load-path' "~/.emacs.d/plugins")
首先我添加了emacs插件的加載路徑,大多數插件在這個目錄下面。
點擊(此處)折疊或打開
- ;;-------------------------------------------------------------
- ;;Auto complete
- ;;-------------------------------------------------------------
- (add-to-list 'load-path "~/.emacs.d/plugins/auto-complete-1.3.1/")
- (require 'auto-complete-config)
- (add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/auto-complete-1.3.1//ac-dict")
- (ac-config-default)
點擊(此處)折疊或打開
- ;;-------------------------------------------------------------
- ;;yasnippet
- ;;-------------------------------------------------------------
- (add-to-list 'load-path
- "~/.emacs.d/plugins/yasnippet")
- (require 'yasnippet)
- (yas/global-mode 1)
點擊(此處)折疊或打開
- (require 'auto-complete-clang)
- (setq ac-auto-start nil)
- (setq ac-quick-help-delay 0.5)
- (define-key ac-mode-map [(control tab)] 'auto-complete)
點擊(此處)折疊或打開
- (defun my-ac-config ()
- (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 "))
- (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
- (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
- (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
- (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
- (add-hook 'css-mode-hook 'ac-css-mode-setup)
- (add-hook 'auto-complete-mode-hook 'ac-common-setup)
- (global-auto-complete-mode t))
- (defun my-ac-cc-mode-setup ()
- (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
- (add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
- (my-ac-config)
點擊(此處)折疊或打開
- ;;-------------------------------------------------------------
- ;;language config
- ;;-------------------------------------------------------------
- (ansi-color-for-comint-mode-on)
- (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亂碼,好像沒作用
- ;;-------------------------------------------------------------
- ;;Common config
- ;;-------------------------------------------------------------
- (auto-image-file-mode t);打開圖片顯示功能
- (display-time-mode 1);顯示時間,格式如下
- (setq display-time-24hr-format t)
- (setq display-time-day-and-date t)
- (transient-mark-mode t);允許臨時設置標記
- (setq frame-title-format '("" buffer-file-name "@emacs" ));在標題欄顯示buffer名稱
- ;(setq default-fill-column 80);默認顯示 80列就換行
- (set-scroll-bar-mode nil) ; 取消滾動欄
- (tool-bar-mode nil) ; 取消工具欄
- (ido-mode t)
- (setq visible-bell t)
- (setq inhibit-startup-message t)
- (setq gnus-inhibit-startup-message t)
- (fset 'yes-or-no-p 'y-or-n-p)
- (setq mouse-yank-at-point t)
- (setq kill-ring-max 200)
- (setq auto-save-mode nil)
- (setq x-select-enable-clipboard t)
- (setq user-full-name "JamesChen")
- (setq user-mail-address "chenpengsmail@qq.com")
- (setq global-font-lock-mode t)
- (setq-default kill-whole-line t)
- (setq show-paren-mode t)
- (setq show-paren-style 'parenthesis)
- (setq mouse-avoidance-mode 'animate)
- (setq auto-image-file-mode t)
- (setq default-major-mode 'text-mode)
- ;;(add-hook 'text-mode-hook 'turn-on-auto-fill) ; 設置缺省主模式是text,,並進入auto-fill次模式.而不是基本模式fundamental-mode
- ;;(setq-default auto-fill-function 'do-auto-fill)
- (setq-default indent-tabs-mode nil)
- (setq default-tab-width 8)
- (setq tab-stop-list ())
- ;;不用 TAB 字符來indent, 這會引起很多奇怪的錯誤。編輯 Makefile 的時候也不用擔心,因為 makefile-mode 會把 TAB 鍵設置成真正的 TAB 字符,並且加亮顯示的。注:還沒搞清楚
- (setq column-number-mode t)
- (setq line-number-mode t) ; 顯示行號
- (setq display-time-24hr-format t)
- (setq display-time-day-and-date t)
- (display-time) ; 顯示時間
- (setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")
- (setq sentence-end-double-space nil) ; 設置 sentence-end 可以識別中文標點。不用在 fill 時在句號后插入兩個空格。
- (setq enable-recursive-minibuffers t) ; 可以遞歸的使用 minibuffer
- (setq scroll-margin 3 scroll-conservatively 10000)
- ;;防止頁面滾動時跳動, scroll-margin 3 可以在靠近屏幕邊沿3行時就開始滾動,可以很好的看到上下文。
- (setq track-eol t) ; 當光標在行尾上下移動的時候,始終保持在行尾。
- (setq Man-notify-method 'pushy) ; 當瀏覽 man page 時,直接跳轉到 man buffer。
- (setq next-line-add-newlines nil) ; Emacs 21 中已經是缺省設置。按 C-n 或向下鍵時不添加新行。
- (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)
- (setq time-stamp-active t)
- (setq time-stamp-warn-inactive t)
- (setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S JamesChen") ; 設置時間戳,標識出最后一次保存文件的時間。
- (setq dired-recursive-copies 'top)
- (setq dired-recursive-deletes 'top) ;讓 dired 可以遞歸的拷貝和刪除目錄。
- (setq gdb-many-windows t)
點擊(此處)折疊或打開
- ;;------------------------------------------------
- ;;cedet 安裝
- ;;------------------------------------------------
- (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
- (load-file "~/.emacs.d/plugins/cedet-1.0.1/common/cedet.el")
- (require 'cedet)
- ;;(semantic-load-enable-minimum-features)
- (semantic-load-enable-code-helpers)
- ;;(semantic-load-enable-guady-code-helpers)
- ;(semantic-load-enable-excessive-code-helpers)
- ;(semantic-load-enable-semantic-debugging-helpers)
- ;(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
- ;(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
- ;(define-key-after (lookup-key global-map [menu-bar tools])
- ; [speedbar]
- ; '("Speedbar" .
- ; speedbar-frame-mode)
- ; [calendar])
- ;; 指定semantic臨時文件的路徑,避免到處都是臨時文件
- (setq semanticdb-default-save-directory "~/backups/emacs/semantic")
- ;;;;C/C++語言啟動時自動加載semantic對/usr/include的索引數據庫
- (setq semanticdb-search-system-databases t)
- (add-hook 'c-mode-common-hook
- (lambda ()
- (setq semanticdb-project-system-databases
- (list (semanticdb-create-database
- semanticdb-new-database-class
- "/usr/include")))))
- (enable-visual-studio-bookmarks) ;開啟高亮書簽
- (require 'eassist nil 'noerror) ;開啟頭文件和源文件之間的跳轉功能
- (require 'semantic-tag-folding nil 'noerror) ;;使用semantic的代碼折疊功能
這里導入並配置了 cedet 這是一個強大的工具,提供了各式各樣的插件,各種高亮 跳轉后的高亮 代碼折疊 智能補全 等等。。。。 這里只開啟了比較基本的功能 因為這個插件有一個缺點就是非資源速度慢。。。 我沒有使用它的代碼補全功能 曾經使用過,感覺速度確實不太給力。
點擊(此處)折疊或打開
- ;;-----------------------------------------------------------------------
- ;;加載tabbar
- ;;-----------------------------------------------------------------------
- (require 'tabbar)
- (tabbar-mode)
- ;;-----------------------------------------------------------------------
- ;;加載xcscope
- ;;-----------------------------------------------------------------------
- (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
- ;;-----------------------------------------------------------------------
- ;;highlight-symbol
- ;;-----------------------------------------------------------------------
- (require 'highlight-symbol)
- ;;-----------------------------------------------------------------------
- ;;加載主題插件
- ;;-----------------------------------------------------------------------
- ;;COLOR_THEME
- (add-to-list 'load-path "~/.emacs.d/plugins/color-theme-6.6.0")
- (load-file "~/.emacs.d/plugins/color-theme-6.6.0/color-theme.el")
- (require 'color-theme)
- (color-theme-initialize)
- (color-theme-calm-forest)
- ;;-------------------------------------------------------------
- ;;set GDB config
- ;;-------------------------------------------------------------
- (setq gdb-use-separate-io-buffer t)
- ;;-------------------------------------------------------------
- ;;c / c++ config
- ;;-------------------------------------------------------------
- (defun my-c-mode-common-hook ()
- (setq default-tab-width 4)
- (setq tab-width 4)
- (setq c-basic-offset 4)
- (hs-minor-mode t)
- )
- (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
- (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
- ;; C語言設置
- (defun my-c-mode-hook ()
- (c-set-style "cc-mode"))
- (add-hook 'c-mode-hook 'my-c-mode-hook)
- ;; C++設置
- (defun my-c++-mode-hook ()
- (c-set-style "stroustrup"))
- (add-hook 'c++-mode-hook 'my-c++-mode-hook)
- (add-hook 'c-mode-hook 'my-c++-mode-hook)
- ;;--------------------------------------------------------------
- ;;bakup
- ;;--------------------------------------------------------------
- (setq auto-save-default nil) ;不生成 #filename# 文件
- (setq make-backup-files t) ;設定不產生備份文件
- (setq auto-save-mode nil) ;自動保存模式
- ;;(setq-default make-backup-files t) ; 不生成臨時文件
- (setq delete-old-versions t)
- (setq version-control 'never) ; 啟用版本控制,即可以備份多次
- (setq kept-old-versions 2) ; 備份最原始的版本兩次,及第一次編輯前的
- ; 文檔,和第二次編輯前的文檔
- (setq kept-new-versions 1) ; 備份最新的版本1次,理解同上
- (setq delete-old-versions t) ;刪掉不屬於以上3中版本的版本
- (setq backup-directory-alist '((" " . "~/backups/emacs/"))) ; 設置備份文件的路徑
- (setq backup-by-copying t) ;備份設置方法,直接拷貝
- ;; Emacs 中,改變文件時,默認都會產生備份文件(以 ~ 結尾的文件)。可以完
- ;; 全去掉
- ;; (並不可取),也可以制定備份的方式。這里采用的是,把所有的文件備份都
- ;; 放在一
- ;; 個固定的地方("~/backups")。對於每個備份文件,保留最原始的兩個版本和
- ;; 最新的
- ;; 1個版本。並且備份的時候,備份文件是復本,而不是原件。
開啟了 color-theme 並 選擇了 (color-theme-calm-forest)主題可以通過
color-theme-select命令選擇喜歡的主題 然后按d鍵將會自動幫你生成選擇此主題的elisp代碼
點擊(此處)折疊或打開
- ;;--------------------------------------------------------------
- ;;HOT KEY
- ;;--------------------------------------------------------------
- ;;保留F3、F4、F5、F6、F7、F8 for Xrefactory
- (global-set-key [f1] 'shell) ; 進入shell
- ;(global-set-key "\C-\;c" 'compile) ; 編譯
- ;(global-set-key "\C-\'d" 'gdb) ; 調試
- ;(global-set-key "\C-\'f" 'hs-hide-block) ; 折疊
- ;(global-set-key "\C-\'o" 'hs-show-block) ; 展開
- ;(global-set-key "\C-\'n" 'highlight-symbol-next) ; 查找下一個符號
- ;(global-set-key "\C-\'p" 'highlight-symbol-prev) ; 查找上一個符號
- ;(global-set-key "\C-\'h" 'highlight-symbol-at-point) ; 高亮所有
- ;(global-set-key "\C-\'u" 'highlight-symbol-remove-all) ; 取消高亮
- (global-set-key [(control f6)] 'highlight-symbol-at-point);;高亮所有當前符號
- (global-set-key [f6] 'highlight-symbol-next);;查找下一個當前符號
- (global-set-key [(meta f6)] 'highlight-symbol-prev);;查找上一個當前符號
- (global-set-key [(control shift f6)] 'highlight-symbol-remove-all);;去除所有高亮
- ;(define-key global-map "\M-pi" 'cscope-set-initial-directory)
- ;(define-key global-map "\M-pi" 'cscope-unset-initial-directory)
- ;(define-key global-map "\M-pi" 'cscope-find-this-symbol)
- ;(define-key global-map "\M-pi" 'cscope-find-global-definition)
- ;(define-key global-map [(control f7)] 'cscope-find-global-definition-no-prompting)
- ;(define-key global-map [(control f8)] 'cscope-pop-mark)
- ;(define-key global-map [(control f9)] 'cscope-next-symbol)
- ;(define-key global-map [(control f10)] 'cscope-next-file)
- ;(define-key global-map [(control f11)] 'cscope-prev-symbol)
- ;(define-key global-map [(control f12)] 'cscope-prev-file)
- ;(define-key global-map [(meta f9)] 'cscope-display-buffer)
- ;(define-key global-map [(meta f10)] 'cscope-display-buffer-toggle)
- (setq compile-command "make -f Makefile") ; 編譯
- (global-set-key [f9] 'compile) ; 編譯
- (global-set-key [C-f9] 'gdb) ; 調試
- (global-set-key (kbd "M-\[") 'hs-hide-block) ; 隱藏塊
- (global-set-key (kbd "M-\]") 'hs-show-block) ; 顯示塊
- (global-set-key [C-f11] 'comment-or-uncomment-region) ; 注釋 / 取消注釋
- ;;(global-set-key [f7] 'c-indent-line-or-region) ; 格式化代碼
- (global-set-key [C-tab] 'other-window) ; 切換窗口
- (global-set-key [M-return] 'delete-other-windows) ; 關閉其他窗
- (global-set-key (kbd "C-x C-b") 'ibuffer);; 顯示buffer列表
- (global-set-key "\C-x\C-j" 'dired-jump);; 跳轉到當前目錄的Dired
- ;(global-set-key "\C-xj"
- ;'jump-to-register);; 跳轉到寄
- ;存器指定的位置
- (global-set-key (kbd "S-<SPC>") 'set-mark-command) ;用shift+space 來
- ;setmark 了, C-@ 很不好按。
- ;(global-set-key "\C-xg"
- ;'cscope-find-global-definition-no-prompting)
- ;;; 跳轉到全局定義
- (global-set-key [C-=] 'my-indent-or-complete) ;自動補全或縮進
- (global-set-key "\C-xk" 'kill-this-buffer) ; 關閉當前buffer
- (global-set-key "\C-\\" 'auto-complete)
- (global-set-key (kbd "S-<up>") 'tabbar-backward-group)
- (global-set-key (kbd "S-<down>") 'tabbar-forward-group)
- (global-set-key (kbd "S-<left>") 'tabbar-backward)
- (global-set-key (kbd "S-<right>") 'tabbar-forward)
- (global-set-key [f12] 'semantic-ia-fast-jump) ; 智能跳轉 跳轉到定義
- (global-set-key [M-S-f12] 'semantic-analyze-proto-impl-toggle) ;在函數的聲明和實現之間來回跳轉
- (global-set-key [M-f12] 'eassist-switch-h-cpp) ;頭文件和源文件之間跳轉的快捷鍵
- ;;文本界面下禁用此代碼折疊
- (when (and window-system (require 'semantic-tag-folding nil 'noerror))
- (global-semantic-tag-folding-mode 1)
- (global-set-key (kbd "C-?") 'global-semantic-tag-folding-mode)
- (define-key semantic-tag-folding-mode-map (kbd "C-c , -") 'semantic-tag-folding-fold-block)
- (define-key semantic-tag-folding-mode-map (kbd "C-c , +") 'semantic-tag-folding-show-block)
- (define-key semantic-tag-folding-mode-map (kbd "C-_") 'semantic-tag-folding-fold-all)
- (define-key semantic-tag-folding-mode-map (kbd "C-+") 'semantic-tag-folding-show-all))
