TextMate是極具創(chuàng)新性的編輯器,可惜現(xiàn)在很多特性已經(jīng)被其他編輯器或多或少的模仿了。
對于文本編輯器這個話題,我一直充滿了疑問:是什么魔力讓人們?nèi)绱俗分?a href="http://elephantinaurance.com/k/txt/" target="_blank">文本編輯器的力量?作為一個2004年才出道的毛頭小伙,TextMate憑 什么與Vim, Emacs這些前輩同臺競技,又有什么資格被稱為"The Missing Editor for Mac OS X"?
其實(shí),我對這些編輯器一直沒什么好感,一堆快捷鍵,好好的上下左右不用,非得用什么HJKL……我學(xué)習(xí)的動機(jī)主要是好奇。
令我驚訝的是James居然也是從窗口講起,還以為會先講講TextMate的設(shè)計(jì)哲學(xué)呢。
編輯窗口左側(cè)可以(注意是:可以)顯示行號、代碼折疊、書簽等。下方是當(dāng)前光標(biāo)的位置信息,文本格式等,按^ 可以調(diào)出Bundles。
敲字也瘋狂
敲字的三重境界:
敲A得A,敲B得B;
敲一個,得一雙;
只敲關(guān)鍵的,剩下的讓編輯器做去吧。
文藝一下^_^
以前總聽說TextMate支持多標(biāo)簽,可我怎么也找不到,原來必須先建個項(xiàng)目,項(xiàng)目里面的文件就能以標(biāo)簽形式顯現(xiàn)了。
標(biāo)簽間的切換,以及TextMate最夢幻的一個功能——智能查找(T 調(diào)出Go to File 窗口,如果你想找pitches_controller_test.rb,只需輸入pct,回車,就是你了)。它還有個兄弟Go to Symbol (⇧⌘ T)
TextMate提供的文本操作也很簡單,無非是移動、選中和智能變換。
移動,記住上下左右就夠了。不過,TextMate牛就牛在做移動,人家都能做出花來,比如,像CamelCaseWords這樣連在一起,但是用大寫字母分開的詞,用^ ←/ ^ →居然可以一個詞一個詞的跳躍。
以前在Windows的記事本里發(fā)現(xiàn)一個很貼心的設(shè)計(jì):按住alt就可以列選。其實(shí),TextMate也可以,按住⌥就行。
接下來是TextMate的有一個賣點(diǎn):自動補(bǔ)全(按,就是esc鍵啦)。
當(dāng)然,支持正則查找的⌘ F 更有用一些。
自動補(bǔ)全
TextMate的Bundles就像語言里的庫一樣,為不同需求的用戶帶來一站式的舒適(我剛下了一個Mathematica的Bundle, 雖然有些問題,還是挺強(qiáng)大的)。在我看來,bundle就是為某種需求定制的一個庫,約定好我敲個什么字,按個什么鍵,你就把它補(bǔ)全,比如:輸入一個 HTML標(biāo)簽div,按住⌃ <(學(xué)名叫神馬Insert Open/Close Tag (With Current Word)),TextMate就會幫你補(bǔ)全為<div></div>。
除了bundle之外,TextMate還提供了snippet, macros, command等工具。
Bundle
以Ruby Bundle 為例:
運(yùn)行腳本: ⌘ R
在注釋中標(biāo)注結(jié)果:先在需要計(jì)算的行后敲入 #⇥,#號會補(bǔ)全為# =>,然后⌃⇧⌘E,這時(shí)所有行尾標(biāo)有# => 的行都會自動計(jì)算結(jié)果。
’ Markers" width="750" height="259" style="border: 0px;" _src="http://pic.cr173.com/up/2015-4/2015042315433133002.jpg">
除了上面提到的#⇥,還有cla⇥, mod⇥, def⇥, defs⇥, deft⇥, r⇥, w⇥, rw⇥, if⇥, case⇥, while⇥, 以及關(guān)于迭代的snippet,inj⇥, tim⇥, ea⇥, sorb⇥, eawi⇥……
為單元測試提供了tc⇥, ts⇥, as⇥, asid⇥
用⌃H 查看Ruby的內(nèi)置文檔
……
Snippet
Snippet,顧名思義就是 一段小程序,就像平時(shí)看到好文章做的摘抄。一般由快捷鍵觸發(fā),書上是這么說的“This simple association of a trigger and a response is exactly what TextMate’s snippets are.”
你可以用⌃⌥⌘ B 來打開:
現(xiàn)在只要敲AP⇥ 就會自動展開為Armystrong Pope
snippet有兩個字符不代表其字面本身:$和`,你可以用/$和/` 來表示。除了字串展開,TextMate還可以制定⇥跳轉(zhuǎn)的位置。還記得填表的時(shí)候,按一下⇥ 就會自動調(diào)到下一個表格里么?這種技術(shù)在這就叫tab stop,從$1開始(是的,從1開始,$0結(jié)束),在需要跳轉(zhuǎn)的地方依次寫上$2, $3, ..., $n。如果不加tab stop,則默認(rèn)光標(biāo)停在sinppet的最后一個字符后。另外,還可以指定缺省值,像這樣:
<div${1: id="${2:some_id}"}>
$0
</div>
這樣,一開始會選中“id="some_id"”,按下⇥ 之后,光標(biāo)會圈住“some_id”。
如果僅僅是這些,TextMate就不會這么出名了。很多語言因?yàn)樽非髧?yán)謹(jǐn),要求在作用域的開頭和結(jié)尾都標(biāo)明名字,比如TeX里面
/begin{content}
/end{content}
這時(shí)你就可以使用鏡像,在begin{}里面輸入的內(nèi)容會在end{}里面同步出現(xiàn)?粗$n眼熟吧,感覺就像變量,實(shí)際上它就是變量。在需要的地方引用它就可以實(shí)現(xiàn)鏡像:
/begin{$1}
$0
/end{$1}
更進(jìn)一步,有些時(shí)候需要鏡像的內(nèi)容做一點(diǎn)點(diǎn)變換,比如首字母大寫啦……。噹噹噹,正則表達(dá)式出場!是的,你可以用正則表達(dá)式對tab stop 做變換。首字母大寫是吧,簡單:
begin ${1:foo}
// bla bla ...
end ${1/.//u$0/}
例子有欠妥當(dāng)。注意/u$0 的$0 是正則表達(dá)式里的$0,指代整個被匹配的字串;/u是說下一個字符大寫(這可是標(biāo)準(zhǔn)的正則表達(dá)式用法),因?yàn)樽饔迷谡淝,就變成了首字母大寫?/p>
還記得前面說snippet中有兩個特殊字符$ 和` 嗎?$用來引用變量,而` 通常用來插入shell代碼:
<a href="` echo http://example.com/ `"></a>
從如何改造TextMate你才能體會到它提供的這些定制機(jī)制是多么簡潔、貼心。
Macros
TextMate里的宏更像是M$ Office里的宏:開始記錄(⌥⌘ M),小紅燈閃,記錄,停止記錄(⌥⌘ M),打完收工。
Command
這里的command有些歧義,一是指Shell Commands,一是指TextMate里面一種自動補(bǔ)全的機(jī)制。
先說第一種,shell 命令。你可以在TextMate里敲一段腳本,然后⌃ R,TextMate會把運(yùn)行結(jié)果用管道傳送過來。
而TextMate中的command通常會調(diào)用shell 命令。相比snippet, macros, 它可以以更復(fù)雜的邏輯來完成自動補(bǔ)全。
TextMate 有哪些優(yōu)點(diǎn)?
我對其他編輯器了解不多,很多特性是我在TextMate第一次見到,因此如果說得不對大伙指正:
1. 首創(chuàng)Snippets代碼自動生成功能。相信很多人用TextMate是為了這個功能,它真的非常好用。當(dāng)時(shí)幾乎所有的IDE都是讓你填寫一大堆對話畫框,然后自動生成一個文件或者代碼,繁瑣而靈活性不佳。而在TM僅僅考一系列Snippets,就可以將預(yù)設(shè)好的縮寫詞擴(kuò)展成類、函數(shù)和分支循環(huán)結(jié)構(gòu),并且可以考tab逐次的修改自定義的部位;
2. 首創(chuàng)Plugin bundle的分發(fā)和管理機(jī)制,并且形成了一定規(guī)模的社區(qū)。TextMate的插件安裝非常簡單,而且隨裝隨用,隨時(shí)刪除。當(dāng)時(shí)很多軟件的插件都要自己拷貝so文件到制定目錄,vim需要在.vim/目錄下去解壓插件包或者手工復(fù)制vim。
3. 定義了lexical scope,使得所有Snippets,命令和宏的域都不是針對整個文件/項(xiàng)目的。這個設(shè)計(jì)使得不同類型的文件、甚至文件中不同的位置都可以共享相同的快捷鍵,行為卻是完全不同的。這一設(shè)計(jì)使得需要記住的快捷鍵命令大大減少,但是威力確依然不減;
4. 自動化編輯器里Discoverbility做得最好的。TextMate常常被用來和Vim、eMacs相比,具備不輸后兩者鍵盤操作,相差不遠(yuǎn)的可擴(kuò)展性。但是她的學(xué)習(xí)曲線卻驚人的平滑。這得意于她所有的快捷鍵都可以找到對應(yīng)的菜單操作。新手翻幾次菜單后,就可以記住常規(guī)的快捷鍵,而因?yàn)榈?點(diǎn)的緣故,用戶可以用這些快捷鍵在不同的文件類型中去嘗試,可以獲得不太超出預(yù)料的結(jié)果;
5. 善用腳本?赡芤?yàn)門extMate的作者之前是eMacs用戶,因此對于調(diào)用腳本的支持完善得很好,事實(shí)上,大部分TextMate命令都會調(diào)用外部腳本來實(shí)現(xiàn)某些功能。而且腳本可以是python, ruby, shell, perl等任何unix下能運(yùn)行的腳本。此外TextMate還不強(qiáng)迫用戶學(xué)會這些腳本語言,你可以作為bundle用戶,可以寫腳本開發(fā)bundle。
當(dāng)然,TextMate也有很多不足,加上作者在醞釀TM2,而不是快速迭代這一版本,導(dǎo)致演化過慢,很多功能都被其他編輯器模仿過去了。我覺得TM有一下幾點(diǎn)不足或者不再有優(yōu)勢的地方:
0. 寬字符支持太爛,永遠(yuǎn)的痛!
1. Snippets已經(jīng)被Vim、eMacs、NotePad++等一大堆編輯器所吸收;
2. bundle連vim都可以通過pathogen模仿;
3. 補(bǔ)全功能太弱;
4. 臨時(shí)性的管道輸入輸出,需要經(jīng)過一個對話框,遠(yuǎn)不如vim方便;
5. tab標(biāo)簽式多文件,文件一多導(dǎo)航不佳,不支持屏幕分割;尤其是文件切換避免不了鼠標(biāo)操作,無法和Vim/eMacs的存鍵盤操作媲美;
6. 文本查找對話框,現(xiàn)在連瀏覽器都不用了,也不如vim下的/方便。查找到的多個結(jié)果依賴鼠標(biāo)訪問,不像vim有quickfix和快捷鍵;
7. 遠(yuǎn)程編輯文件太弱了。
所以,大約用了1年左右的TextMate之后,我還是用回了Vim。Vim通過強(qiáng)大的可擴(kuò)展性和社區(qū)的支持,Snippets、bundle的劃分都逐漸成熟。而且個人已經(jīng)過Vim學(xué)習(xí)曲線陡的階段,TextMate對我來說,優(yōu)勢已經(jīng)不是太多了。
好在插件多啊。
不過是個不思進(jìn)取的編輯器。作者當(dāng)年許諾免費(fèi)升級到2.0已經(jīng)不指望了,但好歹你倒是升級啊!
相信以上是每個用 TextMate 的人都抱怨過的問題吧。
所以我們公司里的同志們都已經(jīng)紛紛轉(zhuǎn)用 vim 了,一樣有很多插件,自定義性極強(qiáng)(強(qiáng)到不搞一套別人做好的設(shè)置自己從頭設(shè)置能累死),開源。
tab鍵自動補(bǔ)全,多行編輯。我知道的有這些。
哈哈其實(shí)我也沒用過mac。用過一些在linux和windows上模仿的編輯器,感覺都一般。
ruby編程必備