天天看點

Emacs 的世界

Emacs 的世界

開源界流行一句話:現今有三種編輯器,一是 Emacs,二是 VIM,再者就是其它。

Emacs 項目

Emacs 實質上是一組文本編輯器的集合。

GNU Emacs 是 GNU 項目的一部分,GNU Emacs 官方手冊描述它是一個“靈活的,可高度訂制

的,自行檔案編制的,實時顯示的編輯器”,他也應該是最廣泛引用的 Emacs。除此之外,

還有 XEmacs 等等。

其實,Emacs 開發早在 19 世紀 70 年代就在麻省理工AI實驗室裡開始了(想想這款編輯器的

曆史有多長)。Emacs 的起名有兩種說法,一中較為普遍,就是 Edit MACroS,另外一種則

稱之為 E with MACroS,這裡的 'E' 代指更早使用的一種編輯器,它缺乏宏編輯能力。

第一款在 Unix 跑的類 Emacs 軟體是在 1982 年的開發的 Gosling Emacs,作者是 James

Gosling,聽起來是不是很熟悉?對,Gosling 是 NeWS 的創始人,JAVA 的生父。

1984 年,FSF 掌門人 Rechard Stallman 開始在 GNU Emacs 工作了,這時候的 GNU Emacs

基于 Gosling Emacs,但是他為 GNU Emacs 提供了全新的真正的 Lisp 語言解析器,這樣

也幾乎修改了所有的源代碼。而後,GNU Emacs 成為初生的 GNU 項目的第一個釋出軟體,

它由 C 編寫,提供了 Emacs Lisp 作為其拓展語言(由文本編輯軟體提供了語言實作,酷

吧~)。最初廣泛分布的版本是 1985 年出現的 15.34(記住,2 到 12 的版本号是不存在

地!直接從 1.x.x 到了 13)。

GNU Emacs 的維護人在 2008 年由大神 Richard Stallman 轉交到了 Stefan Monnier 和

Chong Yidong。

Emacs 哲學

早先的 Emacs 是一個 TECO 編輯器的宏編輯元件,它由 Richard Stallman 和 Guy

L. Steele, Jr 開發。他的創意來自于 Steele, Dave Moon Richard Greenblatt, Charles

Frankston 等人編寫的 TECMAC 和 TMACS 編輯器。盡管現在有多個版本的 Emacs 存在,但

是 1984 年度由 Stallman (他參與維護到 2008 年)編寫的 GNU Emacs 和 1991 年開始

的子項目 XEmacs 最為流行。他倆都使用一種強大的擴充語言 Emacs Lisp —— 它允許

Emacs 處理多元化的任務,包括編寫文檔,編譯計算機程式,浏覽網頁等等。

很多初學 Emacs 的人,就像初學 Linux 一樣,可能都遇到很大的門檻。對,作業系統從

Windows 下向 Linux 遷移很費力氣,但是文本編輯工具也是一樣,這一點也不誇張。引用

一些大牛的話說:用 Emacs 就像是一架腳踏車,你可以騎在上面觀看 NBA,但那得你自己

架一個電視機,并且自行提供電力。

現今 Emacs 已經強大到無以複加的地步,别說什麼文法高亮,語言模式了,Emacs 搖身一

變成為一個 IDE,他可以管理檔案(M-x dired),讀新聞,郵件和 RSS 供稿(M-x gnus),甚

至還有心理醫生,看圖模式,玩俄羅斯方塊(M-x tetris)等等等等。很多人把 Emacs 視為

一個作業系統,而非簡單的一個編輯器。

Emacs 的世界

(Emacs 初始界面)

是不是覺得一個編輯器太過複雜了呢?Emacs 有必要作這麼多呢?沒錯,Emacs 可以作的事

情很多很多,但重要的一點,就是 Emacs 可以高度定制的,而且是由你來訂制。這個現實

是很殘酷,當你除此打開 Emacs 的時候,你就隻能看到 Emacs 闆着白色的面孔,工具欄的

圖示像素極少,很象是為偏執的程式員使用的東西。啊對,如果你要是在 Shell 裡面打開

他,甚至不知道怎麼關閉這個生僻的編輯器。

