2010/06/25

GNU Emacs on Windows

問:這篇要講什麼?
答:要講如何在Windows XP上使用GNU Emacs,主要是給程序員看的。我的電腦是Windows XP。

問:為什麼?Emacs這個古董不是很難用嗎?
答:雖然常常聽說Emacs很難學難用,卻是功能最強大的編輯器,也是程序員終極的工具,所以我就想說用用看囉。

這是GNU Emacs的logo。


問:你欠揍嗎?難用還用?
答:或許吧,別打我臉啊~不~哪裡都別打~。

問:Emacs到底是什麼東西?
答:很難解釋,讓我試試看。Emacs是個功能超強大的編輯器,但這不是重點,重點是它的擴充延展性超強,任何人都可以在上面“開發”,所以有人說Emacs是一個完整的開發平台,可以跟火狐Firefox對比一下,任何人都可以在上面開發各種功能的外掛;一般普通的編輯器(或是其他軟體),如果沒有某項功能,你就無計可施,如果某項操作行為不合你意,你也莫可奈何,如果是功能強一點的編輯器,會提供很多設定參數讓你修改,譬如修改各功能對應的快捷鍵;但在Emacs上,遇到這樣的情況,你都可以自己動手寫程式加功能進去,或者修改原有的操作行為,譬如說寫程式時,關鍵字、變數函數名稱、字串、註解等等你希望用不同顏色顯示,你就可以自己寫出這樣的功能;其實既然可以在其上寫程式,那你想要什麼功能都是可以辦得到的,譬如執行shell、讀寫email、呼叫外部程式(例如compiler、spell checker)、科學計算機、甚至瀏覽器都可以。

這種可以讓使用者自己“擴展、延伸”原有軟體功能的特性,在其他軟體也可以看得見,Firefox的外掛就不用說了;還有Microsoft Excel,你可以因特殊需要來寫數學運算式;很多編輯器也都可以錄製巨集,把一連串的指令錄下來,重複使用節省操作時間。

累了嗎?打打打俄羅斯方塊吧。

在Emacs裡面顯示圖檔。

當然別忘了寫程式喔,詳細看看這張圖,其中有寫程式的、有列出目錄檔案的、有執行shell的、有列出函式清單等等,甚至可以執行版本控管指令(cvs, svn...)。

問:可是我不想開發那些功能啊?
答:Emacs已經有三十多年的歷史了,很多功能都已經開發出來了,一般來說你不必擔心,只要找一找,應該都有你想要的外掛功能。想想看Firefox上面豐富的外掛吧。

哇,編輯LaTex耶,好棒。

問:哦,那如果沒有呢?
答:那就要用Emacs的開發語言"Emacs Lisp(elisp, Elisp)"來撰寫,elisp是Lisp程式語言的一個分支,時至今日其主要用途就是在Emacs上開發各種功能,事實上,Emacs的核心部分是以C撰寫,其他大部分都是以elisp撰寫;所以如果沒有你要的功能,也沒有別人要開發的話,請你自己寫吧。本篇不介紹elisp。

問:聽起來很不錯,但是,看圖、打遊戲、讀email,我只要另外執行一支軟體不就得了,為什麼一定要在Emacs內執行?還有,你說的很多編輯功能,我的編輯器也都有啊?
答:是的沒錯,但我上面說的重點是:Emacs是個強大完整的開發平台,發現不足時,就會有人開發各種外掛,這是某些編輯器沒辦法做到的。

