TextMate’s magic: bundles, customized commands, snippets and macros recording

之前尝试过一段时间macvim后又转回了TextMate,想来我还是一个比较visual的人。都说“真正的程序员”都是用vi或是emacs的,不过有时候看着东西想用鼠标点却不能点,必须脑子里去想一下命令或是什么shortcut有时是不是也太隔靴搔痒了,这和五笔输入法其实很类似,重码少很高效很快速,但中断思路… 就是这么一个道理。
不过用久了也确实不排除熟能生巧的,所以我也对上面那句所谓的名言没有任何意见,比如退出vim的:q我基本不用思考

好了闲话又扯远了……

[Bundles]
bundle应该是TextMate里名气最大的了,如果你熟悉eclipse的话,bundle其实和eclipse的plugin很像,虽然textmate也有plugin但bundle的应用显然要更为广泛,之于历史,特性,比较之类的请交给google,这不是我们这儿的focus。
一般TextMate一个release都会built-in一堆广泛使用并口碑较好的bundle,好的bundle很多以至于我本人从来是都是觉得bundle太多太眼花了,其实真正经常用到的bundle就这么几个,于是bundle的更新倒是成了更大的问题,好在TextMate继承了*nix的传统,会优先读取user home下的bundle,问题的解决于是变的异常之trivial。
以TextMate的ruby on rails bundle为例,安装只要几行命令:

mkdir -p ~/Library/Application\ Support/TextMate/Bundles
cd ~/Library/Application\ Support/TextMate/Bundles
git clone git://github.com/drnic/ruby-on-rails-tmbundle.git "Ruby on Rails.tmbundle"
osascript -e 'tell app "TextMate" to reload bundles'

下次更新只要git pull一下然后tell textmate to reload bundles就万事大吉了。

[Commands & Snippets]
Command和Snippet是Bundle里面真正工作的unit,按照我个人的理解,snippet是textmate自己internal的解释执行,而command则是借助外部命令,因此command也比snippet相对更为强大,因为我们可以用ruby,python,perl,bash甚至php来进行文本处理,最后一点让command比snippet强大成为必然,那便是command最后执行的结果不但可以作为literal的text insert到editor中去,甚至也可以作为snippet而insert,想象一下… so powerful!
这里只举一个简单的例子,比如我最近写php code老是对每一行最后的“;”诟病不少,不是忘了就是觉得老是要移到行末然后append那个分号很stupid,于是一个模仿以前eclipse对java code的分号处理的command应运而生,本质上就是我在这一行随便哪个位置敲一个”;”,如果行末没有分号的话就直接append到行末,如果已经存在就把光标移到最后方便我敲回车换行…

Command本身的code用ruby实现,并bind到”;”这个key,scope的话只针对source.php:

#!/usr/bin/env ruby
line = STDIN.read.rstrip.gsub('$', '\$')

if(line =~ /;$/)
  print line
else
  print "#{line};"
end

[Macro]
这个就不详细介绍了,vim也支持,本质上是一样的,有时候会发现有些特性用command或是snippet实现有点麻烦,但用macro处理则突然柳暗花明了,也举一个简单的例子,还是以eclipse里面missing的feature为例,比如duplicate line down和duplicate line up,或者switch line up和switch line down,textmate对这些支持的不全面也不好,不过用macro录好并bind到熟悉的shortcut key后,一切又恢复井然有序了,record完后的duplicate line up如下:

moveToBeginningOfLine:
moveToEndOfLineAndModifySelection:
copy:
moveUp:
playMacroWithOptions:
deleteBackward:
paste:

不用过分关心macro的内容,不过我们也可以发现macro里面其实还可以再调用macro(playMacroWithOptions:),这让macro本身更增添了一份灵活。

Related posts:

6 Comments on "TextMate’s magic: bundles, customized commands, snippets and macros recording"

  1. Goodtiger China Mozilla Firefox Windows says:

    我缺一台MAC

  2. Goodtiger China Mozilla Firefox Windows says:

    除非转到做前端开发,不然公司不给配。

  3. Sunng China Mozilla SeaMonkey Windows says:

    vim有个snipMate插件也可以狂按tab。。。
    那个加;的脚本真不错啊

Got something to say? Go for it!

使用新浪微博登陆