這篇文章用來總結自己對emacs的理解。本人之前使用過vim和sublime,現在主要使用emacs。
Start
就編輯速度來說,是不會有編輯器比vim更快的了。我也常常將程式碼片段,或者日誌,xml,考到sublime進行分析。多行編輯很實用。
但我在平時,主要還是使用emacs,無論是用它寫部落格,寫程式碼,執行程式碼,寫GTD,管理文件…都非常的方便。
鍵繫結
一個高效的編輯器,就是能夠做到不用滑鼠,編輯時在滑鼠和鍵盤之間進行切換是一件很惱人的事情。這點在你抱著筆記本進行寫作的時候會深有體會。
常用的快捷鍵:(C代表Ctrl,A代表Alt)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
C-n 向下移動一個字元 C-p 向上移動一個字元 C-b 向左移動一個字元 C-f 向右移動一個字元 A-b 向左移動一個單詞 A-f 向右移動一個單詞 C-a 移動到行首 C-e 移動到行尾 C-@ 設定選擇下標 C-w 剪貼選中區域 A-w 複製選中區域 C-l 將游標所在行,作為中心行,刷屏 C-x H 全選整個緩衝區。 C-k 刪除游標後的整行內容 C-d 刪除一個字母 M-d 刪除一個單詞 C-_ Undo C-? Redo C-s 查詢 A-j 換行,與上一行保持同樣的縮排 A-< 移動到檔案頭部 A-> 移動到檔案尾部 C-x 3 左右分屏 C-x 2 上下分屏 C-x 1 除此屏全部關閉 C-x 0 關閉此屏 A-/ 補全 |
其它的一些也是因為不常用,基本不會去記它們的。
除了emacs自己的keybinding,我還特意做了些鍵繫結,提高效率。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
(global-set-key (kbd "C-M-h") 'backward-kill-word) ;; (bash中的回刪單詞,也是這三個鍵) (global-set-key (kbd "C-x f") 'recentf-ido-find-file) ;; (在最近開啟檔案列表中,選擇要開啟的檔案,這個很實用) (global-set-key (kbd "C-x t") 'insert-current-date) ;; (插入當前日期,在寫部落格或者gtd的時候,經常用日期作為檔名的一部分) (global-set-key (kbd "<f8>") 'insert-current-file-fill-path) ;; (插入當前檔案的完整路徑,這個也比較實用) (global-set-key (kbd "M-g") 'goto-line) ;; (跳轉到某一行,是沒有vim中的:n快) (global-set-key (kbd "C-x w") 'copy-word) ;; (複製一個單詞,只要游標落在單詞上,就可以複製整個單詞) 13 (global-set-key (kbd "C-x y") 'copy-line) 14 ;; (emacs是沒有這個快捷鍵的,只能自己去實現了。在vim中,yy就可以了) 15 (global-set-key (kbd "C-c C-b") 'comment-or-uncomment-region) 16 ;; (快速的對程式碼進行註釋與反註釋) 17 (define-key global-map (kbd "C-c a") 'wy-go-to-char) 18 ;; (跳到此行的某個字母,vim的f和t,比這個快得多) |
實用的多功能
多視窗編輯,檔案管理器,都是emacs多功能的一部分。甚至還可以配置git等外部程式,僅僅開啟一個emacs就夠了。
我的emacs還配置了以下實用的多功能
1 2 3 4 5 6 7 8 9 10 11 12 13 |
;; 快速的使用bing查詢(直接在emacs中查詢,然後就會彈出網頁上的查詢結果) (prelude-install-search-engine "bing" "https://cn.bing.com/search?q=" "Search Bing:" ) (global-set-key (kbd "C-c b") 'prelude-bing) ;; emacs 彈窗 (我常常退彈出一個cmd,執行python,或者執行git) (defvar popup-terminal-command (cond ((memq system-type '(windows-nt cygwin)) '("cmd" "/c" "start" )) (t '("x-terminal-emulator")))) (defun popup-term () (interactive) (apply 'start-process "terminal" nil popup-terminal-command)) (global-set-key (kbd "<f5>") 'popup-term) |
寫部落格
我的部落格是使用jekyll進行搭建的,所以日常,基本就是用markdown編輯完之後,用git推送到伺服器。
這裡要提的就是snippet,因為jekyll擴充套件了一部分的markdown語法格式,配置成snippet後,快速的插入模板片段非常有用。
比如我的sinppet:hl就對應jekyll的語法高亮擴充套件。這要比markdown自帶的語法高亮(縮排),功能強大一些。
markdown 高亮:
1 2 3 4 |
if i == 3: print "人生苦短" else: print "我用python" |
jekyll 高亮:
1 2 3 4 |
if i == 3: print "人生苦短" else: print "我用python" |
寫程式碼
我用emacs主要寫的程式碼就是python,或者是其它的指令碼,像是bash,反正我是不會用它寫c#的,沒有什麼編輯器會比vs更適合寫c#。
sinppet 是必不可少的了,python中能用到的snippet我都有配置,之前還配置過一部分和tornado相關的snippet。
我將emacs配置成可以彈窗出一個shell,我一般就在這個shell中執行python
或者直接彈出顯示結果,但是這樣不能錯誤資訊,而且你的python程式碼末尾必須要有raw_input() 否則一閃
1 2 3 4 5 6 7 |
;; emacs彈窗,執行,當前的python (defun popup-expython() (interactive) (let ((filename "test.py") (args (list "cmd" "/c" "start" "python" (buffer-name)))) (apply 'start-process "terminal" nil args))) (global-set-key (kbd "<f6>") 'popup-expython) |
不僅僅是鍵盤繫結,這些有關程式設計的emacs配置,也值得一提。
1 2 3 |
;; 好程式碼一行不應該超過80個字元 (add-hook 'python-mode-hook (lambda () (highlight-lines-matching-regexp ".\\{81\\}" "red"))) |
還有我的emacs主題是zenburn,這種主題看起來不扎眼,程式碼高亮美觀。很舒服。
寫GTD
我對GTD的理解,是要單獨寫的,這裡只介紹用emacs寫gtd的一部分內容。
emacs使用org模式來寫GTD,基本上可以看作是*做的一棵樹,可以切TODO和DONE,展開,摺疊,打標籤。
這裡插入我gtd的一部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
* Blog ** DONE 我應該將我購買的域名掛到自己的網站上 CLOSED: [2014-09-11 Thu 13:30] ** TODO 翻譯相關內容 * Book ** DONE 寫給上班族的世界史 CLOSED: [2014-09-05 週五 22:15] ** DONE 方與圓 CLOSED: [2014-09-21 週日 23:30] * 週末寫兩篇部落格 ** DONE 使用python的函數語言程式設計和c#的linq來實現操作,而非迭代器 CLOSED: [2014-11-24 週一 11:29] ** 寫一篇關於c#的迭代器和python的迭代器, |
不要神話emacs
之前在學習emacs和vim的時候,網上有許多文章神話這兩個編輯器,說是什麼神的編輯器和編輯器之神。 其實如果說智慧,它們是不會比VS智慧的,emacs和vim最多也就是文字匹配,而vs卻真正的在內部構建程式碼物件。emacs只是比較方便,比較自由而已,比較能折騰而已,要從實用角度出發,而不是做一個腦殘粉。