而上面強調說“你可以在Emacs裡面做任何事!”,你可能看不出有什麼好處,讓我解釋一下其中的歷史背景,在很久很久以前,沒有『視窗介面』的那個時代,你執行編輯器寫程式,寫一寫離開,執行compiler,在shell下執行程式看看結果,然後再回去編輯器修改,累了就執行email軟體,或是西洋棋,這樣跳來跳去很麻煩,因為整個畫面會被你的軟體佔據,不像現在一個軟體有自己的一個視窗,所以自然會產生希望“一支軟體通吃”這樣的想法;雖然後來這種文字命令列模式也發展出很多機制(譬如同時使用很多個終端機畫面,還有screen這隻程式讓你在多個軟體間跳來跳去)來因應,但對於習慣視窗圖形化操作介面與滑鼠的人來說,那些機制都不夠便利,所以“你可以在Emacs裡面做任何事!”對於以前在命令列下工作的人來說是一大福音,但現在我們在各種環境(Windows, Mac, Linux...)都有圖形化操作介面了,所以這點已經不是那麼有吸引力了。

不過再強調一下,因為Emacs是個強大完整的開發平台,如果你願意學習elisp,那你可以把Emacs調整成你最喜歡的樣子,如果你不願意,也可以找到一堆別人開發出來好用的外掛。


想想看以前沒有滑鼠的時代(嗯,好像很難想像),Emacs是那種時代的產物,所有的動作都要用鍵盤完成,想想看,你要把一整塊文字做搬移的動作,沒有滑 鼠游標可用,只有鍵盤要怎麼達成,很難吧;而且,Emacs還有個中心思想:讓雙手保持在打字區,利用各種按鍵組合完成任務,減少把手移動到鍵盤右邊(上 下左右方向鍵、編輯鍵Delete、Page Up、Home)的機會,所以要記憶很多按鍵組合。結論就是,對於習慣滑鼠操作的人,Emacs以鍵盤為主的操作方法很古老很難學。

有了視窗介面與滑鼠,就不需要記憶一堆指令與參數;現代人用電腦時大部分時間都只需要瀏覽器與滑鼠。

問:好吧,那麼Emacs都有三十多年的歷史了,說些故事來聽聽吧?
答:這就免了吧,可以拜拜孤狗大神,或是查查維基百科吧。

問:難道都沒有其他同等的好產品嗎?
答:有的,但每個人都有不同的看法。有人不管什麼程式語言都用UltraEdit,我以前在寫C/C++時,用的是Source Insight,但我很多同事都是用SlickEdit,當我在寫簡單的Java程式時,用的是TextPad,但現在開發Java的首選Eclipse,另外還聽說TextMate(Mac)與E Text Editor(Windows)很棒(聽說其外掛能力也很強大,但我只有些許的使用經驗),我最近寫簡單的程式時,都是用NotePad++,寫大程式是用Visual Studio(Windows)與Xcode(Mac),在unix上我還用過joe與pico,但資深的都用vi或emacs;如果你問其他人,這份編輯器清單會長到不像話,編輯器之優劣爭論似乎跟程式語言優劣爭辯一樣,永無止息之日,所以就此打住。

這張圖是Source Insight,是我第一個接觸到功能夠強大的編輯器,改用Source Insight後就再也不可能回到Visual C++ 6.0的編輯器了。

問:那你用Emacs是為了什麼?
答:雖然理想上我們希望一支編輯器走遍天下,但現實上,不同的情況會有不同的最佳選擇。而我用Emacs主要是為了學寫lisp程式(但非elisp而是common lisp與scheme),而寫lisp程式最好的開發環境似乎就是Emacs。所以我會另外寫一篇關於在Windows上安裝common lisp系統,以及SLIME(輔助開發的Emacs外掛)。

問:除了Emacs就沒有其他選擇來寫lisp程式嗎?
答:當然有,Lispboxvim+limpLispIDEJabberwocky Cusp on Eclipse。有空就自己試試看囉。

問:我不需要寫lisp,我的編輯器也夠強,我不想學Emacs,再見。
答:不送了。

問:好吧,我想用看看,聽說Emacs有很多版本?
答:Emacs有很多版本分支,例如GNU Emacs、XEmacs、Aquamacs等等,這篇用的是GNU Emacs on Windows。另外在Cygwin上也有GNU Emacs,但我用了覺得怪怪的,譬如一開始居然沒辦法關掉程式離開。

