我的emacs外掛程式:
http://pan.baidu.com/share/link?shareid=4196458904&uk=3708780105
說明:
1.為什麼使用emacs和vim而不使用IDE?
大牛隻用這兩種工具,我等弱渣純屬裝比。
2.為什麼棄vim而使用emacs ?
聽說用vim的人JJ短,用emacs的人JJ長,所以我用emacs.
(emacs和vim沒有誰好誰差,完全是個人喜好,只有吊絲才會爭論好壞,就像爭論win與linux的人一樣,你說win好,惜大牛及專業人士不用,他說linux好,有本事他賣出去啊。程式員的人生時間匆匆,陌生的人,路遇emacs與vim相爭者,語言優劣相爭者,技術與銷售相爭者,公知與五毛相爭者,皆不可與其謀事,糾與小節而不休,思於嘴辯而不實,皆市井小民而非謀大事之人也)
3.本文對emacs的說明有
-emacs如何載入設定檔。
-emacs設定檔如何書寫與組織
-emacs的基本常規設定
-emacs的外掛程式擴充配置說明
-emacs開發環境配置
4.本文不會講解emacs使用操作和lisp編程
閑話少說,入正題
一.emacs如何載入設定檔
Emacs的核心部分是一個emacs lisp解譯器,emacs lisp是lisp的一種方言版本。對emacs進行配置,其實就是lisp解譯器對emacs lisp設定檔進行解釋。而我們對emacs進行配置其實就是書寫emacs lisp設定檔。所有的emacs設定檔都以.el為尾碼(emacs lisp簡寫).emacs在“/home/你的使用者名稱/”下有一個統一的設定檔.emacs,一般用於放置一些基本的配置內容和對其他設定檔的路徑引用。
Emacs初始設定檔案 (Init file)
Emacs啟動的時候通常會嘗試從初始設定檔案中載入解釋一系列Lisp程式。Emacs會尋找~/.emacs,~/.emacs.el或者~/.emacs.d/init.el之一 (el實際上就是Emacs Lisp的縮寫)。Emacs還可以有一個預設的初始設定檔案default.el,可以位於Emacs的任何標準的庫搜尋目錄下,其中Emacs的庫搜尋目錄由load-path變數定義。除此之外,Emacs還可以有一個對所有使用者都有效通用設定檔 (site-wide startup file),稱為site-start.el,也可以位於Emacs的任何標準的庫搜尋目錄下。如果想要知道load-path的內容,可以在Emacs的*scratch*緩衝區中輸入(print
load-path)
,然後在將游標移至右括弧後,使用快速鍵C-j (M-x eval-print-last-sexp) 來執行這條語句,就可以在當前緩衝區中列印出load-path的內容。
Emacs載入這些設定檔的順序為:site-start.el,初始設定檔案,最後才是預設的初始設定檔案default.el。Emacs啟動時,可以使用-q或–no-init-file選項來阻止Emacs載入初始設定檔案;如果初始設定檔案中將inhibit-default-init設定為t,那麼Emacs不會載入default.el;最後,可以使用–no-site-file來阻止Emacs載入通用設定檔。
二.emacs設定檔的書寫與組織
編寫emacs設定檔就是編寫emacs lisp檔案,文法遵循lisp語言, 而通常大多數配置選項為(emacs變數 emacs樣式)
如這種形式 (emacs variable emacs face)
常見的emacs variable有set-background-color,set-foreground-color,column-number-mode。。。等等,他們都代表特定的emacs屬性樣式,後面的是設定的值。
例如:
(global-linum-mode 'linum-mode) ;;auto show row-num (partial-completion-mode 1) ;;use partial-completion (icomplete-mode 1) ;;use complete-completion (display-time-mode 1);;
其中;;為注釋符號,也可以用'來注釋。
所有的emacs設定檔中,只有.emacs不以.el為尾碼,但它也是被以emacs lisp檔案來解釋的。可以把各種功能的配置寫成獨立的el檔案,然後在其他檔案中相互包含,最後在.emacs設定檔中包含這些el檔案。即若在a.el中包含b.el,只需在.emacs中包含a.el即可,與c語言中include一樣
按照一般的習慣,.emacs檔案中一般不會放太多的設定資訊,一般放一些emacs的搜尋路徑的資訊。
以我的配置為例,.emacs放置在/home/fenice/下,而其他el檔案放在/home/fenice/.emacs.d/lisps/_emacs中。
因此首先要添加一個emacs的搜尋路徑
;;add plugin to emacs
;;設定外掛程式載入路徑
;;plugin directory ~/.emacs.d/lisp/_emacs/
(add-to-list 'load-path "~/.emacs.d/lisp/_emacs/")
將別人寫好的外掛程式也可以添加到路徑,例如
;;;; 添加Emacs搜尋路徑 (add-to-list 'load-path "~/.emacs.d/lisps/_emacs") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/install/ecb-2.40") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/codepilot") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/emacs-eclim") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/icicles") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/gnuserv") (add-to-list 'load-path "~/.emacs.d/lisps/_emacs/install/cedet-1.0/common")
添加搜尋路徑後需要包含檔案才能在emacs啟動時載入
例如包含xxx.el檔案,可以(require 'xxx)或者(load "xxx.el")
三.emacs基本常規設定
大家可以下載我的設定檔,基本設定放在/home/fenice/.emacs.d/lisps/_emacs/base.el中,即檔案夾的_emacs下的base.el
;;=======================================================================;;Author:kevin_samuel(孫俊彥);;Date:2013-7-30;;Update Date:2013-7-30;;=======================================================================;;設定字型,預設是Monospace;;set-defalut-font;;(set-default-font "Monospace")(set-default-font "-unknown-DejaVu Sans Mono-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1") ;;個人感覺Mono系字型適合程式(對普通青年)
;;custom-set-variables;;set-color(set-background-color "black") ;;use black-ground(set-foreground-color "white") ;;use white-fore(set-face-foreground 'region "green") ;;(set-face-background 'region "blue") ;;
;;===============================================================;;外觀設定;;===============================================================;; 去掉捲軸(set-scroll-bar-mode nil);;關閉開啟畫面(setq inhibit-startup-message t);;禁用工具列(tool-bar-mode nil);;禁用功能表列;;(menu-bar-mode nil);;remove alert-bell(mouse-wheel-mode t)(global-linum-mode 'linum-mode);;auto show row-num;;自動載入行號(partial-completion-mode 1);;use partial-completion(icomplete-mode 1);;use complete-completion;; 高亮當前行;;(require 'hl-line-settings);; 可以把游標由方塊變成一個小長條;;(require 'bar-cursor);;======================================================================;;======================================================================;;狀態列;;======================================================================;;顯示時間;;(display-time)(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);;時間的變化頻率,單位多少來著?;;顯示列號(setq column-number-mode t);;沒列左邊顯示行號,按f3顯示/隱藏行號(require 'setnu)(setnu-mode t);;(global-set-key[f3] (quote setnu-mode));;顯示標題列 %f 緩衝區完整路徑 %p 頁面百分數 %l 行號(setq frame-title-format "%f");;=======================================================================;;緩衝區;;=====================================================================;;設定行距(setq default-line-spaceing 4);;頁寬(setq default-fill-column 60);;預設模式 text-mode;;(setq default-major-mode 'text-mode);;設定刪除記錄(setq kill-ring-max 200);;以空行結束;;(setq require-final-newline t);;開啟文法高亮。(global-font-lock-mode 1);;高亮顯示地區選取項目(transient-mark-mode t);;頁面平滑滾動,scroll-margin 3 靠近螢幕邊沿3行開始滾動,正好可以看到上下文;;(setq scroll-margin 3 scroll-consrvatively 10000);;高亮顯示成對括弧(show-paren-mode t)(setq show-paren-style 'parentheses);;滑鼠指標避游標(mouse-avoidance-mode 'animate);;粘貼於游標處,而不是滑鼠指標處(setq mouse-yank-at-point t);;=======================================================================;;回顯區;;=======================================================================;;閃屏警示(setq visible-bell t);;使用y or n提問(fset 'yes-or-no-p 'y-or-n-p);;鎖定行高(setq resize-mini-windows nil);;遞迴minibuffer(setq enable-recursive-minibuffers t);;當使用M-x COMMAND後,過1秒顯示該COMMAND綁定的鍵(setq suggest-key-bindings-1) ;;預設?;;======================================================================;;編輯器的設定;;======================================================================;;不產生備份檔案(setq make-backup-files nil);;不產生臨時檔案(setq-default make-backup-files nil);;只渲染當前螢幕文法高亮,加快顯示速度(setq lazy-lock-defer-on-scrolling t);;(setq font-lock-support-mode 'lazy-lock-mode)(setq font-lock-maximum-decoration t);;將錯誤資訊顯示在回顯區(condition-case err(progn (require 'xxx)) (error (message "Can't load xxx-mode %s" (cdr err))));;使用X剪貼簿(setq x-select-enable-clipboard t);;設定剪貼簿的內容格式 適應Firefox(set-clipboard-coding-system 'ctext);;設定TAB寬度為4(setq default-tab-width 4) ;;以下設定縮排;;用tab縮排(setq indent-tabs-mode t)(setq c-indent-level 4)(setq c-continued-statement-offset 4)(setq c-brace-offset -4)(setq c-argdecl-indent 4)(setq c-label-offset -4)(setq c-basic-offset 4)(global-set-key "\C-m" 'reindent-then-newline-and-indent)
這是我的base.el檔案中的部分內容,就不全部貼上了。但是請記住,emacs所有的設定檔都是在啟動時一下子全部載入進lisp解譯器的,如果設定檔或外掛程式太多,編輯器會變得很慢,曾經看過一篇把emacs配置成IDE開發環境的文章,裡面加入了無數外掛程式,我按照那篇文章配置出來的emacs要啟動5秒鐘(i5-3230 8g),正常情況下emacs都是瞬開。如果非要那麼冗餘,都不如去用IDE了,emacs看著就土鱉,難道不是麼。
四.emacs的外掛程式擴充配置說明
(1)
我的emacs設定檔
/home/fenice/.emacs
我的emacs設定檔包
/home/fenice/.emacs.d/lisps/_emacs
主要功能調用如下(.emacs中)載入設定檔包
;;;;讀取指令碼;;=========================================;;bind the key(load "cykbd.el");;basic setting(load "base.el");;expand setting(load "cyexpand.el");;IDE frame setting;;(load "addon.el");;code setting為了編程的配置(load "cycode.el");;========================================
我的設定檔中有一個cycode.el,為什麼叫cy code.el呢,因為此檔案是陳楊所寫。一下有cy首碼的都是。
調試功能,在cycode.el中添加:
;;==============================================================;;gdb-UI配置;;==============================================================(setq gdb-many-windows t)(load-library "multi-gud.el")(load-library "multi-gdb-ui.el")
上麵包含了兩個從網上下載的調試外掛程式,可以很方便的在emacs中進行gdb調試。
(2)安裝cedet外掛程式。需要從網上下載。cedet可以進行多種語言文法分析,自動補全,物件導向設計,UML圖繪製等功能,還有工程管理功能,不過沒用過。
參考文章: http://www.cnblogs.com/logicbaby/archive/2011/10/19/2217253.html
如果用我的設定檔,那麼最好把/home/fenice/.emacs.d/lisps/_emacs/install中的內容清空,然後將cedet(我的共用檔案裡有壓縮包)解壓到install目錄中,然後根據cedet內的INSTALL檔案裡的指示來安裝。最後在.emacs或cycode.el中添加路徑及配置資訊。我的設定檔中目錄為~/.emacs.d/lisps/_emacs/install/cedet-1.0/
如果使用,需要添加
;;==================================================;;cedet外掛程式設定;;==================================================(add-to-list 'load-path "~/.emacs.d/lisps/_emacs/install/cedet-1.0/speedbar")(add-to-list 'load-path "~/.emacs.d/lisps/_emacs/install/cedet-1.0/eieio")(add-to-list 'load-path "~/.emacs.d/lisps/_emacs/install/cedet-1.0/semantic");; Load CEDET.,從cedet的INSTALL中複製過來的;; See cedet/common/cedet.info for configuration details.
最後在設定檔中添加(在.emacs中或者其他自訂檔案,我的是cycode.el)
(load-file "~/.emacs.d/lisps/_emacs/install/cedet-1.0/common/cedet.el");; Enable EDE (Project Management) features(global-ede-mode 1);; Enable EDE for a pre-existing C++ project;; (ede-cpp-root-project "NAME" :file "~/myproject/Makefile");; Enabling Semantic (code-parsing, smart completion) features;; Select one of the following:;; * This enables the database and idle reparse engines;;(semantic-load-enable-minimum-features);; * This enables some tools useful for coding, such as summary mode;; imenu support, and the semantic navigator;;(semantic-load-enable-code-helpers);; * This enables even more coding tools such as intellisense mode;; decoration mode, and stickyfunc mode (plus regular code helpers);; (semantic-load-enable-gaudy-code-helpers);; * This enables the use of Exuberent ctags if you have it installed.;; If you use C++ templates or boost, you should NOT enable it.;; (semantic-load-enable-all-exuberent-ctags-support);; Or, use one of these two types of support.;; Add support for new languges only via ctags.;; (semantic-load-enable-primary-exuberent-ctags-support);; Add support for using ctags as a backup parser.;; (semantic-load-enable-secondary-exuberent-ctags-support);; Enable SRecode (Template management) minor-mode. ;;(global-srecode-minor-mode 1) ;;----------------------------------------------------------------------(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)(global-ede-mode t);;程式碼摺疊功能;;(require 'semantic-tag-folding nil 'noerror)(global-semantic-tag-folding-mode 1);;摺疊和開啟整個buffer的所有代碼(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);;摺疊和開啟單個buffer的所有代碼(define-key semantic-tag-folding-mode-map (kbd "C-_") 'semantic-tag-folding-fold-block)(define-key semantic-tag-folding-mode-map (kbd "C-+") 'semantic-tag-folding-show-block)
(3)為了使用方便可以使用ecb外掛程式配合cedet的使用。不足之處就是這兩個外掛程式使emacs的啟動速度慢了2秒。
直接下載ecb到~/.emacs.d/lisps/emacs/install目錄下解壓即可,這是我的目錄,也可以自訂目錄,不過要注意修改路徑
然後加上
;;==============================================================;;ecb配置;;==============================================================;;(require 'ecb);;開啟ecb用,M-x:ecb-activate(require 'ecb-autoloads);;自動啟動ecb並且不顯示每日提示;;(require 'ecb);;(setq ecb-auto-activate t)(setq ecb-tip-of-the-day nil)(require 'cc-mode)(c-set-offset 'inline-open 0)(c-set-offset 'friend '-)(c-set-offset 'substatement-open 0)
(4)真正的自動補全功能,就像windos下visual studio裝上visual assist後的補全。
這裡需要兩個外掛程式—auto-complete和yasnippet。先安裝 auto-complete,下載後放到~/.emacs.d/lisps/emacs/install目錄中解壓(也可以用自己的目錄,注意修改路徑),然後進入解壓後的目錄,然後輸入make命令即可;下面安裝yasnippet,下載 後放到~/.emacs.d/lisps/emacs/install目錄,然後解壓即可;下面是幾句關於這兩個外掛程式的配置:
;;==========================================================;;載入cscope;;==========================================================(require 'xcscope);;==========================================================;;YASnippet的配置;;==========================================================;;太強大了,強大的模板功能(require 'yasnippet) ;;not yasnippet-bundle(yas/initialize)(yas/load-directory "~/.emacs.d/lisps/_emacs/install/yasnippet-0.6.1c/snippets");;自動補全;;(require 'auto-complete-config);;(ac-config-default)
(5)鍵綁定功能
即設定emacs的快速鍵
我的鍵綁定全部設定在cykbd.el檔案中,以下是部分內容包括編譯和調試
(global-set-key [f1] 'manual-entry)(global-set-key [C-f1] 'info );;f3為尋找字串,alt+f3關閉當前緩衝區(global-set-key [f3] 'grep-find)(global-set-key [M-f3] 'kill-this-buffer);;.emacs中設一個speedbar的快速鍵(global-set-key [(f4)] 'speedbar-get-focus);;ctrl-f4,啟用,ecb(global-set-key [C-f4] 'ecb-activate);;F5顯示/隱藏工具列 方便調試(global-set-key [f5] 'tool-bar-mode);;ctrl-F5顯示/隱藏功能表列 ;; M-x menu-bar-open(global-set-key [C-f5] 'menu-bar-mode)(global-set-key [f6] 'gdb);; C-f7, 設定編譯命令; f7, 儲存所有檔案然後編譯當前視窗檔案(defun du-onekey-compile () "Save buffers and start compile" (interactive) (save-some-buffers t) (switch-to-buffer-other-window "*compilation*") (compile compile-command))
(6)其他很多搜集的點el擴充檔案均用cyexpand.el包含。不過其中有很多用不到的被我注掉了。如果不需要可以在.emacs中把(load "cyexpand.el")注掉。
(7)我的設定檔中有一個addon.el,這個配置外掛程式可以將emacs的外觀變得更像IDE,但因實在太醜陋,所以我在.emacs把它注掉了。
如果使用我的設定檔 http://pan.baidu.com/share/link?shareid=4196458904&uk=3708780105
下載Emacs_setting.tar.gz,按照readme.txt指示即可,略有麻煩,可以細心摸索。將samuel_emacs重新命名為.emacs放到/home/yourusername/下
將_emacs.d.tar.gz解壓後重新命名為.emacs.d後放入/home/yourusername/下,其他外掛程式配置按照readme.txt
注意用不到的設定檔包含全部要注掉,不然emacs真的會像某些IDE一樣臃腫。相對來說vim配置成IDE 要簡單一點,吳垠大神曾經寫過一篇把vim配置乘IDE的文章,不過那個更複雜。