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


            獲得輔助插件


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

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

            cedet+ecb:這兩個“插件”無比強大,專門為emacs作為IDE而設計的。我現在只使用了其中很小一部分功能,就領略到了它帶給我的高效。官方網站:http://ecb.sourceforge.net/ ; http://cedet.sourceforge.net/。下載這兩個插件,和xcscope一樣,復制到site-lisp目錄。

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

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


            配置emacs


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


            常用快捷鍵


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


            參考資料


            這里只是設計了emacs的皮毛,想要獲得更加了解emacs這個強大的編輯器,學習更多emacs的使用技巧請參考以下資料:
            《學習GNU emacs》機械工業出版社
            《生活在emacs中》IBM開發者網
            附件:
            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環境下編譯文件的按鍵組合
            小楓兒 發表于 2005-7-9 13:44:00

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

            C-x C-f : 打開一個文件,如果文件不存在,則創建一個文件

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

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

            M-v : 向后翻頁

            M-r : 將光標移動到屏幕中間那行

            C-a : 移到行首

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

            C-e : 移到行尾

            M-e : 移到句尾

            M-{ : 向上移動一段

            M-} : 向下移動一段

            C-right : 向前移動一個單詞

            C-left : 向后移動一個單詞

            C-up : 向前移動一段

            C-down : 向后移動一段

            M-< : 移到整個文本開頭

            M-> : 移到整個文本末尾

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

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

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

            C-x b : 切換到前一個編輯的buffer

            C-x C-b : 列出當前所有buffer

            C-x C-s : 保存當前buffer

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

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

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

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

            C-k : 從當前位置剪切到行尾

            C-y : 粘貼

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

            C-x r k : 執行矩形區域的剪切

            C-x r y : 執行矩形區域的粘貼
            窗口操作
            C-x 0 : 關閉當前窗口

            C-x 1 : 將當前窗口最大化

            C-x 2 : 垂直分割窗口

            C-x 3 : 水平分割窗口

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

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

            C-x < : 窗口內容右卷

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

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

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

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

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

            C-s RET : 普通搜索

            C-r : 向前搜索

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

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

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

            M-. : 跳到tag所在位置

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

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

            C-h f : 查看一個函數

            C-h v : 查看一個變量

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

            C-h C-f : 查看一個函數的Info,非常有用

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

            C-x h : 全部選中

            M-! : 執行外部shell命令

            M-x shell : 模擬shell的buffer

            M-x term : 模擬terminal, C-c k 關閉terminal

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

            一些擴展

            顯示行號
            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)

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

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

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

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

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

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

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

            緩沖區操作:

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

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

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

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

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

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

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

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

            任何命令都可以忘掉,C-h不能忘,因為通過它你可以找到其他所有的命令,不知道C-h怎么用?C-h C-h 這里第二個C-h是個help option,常用的option還有:

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

            2. user option和變量

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

            * 查看buffer列表 C-x C-b
            * 切換buffer C-x b
            * 關閉buffer C-x k
            * 保存當前的buffer到它關聯的文件 C-x C-s

            4. 編碼相關

            emacs使用language environment來進行編碼相關的設置。一個language environment為emcas中編碼相關的變量設置默認值,比較重要的設置項有:

            * 優先編碼列表 當讀入一個文件時,以該列表的順序來識別文件的編碼,用prefer-coding-system在該列表首插入一個編碼
            * default-buffer-file-coding-system 新建文件的默認編碼


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

            (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這個language environment下,emacs并不能自動識別gbk編碼的文件,因為其缺省設置的優先編碼列表沒有gbk,上面的lisp對UTF-8 language environment做了定制,之所以又加了一次utf-8編碼是因為希望在UTF-8這個language environment下首選的編碼是utf-8。

            5. registers

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

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

            6. undo and redo

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

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

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

            8. indentation

            在多數mode下,Tab鍵是被綁定到indent相關的命令上的,要插入tab字符,需要用C-q tab轉義一下。

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

            9. 字體

            emacs是針對charset來配置字體的,對要顯示的coding system中的字符,emacs把它們歸到這些charset中,然后使用在這些charset上指定的字體來顯示它們。這樣的一個字體配置在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. 常用命令

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

            12. 插件/擴展

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

            1. 如何在buffer中輸入回車和換行 C-q C-m 輸入回車(\r),這里C-q代表轉義,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語言程式的模式。在這個模式下面Emacs會提供一些針對C語言所增加的特性及功能。對於C的程式設計師而言是相當好 用的。雖然這篇文章著重在C mode之下,但是大部分的指令對於其他的模式依舊適用。
            避免被其他的設定所影響
            Emacs本身是一個非常有彈性的編輯器,因此經過相當的設定之後,原本預設的設定可能會被修改掉了。為了讓您的Emacs能夠符合本文件所列出的熱鍵及弁遄C建議您在home directory的.emacs檔案中加入下面的設定。


            (setq inhibit-default-init t) ; 避免被系統預設的設定所影響
            (keyboard-translate ?C-h ?C-?) ; 可以避免backspace變成help hot-key的問題
            (keyboard-translate ?C- ?C-h) ; 將help hot-key由Ctrl-h轉成Ctrl-
            ;; 以下的設定是讓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)

            進入及離開Emacs

            如果您的系統上面已經安裝好emacs,只要在shell下面執行emacs xxx.c就可以以C mode進入emacs中。如果您要離開emacs,則需要在emacs中鍵入:Ctrl-x-c。


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

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

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

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

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


            拷貝與搬移
            Ctrl-@ 設定標記起始點
            Ctrl-w 剪下標記起始點至目前游標所在位置的文字。
            Alt-w 複製標記起始點至目前游標所在位置的文字。
            Ctrl-y 貼上之前所剪下或複製的文字至目前游標所在的位置。

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

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

            編譯程式
            ESC x compile 在C mode中輸入ESC x compile就可以在不離開Emacs的狀況下進行程式的編譯。此時,emacs會顯示預設的編譯命令是make -k。compile之後,所有訊息都會出現在另一個視窗。
            Ctrl-x ` 編譯完成後,如果有錯誤發生,按下Ctrl-x `就可以跳到下一個有錯誤的地方,修改完成後,再按一次就可以繼續修改下一個錯誤,一直到沒有其他的錯誤為止。

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

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

            % etags -tlist_of_source_file

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

            % etags -t *.[ch]

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

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

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

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

            Emacs 具有超強的擴展性。這是當今沒有任何其它編輯器可以比擬的強大特點。這里介紹一些很方便的 Emacs Lisp 擴展。

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

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

            這里提供的下載是我正在用的版本。我沒有列出我找到它們的地址, 因為我記不住那么多。如果你需要最新的版本,請查看文件里的網址 到作者的主頁。

            每個標題后面的lisp代碼是需要寫到配置文件里的東西。
            session.el

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

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

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

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

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

            M-x desktop-clear 可以刪除記住的內容,你閑現在記住的 buffer 太多就可以采用這個辦法。不過我還是建議用 ibuffer(見下) 來管理這些buffer,因為有時你會發現,如果刪掉全部記住的buffer,以后你需要一定的時間來打開你經常編輯的文件!

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

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

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

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

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

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

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

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

            kill-ring 里的內容都可以方便的瀏覽,粘貼。具體操作請在這個 buffer 里 C-h m 或者 ?.
            ido.el

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

            (require 'ido)
            (ido-mode t)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            現在我想打開另一些

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

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

            因為當前目錄(PWD)下沒有后綴是 fd 的文件,所以我按了一下 M-up,這下成了這個樣子:

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

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

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

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

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

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

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

            最新的 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)

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

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

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

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

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

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

            swbuff-window-min-text-height 可以控制小窗口的大小。如果設為 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)

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

            我把Windows鍵盤上的 "Win" 鍵綁定到了這個功能,因為 tabbar 很像Windows 的風格。按 Win-left 和 Win-right 就會在同組 tab 之間切換,Win-up 和 Win-down 可以在分組之間切換。

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

            顯示 html mode 的分組:

            分組列表

            在不同的窗口里可以有獨立的 tab。圖片太大,要看的話點擊這里

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

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

            在你編輯不同的文件時,它可以顯示當前文件所在目錄里的相關文 件和它們的信息,比如文件是否需要重新編譯,elisp文件是否已 經編譯,…… 等等。

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

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

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

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

            (require 'recentf)
            (recentf-mode 1)

            你可以把不常用的C-x C-r 綁定到這樣一個函數:

            (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 的“矩形區域操作”不太直觀?使用這個包之后矩形 region會被真正顯示成一個矩形。[查看圖形]這可以使你的矩形操作大大方便。

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

            這個是 Emacs 自帶的功能,可是知道它的人不多。很多人用的是M-/ (dabbrev-expand) 這樣的東西。 hippie-expand 要強大的多。因為它可以使用擴展函數任意擴充!你可以把你的 M-/ 綁定到 hippie-expand,馬上就可以體會到它的方便。

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

            你可以設置以下 hippie-expand 的補全方式。它是一個優先列表, hippie-expand 會優先使用表最前面的函數來補全。通常我的設置是:

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

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

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

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

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

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

            臨時記號

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

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

            當你按 C-. 時就做了一個記號。然后你可以到別處,按 C-, 就可以在這兩點之間來回跳轉了。這雖然沒有 vi 的 26 個 mark 多,但是你仔細想想,vi的26個 mark,你通常能用到幾個?
            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 提供這個函數給我。

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

            舉個例子說明這個命令的用途。比如我們有這樣一行字,光標在行首。

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

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

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

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

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

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

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

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

            hide-lines 在操作某些行的時候用起來特別方便。加一個前綴參數可以把不匹配的行都藏起來,只看到匹配的!看看我只顯示這個文件里含有global-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 配置很長,要看請點擊這里。

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

            folding 根據不同的文檔有不同的標記,它都是基于注釋的。本網頁就是這樣一個例子。
            htmlize.el

            把語法加亮的文件輸出成彩色 HTML 文件。看看這個例子。
            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 協議服務器,并且查詢單詞含義。按 C-c d 查詢道當 前單詞,按 C-c m 在字典里查找一個匹配的單詞,鼠標郵件點擊單詞 會彈出菜單。還有 tooltip 功能!非常好用!你可以看看我的屏幕截圖。

            你可以在自己機器上安裝一個 dictd。這樣就不需要連到很遠的服 務器查字典了。
            color theme

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

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

            (require 'color-theme)

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

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

            這個擴展可以把 Emacs 變成一個圖片瀏覽器。看看抓圖吧。
            mmm

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

            你想過一個 buffer 里同時存在很多個 major mode 嗎?現在用 MMM 就可以辦到了。在不同的區域擁有對應鍵綁定,變量,縮進 ……

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

            當然我現在是在濫用這個模式。如果你有嵌入 HTML 的 JavaScript 或 CSS2, PL/SQL,……這個就有用了。

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

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

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

            文檔里的公式

            文檔里的圖片

            注意要用這個包,你必須安裝 TeX 系統和 AUCTeX.
            ctypes.el

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

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

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

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

            看看這個抓圖。
            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 的包。非常方便。看看我的抓圖。

            這上面的只是我自己的設定,你要根據自己的情況修改。

            我寫了一個簡要的 WiKi 說明在 這里。

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


            附件:
            elisp.zip [1.7 MiB]

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

            久久久精品国产sm调教网站| 久久人人爽人人爽人人片AV高清| 中文字幕精品久久| 久久丝袜精品中文字幕| 久久精品免费大片国产大片| 精品欧美一区二区三区久久久| 国产Av激情久久无码天堂| 少妇人妻88久久中文字幕| 亚洲中文字幕久久精品无码APP | 精品多毛少妇人妻AV免费久久| 日韩美女18网站久久精品| 亚洲国产精品狼友中文久久久| 久久亚洲中文字幕精品一区| 日韩电影久久久被窝网| 亚洲国产天堂久久综合| 综合久久国产九一剧情麻豆 | 久久久久久伊人高潮影院| 久久精品免费一区二区| 久久国产精品99精品国产| 久久人人爽人人爽人人AV| 精品熟女少妇av免费久久| 久久青青草原国产精品免费| 久久精品国产99久久香蕉| 亚洲国产成人精品女人久久久 | 99久久亚洲综合精品成人| 人妻久久久一区二区三区| 久久综合欧美成人| 久久亚洲电影| 精品国产一区二区三区久久久狼| 国产69精品久久久久99| 国产成人精品三上悠亚久久| a高清免费毛片久久| 无码任你躁久久久久久久| 国产美女久久精品香蕉69| 久久亚洲精品无码播放| 精品久久人人爽天天玩人人妻| 2021少妇久久久久久久久久| 久久高清一级毛片| 2021久久精品国产99国产精品| 国产成人无码精品久久久免费 | 国内精品久久久久影院网站|