問:去哪下載?
答:在官方網站的下載區,可以下載原始碼,不過編譯好的Windows版已經準備好了(不支援95與NT之前的版本)。目前(寫這篇的時候)最新版本是23.2,進去後可以看到兩種檔案,一種是emacs-23.2-barebin-i386.zip,裡面只有編譯過後的執行檔,沒有elisp code以及一些文件,不是我們要的;另一種是emacs-23.2-bin-i386.zip(43 MB),這才是完整的。

問:怎麼安裝?
答:安裝只需把檔案解壓縮即可,但解壓縮後的目錄名最好不要有空格或太長,避免發生一些奇怪的問題。因為Emacs以及相關軟體都有很深的unix背景,為避免麻煩,我採用無空格的目錄名。還有,為了配合unix的一些習慣,我在C:\下新增了一些目錄:
C:\home
C:\home\bin
C:\home\bin\emacs (Emacs放這裡,我把解壓縮後的目錄名emacs-23.2改成emacs。)
C:\home\yehnan (這是我的使用者目錄)

PS 因為我之後還要安裝lisp systems,所以才會有這些目錄,如果你不需要,只要把Emacs解壓縮到任何一個地方即可。

然後執行C:\home\bin\emacs\runemacs.exe,哇,出現了。自己拉個捷徑到桌面吧。注意,不是emacs.exe,其實也可以,但會多出一個沒用的命令列視窗。
沒錯,不用安裝,Emacs也不會在其他地方產生奇奇怪怪的檔案,你甚至可以把Emacs放進隨身碟帶著走,沒有問題。

如果你想要文字模式的話,在命令列模式下輸入c:\home\bin\emacs\bin\emacs -nw即可。

問:我改變心意了,怎麼解除安裝?
答:把剛剛那些目錄通通砍掉,還有你建立的捷徑,這樣就好了。

問:接下來呢?怎麼用?
答:嗯,你可以看看Emacs Tutorial(Emacs快速指南),就在Emacs的開始畫面上;或是GNU Emacs Manual(官方手冊),可以線上閱讀或是下載;或是看本書Learning GNU Emacs 3/E,這本書我只有大概翻過,覺得還不錯。

問:這些文件怎麼看起來怪怪的?
答:我覺得Emacs官方寫的文件都很奇怪很囉嗦,因為:

第一,寫的人把用的人都當做初學者,沒有使用編輯器的經驗、甚至沒有使用電腦的經驗。看看這段話:
"Files are named units of text which are stored by the operating system for you to retrieve later by name.",拜託,我還需要你教我“檔案”是什麼東西嗎?

第二,寫文件的人似乎停留在1980年代,裡面很多術語都很老舊了,看看這個:
" We use the term frame to mean the entire terminal screen or graphical window used by Emacs."、"The main area of the frame, below the tool bar (if one exists) and above the echo area, is called the window.",哇哩咧,你的frame是我的window,你的window又是什麼鬼?

第三,寫文件的人還在緬懷以前的時光,有些在以前算特殊的功能,已經不再特殊了,例如:
"You are reading about GNU Emacs, the GNU incarnation of the advanced, self-
documenting, customizable, extensible editor Emacs.",啥?self-documenting?哪個編輯器沒有說明文件啊?extensible, customizable?現在很多編輯器多多少少都可以客製化了。

第四,有些功能太過強大,所以解釋起來很麻煩:
"You can yank text from the kill ring into any position in a buffer, including a position in a different buffer; the kill ring is shared by all buffers.",yank&kill在這裡等於cut&paste,而kill ring呢?大概是指你cut好幾次後,不會只剩下最後一次cut的東西,之前的都還在kill ring裡面。

