查看單個文章
舊 2004-09-13, 11:15 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 不完全解讀 Emacs 編輯器—自由軟體的旗艦

希望本文能指引你進入Emacs的神奇世界

一 基本介紹
1. Emacs是什麼東西?

Emacs名字的正式由來是"Editing Macros"的簡稱,即「巨集編輯器」,當然這個「巨集」
和臭名昭著的「巨集病毒」沒有半點關係。也有一種說法是rms(Emacs的作者)最喜歡的
一家冰淇淋店的名字。經過將近20年的發展, Emacs的功能不斷的增強,現在更通用
的說法是"Emacs is the extensible, customizable, self-documenting real-time
display editor"。

也許你早就從網上,朋友或者某個討厭的Emacs fake zealot(比如我)那裡聽說過有
個 叫 "Emacs"的東西。也許你一直以為Emacs是來自遙遠的*nix世界的魔鬼,而對它
畏而遠之,但實際上,Emacs是一個真正的跨平台軟體,在最大限度上保證了平台無關
性,即使是在Windows下,也表現的非常出色,實際上我現在就是在Windows下寫這篇
文件。應廣大用戶的要求,微軟 的Visual Studio .Net 2005 beta版中已經實現了簡
單的模擬Emacs編輯模式,也許在正式版中會得到進一步的加強。

2. Emacs能做什麼?

顧名思義,Emacs的「本職工作」是編輯文本。這裡的文本包括的 範圍就很大了,像
我現在寫的這樣簡單的純文本,更主要是用來編輯各種程序的來源碼,比如C, C++,
C#, Perl, Python, html, php, lisp, matlab, tex....。

Emacs的強大體現在它的人
性化,和智能化。

比如不管在哪種語言模式下,都可以用 M-e, M-a 移動一句話,
M-{ M-} 移動一個段落,C-M-f, C-M-b 在平級的語法結構中移動,C-M-a C-M-e 在語
句塊中前後移動,等等等等。


你不需要去記住每個模式的操作方式,因為它們是如此
的一致,Emacs通常會很「聰明」的識別不同模式下各種語法結構的意義, 在任何模式
下 C-M-\ 都會把一段程式碼排版的整整齊齊, M-; 可以插入一條註釋並縮排到正確的地
方。

用Emacs編輯程式碼,可以實現語法加亮,折疊,隱藏,大綱模式,自動補全等基本功能
,可以直接使用編譯器和偵錯器來編譯,偵錯程序,可以直接把網頁程式碼送到瀏覽器
中預覽,可以把Emacs當成一個程式碼瀏覽器。

關於Emacs編寫程序方面的增強實在是太
多了,由於我水準很菜,也沒接觸過很多,總之當你有自己的需求的時候,直接去網
上找,Emacs很少會讓你失望的。

除了被用來編輯文本,Emacs也越來越多的被用來做其它事情,而且往往做得非常出色

dired 模式被用來作為文件管理器, 其功能比起同樣出色的Total Commander可一
點都不弱。


Gnus是訪問新聞組和接收郵件的利器,實現了專業層次的 Mail Client 功
能,Gnus 的 FAQ 中這樣寫道 "不要再問 『我能xxxx嗎?』之類的問題,因為你得到
的答案通常都是 『Yes』"。當然有點誇張了, 因為對於某些"私有"的東西,Gnus 支持
的並不好,比如微軟的 hotmail。

Emacs還可以被用來作為很多程序的前端,比如 mysql 資料庫, Matlab 軟體, 各種
Scheme 解釋器。

Emacs還有一大堆「亂七八糟」的功能,Emacs的日曆,能支持中國的曆法,天干地支
都支持,還能根據你所在地方的經度緯度計算日出日落時間。

配合Emacs日曆,可以寫
日誌,約會提醒等等和日程相關的事情。你要是想用Emacs做計算器,查字典,聊天,
播放mp3,使用p2p下載軟體,這些也不是不可以。

3. 為什麼要用Emacs?

看了前面一大堆功能(雖然不及Emacs實際功能的1%),你可能會說「你丫是不是有毛
病,這些功能都有專門的軟體去實現」。你說的沒錯。

當然每個人都有自己的選項習
慣。但是我的感覺是,Emacs不僅僅是能實現這些功能,關鍵是實現的往往非常出色,
不遜色於專有的軟體。

而且在Emacs中做這些事情,有一個統一的工作環境,不需要去
熟悉各種軟體的操作習慣,在Emacs中你會發現許多看似毫不相關的軟體功能,在
Emacs 中變得如此相似,我覺得這種感覺很美妙:P。

