• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            isware

            Emacs + C++

            http://forum.ubuntu.org.cn/viewtopic.php?t=40522

            獲得emacs


            emacs有兩種主流版本,一個(gè)是Gnu emacs,一個(gè)是Xemacs。其中Gnu emacs使用者較多,我們一般說的emacs就是GNU emacs。以下說到的emacs就默認(rèn)是Gnu emacs了。
            emacs的官方網(wǎng)站是:http://www.gnu.org/software/emacs/
            在這個(gè)網(wǎng)站上,你可以下載到各個(gè)平臺的最新穩(wěn)定版的emacs,包括windows和linux。在我寫這段文字的時(shí)候,emacs最新穩(wěn)定版是 21.4。然而,正在開發(fā)中的cvs版中有許多我們非常感興趣的新特性。一個(gè)是我們期待已久的unicode的支持,一個(gè)是我們同樣期待已久的GTK2 的支持。而且就我使用而言,最新的CVS版已經(jīng)相當(dāng)?shù)姆€(wěn)定。那么我們是不是必須用CVS工具提取CVS代碼然后自己編譯生成emacs可執(zhí)行程序呢?不 用!有一個(gè)叫做ntemacs的項(xiàng)目已經(jīng)幫我們做了這個(gè)工作了。
            ntemacs的官方網(wǎng)站是:http://www.ntemacs.sf.net
            下載最新的ntemacs,將其解壓到任意一個(gè)目錄就可以使用了。運(yùn)行emacs的腳本是 bin/runemacs.bat。你可以將這個(gè)腳本創(chuàng)建一個(gè)快捷方式到sendto文件 夾。
            還有一個(gè)可供選擇的emacs的windows版本是winmacs。他的下載地址是http://sourceforge.net/projects/winmacs。這個(gè)版本有一個(gè)問題,你必須設(shè)置HOME系統(tǒng)變量,將其設(shè)置為c:\


            獲得輔助插件


            純粹的emacs已經(jīng)足夠強(qiáng)大,借助其cc-mode已經(jīng)可以進(jìn)行C/C++開發(fā)。但是我們前面說過,要進(jìn)行高效的開發(fā)。那么,我們需要一些輔助的“插件”。

            cscope:這是一個(gè)可以使emacs實(shí)現(xiàn)類似source insight那種符號查找等功能的軟件。它最常用的功能就是找到任何一個(gè)變量、函數(shù)、結(jié)構(gòu)體等是在哪里被定義,被引用的。cscope的官方網(wǎng)站在 http://cscope.sourceforge.net/。這里可以下載到cscope的源碼,源碼中有一個(gè)叫做xcscope的目錄,將其拷貝到 你emacs的site-lisp目錄下。xcscope是 lisp腳本,它是與平臺無關(guān)的語言。然而,這個(gè)腳本依賴cscope可執(zhí)行文件。但cscope是不能直接在windows下運(yùn)行的。我在網(wǎng)上找了很 久,終于在一個(gè)俄羅斯網(wǎng)站上找到了cscope的windows編譯。這個(gè)網(wǎng)站是:http://iamphet.nm.ru/cscope /index.html。下載后將cscope.exe解壓到emacs的bin目錄下即可。

            cedet+ecb:這兩個(gè)“插件”無比強(qiáng)大,專門為emacs作為IDE而設(shè)計(jì)的。我現(xiàn)在只使用了其中很小一部分功能,就領(lǐng)略到了它帶給我的高效。官方網(wǎng)站:http://ecb.sourceforge.net/ ; http://cedet.sourceforge.net/。下載這兩個(gè)插件,和xcscope一樣,復(fù)制到site-lisp目錄。

            session : 這個(gè)插件可以讓你的emacs顯示最近編輯和最近訪問的文件。官方網(wǎng)站是:http://sourceforge.net/projects/emacs-session

            doxymacs : 這是一個(gè)按照doxy風(fēng)格生成注釋的工具。使代碼可以更方便的生成文檔。官方網(wǎng)站是:http://sourceforge.net/projects/doxymacs


            配置emacs


            一切就緒后,就需要配置emacs了。在C盤根目錄下建立一個(gè).emacs文本文件,輸入配置內(nèi)容。以下是我的配置文件內(nèi)容:
            (require 'xcscope) ;;加載xcscope
            (require 'cedet) ;;加載cedet
            (require 'ecb) ;;加載ecb
            (require 'session) ;;加載session
            (add-hook 'after-init-hook 'session-initialize) ;; 啟動時(shí)初始化session
            (require 'doxymacs) ;; 啟動doxymacs
            (add-hook 'c-mode-common-hook 'doxymacs-mode) ;; 啟動doxymacs-mode
            (add-hook 'c++-mode-common-hook 'doxymacs-mode) ;; 啟動doxymacs-mode
            (desktop-load-default) ;;讀取默認(rèn)desktop設(shè)置
            (desktop-read) ;;讀取當(dāng)前目錄保存的desktop設(shè)置
            (set-face-background 'default "LightCyan3") ;;設(shè)置背景色為 淺青色3
            (set-face-font 'default "-outline-新宋體-normal-r-normal-normal-*-*-96-96-c-*-iso8859-1") ;;設(shè)置字體為新宋體 ( Only for windows )
            (global-set-key [f12] 'ecb-activate) ;;定義F12鍵為激活ecb
            (global-set-key [C-f12] 'ecb-deactivate) ;;定義Ctrl+F12為停止ecb
            (global-set-key [f11] 'delete-other-windows) ;;設(shè)置F11為刪除其它窗口
            (global-set-key [(meta return)] 'semantic-ia-complete-symbol-menu) ;;設(shè)置Alt+Enter為自動補(bǔ)全菜單
            (global-set-key [C-\;] 'ecb-goto-window-edit-last) ;;切換到編輯窗口
            (global-set-key [C-\'] 'ecb-goto-window-methods) ;;切換到函數(shù)窗口
            (global-set-key [C-.] 'cscope-find-global-definition) ;;搜索定義
            (global-set-key [C-,] 'cscope-pop-mark) ;; 跳出轉(zhuǎn)向
            (enable-visual-studio-bookmarks) ;; 啟動VS書簽子程序
            ;;(setq semanticdb-project-roots (list "d:/work")) ;; 設(shè)置cemanticdb的掃描根目錄
            (add-hook 'c-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;設(shè)置C語言默認(rèn)格式
            (add-hook 'c++-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;設(shè)置C++語言默認(rèn)格式


            常用快捷鍵


            (這部分還沒有時(shí)間寫,事實(shí)上學(xué)習(xí)emacs基本上就是學(xué)習(xí)其快捷鍵和命令。這些東西網(wǎng)上有很多,書上也有很多)


            參考資料


            這里只是設(shè)計(jì)了emacs的皮毛,想要獲得更加了解emacs這個(gè)強(qiáng)大的編輯器,學(xué)習(xí)更多emacs的使用技巧請參考以下資料:
            《學(xué)習(xí)GNU emacs》機(jī)械工業(yè)出版社
            《生活在emacs中》IBM開發(fā)者網(wǎng)
            附件:
            ecb-2.32.tar.gz [875.37 KiB]
            cscope-15.6.tar.gz [382.05 KiB]
            cedet-1.0pre3.tar.gz [1.29 MiB]

            在Emacs環(huán)境下編譯文件的按鍵組合
            小楓兒 發(fā)表于 2005-7-9 13:44:00

            首先編寫Makefile文件,然后在Emacs環(huán)境下?lián)翩I:
            Alt-x compile RET(回車鍵)
            在小緩沖區(qū)出現(xiàn):
            Compile command : make -k
            如果當(dāng)前目錄下只有一個(gè)Makefile文件,回車即可編譯。
            接下來的擊鍵組合是在出現(xiàn)編譯錯(cuò)誤的時(shí)候通過這些擊鍵可以快速地在源代碼中找到錯(cuò)誤:
            ———————————————————————————————————————
            Ctrl-x ` next-error 移動到下一條出錯(cuò)信息并訪問與之相對應(yīng)的代碼(` 按鍵在數(shù)字鍵1的左邊)
            Alt-n compilation-next-error 移動到下一條出錯(cuò)信息
            Alt-p compilation-previous-error 移動到上一條錯(cuò)誤信息
            Ctrl-c Ctrl-c compilation-goto-error 訪問對應(yīng)于當(dāng)前出錯(cuò)信息的源代碼
            SPACE scroll-down 下卷屏幕顯示內(nèi)容
            DEL scroll-up 上卷屏幕顯示內(nèi)容
            ————————————————————————————————————————
            基本命令
            C-x C-c : 退出Emacs

            C-x C-f : 打開一個(gè)文件,如果文件不存在,則創(chuàng)建一個(gè)文件

            C-g : 取消未完成的命令
            編輯
            C-z (redefined): Undo;原來C-z是掛起Emacs(然后用fg命令調(diào)出);C-x u 是默認(rèn)的命令; 移動一下光標(biāo),再C-z就可以redo

            M-d : 刪除光標(biāo)后的詞語
            移動光標(biāo)
            C-v : 向前翻頁

            M-v : 向后翻頁

            M-r : 將光標(biāo)移動到屏幕中間那行

            C-a : 移到行首

            M-a : 移到句首,從行首到句首之間可能有空格

            C-e : 移到行尾

            M-e : 移到句尾

            M-{ : 向上移動一段

            M-} : 向下移動一段

            C-right : 向前移動一個(gè)單詞

            C-left : 向后移動一個(gè)單詞

            C-up : 向前移動一段

            C-down : 向后移動一段

            M-< : 移到整個(gè)文本開頭

            M-> : 移到整個(gè)文本末尾

            C-u 數(shù)字 命令 : 執(zhí)行多次(數(shù)字表示次數(shù))該命令;“M-數(shù)字 命令” 也可以

            M-x goto-line : 移動到某一行

            C-l : 重繪屏幕,效果就是當(dāng)前編輯行移動窗口中央
            Buffer 相關(guān)
            C-x k : 關(guān)閉當(dāng)前buffer

            C-x b : 切換到前一個(gè)編輯的buffer

            C-x C-b : 列出當(dāng)前所有buffer

            C-x C-s : 保存當(dāng)前buffer

            C-x s : 保存所有未保存的buffer,會提示你是否需要保存

            C-x C-w : 文件另存為
            拷貝與粘貼
            M-space (redefined): 設(shè)置mark; C-@ 是默認(rèn)命令

            C-w (redefined) : 剪切一塊區(qū)域;如果沒有設(shè)置mark,則是剪切一行

            M-w (redefined) : 拷貝一塊區(qū)域;如果沒有設(shè)置mark, 則是拷貝一行

            C-k : 從當(dāng)前位置剪切到行尾

            C-y : 粘貼

            M-y : 用C-y拉回最近被除去的文本后,換成 M-y可以拉回以前被除去的文本。鍵入多次的M-y可以拉回更早以前被除去的文本。

            C-x r k : 執(zhí)行矩形區(qū)域的剪切

            C-x r y : 執(zhí)行矩形區(qū)域的粘貼
            窗口操作
            C-x 0 : 關(guān)閉當(dāng)前窗口

            C-x 1 : 將當(dāng)前窗口最大化

            C-x 2 : 垂直分割窗口

            C-x 3 : 水平分割窗口

            M-o (redefined) : 在窗口之間切換; C-x o 是默認(rèn)命令

            C-x 5 1/2/3/0 : 對frame類似的操作

            C-x < : 窗口內(nèi)容右卷

            C-x > : 窗口內(nèi)容左卷(這兩個(gè)命令在垂直分割窗口后比較有用)

            (C-u) C-x ^ : 加高當(dāng)前窗口,如果有C-u,則每次加高4行

            (C-u) C-x } : 加寬當(dāng)前窗口

            (C-u) C-x { : 壓窄當(dāng)前窗口

            ESC C-v : 在其它窗口進(jìn)行卷屏操作
            搜索和替換
            C-s : 向前搜索(增量式搜索);連續(xù)C-s,跳到下一個(gè)搜索到的目標(biāo)

            C-s RET : 普通搜索

            C-r : 向前搜索

            C-s RET C-w : 按單詞查詢

            M-% : 查詢替換,也就是替換前會詢問一下

            M-x replace-string : 普通替換
            Tags
            M-! etags .c .h : 創(chuàng)建TAGS文件

            M-. : 跳到tag所在位置

            M-x list-tags : 列出tags
            Bookmark
            C-x r m : 設(shè)置書簽bookmark

            C-x r b : 跳到bookmark處
            幫助
            C-h ? : 查看幫助信息

            C-h f : 查看一個(gè)函數(shù)

            C-h v : 查看一個(gè)變量

            C-h k : 查看一個(gè)鍵綁定 (C-h(huán) c 也是查看鍵綁定,但是信息較簡略)

            C-h C-f : 查看一個(gè)函數(shù)的Info,非常有用

            C-h i : 看Info
            其它
            C-M-\ : 對選中區(qū)域,按照某種格式(比如C程序)進(jìn)行格式化

            C-x h : 全部選中

            M-! : 執(zhí)行外部shell命令

            M-x shell : 模擬shell的buffer

            M-x term : 模擬terminal, C-c k 關(guān)閉terminal

            C-x C-q : 修改buffer的只讀屬性

            一些擴(kuò)展

            顯示行號
            1, 下載wb-line-number.el, 放到合適的目錄. (我一般放在~/.emacs.d中)

            2, 在~/.emacs中添加:

            (set-scroll-bar-mode nil) ;; no scroll bar, even in x-window system (recommended)
            (require 'wb-line-number)
            (wb-line-number-toggle)

            注意: 這里假設(shè)你已設(shè)置了加載目錄: (add-to-list 'load-path "~/.emacs.d")

            【GNU/Linux實(shí)戰(zhàn)手記之Emacs篇 下——Emacs是個(gè)IDE】
            作者:葉魏彬 MSN:fritz_yea@hotmail.com
            Copyright(C)Free Software Library,Org(http://yea.xiloo.com)
            本文依照GNU Free Document Lience發(fā)布,任何人都可以將本文原封不動的復(fù)制、轉(zhuǎn)載,但請務(wù)必保留此聲明。作者不對本文所導(dǎo)致的任何結(jié)果負(fù)責(zé)。

            十、定制你的Emacs
            其實(shí),有關(guān)Emacs的爭論一直沒有停息過。有人堅(jiān)持Emacs是個(gè)龐大的史前生物,也有人堅(jiān)持Emacs是神造的萬能工具。總之,一切都是圍繞著它的復(fù) 雜性而論。毋庸置疑的,單作為一個(gè)文本編輯器而言,Emacs的確是太龐大了(它足有70多兆!)。但是,如果把Emacs視為一個(gè)環(huán)境(它也的確是一個(gè) 環(huán)境),則它是非常優(yōu)秀的,70兆的體積也就不算什么了。作為普通用戶,我不推薦你去使用Emacs,vi就可以了--但我不并不是在貶低vi,相反, vi同樣是令我們尊敬的一個(gè)優(yōu)秀的編輯器--它將復(fù)雜性隱藏在了幕后,通過各種命令實(shí)現(xiàn),而這些命令我們也許永遠(yuǎn)也用不到,所以我們不必去理睬它,它就是 一個(gè)小巧、簡潔和直觀的文本編輯器。但是如果你是一個(gè)程序員,或是系統(tǒng)管理員,你所關(guān)心的就不會是絢麗的界面,而是強(qiáng)大的功能和工作的效率。而這就是 Emacs能帶給你的。平心而論,Emacs并不比我們平常所慣用的其他編輯器,如UltraEdit、TextPad、EmEditor等難用多少,只 是我們在使用Emacs的時(shí)候,要從新適應(yīng)Emacs定義的快捷鍵罷了。而正是這一點(diǎn),給許多淺嘗輒止的人眼前蒙上了一層紗,他們也就以訛傳訛,大肆宣揚(yáng) 起Emacs的“復(fù)雜”來。其實(shí),一旦你熟悉了它的快捷鍵,你就能像用其它軟件一樣自如。
            (如果你只是為了寫幾個(gè)字,你會固執(zhí)的堅(jiān)持使用Word嗎?如果你要寫C/C++程序,你會用Word嗎?要是我,我寧可用notepad。當(dāng)我初次接觸 電腦的時(shí)候,我還是在黑底白字的DOS時(shí)代。我曾為Turbo C里的IDE環(huán)境驚嘆不已。那時(shí)的剪貼、粘貼的快捷鍵是Ctrl-Ins、Shift-Ins,刪除一行是Ctrl-y,直到現(xiàn)在我還忍不住想用Ctrl -y來刪除一行。其實(shí)統(tǒng)一軟件快捷鍵的不是MS,而是WordPerfect,正是因?yàn)樗牧餍校沟弥蟮能浖技娂娦Х滤栽黾佑H和力。F1代表 “幫助”就是它最先使用的。所以不要再抱怨Emacs的快捷鍵了。Emacs可以在沒有圖形顯示的終端環(huán)境下出色的工作,和它在X下一模一樣。 UltraEdit可以嗎?)
            廢話少說,言歸正傳。我們的目的是定制我們的工作環(huán)境,使之最適合我們的工作。因此,我們必須首先澄清一些概念。
            緩沖區(qū)(Buffer)
            緩沖區(qū)(Buffer)的概念聽起來很玄,其實(shí)就是一塊用來保存我們輸入的東西的內(nèi)存區(qū)域,你可以把它理解為文件。在Emacs里,一切都是在內(nèi)存中進(jìn) 行,直到你按下C-x C-s來保存,你的文件才會被改變。這是一個(gè)普遍的文本保存策略,幾乎所有的文本編輯器都是這樣工作的。
            窗口(Frame)
            窗口(Frame)不是Window,它是指你所編輯的文本被顯示的區(qū)域。這一點(diǎn)類似于你在UltraEdit里打開的各個(gè)文件所在的小窗口。
            模式(mode)
            模式(mode)是Emacs里最重要的概念,Emacs的強(qiáng)大功能基本上都是由各種模式提供的。常用的有C/C++模式、shell模式、Perl模式、SGML/HTML模式等等。

            基于上面的概念,讓我們來逐步研究Emacs的IDE環(huán)境

            10.1、文件,緩沖區(qū)和窗口
            首先,我們可以在Emacs里同時(shí)編輯多個(gè)文件。你隨時(shí)可以使用C-x C-f來打開(或者創(chuàng)建)文件。但是默認(rèn)情況是,編輯器自動進(jìn)入到新的文件窗口中(所有的編輯器都這樣)。如果我們希望同時(shí)看到兩個(gè)文件(比如比對兩個(gè)文 件),我們就必須首先對窗口進(jìn)行分割。使用C-x 2對窗口進(jìn)行水平分割。分割完畢后你會失望的發(fā)現(xiàn),兩個(gè)窗口里的內(nèi)容竟然完全一樣(包括你對任一窗口的修改,都會同步顯示在另一個(gè)窗口中)!是的,我們只 是分割了窗口,但是并沒有切換緩沖區(qū),因此依舊是顯示原來緩沖區(qū)的內(nèi)容。使用C-x o切換到你想去的窗口,然后在緩沖區(qū)列表(C-x C-b)里選擇目標(biāo)文件。這樣你就可以在同一屏終審視兩個(gè)文件了。
            你也可以用C-x 3垂直分割屏幕,分成左右兩個(gè)區(qū)域。窗口理論上可以無限分割,只要你覺得分那么多的小窗口有意義(試試看,連Emacs都會覺得你這樣做很愚蠢),因此你完全可以將屏幕分割成倒“品”字形,只需依次按下C-x 2、C-x 3即可。
            窗口和緩沖區(qū)的概念是完全不同的,因此我們可以“關(guān)閉”窗口,而非“關(guān)閉”緩沖區(qū),讓它暫時(shí)從我們的視線里消失。這相當(dāng)于圖形環(huán)境下的“最小化窗口”。使用C-x 0關(guān)閉當(dāng)前窗口,使用C-x 1關(guān)閉當(dāng)前窗口以外的其他窗口。

            下面的這個(gè)列表很直觀的顯示了對窗口和緩沖區(qū)的鍵盤操作:
            -------------------------------------------------------------------------------------------------------
            窗口操作:

            功能鍵 功能
            C-x 0 刪除當(dāng)前窗口,對緩沖區(qū)無影響。注意這里是數(shù)字0。 (最小化當(dāng)前窗口)
            C-x 1 刪除當(dāng)前以外的所有窗口,對緩沖區(qū)無影響。 (最小化其他窗口)
            C-x 2 水平分割當(dāng)前窗口。
            C-x 3 垂直分割當(dāng)前窗口。
            C-x o 切換窗口(當(dāng)且僅當(dāng)有一個(gè)以上的窗口存在)。注意這里是字母o。

            緩沖區(qū)操作:

            功能鍵 功能
            C-x C-f 打開(創(chuàng)建)文件,創(chuàng)建一個(gè)新的緩沖區(qū)。
            C-x C-s 保存當(dāng)前緩沖區(qū)到文件。
            C-x C-w 保存當(dāng)前緩沖區(qū)到其他文件(文件另存為)。
            C-x k 關(guān)閉當(dāng)前緩沖區(qū)。
            C-x C-b 緩沖區(qū)列表。你可以用方向鍵來選擇要切換的緩沖區(qū)。
            C-x C-c 關(guān)閉所有的緩沖區(qū),退出Emacs。

            -------------------------------------------------------------------------------------------------------

            10.2、模式
            接下來我們看看Emacs里的模式(Mode)。
            在Emacs里,無論何時(shí)編輯一個(gè)文件,都要使用一個(gè)特定的模式(Mode)。Emacs里的“模式”不同于vi里的“模式”。vi里分“命令”和“編 輯”兩種模式,而Emacs里只有一種模式,就是編輯模式,Emacs里的命令全靠功能鍵完成。但是我說的“模式”不是指這個(gè)模式,而是指Emacs里的 各種輔助環(huán)境。當(dāng)我們編輯普通文本時(shí),用的是“文本模式(Txt Mode)”,而當(dāng)我們寫程序時(shí),比如前面的Bash腳本,用的則是“Shell(bash)模式”。
            當(dāng)我們啟動某一文件時(shí),Emacs會判斷文件的類型,從而自動選擇相應(yīng)的模式。當(dāng)然,我們也可以手動啟動各種模式。先按M-x,然后輸入模式的名稱。比如 啟動“C模式”,就是M-x c-mode。直接按下M-x,然后按兩下Tab鍵,你將得到所有可執(zhí)行的命令,這里面當(dāng)然包括所有的模式。因此,你要想不起來某個(gè)命令的名稱,就用這個(gè) 方法。

            10.2.1、C模式
            在強(qiáng)大的C模式下,我們擁有“自動縮進(jìn)”、“注釋”、“預(yù)處理擴(kuò)展”、“自動狀態(tài)”等強(qiáng)大功能。
            當(dāng)我們在“C模式”下編輯代碼的時(shí)候,可以用Tab鍵自動的將當(dāng)前行的代碼產(chǎn)生適當(dāng)?shù)目s進(jìn),使代碼結(jié)構(gòu)清晰、美觀。我們也可以指定縮進(jìn)的規(guī)則。Emacs 支持的縮進(jìn)規(guī)則有:bsd、cc-mode、ellemtel、gnu、java、k&r、linux、python、stroustrup、 user、whitesmith,通過M-x c-set-style命令指定。
            源代碼要有良好可讀性,必須要有良好的注釋。用M-;可以產(chǎn)生一條右縮進(jìn)的注釋。C模式下是“/* comments */”形式的注釋,C++模式下是“// comments”形式的注釋。當(dāng)我們高亮選定某段文本,然后按C-c C-c,就可以把這段文字給注釋掉。
            Emacs可以使用C預(yù)處理其運(yùn)行代碼的一部分,以便讓程序員檢測宏、條件編譯以及include語句的效果。比如想象下面的這種情況:
            1、在頂層窗口輸入看到的代碼。
            2、高亮顯示一個(gè)區(qū)域。
            3、按C-c C-e調(diào)用宏擴(kuò)展。也可以從菜單C中選擇 Macro Expand Region。
            Emacs將創(chuàng)間諜熱窗口,顯示宏擴(kuò)展的結(jié)果。
            Emacs中的C環(huán)境還有許多特性,可以幫助程序員加速開發(fā)過程。運(yùn)行在自動狀態(tài)下的時(shí)候,且程序員輸入代碼的時(shí)候,C環(huán)境會自動地插入新行、處理縮進(jìn)并完成其他相關(guān)任務(wù)。在許多情況下,編程時(shí)都不用按EnteAr鍵,系統(tǒng)會自動處理。
            按C-c C-a或者運(yùn)行M-x c-toggle-auto-stat,就可以開啟自動模式。在這種模式下敲擊鍵盤時(shí),程序員會注意到無論何時(shí),只要輸入分號,編輯器就會自動把光標(biāo)定位 到下一行,并自動縮進(jìn)。最終代碼看起來好像沒有使用自動模式一樣;它只是減少了程序員創(chuàng)建文件敲擊鍵盤的次數(shù)。
            如果想要關(guān)閉自動模式,只需要按C-c C-a或者運(yùn)行M-x c-toggle-auto-state,系統(tǒng)將恢復(fù)一般狀態(tài)。

            10.2.2、編譯程序
            Emacs可以讓程序員在Emacs環(huán)境里編譯自己的軟件。這樣做的時(shí)候,編輯器把編譯器的輸出和程序代碼連接起來。這意味著程序員只需要單擊出錯(cuò)的命令(按個(gè)回車),就可以立刻定位那些警告和錯(cuò)誤信息。
            可以在Tools菜單里找到這些選項(xiàng)。在從菜單中選擇Compile時(shí),Emacs要求輸入編譯命令。如果有一個(gè)Make文件,可以接受默認(rèn)設(shè)置。否則,程序員必須為正確編譯程序而填寫編譯命令行。
            如果在編譯時(shí)遇到錯(cuò)誤或警告,Emacs將在分開的窗口中顯示它們。
            此時(shí)用Enter單擊錯(cuò)誤信息,就可以直接跳到發(fā)生錯(cuò)誤的源代碼處。有時(shí),在輸出窗口重將有幾百條警告信息;直接跳到出錯(cuò)的地方,可大量的節(jié)省時(shí)間。
            正如你看到的,默認(rèn)的編輯命令是對一個(gè)make的調(diào)用。Emacs可以完美使用make并處理大量文件,對Emacs是否能支持大的工程項(xiàng)目的擔(dān)心,是完全沒有必要的。

            10.2.3、調(diào)試
            許多集成的開發(fā)環(huán)境提供一個(gè)調(diào)試器。雖然多數(shù)只是一個(gè)有限的調(diào)試器,但是Emacs為gdb調(diào)試器提供了一個(gè)功能齊全的借口。
            在Emacs中使用gdb的時(shí)候,程序員能獲得gdb在其他任何方式運(yùn)行時(shí)所具有的全部標(biāo)準(zhǔn)特性。但是還是包括了一些通過接口增強(qiáng)而獲得的其他性能。
            在Emacs中使用gdb調(diào)試程序,可以觀察自己的代碼是如何從頭到尾運(yùn)行的。這個(gè)選項(xiàng)比默認(rèn)的gdb操作更容易使用,默認(rèn)的操作只是顯示的指令。
            此外,由于可以直接在Emacs中重新編譯調(diào)試器運(yùn)行在緩沖器內(nèi)的代碼,在調(diào)試器內(nèi)對代碼進(jìn)行改動、重新編譯和運(yùn)行是簡單的方法。
            為了在Emacs里調(diào)用調(diào)試器,在Tools菜單中選擇gdb,會出現(xiàn)系統(tǒng)提示,要求輸入可運(yùn)行文件以便進(jìn)行調(diào)試。當(dāng)輸入了名字時(shí),gdb被調(diào)用。最初將 看到一個(gè)和標(biāo)準(zhǔn)gdb一樣的窗口。在程序的適當(dāng)?shù)胤皆O(shè)置斷點(diǎn)后運(yùn)行程序,源代碼窗口將會有=>標(biāo)記指向斷點(diǎn)位置的代碼并高亮顯示。gdb窗口將不再 顯示代碼。
            在gdb窗口中,可以使用所有的常用gdb命令。在Emacs中使用gdb,程序員必須要學(xué)習(xí)任何新的命令。
            10.2.3、使用標(biāo)記
            Emacs的另外一個(gè)強(qiáng)大的功能是使用標(biāo)記(tag)的能力。根據(jù)標(biāo)記,編輯器可以區(qū)分哪些文件屬于同一個(gè)項(xiàng)目。更重要的是,標(biāo)記還能準(zhǔn)確指出每個(gè)文件都 包含了什么。比如在C程序中,標(biāo)記指出那個(gè)文件包含了特定的函數(shù)。當(dāng)編譯文件的時(shí)候,可以直接跳到任何函數(shù)所在——而不管文件的路徑。此外,可以對一組文 件而不僅僅對當(dāng)前文件使用命令。比如,一個(gè)搜索命令可以對一組文件起作用。
            為了提供這個(gè)功能,Emacs需要分析文件,并且保存將要被使用到的標(biāo)記信息。一般而言,實(shí)現(xiàn)這種功能要使用一個(gè)叫TAGS的文件。在命令行中運(yùn)行etags程序創(chuàng)建這個(gè)文件,并且給它需要索引的文件名字。例如:
            $etags *.c
            etags程序分析源代碼,并產(chǎn)生一個(gè)TAGS文件,便于以后在Emacs中使用。
            現(xiàn)在,可以在Tools菜單中使用Tags選項(xiàng),對文件進(jìn)行操作。可以使用Find Tag(M-.)來看看到底發(fā)生了些什么。比如,輸入一個(gè)函數(shù)的名字,Emacs將直接跳到包含該函數(shù)的文件,如果需要?jiǎng)t帶開該文件,并且定位光標(biāo)于該函 數(shù)的第一行;如果該函數(shù)在一個(gè)以上的文件中出現(xiàn),就可以使用M-,繼續(xù)搜索其他的文件。
            10.3、在Emacs里用Shell
            Emacs獨(dú)一無二的地方就在于它可以在內(nèi)部運(yùn)行shell。Emacs里的Shell與普通的Shell沒有區(qū)別,我們編寫的shell腳本可以直接運(yùn) 行測試,而不必退出Emacs。但是,在Emacs的shell環(huán)境下,不能運(yùn)行某些需要對控制臺進(jìn)行控制的程序,比如mc。這是我們可以用term模式 代替,只需運(yùn)行M-x term-mode命令。
            我們已經(jīng)在前面體驗(yàn)過Emacs里的shell了,我就不再重復(fù)了。
            10.4、其他,但不是雞肋
            Emacs集成了萬維網(wǎng)瀏覽器、郵件閱讀器、ftp、telnet、新聞組閱讀器、版本控制系統(tǒng)等等。實(shí)在是太多了,我在這里肯定無法一一談到。學(xué)習(xí) Emacs的最好方法就是“看書+實(shí)踐”,我就是這么學(xué)習(xí)Emacs的。多多摸索,你也可以成為Emacs高手。征服Emacs并不是“不可完成的使 命”。
            10.5、累了,玩玩游戲吧
            F10->Tools->Games,盡情娛樂吧,我們的宗旨是——勞逸結(jié)合。

            【GNU/Linux實(shí)戰(zhàn)手記】到此就全部結(jié)束了。我希望這短短的五篇文章能起到點(diǎn)作用,這樣也不妄費(fèi)我痛苦的敲鍵盤。感謝大家的閱讀。:)

            /////////////////////////
            1. C-h

            任何命令都可以忘掉,C-h不能忘,因?yàn)橥ㄟ^它你可以找到其他所有的命令,不知道C-h怎么用?C-h C-h 這里第二個(gè)C-h是個(gè)help option,常用的option還有:

            * a 列出包含給定字符串的所有命令。這里的命令實(shí)際上是函數(shù)名,因?yàn)閑macs中的所用功能都是通過函數(shù)來實(shí)現(xiàn)的,把這些功能(函數(shù))綁定到鍵盤上,就叫做key binding,這種設(shè)計(jì)使我們可以很容易地把某項(xiàng)功能綁定到我們喜好的按鍵上。
            * b 顯示所有的key bindings
            * C 顯示指定編碼的信息,如果不帶參數(shù)則顯示當(dāng)前和編碼有關(guān)的設(shè)置
            * r info形式的emacs guide,最好的參考資料

            2. user option和變量

            兩者都是perl變量,用來定制emacs環(huán)境,區(qū)別在于M-x set-variable只能設(shè)置user option變量,要設(shè)置任何變量,在*scratch*buffer輸入(setq variable-name value),用C-j執(zhí)行;用C-h v VAR則可以查看任何變量的值
            3. buffer

            * 查看buffer列表 C-x C-b
            * 切換buffer C-x b
            * 關(guān)閉buffer C-x k
            * 保存當(dāng)前的buffer到它關(guān)聯(lián)的文件 C-x C-s

            4. 編碼相關(guān)

            emacs使用language environment來進(jìn)行編碼相關(guān)的設(shè)置。一個(gè)language environment為emcas中編碼相關(guān)的變量設(shè)置默認(rèn)值,比較重要的設(shè)置項(xiàng)有:

            * 優(yōu)先編碼列表 當(dāng)讀入一個(gè)文件時(shí),以該列表的順序來識別文件的編碼,用prefer-coding-system在該列表首插入一個(gè)編碼
            * default-buffer-file-coding-system 新建文件的默認(rèn)編碼


            C-h L來查看當(dāng)前或其他language environment的信息,使用M-x set-lanaguage-environment來修改。 如果沒有指定language enviroment,emacs將會根據(jù)locale中設(shè)置的編碼來選擇一個(gè)language environment,比如在我的en_US.UTF-8下,language environment設(shè)置的是UTF-8。不過這里似乎有個(gè)問題,按理說這時(shí)相關(guān)的編碼變量應(yīng)該也被設(shè)置為UTF-8 language environment設(shè)置的默認(rèn)值,不過在我的環(huán)境下這些變量的值似乎和UTF-8 language environment無關(guān),于是不得不在.emacs下明確設(shè)置一下:

            (if (equal current-language-environment "UTF-8") (prefer-coding-system 'gb2312) (prefer-coding-system 'Utf-8) ) ) ) (add-hook 'set-language-environment-hook 'utf8gbk) (set-lanaguage-environment 'UTF-8)

            在UTF-8這個(gè)language environment下,emacs并不能自動識別gbk編碼的文件,因?yàn)槠淙笔≡O(shè)置的優(yōu)先編碼列表沒有g(shù)bk,上面的lisp對UTF-8 language environment做了定制,之所以又加了一次utf-8編碼是因?yàn)橄M赨TF-8這個(gè)language environment下首選的編碼是utf-8。

            5. registers

            emacs用來存放文本、矩形、位置或其他內(nèi)容的地方,供以后使用。每個(gè)register都有一個(gè)名字,為一個(gè)英文字母。 C-x r s R 保存region的文本到register R C-x r i R 從register R中插入文本

            1. deleting, killing and yanking killing會把刪掉的文本放到kill ring中,隨后可以用yanking來把它c(diǎn)opy到別處,類似win下的copy/paste,deleting則不把刪掉的文本放到kill ring中,因此也無法copy刪掉的文本。
            * C-k killing從當(dāng)前光標(biāo)到行尾的文本,如果是空行則包括其換行符,在行首兩次C-k就刪掉該行
            * C-w Killing region
            * C-y yanking上次killing的文本

            6. undo and redo

            用C-x u進(jìn)行undo,用什么來redo呢?不幸的是,emacs沒有redo的命令,它是用undo來實(shí)現(xiàn)redo的:任意一個(gè)非undo的命令將會打斷 undo命令的順序,從那時(shí)起,以前的undo命令就成為了普通的改變文本的命令,這樣當(dāng)再使用undo命令時(shí)將會undo以前undo命令的改變,于是 就redo了
            7. region

            很多emacs命令操作buffer中任意一段連續(xù)的區(qū)域,怎么指定這段區(qū)域呢?在這個(gè)區(qū)域的一端設(shè)置一個(gè)mark,再移動光標(biāo)到另一端,位于光標(biāo)和mark之間的內(nèi)容就是選擇的區(qū)域。用C-<SPC>來設(shè)置mark。

            * Kill region C-w
            * save region到一個(gè)register C-x r s
            * 設(shè)置整個(gè)buffer為region C-x h

            8. indentation

            在多數(shù)mode下,Tab鍵是被綁定到indent相關(guān)的命令上的,要插入tab字符,需要用C-q tab轉(zhuǎn)義一下。

            * 對region中的每一行indent C-M-\
            * <RET>并<TAB> C-j

            9. 字體

            emacs是針對charset來配置字體的,對要顯示的coding system中的字符,emacs把它們歸到這些charset中,然后使用在這些charset上指定的字體來顯示它們。這樣的一個(gè)字體配置在emacs里叫做fontset,如:

            Emacs.Fontset-0:-*-courier-medium-r-normal-*-18-*-*-*-*-*-fontset-courier,\ chinese-gb2312:-*-simsun-medium-r-*-*-18-*-*-*-p-*-iso10646-1,\ chinese-cns11643-5:-*-simsun-medium-r-*-*-18-*-*-*-p-*-iso10646-1,\ chinese-cns11643-6:-*-simsun-medium-r-*-*-18-*-*-*-p-*-iso10646-1,\ chinese-cns11643-7:-*-simsun-medium-r-*-*-18-*-*-*-p-*-iso10646-1,\ Emacs.font:fontset-courier


            10. Move

            * 以word為單位的前移/后移 M-b/M-f
            * 以word為單位的前刪/后刪 M-Delback/M-d
            * 移到行首/行尾 C-a/C-e
            * 移到頁首/頁尾 M-a/M-e
            * 移動到buffer首/尾 M-</M->

            11. 常用命令

            * 列出某個(gè)主題的幫助 C-h a
            * 刪除從當(dāng)前光標(biāo)到行尾/行首 C-k/C-u
            * Undo/Redo C-x u/
            * 在window間切換 C-x o(other)
            * 翻頁 C-v/M-v
            * 退出 C-x C-c
            * 啟動emacs時(shí)不加載~/.emacs:-q
            * 配合sudo打開文件 C-x C-f /sudo::/etc/emacs/
            * 把一個(gè)文件的內(nèi)容插入到當(dāng)前位置 C-x i
            * 在當(dāng)前光標(biāo)處插入一行 C-o
            * 使光標(biāo)所在文本滾動到離窗口頂部n行處 C-u n C-l

            12. 插件/擴(kuò)展

            emacs 是用lisp擴(kuò)展的,M-x load-file用來執(zhí)行任意一段lisp腳本,M-x load-library則從變量load-path定義的一個(gè)目錄列表中尋找指定的文件并執(zhí)行它,autoload函數(shù)把一個(gè)函數(shù)和一個(gè)lisp腳本相 關(guān)聯(lián),當(dāng)執(zhí)行這個(gè)函數(shù)時(shí),加載對應(yīng)的腳本文件并執(zhí)行,如: (autoload 'javascript-mode "javascript" nil t) 當(dāng)執(zhí)行javascript-mode函數(shù)時(shí),load-library javacript,nil是該函數(shù)的描述,t表示該函數(shù)是interactive的,當(dāng)以后用C-h f來查看該函數(shù)時(shí),這些信息將得到體現(xiàn)。

            1. 如何在buffer中輸入回車和換行 C-q C-m 輸入回車(\r),這里C-q代表轉(zhuǎn)義,C-m代表ascii的控制字符\r C-q C-j 輸入換行(\n),C-j代表ascii的控制字符\n

            13. key binding

            (global-set-key [?\C-2] 'set-mark-command)

            方括號中的是key sequence,后面的是要綁定到的command。對key sequence中的字符元素,用lisp的字符常量來表示:問號后跟該字符,用\C-表示控制字符;對key sequence中的symbo元素,直接寫其名稱,如f7
            14. lisp

            注釋 以;;開頭的行為注釋


            /////////////////////
            本文件列出了在Emacs C mode下面常見的指令及所謂的C mode就是在Emacs下面撰寫C語言程式的模式。在這個(gè)模式下面Emacs會提供一些針對C語言所增加的特性及功能。對於C的程式設(shè)計(jì)師而言是相當(dāng)好 用的。雖然這篇文章著重在C mode之下,但是大部分的指令對於其他的模式依舊適用。
            避免被其他的設(shè)定所影響
            Emacs本身是一個(gè)非常有彈性的編輯器,因此經(jīng)過相當(dāng)?shù)脑O(shè)定之後,原本預(yù)設(shè)的設(shè)定可能會被修改掉了。為了讓您的Emacs能夠符合本文件所列出的熱鍵及弁遄C建議您在home directory的.emacs檔案中加入下面的設(shè)定。


            (setq inhibit-default-init t) ; 避免被系統(tǒng)預(yù)設(shè)的設(shè)定所影響
            (keyboard-translate ?C-h ?C-?) ; 可以避免backspace變成help hot-key的問題
            (keyboard-translate ?C- ?C-h) ; 將help hot-key由Ctrl-h轉(zhuǎn)成Ctrl-
            ;; 以下的設(shè)定是讓C mode具有 K&R 所建議的樣式
            (setq c-mode-hook '(lambda () (auto-fill-mode 1)))
            (setq c-indent-level 5)
            (setq c-continued-statement-offset 5)
            (setq c-argdecl-indent 0)
            (setq c-brace-offset -5)
            (setq c-label-offset -5)

            進(jìn)入及離開Emacs

            如果您的系統(tǒng)上面已經(jīng)安裝好emacs,只要在shell下面執(zhí)行emacs xxx.c就可以以C mode進(jìn)入emacs中。如果您要離開emacs,則需要在emacs中鍵入:Ctrl-x-c。


            檔案控制及存取
            Ctrl-x Ctrl-s 儲存目前正在編輯視窗內(nèi)的檔案
            Ctrl-x s 儲存所有目前在編輯的檔案
            Ctrl-x k 關(guān)閉目前正在編輯視窗的檔案,但是不存檔
            Ctrl-x Ctrl-c 跳出emacs
            Ctrl-x Ctrl-w 另存新檔
            Ctrl-x Ctrl-f 開啟檔案
            Ctrl-x Ctrl-r 以唯讀模式開啟檔案
            Ctrl-x Ctrl-q 將原本是唯讀的檔案變成可寫入

            游標(biāo)的移動
            Ctrl-b 往回移一個(gè)字元
            Ctrl-f 往後移一個(gè)字元
            Ctrl-p 往上移動一行
            Ctrl-n 往下移動一行
            Ctrl-a 移到行首
            Ctrl-e 移到行末
            Esc b 往前移一個(gè)英文字
            Esc f 往後移一個(gè)英文字
            Esc v 往上移一頁
            Ctrl-v 往下移一頁
            Esc < 移到檔案最前面
            Esc > 移到檔案最後面
            Esc a 移到敘述(statement)最前面
            Esc e 移到敘述最後面
            Esc Ctrl-a 移到Function最前面
            Esc Ctrl-e 移到Function最後面
            Ctrl-u 重複前一個(gè)指令四次

            刪除與回復(fù)
            DEL 刪除游標(biāo)左邊的字元
            Ctrl-d 刪除游標(biāo)所在位置的字元
            ESC DEL 刪除游標(biāo)左邊的英文字
            ESC d 刪除游標(biāo)右邊的英文字
            Ctrl-k 刪除所有在游標(biāo)右邊的字元
            ESC Shift-2 設(shè)定Region的Mark
            Ctrl-w 從設(shè)定Region Mark到目前游標(biāo)之間的字元全部刪除
            Ctrl-y 將被Ctrl-w指令所刪除的字元回復(fù)
            ESC y 將被Ctrl-y所回復(fù)的字元再刪除
            Ctrl-u 重複前一個(gè)命令四次
            Ctrl-x u 回復(fù)前一個(gè)命令所造成的影響(Undo)

            搜尋與置換
            Ctrl-r 向上搜尋
            ESC 在搜尋模式中按ESC可以離開搜尋模式
            ESC % 啟動置換模式。在置換模式中,首先要輸入將被置換掉的字串,然後輸入新字串。接下來游標(biāo)會移到需要被置換的地方。你需要用下面的key來指定動作:

            * y:置換目前游標(biāo)所在的字串,並且移到下一個(gè)可被置換的字串。
            * n:跳過目前游標(biāo)所在的字串。移到下一個(gè)可被置換的字串。
            * !:將整個(gè)檔案一次置換完畢,不進(jìn)行任何詢問。
            * ESC:結(jié)束置換模式。
            * .:將目前的字串置換後,即離開置換模式。
            * ^:回到前一個(gè)符合置換的地方。


            拷貝與搬移
            Ctrl-@ 設(shè)定標(biāo)記起始點(diǎn)
            Ctrl-w 剪下標(biāo)記起始點(diǎn)至目前游標(biāo)所在位置的文字。
            Alt-w 複製標(biāo)記起始點(diǎn)至目前游標(biāo)所在位置的文字。
            Ctrl-y 貼上之前所剪下或複製的文字至目前游標(biāo)所在的位置。

            多重視窗控制
            Ctrl-x 0 刪除目前的視窗(不會關(guān)閉正在編輯的檔案)
            Ctrl-x 1 刪除其他的視窗(不會關(guān)閉正在編輯的檔案)
            Ctrl-x 2 水平分割視窗
            Ctrl-x 3 垂直分割視窗
            Ctrl-x b 將目前視窗內(nèi)的檔案切換成其他的檔案
            Ctrl-x o 將游標(biāo)移動到其他視窗之內(nèi)

            加入註解
            ESC ; 在Emacs的C mode中按下'ESC ;'就會出現(xiàn)註解符號/* 及*/。並且在編輯時(shí)會自動幫你換行。

            編譯程式
            ESC x compile 在C mode中輸入ESC x compile就可以在不離開Emacs的狀況下進(jìn)行程式的編譯。此時(shí),emacs會顯示預(yù)設(shè)的編譯命令是make -k。compile之後,所有訊息都會出現(xiàn)在另一個(gè)視窗。
            Ctrl-x ` 編譯完成後,如果有錯(cuò)誤發(fā)生,按下Ctrl-x `就可以跳到下一個(gè)有錯(cuò)誤的地方,修改完成後,再按一次就可以繼續(xù)修改下一個(gè)錯(cuò)誤,一直到?jīng)]有其他的錯(cuò)誤為止。

            SHELL
            ESC x shell 進(jìn)入Shell mode。可以讓你在emacs的視窗中使用shell。
            Ctrl-c Ctrl-c 將正在執(zhí)行的程式中斷
            Ctrl-c Ctrl-z 暫停目前的工作
            Ctrl-c Ctrl-r 將游標(biāo)移動到最後一個(gè)命令
            Ctrl-c Ctrl-y 重複執(zhí)行前一個(gè)命令。

            Tags
            tags 是一個(gè)很有用的工具,他可以幫助您將source檔案中所有function定義,及 typedef的定義,全部收集成為一個(gè)資料庫,讓你可以很輕易的跳到您要的函數(shù)定義。在使用emacs的tags機(jī)制之前,您需要先將有關(guān)的tag的資 料庫建構(gòu)出來。建構(gòu)的方法如下:

            % etags -tlist_of_source_file

            list_of_source_file就是您要做紀(jì)錄的原始程式檔案。您可以指定很多個(gè)檔案。例如:

            % etags -t *.[ch]

            其中,-t的參數(shù)主要是要求etags將typedef的宣告一併放入資料中。

            在Emacs中,如果要使用tags的機(jī)制,可以使用下表的命令:

            ESC . 尋找函數(shù)的定義。你可以透過這個(gè)命令來找尋你要的函數(shù)。輸入此命令後,emacs會提示訊息,要求你輸入要找尋的函數(shù)名稱。或是typedef的定義。
            Ctrl-x 4 . 功能同ESC .。但是會把找到的函數(shù)定義顯示在另外一個(gè)視窗。
            ESC x visit-tags-table 使用其他的TAGS檔案
            ESC x tags-search 以regular expression的方式來找尋函數(shù)名稱。
            ESC , 輸入ESC x tags-search之後,可以用這個(gè)來進(jìn)行尋找下一個(gè)的動作。
            ESC x tags-query-replace 以regular expression的方式來置換函數(shù)名稱。

            其他
            Ctrl-x Ctrl-b 目前正在處理的檔案列表
            Ctrl-x b 將目前視窗內(nèi)的檔案切換成其他的檔案
            Ctrl-x d 會在目前的視窗中顯示目錄列表
            Ctrl-x 4 d 在其他視窗顯示目錄列表
            ///////////////////////////
            Emacs Lisp 功能擴(kuò)展集錦

            Emacs 具有超強(qiáng)的擴(kuò)展性。這是當(dāng)今沒有任何其它編輯器可以比擬的強(qiáng)大特點(diǎn)。這里介紹一些很方便的 Emacs Lisp 擴(kuò)展。

            有鏈接的文件可能不是 Emacs 自帶的,你需要下載el文件到你的 load-path 中的一個(gè)目錄里。

            所有文件可以點(diǎn)擊鏈接下載,你也可以點(diǎn)擊這里一次性下載所有 el 文件,但是不包括大型的 elisp 包,比如 dictionary. [下載]。

            這里提供的下載是我正在用的版本。我沒有列出我找到它們的地址, 因?yàn)槲矣洸蛔∧敲炊唷H绻阈枰钚碌陌姹荆埐榭次募锏木W(wǎng)址 到作者的主頁。

            每個(gè)標(biāo)題后面的lisp代碼是需要寫到配置文件里的東西。
            session.el

            (require 'session)
            (add-hook 'after-init-hook 'session-initialize)

            使用了這個(gè)擴(kuò)展之后,你上次離開 Emacs 時(shí)的全局變量 (kill-ring,命令記錄……),局部變量,寄存器,打開的文件,修改過的文件和最后修改的位置,…… 全部都會被記錄下來。

            加載了 session 之后菜單上會多兩項(xiàng):最近訪問過的文件和最近修改過的文件。看這個(gè)圖 。
            desktop.el

            (load "desktop")
            (desktop-load-default)
            (desktop-read)

            如果你想保存上次打開的文件記錄,那么可以使用 desktop。這是 Emacs 自帶的。你只需要加入以上設(shè)置,然后 M-x desktop-save。以后 Emacs 啟動時(shí)就會打開你上次離開時(shí)的所有 buffer.

            M-x desktop-clear 可以刪除記住的內(nèi)容,你閑現(xiàn)在記住的 buffer 太多就可以采用這個(gè)辦法。不過我還是建議用 ibuffer(見下) 來管理這些buffer,因?yàn)橛袝r(shí)你會發(fā)現(xiàn),如果刪掉全部記住的buffer,以后你需要一定的時(shí)間來打開你經(jīng)常編輯的文件!

            如果session跟desktop配合,下次啟動Emacs 的時(shí)候,就像根本沒有關(guān)閉 Emacs 一樣!多爽!
            ibuffer.el

            把這幾行加入 .emacs 就可以把 C-x C-b 那個(gè)普通的 buffer menu 換成非常方便的 ibuffer 啦!

            (require 'ibuffer)
            (global-set-key (kbd "C-x C-b") 'ibuffer)

            使用了 desktop 之后有可能使你同時(shí)有幾十個(gè) buffer 同時(shí)打開著。有時(shí)你想把其中一些關(guān)閉,有時(shí)你想在某些 buffer 里尋找某個(gè) regexp。這個(gè)時(shí)候你可以用 ibuffer,它有跟 dired 相似的界面。可以對 buffer 進(jìn)行各種標(biāo)記,排序,隱藏,查找,替換。非常好用。看看這個(gè)抓圖就是我限定顯示 emacs-lisp-mode 和 c-mode 的 buffer,按 major mode 名稱排序,并做上一些記號的情況。

            我常用的一個(gè)功能是,用 %-n 標(biāo)記符合某種名字的 buffer,然后按 "O" 在這些buffer里尋找我需要的字串。比如在所有打開的后綴為 html 的 buffer 里尋找 "Emacs" 字樣,得到如下結(jié)果。
            browse-kill-ring.el

            (require 'browse-kill-ring)
            (global-set-key [(control c)(k)] 'browse-kill-ring)
            (browse-kill-ring-default-keybindings)

            方便的在 kill-ring 里尋找需要的東西。

            你是不是經(jīng)常按 C-y 放進(jìn)一個(gè) kill-ring 里的單元。然后 M-y,M-y,…… 來尋找你需要的很久以前剪切下來的東西?很費(fèi)事吧?用了 browse-kill-ring 就好了。你只需要把它綁定到一個(gè)熱鍵,比如 C-c k: 就能出現(xiàn)這樣一個(gè)buffer。[查看圖形]

            kill-ring 里的內(nèi)容都可以方便的瀏覽,粘貼。具體操作請?jiān)谶@個(gè) buffer 里 C-h m 或者 ?.
            ido.el

            你可能用過 iswitchb。但是當(dāng)有很多buffer時(shí),iswitchb 還是很慢。你可以使用ido。這是我見過的最方便的切換buffer,尋找文件的擴(kuò)展了。在你的 .emacs 文件里加入:

            (require 'ido)
            (ido-mode t)

            ido 主要有兩個(gè)界面:打開文件和切換buffer,它們之間可以隨便切換。它的原始的鍵設(shè)定不是很方便直觀,所以我把它另外設(shè)置了一下。看這個(gè)列表。其實(shí)你從這個(gè)列表就可以看出 ido 的功能。我這里只敘述一下基本的操作。

            1. 打開文件 (C-x C-f)

            啟動 ido-mode 以后,你可以在 C-x C-f 打開文件時(shí)得到一個(gè)如下的界面:

            你開始輸入文件名,前綴匹配的文件和目錄都會列在光標(biāo)后面的表里。目錄是紅色的。

            你可以使用 C-s,C-r 或者左右光標(biāo)鍵在匹配的文件之間來回旋轉(zhuǎn),按上下光標(biāo)可以在匹配的目錄名之間旋轉(zhuǎn)。你可以按 TAB 補(bǔ)全名字,方括號里的內(nèi)容是你按 TAB 將會補(bǔ)全的字符。按 backspace 遇到目錄名時(shí),一次會吃掉整個(gè)目錄名,并且到達(dá)上一級目錄。C-k 可以刪除一個(gè)文件。別擔(dān)心,當(dāng)刪除文件時(shí),你會被要求做出明確的回答。

            如果你按 C-p 就會啟動部分匹配,而不是嚴(yán)格前綴匹配。這時(shí)只要文件名的一部分與你的輸入匹配就會列在表中。

            按 C-t 就會切換到正則表達(dá)式匹配方式,你輸入的文字將被作為正則表達(dá)式對文件進(jìn)行匹配。比如我輸入 ".*el$" 就可以得到所有以 "el" 結(jié)尾的 文件列表。

            另外,C-c 和 C-a 分別切換大小寫匹配和忽略某些文件。

            你訪問過的目錄都會被 ido 記住,你可以按 M-up 和 M-down切換以前訪問過的目錄,按 M-left 和 M-right 可以提出以前使用過的文件名。

            按 C-b 就會切換到選擇buffer模式。按 C-d 就會進(jìn)入Dired.

            注意,你如果要?jiǎng)?chuàng)建一個(gè)新的文件叫 "ab",而你的目錄里有匹配前綴的文件或目錄,RET 就會打開部分匹配的文件。所以這個(gè)時(shí)候你必須按 C-j 來創(chuàng)建這樣一個(gè)文件。如果沒有匹配的文件,那么RET也會創(chuàng)建一個(gè)新的文件。

            由于方向鍵,backspace 和 C-f, C-b 都被作為其它用途了,所以如果你想把光標(biāo)移動到行首修改一些東西,你必須按 C-e 進(jìn)入編輯模式。
            2. 尋找文件

            Emacs 打開文件的函數(shù)叫 find-file。這是很多人不理解的問題。下面我們就能看到,有了 ido 之后,這個(gè)函數(shù)就名副其實(shí)了。當(dāng)你輸入了一個(gè)文件名或者正則表達(dá)式,而在當(dāng)前目錄沒有這樣的文件,你就可以利用ido的查找功能了。我舉一個(gè)例子好了。

            我經(jīng)常同時(shí)編輯不同種類的文件,它們在系統(tǒng)里不同的目錄中。它們的目錄名會被ido記住。這樣我打開一個(gè)文件時(shí),可以不管它在哪個(gè)目錄。我只需要輸入它的名字。比如,我剛才已經(jīng)打開了

            ~/html/emacs_elisp.html
            /usr/local/texlive/texmf-local/tex/latex/CJK/GB/c19fzhc.fd
            ~/.emacs.d/site-lisp/folding.el
            ....

            現(xiàn)在我想打開另一些

            /usr/local/texlive/texmf-local/tex/latex/CJK/GB/

            目錄下的 .cap 文件。我就在 C-x C-f 的界面按輸入 "cap$",然后打開正則匹配和部分匹配,出現(xiàn)以下界面:

            因?yàn)楫?dāng)前目錄(PWD)下沒有后綴是 fd 的文件,所以我按了一下 M-up,這下成了這個(gè)樣子:

            顯然它找到一個(gè)結(jié)尾是 "cap" 的文件,但是這不是我想要的,于是我繼續(xù)按一下 M-up 到再上面一個(gè)目錄里去找。就成了這樣:

            這就是我需要的文件!想一想,你的當(dāng)前目錄不在那個(gè)地方,用別的辦法打開如此深一個(gè)目錄里的文件需要花多少時(shí)間?

            其實(shí)我們還有一個(gè)竅門,剛才如果在不能匹配的時(shí)候按 M-s,ido 就會把所路徑合并,找到匹配文件,然后給出一個(gè)列表:
            3. 切換buffer(C-x b)

            切換 buffer 的界面也跟打開文件功能類似。不過少了一些文件特有的功能,多了一些buffer特有的的功能。

            打開文件時(shí) C-k 是刪除文件,現(xiàn)在 C-k 變成了關(guān)閉 buffer。如果你按 C-a 就會顯示通常被忽略的 buffer。

            如果不存在這樣的的buffer,你可以直接回車新建一個(gè)buffer,也可以使用 C-f 切換到打開文件界面。

            這個(gè)擴(kuò)展功能實(shí)在太多,你看了我的敘述能夠體會到它的方便了吧。但是實(shí)際使用時(shí),你很少能記住所有這些功能。最好是自己綁定鍵。在需要的時(shí)候可以查詢這個(gè)鍵綁定。就像我的這個(gè)鍵綁定。

            最新的 ido 可以逐步篩選你需要的文件 (ido-restrict-to-matches),你可以把這段代碼加入你的 .emacs.
            # swbuff

            (require 'swbuff)
            (global-set-key (kbd "") 'swbuff-switch-to-previous-buffer)
            (global-set-key (kbd "") 'swbuff-switch-to-next-buffer)
            (setq swbuff-exclude-buffer-regexps
            '("^ " "\\*.*\\*"))

            (setq swbuff-status-window-layout 'scroll)
            (setq swbuff-clear-delay 1)
            (setq swbuff-separator "|")
            (setq swbuff-window-min-text-height 1)

            使用這個(gè),你就可以方便的在最近編輯的 buffer 之間切換了。切換的時(shí)候會出現(xiàn)一個(gè)小窗口顯示附近的buffer,就像翻頁一樣。看看抓圖。

            我把它綁定到了 C-prior 和 C-next,按起來很方便。而且你可以用變量 swbuff-exclude-buffer-regexps 設(shè)定你不想看到的 buffer。它們不會出現(xiàn)在列表里。這個(gè)例子中我把所有名稱開頭是空格的 buffer 和名字前后都是 "*" 的都排除在輪訓(xùn)以外,這樣就可以在不同的文件之間切換而不被惱人的臨時(shí) buffer 擾亂了。

            一個(gè)很重要的變量是 swbuff-status-window-layout, 改變它的值可以改變 swbuff 下面那個(gè)窗口的顯示方式。

            如果你的 buffer 很多,這個(gè)窗口可以長得很大。如果你把 swbuff-status-window-layout設(shè)為 'adjust,則不論什么時(shí)候都會出現(xiàn)這樣的大窗口,設(shè)為 'default 則只有單窗口時(shí)才出現(xiàn)大窗口。雖然這個(gè)窗口只顯示幾秒鐘,但是 我很討厭一個(gè)那么大的窗口在我面前一閃。現(xiàn)在如果你把它設(shè)為 'scroll,不論什么時(shí)候都只占用一行。這樣buffer太多時(shí),那個(gè)窗口不會占用太多空間擾亂視線。

            原來的 swbuff 有一個(gè)小小的 bug, 無論 swbuff-status-window-layout 是什么值,都會顯示一個(gè)很大的窗口顯示所有的 buffer,這個(gè)文件是我修改過的版本。

            swbuff-clear-delay 可以控制小窗口消失的延遲。

            swbuff-window-min-text-height 可以控制小窗口的大小。如果設(shè)為 0, 就不會打開小窗口了。
            tabbar.el

            (require 'tabbar)
            (tabbar-mode)
            (global-set-key (kbd "") 'tabbar-backward-group)
            (global-set-key (kbd "") 'tabbar-forward-group)
            (global-set-key (kbd "") 'tabbar-backward)
            (global-set-key (kbd "") 'tabbar-forward)

            你曾經(jīng)覺得 Windows 樣式的編輯器上面的 tab 很好用吧?其實(shí) Emacs 的更好,它不但可以把所有 buffer 列在 tab 上,而且根據(jù) major mode 對 tab 進(jìn)行分組。你可以用 customize-group RET tabbar RET 來設(shè)置它的選項(xiàng)。

            我把Windows鍵盤上的 "Win" 鍵綁定到了這個(gè)功能,因?yàn)?tabbar 很像Windows 的風(fēng)格。按 Win-left 和 Win-right 就會在同組 tab 之間切換,Win-up 和 Win-down 可以在分組之間切換。

            看看下面幾個(gè)圖你就知道它如何好用啦!

            顯示 html mode 的分組:

            分組列表

            在不同的窗口里可以有獨(dú)立的 tab。圖片太大,要看的話點(diǎn)擊這里

            tabbar 有一個(gè)小小的 Hack, 可以使你更方便。
            speedbar

            這個(gè)是 Emacs 自帶的。M-x speedbar 就可以啟動它。它可以讓你 方便的瀏覽文件,你還可以顯示文件里的標(biāo)題,函數(shù),變量……

            在你編輯不同的文件時(shí),它可以顯示當(dāng)前文件所在目錄里的相關(guān)文 件和它們的信息,比如文件是否需要重新編譯,elisp文件是否已 經(jīng)編譯,…… 等等。

            你可以看看我的抓圖。
            table.el

            (autoload 'table-insert "table" "WYGIWYS table editor")

            非常酷的一個(gè)擴(kuò)展。可以“所見即所得”的編輯一個(gè)文本模式的表格。就跟很多字處理程序那樣操作,可以識別文本文件里本來就存在的表格,而且可以把表格輸出為 HTML 和 TeX。看看我的抓圖吧。
            recentf.el

            這個(gè)擴(kuò)展可以幫你保存一個(gè)“最近打開的文件”列表。在 .emacs 文件里加入:

            (require 'recentf)
            (recentf-mode 1)

            你可以把不常用的C-x C-r 綁定到這樣一個(gè)函數(shù):

            (defun recentf-open-files-compl ()
            (interactive)
            (let* ((all-files recentf-list)
            (tocpl (mapcar (function
            (lambda (x) (cons (file-name-nondirectory x) x))) all-files))
            (prompt (append '("File name: ") tocpl))
            (fname (completing-read (car prompt) (cdr prompt) nil nil)))
            (find-file (cdr (assoc-ignore-representation fname tocpl)))))

            (global-set-key [(control x)(control r)] 'recentf-open-files-compl)

            這樣你就可以 C-x C-r 然后 TAB 列出最近打開文件列表了。
            rect-mark.el

            你是不是覺得 Emacs 的“矩形區(qū)域操作”不太直觀?使用這個(gè)包之后矩形 region會被真正顯示成一個(gè)矩形。[查看圖形]這可以使你的矩形操作大大方便。

            如果你已經(jīng)有了一個(gè) region。你可以使用 C-x r C-x 把它顯示為一個(gè)矩形。如果你剛開始設(shè)定一個(gè)矩形區(qū)域,你可以使用 C-x r 作為你的 set-mark-command 的前綴,比如 C-x r C-SPC。那么區(qū)域會被顯示為矩形。
            hippie-expand

            這個(gè)是 Emacs 自帶的功能,可是知道它的人不多。很多人用的是M-/ (dabbrev-expand) 這樣的東西。 hippie-expand 要強(qiáng)大的多。因?yàn)樗梢允褂脭U(kuò)展函數(shù)任意擴(kuò)充!你可以把你的 M-/ 綁定到 hippie-expand,馬上就可以體會到它的方便。

            (global-set-key [(meta ?/)] 'hippie-expand)

            你可以設(shè)置以下 hippie-expand 的補(bǔ)全方式。它是一個(gè)優(yōu)先列表, hippie-expand 會優(yōu)先使用表最前面的函數(shù)來補(bǔ)全。通常我的設(shè)置是:

            (setq hippie-expand-try-functions-list
            '(try-expand-dabbrev
            try-expand-dabbrev-visible
            try-expand-dabbrev-all-buffers
            try-expand-dabbrev-from-kill
            try-complete-file-name-partially
            try-complete-file-name
            try-expand-all-abbrevs
            try-expand-list
            try-expand-line
            try-complete-lisp-symbol-partially
            try-complete-lisp-symbol))

            這是說,首先使用當(dāng)前的buffer補(bǔ)全,如果找不到,就到別的可見的窗口里尋找,如果還找不到,那么到所有打開的buffer去找,如果還……那么到kill-ring里,到文件名,到簡稱列表里,到list,…… 當(dāng)前使用的匹配方式會在 echo 區(qū)域顯示。

            特別有意思的是 try-expand-line,它可以幫你補(bǔ)全整整一行文字。我很多時(shí)后有兩行文字大致相同,只有幾個(gè)字不一樣,但是我懶得去拷貝粘貼以下。那么我就輸入這行文字的前面幾個(gè)字。然后多按幾下 M-/ 就能得到那一行。
            括號匹配

            這是一個(gè)很小的函數(shù)。你是不是覺得 Emacs 在匹配的括號之間來回跳轉(zhuǎn)的時(shí)候按 C-M-f 和 C-M-b 太麻煩了?vi的 % 就很方便,我們可以把 % 設(shè)置為匹配括號。可是你想輸入 % 怎么辦呢?

            一個(gè)很巧妙的解決方案就是,當(dāng) % 在括號上按下時(shí),那么匹配括號,否則輸入一個(gè) %。你只需要在 .emacs 文件里加入這些東西就可以達(dá)到目的:

            (global-set-key "%" 'match-paren)

            (defun match-paren (arg)
            "Go to the matching paren if on a paren; otherwise insert %."
            (interactive "p")
            (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
            ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
            (t (self-insert-command (or arg 1)))))

            臨時(shí)記號

            有時(shí)你需要跳到另一個(gè)文件進(jìn)行一些操作,然后很快的跳回來。你當(dāng)然可以使用 bookmark 或者寄存器。但是這些實(shí)在是太慢了。你多想擁有vi那樣的 ma, mb, 'a, 'b 的操作。現(xiàn)在你可以用幾行 elisp 達(dá)到類似的目的:

            (global-set-key [(control ?\.)] 'ska-point-to-register)
            (global-set-key [(control ?\,)] 'ska-jump-to-register)
            (defun ska-point-to-register()
            "Store cursorposition _fast_ in a register.
            Use ska-jump-to-register to jump back to the stored
            position."
            (interactive)
            (setq zmacs-region-stays t)
            (point-to-register 8))

            (defun ska-jump-to-register()
            "Switches between current cursorposition and position
            that was stored with ska-point-to-register."
            (interactive)
            (setq zmacs-region-stays t)
            (let ((tmp (point-marker)))
            (jump-to-register 8)
            (set-register 8 tmp)))

            當(dāng)你按 C-. 時(shí)就做了一個(gè)記號。然后你可以到別處,按 C-, 就可以在這兩點(diǎn)之間來回跳轉(zhuǎn)了。這雖然沒有 vi 的 26 個(gè) mark 多,但是你仔細(xì)想想,vi的26個(gè) mark,你通常能用到幾個(gè)?
            go-to-char

            (defun wy-go-to-char (n char)
            "Move forward to Nth occurence of CHAR.
            Typing `wy-go-to-char-key' again will move forwad to the next Nth
            occurence of CHAR."
            (interactive "p\ncGo to char: ")
            (search-forward (string char) nil nil n)
            (while (char-equal (read-char)
            char)
            (search-forward (string char) nil nil n))
            (setq unread-command-events (list last-input-event)))

            (define-key global-map (kbd "C-c a") 'wy-go-to-char)

            非常感謝 Oliver Scholz 提供這個(gè)函數(shù)給我。

            這個(gè)函數(shù)是一個(gè) vi 的 "f" 命令的替代品。vi的用戶知道,vi有一個(gè)特別好的命令 "f"。當(dāng)你按 "fx", x 是任意一個(gè)字符時(shí),光標(biāo)就會移動到下一個(gè) "x" 處。這之后只要按 ";"(分號),光標(biāo)就到再下一個(gè) "x"。

            舉個(gè)例子說明這個(gè)命令的用途。比如我們有這樣一行字,光標(biāo)在行首。

            (setq unread-command-events (list last-input-event)))
            ^^^^^

            我們希望迅速的到達(dá)最后那個(gè) event 處,于是我在 vi 里按 "fe"。結(jié)果光標(biāo)到了 "setq" 的那個(gè) e 上面,這時(shí)候我接著按 ";", 不一會兒就到了我們想要的地方。很方便吧?可能起初不覺得,后來你發(fā)現(xiàn)這真的非常好!

            我一直覺得 Emacs 沒有這樣一個(gè)方便的命令,但是 Oliver 給了我一個(gè)完美的答案:

            有了這段代碼之后,當(dāng)你按 C-c a x (x 是任意一個(gè)字符) 時(shí),光標(biāo)就會到下一個(gè) x 處。再次按 x,光標(biāo)就到下一個(gè) x。比如 C-c a w w w w ..., C-c a b b b b b b ...

            我覺得這個(gè)方式比 vi 的 "f" 要快。
            setnu和setnu-plus

            這兩個(gè)包可以用來顯示文件的行號。并且根據(jù)是否空行和文件行的語法加亮顯示不同的數(shù)字顏色。

            看看我的抓圖。
            hide-region.el 和 hide-lines.el

            這兩個(gè)函數(shù)可以分別把一個(gè)區(qū)域和匹配某個(gè)regexp的行都藏起來,就跟不存在一樣……這樣你就可以對某些內(nèi)容進(jìn)行任意的操作而不會影響到其它的部分。

            hide-lines 在操作某些行的時(shí)候用起來特別方便。加一個(gè)前綴參數(shù)可以把不匹配的行都藏起來,只看到匹配的!看看我只顯示這個(gè)文件里含有g(shù)lobal-set-key 的行:

            ;;hide region
            (require 'hide-region)
            (global-set-key (kbd "C-c r") 'hide-region-hide)
            (global-set-key (kbd "C-c R") 'hide-region-unhide)


            ;; hide lines
            (require 'hide-lines)
            (global-set-key (kbd "C-c l") 'hide-lines)
            (global-set-key (kbd "C-c L") 'show-all-invisible)

            folding.el

            我的 folding 配置很長,要看請點(diǎn)擊這里。

            我編輯了這么長一個(gè) HTML 文件,你覺得一定很費(fèi)力,不容易定位吧?其實(shí)我的屏幕看起來就是這個(gè)樣子。所有小節(jié)都被我折疊了起來,我很容易就可以調(diào)換小節(jié)的位置。我剛才把folding的大段的配置代碼移動到了另一個(gè)文件,就像移動了一行。

            folding 根據(jù)不同的文檔有不同的標(biāo)記,它都是基于注釋的。本網(wǎng)頁就是這樣一個(gè)例子。
            htmlize.el

            把語法加亮的文件輸出成彩色 HTML 文件。看看這個(gè)例子。
            dictionary

            [本地下載][來源地]

            (autoload 'dictionary-search "dictionary"
            "Ask for a word and search it in all dictionaries" t)
            (autoload 'dictionary-match-words "dictionary"
            "Ask for a word and search all matching words in the dictionaries" t)
            (autoload 'dictionary-lookup-definition "dictionary"
            "Unconditionally lookup the word at point." t)
            (autoload 'dictionary "dictionary"
            "Create a new dictionary buffer" t)
            (autoload 'dictionary-mouse-popup-matching-words "dictionary"
            "Display entries matching the word at the cursor" t)
            (autoload 'dictionary-popup-matching-words "dictionary"
            "Display entries matching the word at the point" t)
            (autoload 'dictionary-tooltip-mode "dictionary"
            "Display tooltips for the current word" t)
            (autoload 'global-dictionary-tooltip-mode "dictionary"
            "Enable/disable dictionary-tooltip-mode for all buffers" t)

            (global-set-key [mouse-3] 'dictionary-mouse-popup-matching-words)
            (global-set-key [(control c)(d)] 'dictionary-lookup-definition)
            (global-set-key [(control c)(s)] 'dictionary-search)
            (global-set-key [(control c)(m)] 'dictionary-match-words)

            ;; choose a dictionary server
            (setq dictionary-server "localhost")

            ;; for dictionary tooltip mode
            ;; choose the dictionary: "wn" for WordNet
            ;; "web1913" for Webster's Revised Unabridged Dictionary(1913)
            ;; so on
            (setq dictionary-tooltip-dictionary "wn")
            (global-dictionary-tooltip-mode t)
            ;(dictionary-tooltip-mode t)

            連接到 dict 協(xié)議服務(wù)器,并且查詢單詞含義。按 C-c d 查詢道當(dāng) 前單詞,按 C-c m 在字典里查找一個(gè)匹配的單詞,鼠標(biāo)郵件點(diǎn)擊單詞 會彈出菜單。還有 tooltip 功能!非常好用!你可以看看我的屏幕截圖。

            你可以在自己機(jī)器上安裝一個(gè) dictd。這樣就不需要連到很遠(yuǎn)的服 務(wù)器查字典了。
            color theme

            Emacs 提供給你所有的配色機(jī)制,可是由于你的藝術(shù)細(xì)胞不夠,經(jīng)常為找不到好的配色方案而煩惱。使用這個(gè)包就可以方便的改變你的 Emacs 的配色方案啦!看看我的屏幕抓圖 [1] [2] [3]

            它提供了50種以上的配色方案。你只需要把:

            (require 'color-theme)

            加入到 .emacs 文件。使用 M-x color-theme-select 就會出現(xiàn)一個(gè)配色方案選擇窗口,在配色方案上按 l 就可以改變當(dāng)前 frame 的配色,按 i 就可以改變所有 frame 的配色。

            如果你想選定一個(gè)配色方案后就一直用它,而避免每次都加載大量用不著的 lisp代碼,按 p 就可以把當(dāng)前配色方案的 lisp 打印出來,你可以把它加到你的 .emacs 文件。而不使用 (require 'color-theme) 這樣可以加快啟動速度。
            thumbs

            這個(gè)擴(kuò)展可以把 Emacs 變成一個(gè)圖片瀏覽器。看看抓圖吧。
            mmm

            (autoload 'mmm-mode "mmm-mode" "Multiple Major Modes" t)
            (autoload 'mmm-parse-buffer "mmm-mode" "Automatic MMM-ification" t)

            你想過一個(gè) buffer 里同時(shí)存在很多個(gè) major mode 嗎?現(xiàn)在用 MMM 就可以辦到了。在不同的區(qū)域擁有對應(yīng)鍵綁定,變量,縮進(jìn) ……

            看看我的抓圖,HTML, Emacs Lisp, Perl, C 和 LaTeX 全都都在同一個(gè) buffer 里被正確的語法加亮了!而且TAB在不同的區(qū)域都可以進(jìn)行正確縮進(jìn)。在 LaTeX 的區(qū)域還可以使用 AUC TeX 來處理某個(gè)部分。

            當(dāng)然我現(xiàn)在是在濫用這個(gè)模式。如果你有嵌入 HTML 的 JavaScript 或 CSS2, PL/SQL,……這個(gè)就有用了。

            我可以使用這個(gè)擴(kuò)展來處理 CWEB 程序。最外面的 major mode 用 cweb-mode, 里面的 TeX 和 C 的區(qū)域就使用它們各自的TeX-mode 和 c-mode。看起來就像這個(gè)樣子 。
            AUCTeX

            看到這個(gè)名字你還以為是一個(gè) TeX 發(fā)行吧?它不是一個(gè) TeX 發(fā)行,而是一個(gè)專門用來幫助作者寫 TeX/LaTeX 文檔的工具。它大大加強(qiáng)了 LaTeX 用戶的能力。你寫文檔時(shí)能夠只 TeX 一個(gè)你覺得需要看到效果的 region 的內(nèi)容,而不必等待漫長的編譯過程啦!
            preview-latex

            可以把 LaTeX 文檔的效果插入到文檔里,形成一個(gè)預(yù)覽,與你的原文件一一對照。非常方便。你可以看看我的抓圖:

            文檔里的公式

            文檔里的圖片

            注意要用這個(gè)包,你必須安裝 TeX 系統(tǒng)和 AUCTeX.
            ctypes.el

            (require 'ctypes)
            (ctypes-auto-parse-mode 1)

            ctypes 可以識別你的 C 文件里的類型定義 (typedef)。自動對它們進(jìn)行語法加亮。
            ECB

            ECB(Emacs Code Browser) 是一個(gè)代碼瀏覽器,它依賴于Semantic 和Eieio。

            它們組合可以實(shí)現(xiàn)很好的文法分析的代碼瀏覽。ECB 在 Semantic 和 Eieio 的支持下,可以識別許許多多種計(jì)算機(jī)語言,C, C++, Java, Elisp, ...

            看看這個(gè)抓圖。
            Emacs Wiki

            (require 'emacs-wiki)

            (add-hook 'emacs-wiki-mode-hook
            (lambda ()
            (define-key emacs-wiki-mode-map (kbd "C-c C-h") 'emacs-wiki-preview-html)
            (define-key emacs-wiki-mode-map (kbd "C-c C-c") 'emacs-wiki-preview-source)
            (define-key emacs-wiki-mode-map (kbd "C-c C-v") 'emacs-wiki-change-project)

            ))

            ;; (setq emacs-wiki-grep-command "glimpse -nyi \"%W\"")

            (setq emacs-wiki-publishing-directory "publish")

            (setq emacs-wiki-directories '("~/WiKi"))
            (setq emacs-wiki-meta-charset "gb2312")
            (setq emacs-wiki-style-sheet
            "")

            (setq emacs-wiki-inline-relative-to 'emacs-wiki-publishing-directory)

            (defun emacs-wiki-preview-source ()
            (interactive)
            (emacs-wiki-publish-this-page)
            (find-file (emacs-wiki-published-file)))

            (defun emacs-wiki-preview-html ()
            (interactive)
            (emacs-wiki-publish-this-page)
            (browse-url (emacs-wiki-published-file)))

            (setq emacs-wiki-projects
            `(("default" . ((emacs-wiki-directories . ("~/WiKi"))))
            ("work" . ((fill-column . 65)
            (emacs-wiki-directories . ("~/workwiki/"))))))


            用來制作 WiKi 的包。非常方便。看看我的抓圖。

            這上面的只是我自己的設(shè)定,你要根據(jù)自己的情況修改。

            我寫了一個(gè)簡要的 WiKi 說明在 這里。

            更多的信息請參考 http://repose.cx/emacs/wiki/


            附件:
            elisp.zip [1.7 MiB]

            posted on 2011-05-25 20:15 艾斯維亞 閱讀(4441) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久综合视频网站| 亚洲性久久久影院| 国产成人精品免费久久久久| 精品久久久噜噜噜久久久 | 亚洲香蕉网久久综合影视| 欧洲成人午夜精品无码区久久| 色欲久久久天天天综合网精品| 狠色狠色狠狠色综合久久| 午夜精品久久久久9999高清| 午夜精品久久久久久毛片| 精品久久久久久久久久久久久久久| 日本亚洲色大成网站WWW久久| 国产成人精品久久| 久久se精品一区二区影院| 欧美一区二区三区久久综| 人人狠狠综合久久亚洲| 久久精品草草草| 久久亚洲国产成人精品性色| 人妻无码久久精品| 国产午夜福利精品久久| 国内精品久久久人妻中文字幕 | 精品久久人人爽天天玩人人妻| 久久被窝电影亚洲爽爽爽| 亚洲国产精品无码久久一线| 国产高潮久久免费观看| 97久久精品午夜一区二区| 久久这里只有精品18| 久久人人爽人人爽人人片AV高清| 久久se这里只有精品| 精品一区二区久久久久久久网站| 亚洲∧v久久久无码精品| 色婷婷综合久久久久中文| 国内精品久久久久影院老司| 午夜精品久久久久久久无码| 青草久久久国产线免观| 久久综合伊人77777麻豆| 久久这里只有精品久久| 亚洲成人精品久久| 精品国产婷婷久久久| 久久综合久久伊人| 亚洲欧美国产日韩综合久久|