第五,因為Emacs以鍵盤為主,雖然現在有滑鼠可以用了,可是其中心思想還是要求所有的功能動作都要能用鍵盤達到,以至於像“把一段文字圈選”這種以滑鼠可以輕易達到的功能,手冊要用好多篇幅講解鍵盤的指令。譬如說:
"Setting the mark at a position in the text also activates it. When the mark is active, Emacs indicates the extent of the region by highlighting the text within it, using the region face. After certain non-motion commands, including any command that changes the text in the buffer, Emacs automatically deactivates the mark; this turns off the highlighting. ",什麼鬼啊,滑鼠點一點拉一拉就好了啦。

傳說中,能學會Emacs眾多指令的人,可以得到美女的青睞。真的還假的啊?

我會建議你找找網路上的入門介紹,比較快上手,要詳細一點的話Learning GNU Emacs應該是本不錯的書,至於我嘛,我把GNU Emacs Manual當做參考手冊,不會一頁一頁看,而是碰到問題再去裡面找答案。而我接下來要做的就是幫你入門,介紹一些基本觀念。

注意:老實說我不熟悉Emacs,我只是將一些基本的東西寫下來,能夠用就好,慢慢地再去學高階一點的功能與用法。我使用Emacs最主要的目的是要寫lisp程式,並不打算將Emacs當做我唯一的編輯器。

問:首先講解一下畫面上的各個區域吧?
答:
首先,你看到的整個畫面,稱之為frame(一般的術語會稱之為window視窗),
然後在上面有一條Menu Bar(選單列,File Edit Options Buffers Tools Help),
然後是一些常用功能的Tool Bar(工具列),
最下面那一條叫做echo area(目前顯示著"For more information about GNU Emacs...");
在Tool Bar下面、echo area上面的整個區域稱之為window,是用來顯示編輯內容,window還包括灰色的那條Mode Line

重點:Emacs把整個畫面叫做frame,把編輯一個檔案的地方叫做window。



問:好,接下來,怎麼新增檔案、開啟舊檔?
答:
方法一:用滑鼠把檔案從檔案總管拖曳進Emacs的畫面。
方法二:使用File->Visit New File...,新舊檔都可以。
方法二:使用File->Open File...,開舊檔。

稍微介紹一下“visit”(Emacs術語),意思是,產生出一個新的buffer,把檔案內容拷貝進去,然後把buffer內容秀在window上。接下來你就可以編輯了。

重點:所謂buffer就是一塊記憶體,Emacs把放檔案內容放進去讓我們編輯。


這裡要解說一下那條灰色的Mode Line。
最左邊的“-”,無意義。
左邊數來第二欄,代表編碼系統(Coding System)。如果是“-”,大概代表“undecided”或是“us-ascii”,表示英文,如果是“B”,代表“chinese-big5(cp950)”,表示中文,這是中文版Windows預設的編碼,如果是“U”,表示unicode,可以把滑鼠移到上面,會出現一些資訊;通常我們都不用去管,Emacs都可以正確判斷與處理。
左邊數來第三欄,代表End-Of-Line。如果是“\ or DOS”表示CRLF;“/ or Mac”表示CR;“: or Unix”表示LF。如果忘記了,就把滑鼠停在上面,會顯示資訊給你看。通常我們也不用管這個。
左邊數來第四欄跟第五欄,第四欄表示buffer是否唯讀,第五欄表示buffer是否有被修改(跟檔案內容不一樣了),“--”表示buffer未修改,“**”表示buffer有修改,“%*”表示buffer雖是唯讀但有修改,“%%”表示其他狀態。
左邊數來第六欄,通常是“-”,滑鼠停在上面會顯示檔案路徑,如果路徑是在遠方機器上,會顯示“@”。

好吧,你是不是頭昏眼花了,其實上面這些,通常我們都不用管,而且你把滑鼠移上去就知道了,不需硬記。

然後是buffer名稱,通常跟檔案名稱一樣。但有時候你會看到*Message*、*scratch* 、*GNU Emacs*、*Help*等等,這些有星號的buffer,都是Emacs內部會用到的,不用管他也不用急著把他們關掉。譬如你在echo area會看到很多訊息,這些訊息也會寫入到*Message*內。

