又是好久沒更新了,不過還好,現在慢慢有點感覺了,好長時間不寫博客會心里有點感覺欠一點什么東西.覺得每次寫了東西都往主頁推搞得壓力好大,以后就不往網站首頁推了,純留下來供參考,另外就是主要方便從搜索找過來的朋友,希望能幫助你們在折騰的道路上少走一些彎路.
正題開始之前先說點題外話,最近使用org-mode,深深的佩服org-mode的作者,一個科學家(非計算機科學),從2003年到2013年的現在仍然在持續更新org-mode,讓更多的人認識到純文字的力量與好處,並且把org-mode做到了成為emac生態中不可或缺的一部分,真是不容易,org-mode我用地不熟,以后應該會專門詳細地討論它.
另外還有件事,這個系列的標題以后就不再維持我的Emacs折騰經驗談了,有點文不對題.具體改成什么我再想想.
進入正題:Yasnippet
啥是snippet
對於文本編輯器來說,snippet這個東西應該算非常有用了,尤其是對於java/c++程序員來說,可以迅速而正確地寫出一個塊的基礎框架,沒有接觸過snippet的同學可以想一想IDE里面的快速補全,雖然兩個東西還是很有差別的.我們拿sublime舉個例子:
我們寫java的時候輸入for,這時編輯器會有提示

我們可能會說for不是已經自動補全了嘛?為啥還可以選呢?別急,我們就tab一下試試看:

這是啥?這就是我們for語句循環體的必要的語法結構,我們本來把這個語法結構填滿之后,就形成了我們完整的for語句,但是,怎么才能填滿這個結構呢?可以看到,光標已經在第一個需要填的空上了,我們這時輸入i=0什么的,然后再按下tab,發生了什么?

我們的光標越過了下一個分號,來到了應該填第二個空的地方.就像這樣不斷地輸入+tab我們就填好了整個for語句結構.仔細想想,這樣是不是很省事?是不是節省了很多時間?
其實,snippet就是一些自動的"填空題"機制,我們需要某種語法結構的時候,就召喚出相應"填空題",然后把空填上就可以了.說實在的,snippet就是這么個東西.
Yasnippet
Yasnippet是Yet Another Snippet的簡稱,說明在snippet方面之前已經有不少前人做過工作了,而yasnippet最出名無疑是因為它最好的做到了大家心目中足夠好用的snippet的標准.
安裝yasnippet很簡單,我們的老辦法list-packages和package-install都可以用,我個人覺得這個東西在今后基本上都需要(本職工作碼農),所以就和linum一樣設置成了全局的,配置如下
;;yasnippet config (require 'yasnippet) (yas-global-mode 1)
然后,我經常寫clojure,但是yasnippet並沒有針對clojure的默認snippet,於是又找了clojure-snippet,就在list-package里面,非常方便.
編寫snippet
我們一上來就是可以用默認的snippet工作的,如果我們需要自定義snippet呢?畢竟作者在github里面說了不再會加入更多的snippet,而是把這一工作開放給其他人,可以找一些好的snippet collection使用.
如果我們要自定義snippet的話,可以任意打開一個snippet的文件:
# name: FILE *fp = fopen(..., ...);
# key: fopen
# --
FILE *${fp} = fopen(${"file"}, "${r}");
這個是c語言的fopen的snippet,很好懂,fopen后按tab,就會跳出最下面一行(模板),被${}包圍的就是要填的"空",而包圍的東西是默認值,如果直接按tab略過的話就會保留默認值.第二行key: fopen表明這個snippet的觸發器是fopen,只有fopen+TAB才能觸發這個snippet.
當然snippet編寫遠不止這么簡單:
# -*- coding: utf-8 -*- # name: def # contributor: Orestis Markou # contributor: Yasser González Fernández <yglez@uh.cu> # key: def # -- def ${1:name}($2): """$3 ${2:$ (let* ((indent (concat "\n" (make-string (current-column) 32))) (args (mapconcat '(lambda (x) (if (not (string= (nth 0 x) "")) (concat "- " (char-to-string 96) (nth 0 x) (char-to-string 96) ":"))) (mapcar '(lambda (x) (mapcar '(lambda (x) (replace-regexp-in-string "[[:blank:]]*$" "" (replace-regexp-in-string "^[[:blank:]]*" "" x))) x)) (mapcar '(lambda (x) (split-string x "=")) (split-string text ","))) indent))) (if (string= args "") (make-string 3 34) (mapconcat 'identity (list "" "Arguments:" args (make-string 3 34)) indent))) } $0
以上是python-mode的def的snippet,比原始的更加智能一些.雖然我不知道寫了什么....
好吧等我研究一下了再改,最后說點無關的:Emacs的C-a快捷鍵移到行首,C-e快捷鍵移到行尾,很好用,而且非常神奇的是在很多很多的編輯器里面都可以用,比如google的輸入框(沒做過實驗到底是因為google有這個設定還是firefox有這個設定還是vimperator有這個設定,但是博客園編輯器沒有),還有markdown編輯器mou,以及命令行終端里,很多時候都不用去找HOME鍵和END鍵,先試試C-a和C-e吧.
