<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TextMate Blog</title>
	<atom:link href="http://blog.macromates.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.macromates.com</link>
	<description>TextMate and OS X</description>
	<lastBuildDate>Fri, 26 Jun 2009 09:07:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bundles Repository Moved &amp; Mirrored</title>
		<link>http://blog.macromates.com/2009/bundles-repository-moved-mirrored/</link>
		<comments>http://blog.macromates.com/2009/bundles-repository-moved-mirrored/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 08:50:45 +0000</pubDate>
		<dc:creator>Jacob Rus</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2009/bundles-repository-moved-mirrored/</guid>
		<description><![CDATA[A couple of important announcements went out over the TextMate mailing list related to revision control, affecting any users keeping up with the “bleeding edge” of bundle development.

Subversion Relocation

The URL of the main Subversion repository has been changed from the forgettable untypeable http://macromates.com/svn/Bundles/ to a much nicer http://svn.textmate.org/. We made this change a while ago, [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of important announcements went out over the TextMate mailing list related to revision control, affecting any users keeping up with the “bleeding edge” of bundle development.</p>

<h2>Subversion Relocation</h2>

<p>The URL of the main Subversion repository has been changed from the forgettable untypeable <a href="http://macromates.com/svn/Bundles/">http://macromates.com/svn/Bundles/</a> to a much nicer <a href="http://svn.textmate.org/">http://svn.textmate.org/</a>. We made this change a while ago, but we didn’t put in a redirect before because we weren’t sure the new server could handle the load (there were some problems with the first one). We are putting in the redirect now.</p>

<p>Subversion doesn’t handle this change gracefully (it will just report an error and fail), so anyone using svn to keep up with bundle development needs to manually update the checkout to the new location.  Here are the steps required to relocate your checkout.</p>

<p><span id="more-200"></span>
In the terminal:</p>

<pre><code># assuming this is where your old chekout is
cd /Library/Application\ Support/TextMate

svn switch --relocate \
    http://macromates.com/svn/Bundles/trunk/ \
    http://svn.textmate.org/trunk/
</code></pre>

<p>If you have “switched” subsets of the checkout, for example to test the “work in progress” (WIP) bundles, then this relocate command won’t fix the switched bundles. Run <code>svn status</code> in the root of your checkout, which will indicate any switched bundles with an “S” marker. For each switched bundle, find the <em>from</em> URL by changing directories into the bundle, and running:</p>

<pre><code>svn info
</code></pre>

<p>This will show the URL on the second line. To make a <em>to</em> URL from that, just replace “macromates.com/svn/Bundles” with “svn.textmate.org”. We combine the <em>from</em> and <em>to</em> URLs when running the relocate command, for example:</p>

<pre><code>cd Bundles/Subversion.tmbundle

svn switch --relocate \
    'http://macromates.com/svn/Bundles/branches/Subversion%20(Interactive%20Input).tmbundle/' \
    'http://svn.textmate.org/branches/Subversion%20(Interactive%20Input).tmbundle/'
</code></pre>

<p>(This was detailed in <a href="http://lists.macromates.com/textmate-dev/2008-October/012980.html">this mailing list post</a>; instructions repeated here for convenience.)</p>

<h2>Git for Bundle Development</h2>

<p>For those developers who prefer distributed revision control, we’re now also mirroring the bundle repository on GitHub, at <a href="http://github.com/textmate/">http://github.com/textmate/</a>. This should make it much easier for you to customize your bundles and contribute back: just fork the bundle from GitHub, work on it locally, and then tell us when you have changes for us to pull back into the main repository. GitHub bundles will be kept in sync with the svn bundles, and changes to the main svn repository will be reflected at GitHub. As a bundle maintainer, you’ll be able to commit either to a fork of our GitHub bundle, or, as before, directly to svn. Anyone who isn’t a bundle maintainer will now also be able to work under version control.</p>

<p>For those existing authors without GitHub accounts, we used <code>«nick»@svn.textmate.org</code> as the commit email address. To link these changes to your account on GitHub so you’ll be properly credited (or blamed), just add that email to your account.</p>

<p>If you already forked a bundle obtained from svn, it would help us if you “rebase” that fork onto our GitHub mirror, as we carefully ensured proper history and author info for these mirrors. Also, our mirrors will serve as the starting point when looking for forks in the community.  It is a bit of a nuisance to rebase all of these bundle forks, we realize, but it can be finished all at once, and will save pain later on. The sooner we can manage it, the better. To learn how to rebase your checkout, see Allan’s recent <a href="http://lists.macromates.com/textmate-dev/2009-June/013991.html">mailing list post</a>.</p>

<p>This was initially intended as a two-way mirror (so that changes to the bundles in git would be reflected in svn as well), but the way <code>git-svn</code> works, we must rebase our “master” using the svn trunk, breaking the updates in one direction.  So for now it is only a passive mirror. Practically, this means that when we pull changes, we must go through svn, so these changes will be given a new address (hash) and authorship info when they arrive in our master branch, requiring the fork we pulled from to do a new merge. We are looking into how to avoid this (and for this reason we are hesitant to pull changes right now: manually updating the dropped author info is tedious).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2009/bundles-repository-moved-mirrored/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Working on It</title>
		<link>http://blog.macromates.com/2009/working-on-it/</link>
		<comments>http://blog.macromates.com/2009/working-on-it/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 07:31:16 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2009/working-on-it/</guid>
		<description><![CDATA[Over the past two years, posts on this blog have slowed to just a trickle, and a number of TextMate users have asked about TextMate’s status, or publicly worried about its future. This blog post, the first I’ve written here in a long time, is an attempt to assuage those concerns and answer some of [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past two years, posts on this blog have slowed to just a trickle, and a number of TextMate users have asked about TextMate’s status, or publicly worried about its future. This blog post, the first I’ve written here in a long time, is an attempt to assuage those concerns and answer some of the most frequent questions.</p>

<p>In short, TextMate development is going strong: TextMate 2 isn’t done yet, but progress is steady, it is starting to take shape, and the end is in sight. The rewrite has been a slow and careful process, but the ideas behind it are exciting. I hope to publicly describe some new abstractions in the coming weeks and months. Moreover, the community continues to churn out new bundles and features for TextMate 1.5, and I’ve been building up a backlog of posts describing them. While I am not writing to announce a release date for TextMate 2, I do hope that this post will be the first in a series showing a bit more transparency.</p>

<p><span id="more-199"></span>
The requests for TextMate 1 have mostly been incremental additions such as split views, chunked undo, and editing over SFTP. But TextMate 2 is about more than new surface features. Every part has been completely rewritten to take advantage of the lessons learned from the years of version 1. Not only are the low-level data structures chosen for increased flexibility, but the abstractions on which TextMate is built—snippets, scope-based language grammars, context-dependent settings—have been rethought and are more powerful than ever. In the coming months, I’ll try to describe some of these new abstractions, but for now, know that I am excited about the new ideas involved.</p>

<p>So where does development stand for 2.0? It feels to me like most of the modules are getting close, say 90%.  But as they say, on the horizon, mountains look small. While I use 2.0 for my own work, day-to-day, and the basic infrastructure is pretty solid, much of the front-end still needs work, and for now it’s all lacking the spit and polish of a finished app. Hopefully an alpha version will be ready before too long, but I can’t make any promises about dates.</p>

<p>And why haven’t I been better about keeping the world informed? It is a combination of many things really, but the main issue is that I am not good at writing for a large audience.  I am more into informal conversations, for instance over mailing lists or on IRC.  So while I started a lot of posts, I end up unhappy with them halfway through, and they don’t get finished or published. I <em>am</em> taking measures: I have enlisted a technical writer to help bring this blog back to life, and I’ll try to communicate more of TextMate’s status and direction through him.</p>

<p>Bigger than either of those problems though, as I mentioned, is that TextMate 2 is no minor facelift. It’s a major undertaking with a long timeline and its final form isn’t fully settled. I don’t want to hype vaporware, and I don’t want to get anyone’s hopes up before I know I can meet their expectations.</p>

<p>Furthermore, I haven’t wanted to throw ideas onto the internet without having a chance to implement them myself. I’m humbled that TextMate has served as inspiration for many other products, and I hope that it continues to be a model for other developers in the future, but I want to see my ideas done my way first, before I feed them to the competition.</p>

<p>I am trying to slowly turn this boat. With this post, I hopefully am showing that a hand is at the wheel. I know I’ve been quiet too long about my plans. I can’t make up for that, but going forward, I aim to do better.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2009/working-on-it/feed/</wfw:commentRss>
		<slash:comments>215</slash:comments>
		</item>
		<item>
		<title>ProjectPlus</title>
		<link>http://blog.macromates.com/2008/projectplus/</link>
		<comments>http://blog.macromates.com/2008/projectplus/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 10:00:00 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/projectplus/</guid>
		<description><![CDATA[There is a plug-in from Ciarán Walsh called ProjectPlus. It does SCM badgets (Git and SVN), Finder (color) labels, preserves project state between sessions, and lots more.
]]></description>
			<content:encoded><![CDATA[<p>There is a plug-in from Ciarán Walsh called <a href="http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus">ProjectPlus</a>. It does SCM badgets (Git and SVN), Finder (color) labels, preserves project state between sessions, and lots more.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/projectplus/feed/</wfw:commentRss>
		<slash:comments>101</slash:comments>
		</item>
		<item>
		<title>Bundles and GitHub</title>
		<link>http://blog.macromates.com/2008/bundles-and-github/</link>
		<comments>http://blog.macromates.com/2008/bundles-and-github/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 10:00:00 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/?p=191</guid>
		<description><![CDATA[To make it possible to find TextMate bundles by automatic tools such as TextMate Gem and the new GetBundles bundle (currently in review) the naming convention proposed is to include .tmbundle in the name of your bundle project.

Presently most bundles at GitHub use -tmbundle but likely because a dot was previously not allowed in a [...]]]></description>
			<content:encoded><![CDATA[<p>To make it possible to find TextMate bundles by automatic tools such as <a href="http://yehudakatz.com/2008/05/19/textmate-gem/">TextMate Gem</a> and the new <a href="http://lists.macromates.com/textmate/2008-July/026119.html">GetBundles bundle</a> (currently <a href="http://macromates.com/svn/Bundles/trunk/Review/Bundles/GetBundles.tmbundle/">in review</a>) the <a href="http://lists.macromates.com/textmate/2008-July/026146.html">naming convention proposed</a> is to include <code>.tmbundle</code> in the name of your bundle project.</p>

<p>Presently most bundles at <a href="http://github.com/" title="Git hosting and collaborative development">GitHub</a> use <code>-tmbundle</code> but likely because a dot was previously not allowed in a project name.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/bundles-and-github/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Japanese Manual</title>
		<link>http://blog.macromates.com/2008/japanese-manual/</link>
		<comments>http://blog.macromates.com/2008/japanese-manual/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 08:42:43 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/japanese-manual/</guid>
		<description><![CDATA[Thanks to the work of Takaaki Kato there now is a Japanese TextMate manual.

A few things still need to be translated (there is an issue tracker) but it should already be very useful for people who prefer reading Japanese over English.

And no, this does not mean that a new CJK-compliant TextMate has been released. The [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to the work of <a href="http://samuraicoder.net/">Takaaki Kato</a> there now is a <a href="http://manual.macromates.com/ja/">Japanese TextMate manual</a>.</p>

<p>A few things still need to be translated (there is an <a href="http://samuraicoder.net/lighthouse_textmate_manual_translation">issue tracker</a>) but it should already be very useful for people who prefer reading Japanese over English.</p>

<p>And no, this does not mean that a new CJK-compliant TextMate has been released. The best approach for <a href="http://blog.macromates.com/2006/faking-cjk-support/">using CJK with TextMate</a> is still via the plug-in.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/japanese-manual/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Working With History in Bash</title>
		<link>http://blog.macromates.com/2008/working-with-history-in-bash/</link>
		<comments>http://blog.macromates.com/2008/working-with-history-in-bash/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 16:28:07 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/working-with-history-in-bash/</guid>
		<description><![CDATA[Yesterday we talked about favorite bash features (on the ##textmate IRC channel). I figured it was worth posting mine to this blog, they mostly revolve around history, hence the title.



Setup

My shell history collects a lot of complex command invocations which take time to figure out. To ensure that I have access to them at a [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday we talked about favorite bash features (on the <code>##textmate</code> IRC channel). I figured it was worth posting mine to this blog, they mostly revolve around history, hence the title.</p>

<p><span id="more-189"></span></p>

<h2>Setup</h2>

<p>My shell history collects a lot of complex command invocations which take time to figure out. To ensure that I have access to them at a later time, I have the following 3 lines in my bash init:</p>

<pre><code>export HISTCONTROL=erasedups
export HISTSIZE=10000
shopt -s histappend
</code></pre>

<p>The first one will remove duplicates from the history (when a new item is added). For example if you switch between running <code>make</code> and <code>./a.out</code> in a shell, you may later find that the last 100 or so history items is a mix of these two commands. Not very useful.</p>

<p>The second one increase the history size. With duplicates erased, the history already holds a lot more actual information, but I still like to increase the default size of only 1,000 items.</p>

<p>The third line ensures that when you exit a shell, the history from that session is <em>appended</em> to <code>~/.bash_history</code>. Without this, you might very well lose the history of entire sessions (rather weird that this is not enabled by default).</p>

<h2>History Searching</h2>

<p>Now that I have my history preserved nicely in <code>~/.bash_history</code> there are a few ways to search it.</p>

<h3>Using Grep</h3>

<p>The most crude is <code>grep</code>. You can do:</p>

<pre><code>history|grep iptables
</code></pre>

<p>For me (on this particular Linux server) I get:</p>

<pre><code>4599  iptables -N http-block
4600  iptables -A http-block -s 58.60.43.196 -j DROP
4601  iptables -A INPUT -p tcp --dport 80 -j http-block
4602  iptables -L http-block
4603  iptables-save -c
4604  history|grep iptables
</code></pre>

<p>I do this often enough to have an alias for <code>history</code> (which is just <code>h</code>).</p>

<p>From the output I can either copy/paste the stuff I want, or repeat a given history event. You’ll notice that each history event has a number, you can repeat e.g. event number 4603 simply by running:</p>

<pre><code>!4603
</code></pre>

<p>I will write a bit more about referencing history events in History Expansion.</p>

<h3>Prefix Searching</h3>

<p>Similar to how you can press arrow up for the previous history event, there is a function you can invoke for the previous history event <em>with the same prefix as what is to the left of the insertion point</em>.</p>

<p>This function is called <code>history-search-backward</code> and by default does not have a key equivalent. So to actually reach this function, I have the following in <code>~/.inputrc</code> (or <code>/etc/inputrc</code> when I control the full system):</p>

<pre><code>"\ep": history-search-backward
</code></pre>

<p>This places the function on <abbr title="Escape">⎋</abbr>P (escape P). So if I want to repeat the <code>iptables-save -c</code> history event we found in previous section, all I do is type <code>ipt</code> and hit <abbr title="Escape">⎋</abbr>P. If it finds a later event with the same prefix, hit <abbr title="Escape">⎋</abbr>P again to go further back.</p>

<p><em>This functionality is offered by the <a href="http://tiswww.case.edu/php/chet/readline/rltop.html"><code>readline</code></a> library, so if you setup this key, you have access to prefix searching in all commands which use this library.</em></p>

<h3>Incremental Search</h3>

<p>It is possible to press <abbr title="Control-R">⌃R</abbr> to do an incremental (interactive) search of the history.</p>

<p>Personally I am not a big fan of this feature, so I will leave it at that :)</p>

<p><strong>Update:</strong> The reason I dislike <abbr title="Control-R">⌃R</abbr> is both because the interactive stuff just seems to get in the way (when <abbr title="Escape">⎋</abbr>P is what I need 99% of the time) and because it fails in cases where I “switch shell”, for example I may do: <code>ssh mm</code> press return, then instantly type: <code>f<abbr title="Escape">⎋</abbr>P</code> and again hit return (to execute <code>free -m</code> on the server called <code>mm</code>). I enter this <em>before</em> the connection to the server has been fully established, and here <abbr title="Control-R">⌃R</abbr> would have been taken by the local shell, but it is the shell history at the server I want to search.</p>

<h2>History Expansion</h2>

<p>History Expansion was what we did above when we ran <code>!4603</code>. It is a <abbr title="Domain Specific Language">DSL</abbr> for referencing history events and optionally run transformations on these.</p>

<p>Anyone interested in this should run <code>man bash</code> and search for <code>History Expansion</code>, but just to give you a feel for what it is, I will reference a subset of the manual and provide a few examples.</p>

<h3>Event Designators</h3>

<p>First, an event designator starts with <code>!</code> and then the event we want to reference. This can be:</p>

<pre><code>«n»      Reference event number «n».
-«n»     Go «n» events back.
!        Last line (this is the default).
#        Current line.
«text»   Last event starting with «text».
?«text»  Last event containing «text».
</code></pre>

<p>So if we want to re-run our <code>iptables-save -c</code> we can do: <code>!ipt</code>.</p>

<p>What’s more useful though is to use history references as part of larger commands.</p>

<p>For example take this example:</p>

<pre><code>% which ruby
/usr/bin/ruby
% ls -l $(!!)
lrwxr-xr-x  1 root  wheel  76 30 Oct  2007 /usr/bin/ruby -&gt; ../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby
</code></pre>

<p>Or something like:</p>

<pre><code>% make some_target
(no errors)
% path/to/target some arguments
(no errors)
% !-2 &amp;&amp; !-1
</code></pre>

<h3>Word Designators</h3>

<p>In the previous section we referenced entire history events. It is possible to reference just a subset of a history event by appending a <code>:</code> to the event designator and then the word of interest, the two most useful are:</p>

<pre><code>«n»      Reference the «n»’th word.
$        Reference the last word.
</code></pre>

<p>So for example we can do:</p>

<pre><code>% mkdir -p /path/to/our/www-files
(no errors)
% chown www:www !$
(no errors)
</code></pre>

<p>Here we reference last word of last line. We can also reference stuff on the same line, e.g.:</p>

<pre><code>% cp /path/to/important/file !#:1_backup
</code></pre>

<p><em>To reference the last word of last line one can also press <code><abbr title="Escape">⎋</abbr>_</code> which will immediately insert that word.</em></p>

<h3>Modifiers</h3>

<p>To make history substitution even more useful (and harder to remember), one can also add a modifier to the event designator.</p>

<p>The most useful modifiers are in my experience <code>:h</code> and <code>:t</code>, these are head and tail respectively or better know as <code>dirname</code> and <code>basename</code>.</p>

<p>An example could be:</p>

<pre><code>% ls -l /path/to/some/file
(listing of file)
% cd !$:h
(change directory to that of file)
</code></pre>

<h2>Brace Expansion</h2>

<p>Somewhat related to the backup example where we reference the first argument as <code>!#:1</code> and append <code>_backup</code> to this, another approach is bracket expansion.</p>

<p>Anywhere on a command line, one can write <code>{a,b,c}</code> which will expand to the 3 words <code>a</code>, <code>b</code>, and <code>c</code>. If we include a prefix/suffix, that will be part of each of the expanded words. We can also leave the word in the braces empty, and have it expand to just the prefix/suffix, so for example we can do:</p>

<pre><code>% cp /path/to/important/file{,_backup}
</code></pre>

<p>This is functionally equivalent to:</p>

<pre><code>% cp /path/to/important/file !#:1_backup
</code></pre>

<p>But lack of hardcoded word number is IMO an improvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/working-with-history-in-bash/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>TextMate (Ruby) Tricks</title>
		<link>http://blog.macromates.com/2008/textmate-ruby-tricks/</link>
		<comments>http://blog.macromates.com/2008/textmate-ruby-tricks/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 12:22:05 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/textmate-ruby-tricks/</guid>
		<description><![CDATA[John Muchow of Mac Developer Tips recently posted a screencast showing a neat way to debug your Ruby code.

Speaking of the Ruby bundle, Ciarán Walsh has a post about the design philosophy behind the mnemonics of the Ruby bundle and a few highlights.

And while there seems to be a preference for writing TextMate commands in [...]]]></description>
			<content:encoded><![CDATA[<p>John Muchow of <a href="http://macdevelopertips.com/">Mac Developer Tips</a> recently posted a screencast showing a <a href="http://macdevelopertips.com/textmate/textmate-execute-inline-ruby.html">neat way to debug your Ruby code</a>.</p>

<p>Speaking of the Ruby bundle, Ciarán Walsh has a post about the <a href="http://ciaranwal.sh/2008/02/20/textmate-tip-the-ruby-bundle">design philosophy behind the mnemonics of the Ruby bundle</a> and a few highlights.</p>

<p>And while there seems to be a preference for writing TextMate commands in Ruby, anything that you can run from a terminal (shell) can be used. A <a href="http://ciaranwal.sh/2008/04/04/textmate-tip-using-php-for-commands">step-by-step tutorial about how to write TextMate commands in PHP</a> is available at Ciarán’s blog. I pushed him to write this one, as I believe there are a lot of people who work with PHP in TextMate that never got around to writing custom commands in the false belief that they would have to learn <a href="http://en.wikipedia.org/wiki/Elisp">elisp</a> or some similarly obscure language :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/textmate-ruby-tricks/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>ExpanDrive — Seamless sftp mounts</title>
		<link>http://blog.macromates.com/2008/expandrive-seamless-sftp-mounts/</link>
		<comments>http://blog.macromates.com/2008/expandrive-seamless-sftp-mounts/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 12:51:45 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/expandrive-seamless-sftp-mounts/</guid>
		<description><![CDATA[Not so long ago Jonathan Ragan-Kelley mentioned ExpanDrive on the mailing list and I assume it is the same Jonathan R. quoted on their page as saying:


  I’ve never seen TextMate work well on a network drive. With
  ExpanDrive, it’s a dream. And the drives stay mounted perfectly
  when I move my [...]]]></description>
			<content:encoded><![CDATA[<p>Not so long ago Jonathan Ragan-Kelley <a href="http://lists.macromates.com/pipermail/textmate/2008-February/024516.html">mentioned ExpanDrive on the mailing list</a> and I assume it is the same Jonathan R. quoted on <a href="http://www.magnetk.com/expandrive" title="ExpanDrive — Mount sftp onto your desktop (OS X)">their page</a> as saying:</p>

<blockquote>
  <p>I’ve never seen TextMate work well on a network drive. With
  ExpanDrive, it’s a dream. And the drives stay mounted perfectly
  when I move my laptop between home and work.</p>
</blockquote>

<p>John Gruber just posted a <a href="http://daringfireball.net/2008/03/expandrive">review about ExpanDrive</a> in which he writes:</p>

<blockquote>
  <p>My first impression after reading ExpanDrive’s promotional
  description last week was that it sounded too good to be true. One
  week later, I’m pretty sure it actually <em>is</em> that good.</p>
</blockquote>

<p>If it wasn’t clear from the above, <a href="http://www.magnetk.com/expandrive" title="ExpanDrive — Mount sftp onto your desktop (OS X)">ExpanDrive</a> lets you mount remote sftp drives and it actually works! I.e. no long delays or dropped connection in the middle of a save. Their introductory price is $29.</p>

<p><strong>2008-03-11: Update:</strong> There is a $5 discount for the first 100 who use <code>UWQ0OUQZWIB1ZMTP</code> as coupon code.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/expandrive-seamless-sftp-mounts/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Changes — FileMerge Replacement</title>
		<link>http://blog.macromates.com/2008/changes-filemerge-replacement/</link>
		<comments>http://blog.macromates.com/2008/changes-filemerge-replacement/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 06:31:06 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/changes-%e2%80%94-filemerge-replacement/</guid>
		<description><![CDATA[

Ian Baird recently released Changes which is an application to show differences between two folders and merge these intelligently.

I know this is not an uncommon task among many TextMate users, as I have received quite a lot of requests for building such functionality — Changes of course has TextMate integration, so this application will hopefully [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.macromates.com/wp-content/uploads/2008/02/changes-icon.png" alt="Changes Application Icon" height="128" width="128" align="right"></p>

<p>Ian Baird recently released <a href="http://changesapp.com/">Changes</a> which is an application to show differences between two folders and merge these intelligently.</p>

<p>I know this is not an uncommon task among many TextMate users, as I have received quite a lot of requests for building such functionality — Changes of course has TextMate integration, so this application will hopefully satisfy a lot of you.</p>

<p>Version 1.0 of Changes is available for $39.95 (free trial) but if you use <code>TEXTMATE0308</code> as coupon code you can get it for $29.95 (offer lasts throughout March 2008).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/changes-filemerge-replacement/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Git Bundle</title>
		<link>http://blog.macromates.com/2008/git-bundle/</link>
		<comments>http://blog.macromates.com/2008/git-bundle/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 23:46:34 +0000</pubDate>
		<dc:creator>Allan Odgaard</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.macromates.com/2008/git-bundle/</guid>
		<description><![CDATA[You may have read that a lot of prominent people have recently moved to Git and are loving it. I too am one of those who fancy this new kid on the block but never got very far with the bundle I started for it.

Fortunately Tim Harper recently picked up on my initial efforts and [...]]]></description>
			<content:encoded><![CDATA[<p>You may have read that a lot of prominent people have recently moved to Git and are loving it. I too am one of those who fancy this new kid on the block but never got very far with the bundle I started for it.</p>

<p>Fortunately Tim Harper recently picked up on my initial efforts and has done a great job at not only making this bundle functional but also downright impressive :)</p>

<p>The much improved <a href="http://gitorious.org/projects/git-tmbundle">Git bundle can be found at Gitorious</a> and discussion about it can be directed to its <a href="http://groups.google.com/group/git-tmbundle" title="Git Bundle Google Group">Google Group</a>.</p>

<p>For those too lazy to click the link above, here are the short install instructions:</p>

<pre><code>mkdir -p /Library/Application\ Support/TextMate/Bundles
cd !$
git clone git://gitorious.org/git-tmbundle/mainline.git Git.tmbundle
osascript -e 'tell app "TextMate" to reload bundles'
</code></pre>

<p>After having installed it you can press <abbr title="Control-Command-T">⌃⌘T</abbr> in TextMate and enter <code>git</code> to find the <em>“Administration → Update Git Bundle”</em> action. Use this to update the bundle (it will automatically reload after having performed the update).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.macromates.com/2008/git-bundle/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.945 seconds -->
<!-- Cached page generated by WP-Super-Cache on 2009-07-04 12:36:08 -->