然後是位置資訊,可能是“All or Top or Bot or nn%”,看就知道了。
然後是游標在第幾行,Lxx。

然後是所謂的Major Mode一些附加資訊(如果有的話),所謂major mode就是根據你在編輯的文件種類的不同,設計的編輯模式,例如“Text”、“HTML”、“Fundamental”、“C”等等。

然後是一連串的“---”,把滑鼠移上去會發現可以對window調整大小、放到最大、或移除掉;自己試試看就清楚了。

問:怎麼儲存檔案、另存新檔?
答:請問File->Save或是File->Save As...。

問:開了很多檔,到底有多少buffers啊?怎麼切換?
答:到選單Buffers就可以看到全部的buffers,點選就會切換。

問:怎麼把frame分割成多個windows用來分別顯示不同的buffers?
答:File->Split Window,可以上下分割。至於要左右分割的話,Emacs沒有把這個命令放到選單內,所以,我們終於要輸入Emacs指令囉,

左右分割的指令是“C-x 3”,C代表Ctrl,C-x代表按住Ctrl不放的同時按下x,然後放開,再按3。

任何時候,如果發現輸入指令有錯,可按C-g取消,或是按兩三次的ESC。

問:怎麼把window移除?
答:在mode line上按滑鼠右鍵即可。雖然把window移除,但buffer還是存在的。

問:那怎麼把一個buffer關閉?
答:File->Close。

問:我打錯東西要按C-z取消,怎麼反而把Emacs縮到最小了?
答:想要做undo(一般軟體都以C-z表示),Emacs的指令是C-/。

問:怎麼C-c、C-x、C-v不是複製剪下貼上啊?
答:可以到Options->C-x/C-c/C-v Cut and Paste (CUA),打開這個模式即可。

問:怎麼搜尋?
答:C-s往下尋找,C-r往上尋找。

問:那怎麼把Emacs關掉?
答:按整個畫面右上角的叉叉,或是File->Quit,如果有未存檔的buffer,會詢問你。

問:那接下來?
答:接下來就靠你自己了,我不是Emacs高手,只是因想寫lisp程式需要用Emacs,所以把初步介紹寫下來,下面有一些參考文件,可以作為你的下一步。

聽說Emacs很難學是不是真的啊?不是,正確說法應該是:很詭異。

參考資料:
1. GNU Emacs Manual
2. GNU Emacs FAQ For MS Windows
3. Xah's Emacs Tutorial
3. 炎龍的筆記本
4. Emacs 初學者

7 comments:

  1. Anonymous21/7/10 14:34

    自問自答的介紹方式真有趣。不小心就一路看完了。

    ReplyDelete
  2. 通俗易懂。這種方式對初學者很有效果。

    ReplyDelete
  3. Very good,very powerful...

    ReplyDelete
  4. Anonymous23/1/12 11:31

    我最近剛裝了emacs,然後發現有個小問題

    就是用微軟新注音輸入文字的時候,文字一開始不是會處在有底虛線的模式嗎?

    當文字處在這種模式時,文字居然沒辦法顯示出來,必須要按enter後才會顯示出來

    請問有什麼方法可以改進這點?

    ReplyDelete
  5. 我沒有這種狀況耶,我用奇摩輸入法、微軟新注音都ok,我用emacs 23.3。請問你的輸入法的版本?emacs的版本?

    若是輸入法太舊,可搜尋"微軟新注音法 2010"安裝新版。

    ReplyDelete
  6. Anonymous23/1/12 22:23

    謝謝你的回覆
    我是用emacs23-3,新注音我把它換成
    2010了,不過還是不行...

    ReplyDelete
  7. Anonymous23/1/12 22:34

    不過我改成新酷音來輸入的話就沒問題了

    ReplyDelete