對,Linux 下面的工具就是這樣,功能似乎很強,但是表面上粗糙不堪,使用者體驗一塌糊塗

(針對 Windows 使用者)。如果你能夠有信心接受這樣一個軟體,即可來到 Emacs 的世界。

Emacs 術語

在接手 Emacs 之前,我們可以看看 Emacs 的一些術語,這可以讓我們有闆有眼的向别人介

紹這個東東。

Chord

    Emacs 是可以靈活的捕捉你的鍵盤動作,包括按下和釋放按鍵。而一個可以釋放而

    且可重複性按鍵組合,就是一個 chord。注意 Emacs 有兩種修飾字首,一個是

    Ctrl,記作 `C-',一個是 Alt,記作`M-'。那麼`C-x' 就可以成為一個 chord,

    操作為 Ctrl+x。

Keysequence

    鍵盤序列,它可以直接綁定到一個指令上,執行一個功能。Emacs 正是使用這樣一

    個方式來實作日常操作的。鍵盤序列包括了四種混合方式:

    * 一組按鍵按放的序列,這樣的一組序列可以是不帶修飾字首的按鍵,和同時按下

    的一個或者幾個帶修飾按鍵的 chord 序列集合。

    比如 `C-x 3'(Ctrl+x, 3)執行橫向展開一個 buffer。

    * 一個滑鼠按鍵或者滾輪動作序列。

    * 一個菜單選擇,包括菜單欄選擇。

    * 一個工具欄圖示選擇。

Buffer

    打開一個文本,就是一個 buffer,所有的編輯行為都在 buffer 下面完成。

Frame

    Emacs 的視窗是在一個 frame 裡面顯示的(可以視為 Emacs 外面的視窗)。

MiniBuffer

    特殊的 buffer,比如 Emacs 的狀态欄就是一個 MiniBuffer。

MajorMode

    為每一個文本類型配備一個主編輯模式,比如标準文本,将會是`text-mode'。

    C/C++代碼文本的預設主模式是 `c-mode',還有 `tex-mode',`po-mode' 等等。

    一個模式可以配置自己的指令規則,鍵盤綁定,縮進方式等等。