Emacs是一個「free software」,這裡的「free」是指「freedom」,而不是「免費」
的意思。當然對個人用戶來說,獲得Emacs通常都是免費的。
你永遠不會擔心「新版本
的完美破解怎麼還沒出來?」「昇級到新版本,key又失效了」,「這個軟體要是再便
宜一點我就能註冊了」,「這個軟體的作者真不厚道,老的註冊用戶都不能免費昇級了
」之類的問題。

Emacs屬於所有人,它是完全自由的,你可以自由的修改它以實現你需
要的功能,可以自由的和別人分享你修改後的程式碼,當然這一切都要遵循GPL。

4. Emacs與其它編輯器相比有什麼優點?

這個問題我沒辦法回答,因為我不敢對我不怎麼瞭解的東西妄加評論。尤其是在 et8
這藏龍臥虎的地方(我想你們也一樣吧?)。

我只能說Emacs 開放的 C+elisp 架構使
其具有幾乎無限的增強性,在增強性方面,是當之無愧的 No.1. 如果你看到其它某種
編輯器有個很酷的功能,不用懷疑,Emacs 可以實現它,如果你足夠強,可以自己動
手或者向某個你熟悉 elisp 高手求助。

總之,沒有什麼作為一個編輯器應該具有的
功能是 Emacs 實現不了的 。


5. Emacs 與其它編輯器相比有什麼缺點?

這個我倒可以說說:P。首先,用 Emacs 會上癮,在一個沒有 Emacs 的電腦上,你會
無精打采,沒有工作的熱情。如果你失去了自己的組態文件,你會變得痛苦萬分,因
為重新把 Emacs 組態一遍是很要花一番功夫的(除了 Emacs 還沒見過哪個軟體的配
置文件能讓人窮此一生的去研究)。

其次,Emacs 和其它編輯器相比是「臃腫」的,
和vim, editplus 這樣小巧的編輯器相比,它體積大,啟動慢,耗記憶體(現在我機器
上開了一個ue,四個emedit,和一個editplus,它們加起來消耗的記憶體還不到 Emacs
的一半 =_=),不過它的執行速度可一點都不慢,嘿嘿。


其實 Emacs 本來就不想做一
個小巧的編輯器,它的「正確使用方法」是:隨著你的系統一起啟動,直到你一天的
工作結束後關機,在這一天的工作當中,也許你根本不需要離開 Emacs。


最後,
Emacs 的操作習慣讓大部分用慣了 Windows 的人感到不爽, 很多人都是因為這個放棄
了它。剛開始你會覺得,Ctrl Alt Shift Esc + 各種各樣奇怪的按鍵方法很變態。

事實上 Emacs 的優勢不在擊鍵次數,使用 Emacs 就是要讓它少按鍵甚至不按鍵就實現
你想要的功呢。要說按鍵的簡潔,那老大應該是 Vim :P。再說, Emacs 的按鍵沒有你
想像的那麼複雜,它們的設計都有統一的規律, 熟悉了一種模式的按鍵,很容易就會熟
悉其它模式中的按鍵 , 這就是 Emacs 統一編輯環境帶來的好處。


6. 嘗試消除對 Emacs 的幾個偏見。

1. 「我X,啥破玩意,連語法加亮都沒有,刪了它」。

很多人這樣抱怨 ,不過稍微用腳丫子想一想,最早作為一個程序員給程序員寫的
編輯器,可能連這種最基本的功能都沒有麼?
實際上Emacs 對語法加亮的支持非常
好,它是根據語法分析來著色的,而不是死板的定義一堆的關鍵字和正則陳述式。


語法加亮其實是一個比較消耗資源的功能,特別是在 Emacs 誕生的那個年代。

而且 Emacs 所支持的機器比一般人聽過的都要多,不是每個機器都支持彩色
的....,類似的情況還有加亮選項區域。

還有可能是,最早使用Emacs 的超級大牛
根本不需要這個既消耗資源又對他們沒什麼用的功能。總之, Emacs 由於種種歷
史原因,保留了它特有的一些風格。只要是稍微有耐心的人,都會在 Option 表單
最顯眼的地方找到開啟它的選項。

2. 「開源的東西,還免費,品質靠不住」。

這麼認為的人應該不多。能在這個年代還抱有這種可笑的偏見只有兩種人:火星人
和極端的 Warez zealot。即便是微軟,也只會在他們的 FUD 戰術中「違心」的宣
稱一下而已,能騙一個是一個嘛:P。

附件中是我的一個 .emacs 組態文件,在我這裡測試完全正常,為了顯眼,放在第一個帖子裡
所上傳文件


