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为例,安装只要几行命令: [cc lang=”bash” nowrap=”false”] 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’ [/cc] 下次更新只要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: [cc lang=”ruby”] #!/usr/bin/env ruby line = STDIN.read.rstrip.gsub(‘$’, ‘\$’) if(line =~ /;$/) print line else print “#{line};” end [/cc] [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如下: [cc lang=”ruby”] moveToBeginningOfLine: moveToEndOfLineAndModifySelection: copy: moveUp: playMacroWithOptions: deleteBackward: paste: [/cc] 不用过分关心macro的内容,不过我们也可以发现macro里面其实还可以再调用macro(playMacroWithOptions:),这让macro本身更增添了一份灵活。

Buy me a coffee
  • Post author: Samson Wu
  • Post link: 2042.html
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.
0%