Mark

    Mark 是為複制等操作準備的文本下的操作方案(`M-!')。

一些基本操作

    這裡将不會對基本操作作過多詳述,隻給出一些必須的指令,免得你手忙腳亂。當

    然,你可以使用 `C-h b' 來檢視所有的按鍵綁定。

C-h C-h     打開所有的 help 頁面索引

C-h b        檢視所有的按鍵綁定

C-x-C-c        退出 Emacs(看到連貫的`-'了嗎?這可是一個 chord)

C-x-C-f        打開檔案到一個buffer

C-x-C-s        儲存目前 buffer

C-x s        儲存現有所有的 buffer

C-x k        關閉目前 buffer。

C-x 0        關閉目前 buffer window!并不是關閉 buffer 哦

C-x 1        展開目前 buffer window 到整個 Emacs Frame

C-x 2        縱向展開一個 buffer

C-x 3        橫向展開一個 buffer

Emacs 配置

每個人心中都有一個漢姆雷特,那 Emacser 手中也必定有一個極具個性化的 Emacs。Emacs

所有的一切都将會由使用者來定義。

Emacs 采用 Emacs Lisp 作為它的拓展語言,他的所有拓展和配置也都用 Lisp 語言來完成。

咱們先來看看簡單的配置。

(本人沒有任何 Lisp 語言根基,所用的配置搜集自網上^_^)

首先,來點直覺點的,改變他的外觀。

    ;; 這可是注釋哦

    (set-cursor-color "wheat")

    (set-foreground-color "wheat")

    (set-background-color "DarkSlateGray")

    (tool-bar-mode -1) ;; 禁用工具欄

然後立刻就變成這個樣子:

Emacs 的世界

一些總體選項

    (setq display-time-24hr-format t)

    (display-time) ;; 顯示 24 小時制時間

    (setq inhibit-startup-message t) ;; 禁止每天日常的資訊

    (mouse-wheel-mode t) ;; 禁用滾輪

    (setq visible-bell t) ;; 錯誤鈴聲提示

    (setq default-major-mode 'text-mode) ;; 預設主編輯模式

    (add-hook 'text-mode-hook 'turn-on-auto-fill)    ;; 加上模式鈎子:autofill

    (setq inhibit-eol-conversion 'gb2312-dos) ;;

    (fset 'yes-or-no-p 'y-or-n-p) ;; 使用 y/n 來回複确認

    (setq x-select-enable-clipboard t) ;; 使用外置粘貼闆

    (set-scroll-bar-mode nil) ;; 禁止滾動條

    (setq scroll-margin 2

          scroll-conservatively 10000) ;; 滾動幅度

    (setq kill-ring-max 200)

    (setq column-number-mode t)

    (setq default-fill-column 80)

    (setq require-final-newline t) ;; 預設添加行尾空格,C99?

計算機設計語言文本的設定

    (require 'php-mode)

    (require 'cc-mode)

    ;(setq tab-width 4 indent-tabs-mode nil)

    (setq c-default-style "linux") ;; 使用 Linux 核心的編碼風格

    (setq tab-width 8)

    (c-toggle-auto-hungry-state 1)

    (defconst please-read-document-c-style

    '("ellemtel" (c-basic-offset . 8)

       )

    )

    (c-add-style "readdocument" please-read-document-c-style)

    ;;(c-set-style "readdocument")

    (global-font-lock-mode 1) ;; 打開文法高亮

各種變成模式的代碼折疊

    (load-library "hideshow")

    ;;(add-hook 'c-mode-common-hook 'doxymacs-mode)

    ;;(add-hook 'c++-mode-common-hook 'doxymacs-mode)

    (add-hook 'c-mode-hook

       (lambda ()

          (hs-minor-mode)

          (setq mslk-c++-key (make-keymap))

          (local-set-key "\C-j" mslk-c++-key)

       (define-key mslk-c++-key "\C-h" 'hs-toggle-hiding))

    )

    (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)

來看一下 C 代碼模式下的 Emacs。

Emacs 的世界

介紹到此,再來看看 Emacs 的一些拓展。

Emacs 拓展

Emacs 的拓展仍舊是由 Emacs Lisp 編寫的,作為腳本語言,拓展可以輕松的使用`M-x'的

`load-path'指令加載。Emacs 搜尋庫的路徑包含在 load-path 變量裡。

如果你不想每次都手工加載,就需要在 .emacs 裡完成此項目設定。

    (setq load-path (cons "~/path/to/library" load-path))

接下來推薦幾個拓展:

wb-line-number.el

    美觀大方的行号顯示拓展。

xcscope

    檢查 C 代碼檔案資訊的拓展。需要安裝 dev-util/cscope。

    這個包非常重要,檢查 C 方法的定義,追蹤函數執行路徑都提供了較為簡單的實

    現。

multi-gud

    GDB 的多視窗支援

cedet

    CEDET: Collection of Emacs Development Tools。

    包括了 EIEIO(Emacs的圖形化支援),Semantic(代碼補齊),Speedbar(Lisp編寫的

    檔案浏覽器)等等使用工具。

ecb

    Emacs source code browser。可以自動劃分 Emacs 視窗,像極了一個 IDE。

tabbar

    多标簽拓展,使用滑鼠可以點選其他 buffer。

展示一下帶有 ecb 的 Emacs(點選檢視大圖)

Emacs 的世界

最後希望大家玩的愉快@!

引用:

1. Emacs 官方網站

[ LINK ] http://www.gnu.org/software/emacs/

2. 下載下傳 Emacs(包括 Windows 版本)

[ LINK ] http://ftp.gnu.org/pub/gnu/emacs/

3. Emacs Wiki

[ LINK ] http://www.emacswiki.org/

4. Emacs Wiki 的 LISP 拓展下載下傳倉庫

[ LINK ] http://www.emacswiki.org/cgi-bin/wiki/ElispArea

5. 幾個拓展和我的 .emacs 配置樣式,包括本文中提到的 wb-line-number, multi-gud,

php-mode,session, tabbar。

[ LINK ] http://www.box.net/shared/pmplsevdww

繼續閱讀