;; Top line of .emacs: -*- coding: chinese-iso-8bit; -*-
(add-to-list 'load-path "c:/emas-lisp/mule-gbk-0.1.2004080701")
;;; GBK support
(setq w32-charset-info-alist
(cons '("gbk" w32-charset-gb2312 . 936) w32-charset-info-alist))
(require 'mule-gbk)
(set-w32-system-coding-system 'chinese-gbk)
(set-terminal-coding-system 'chinese-gbk)
(set-keyboard-coding-system 'chinese-gbk)
(set-language-environment 'chinese-gbk)
(set-clipboard-coding-system 'chinese-gbk)
(set-selection-coding-system 'chinese-gbk)
(setq locale-coding-system 'chinese-gbk)
(setq current-language-environment "Chinese-GBK")

;; Setup X Selection for mule-gbk
;(mule-gbk-selection-setup)

;;; Unicode support, for Emacs CVS (21.3.50) only
(when (fboundp 'utf-translate-cjk-mode)
;; Load modified utf-translate-cjk-mode
(require 'gbk-utf-mode)
;; Turn on utf-translate-cjk-mode
(utf-translate-cjk-mode 1)
;; Setup X selection for unicode encoding
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))

(create-fontset-from-fontset-spec
"-*-Lucida Sans Typewriter Std-normal-r-*-*-14-*-*-*-c-*-fontset-most,
chinese-gbk:-*-細明體-normal-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-gb2312:-*-細明體-normal-r-*-*-16-*-*-*-*-*-gb2312*-*,
chinese-cns11643-5:-*-細明體-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-cns11643-6:-*-細明體-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-cns11643-7:-*-細明體-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
korean-ksc5601:-*-Batang-normal-r-*-*-16-*-*-*-c-*-ksc5601.1987*-*,
chinese-big5-1:-*-細明體-normal-r-*-*-16-*-*-*-*-*-big5*-*,
chinese-big5-2:-*-細明體-normal-r-*-*-16-*-*-*-*-*-big5*-*,
japanese-jisx0208:-*-MS UI Gothic-medium-r-*-*-16-*-*-*-*-*-jisx0208*-*" t)

(setq default-frame-alist
(append
'((font . "fontset-most"))
default-frame-alist))

(setq inhibit-startup-message t)

;關閉起動時的那個「開機畫面」。

(setq column-number-mode t)

;顯示列號。

(setq mouse-yank-at-point t)

;不要在滑鼠點擊的那個地方插入剪貼板內容。我不喜歡那樣,經常把我的文件
;搞的一團糟。我覺得先用游標定位,然後滑鼠中鍵點擊要好的多。不管你的光
;標在文件的那個位置,或是在 minibuffer,滑鼠中鍵一點擊,X selection
;的內容就被插入到那個位置。


(setq default-major-mode 'text-mode)

;把預設的 major mode 設定為 text-mode, 而不是幾乎什麼功能也沒有的
;fundamental-mode.

(show-paren-mode t)
(setq show-paren-style 'parentheses)

;括號匹配時顯示另外一邊的括號,而不是煩人的跳到另一個括號。

(mouse-avoidance-mode 'animate)

;游標靠近滑鼠游標時,讓滑鼠游標自動讓開,別擋住視線。

(setq frame-title-format "emacs@%b")

;在標題欄顯示buffer的名字,而不是 emacs@!#*&!(&@# 這樣沒用的提示。

(auto-image-file-mode)

;讓 Emacs 可以直接開啟和顯示圖片。

(cond ((fboundp 'global-font-lock-mode)
;; Load the font-lock package.
(require 'font-lock)
;; Maximum colors
(setq font-lock-maximum-decoration t)
;; Turn on font-lock in all modes that support it
(global-font-lock-mode t)))

;進行語法加亮。

;設定一下制作備份時的版本控制,這樣更加安全。
(setq version-control t)
(setq kept-new-versions 3)
(setq delete-old-versions t)
(setq kept-old-versions 2)
(setq dired-kept-versions 1)

;設定自動備份檔案儲存的目錄,以免把你的磁牒弄得亂七八糟。
(setq backup-directory-alist '(("." . "~/.autosave")))


;讓 dired 可以遞回的拷貝和移除目錄。

(setq dired-recursive-copies 'top)
(setq dired-recursive-deletes 'top)


;;加亮選部分
(transient-mark-mode t)

(setq mouse-wheel-mode t)

;按照windowz用戶的習慣使用 `C-x C-c C-v'
(setq cua-mode t)

;按照windowz用戶的習慣,使用 'Ctrl Alt Shift + 方向鍵移動和選項文本'
;。
(setq pc-selection-mode t)

;設定日曆表的中文天干地支,在日期上按 `p C' 就可以顯示農曆和干支。
(setq chinese-calendar-celestial-stem
["甲" "乙" "丙" "丁" "戊" "已" "庚" "辛" "壬" "癸"])
(setq chinese-calendar-terrestrial-branch
["子" "丑" "寅" "卯" "辰" "巳" "午" "未" "申" "酉" "戌" "亥"])


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


;瀏覽剪貼板中的內容,綁定到 'C-c k'.
(require 'browse-kill-ring)
(global-set-key [(control c)(k)] 'browse-kill-ring)
(browse-kill-ring-default-keybindings)


;ido mode. 超強的buffer切換工具
(require 'ido)

;;{{{ ido: fast switch buffers

(add-hook 'ido-define-mode-map-hook 'ido-my-keys)

(defun ido-my-keys ()
"Set up the keymap for `ido'."
;; common keys
(define-key ido-mode-map "\C-e" 'ido-edit-input)
(define-key ido-mode-map "\t" 'ido-complete) ;; complete partial
(define-key ido-mode-map "\C-j" 'ido-select-text)
(define-key ido-mode-map "\C-m" 'ido-exit-minibuffer)
(define-key ido-mode-map "?" 'ido-completion-help) ;; list completions
(define-key ido-mode-map [(control ? )] 'ido-restrict-to-matches)
(define-key ido-mode-map [(control ?@)] 'ido-restrict-to-matches)

;; cycle through matches
(define-key ido-mode-map "\C-r" 'ido-prev-match)
(define-key ido-mode-map "\C-s" 'ido-next-match)
(define-key ido-mode-map [right] 'ido-next-match)
(define-key ido-mode-map [left] 'ido-prev-match)

;; toggles
(define-key ido-mode-map "\C-t" 'ido-toggle-regexp) ;; same as in isearch
(define-key ido-mode-map "\C-p" 'ido-toggle-prefix)
(define-key ido-mode-map "\C-c" 'ido-toggle-case)
(define-key ido-mode-map "\C-a" 'ido-toggle-ignore)

;; keys used in file and dir environment
(when (memq ido-cur-item '(file dir))
(define-key ido-mode-map "\C-b" 'ido-enter-switch-buffer)
(define-key ido-mode-map "\C-d" 'ido-enter-dired)
(define-key ido-mode-map "\C-f" 'ido-fallback-command)

;; cycle among directories
;; use [left] and [right] for matching files
(define-key ido-mode-map [down] 'ido-next-match-dir)
(define-key ido-mode-map [up] 'ido-prev-match-dir)

;; backspace functions
(define-key ido-mode-map [backspace] 'ido-delete-backward-updir)
(define-key ido-mode-map "\d" 'ido-delete-backward-updir)
(define-key ido-mode-map [(meta backspace)] 'ido-delete-backward-word-updir)
(define-key ido-mode-map [(control backspace)] 'ido-up-directory)

;; I can't understand this
(define-key ido-mode-map [(meta ?d)] 'ido-wide-find-dir)
(define-key ido-mode-map [(meta ?f)] 'ido-wide-find-file)
(define-key ido-mode-map [(meta ?k)] 'ido-forget-work-directory)
(define-key ido-mode-map [(meta ?m)] 'ido-make-directory)

(define-key ido-mode-map [(meta down)] 'ido-next-work-directory)
(define-key ido-mode-map [(meta up)] 'ido-prev-work-directory)
(define-key ido-mode-map [(meta left)] 'ido-prev-work-file)
(define-key ido-mode-map [(meta right)] 'ido-next-work-file)

;; search in the directories
;; use C-_ to undo this
(define-key ido-mode-map [(meta ?s)] 'ido-merge-work-directories)
(define-key ido-mode-map [(control ?\_)] 'ido-undo-merge-work-directory)
)

(when (eq ido-cur-item 'file)
(define-key ido-mode-map "\C-k" 'ido-delete-file-at-head)
(define-key ido-mode-map "\C-l" 'ido-toggle-literal)
(define-key ido-mode-map "\C-o" 'ido-copy-current-word)
(define-key ido-mode-map "\C-v" 'ido-toggle-vc)
(define-key ido-mode-map "\C-w" 'ido-copy-current-file-name)
)

(when (eq ido-cur-item 'buffer)
(define-key ido-mode-map "\C-b" 'ido-fallback-command)
(define-key ido-mode-map "\C-f" 'ido-enter-find-file)
(define-key ido-mode-map "\C-k" 'ido-kill-buffer-at-head)
))

(ido-mode t)
;;}}}


;自動補全
(global-set-key [(meta ?/)] '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))

;日出日落時間計算
(setq calendar-latitude 30.15)
(setq calendar-longitude 120.10)
(setq calendar-location-name "somewhere")


;解決中文 fill 的問題
(put-charset-property 'chinese-cns11643-5 'nospace-between-words t)
(put-charset-property 'chinese-cns11643-6 'nospace-between-words t)
(put-charset-property 'chinese-cns11643-7 'nospace-between-words t)

;記住上次編輯的文件。
(if (equal "21.3.1" emacs-version)
(desktop-load-default)
(desktop-save-mode t))
(desktop-read)
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次