<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="http://www.sanityinc.com">
<channel>
 <title>Sanity, Inc. - Simple thinking for complex software</title>
 <link>http://www.sanityinc.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SanityInc" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="sanityinc" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
 <title>Save hours by reading mailing lists in Emacs over IMAP</title>
 <link>http://www.sanityinc.com/articles/read-mailing-lists-in-emacs-over-imap</link>
 <description>&lt;p&gt;Emacs' built-in newsreader Gnus is made for efficiently keeping up with high-volume lists; I show how to hook it into your IMAP account.&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
With features like configurable message threading, kill-files and per-thread and per-poster scoring, Gnus has the potential to save a lot of the time you would normally spend wading through high-volume mailing lists.&lt;/p&gt;
&lt;p&gt;Nowadays most people read mailing lists via IMAP-enabled mail accounts, e.g. Gmail. Gnus supports IMAP directly, but it doesn't work well when the remote folders have thousands of messages, as is the case with many mailing lists. As a workaround, we can use &lt;a href="http://wiki.github.com/jgoerzen/offlineimap/"&gt;offlineimap&lt;/a&gt; to maintain a local copy of our folders. As a side benefit, we can then read mail off-line.&lt;/p&gt;
&lt;p&gt;We can use the excellent &lt;a href="http://www.dovecot.org/"&gt;Dovecot&lt;/a&gt; to provide an IMAP interface to that local copy so that Gnus can access it; and we can do this without configuring Dovecot as a full IMAP &lt;em&gt;server&lt;/em&gt;, which would need to run constantly and be configured for authentication etc.&lt;/p&gt;
&lt;p&gt;On a Mac, you can install dovecot and offlineimap with &lt;a href="http://github.com/mxcl/homebrew"&gt;Homebrew&lt;/a&gt;, &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; or, presumably, Fink.&lt;/p&gt;
&lt;p&gt;In ~/.dovecotrc:&lt;br /&gt;
&lt;div class="geshifilter text" style="font-family: monospace;"&gt;protocols = imap&lt;br /&gt;
mail_location = maildir:~/Library/Caches/OfflineImap&lt;br /&gt;
auth default {&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;And in ~/.offlineimaprc:&lt;br /&gt;
&lt;div class="geshifilter text" style="font-family: monospace;"&gt;[general]&lt;br /&gt;
accounts = Mail&lt;br /&gt;
maxsyncaccounts = 1&lt;br /&gt;
ui = TTY.TTYUI&lt;br /&gt;
[Account Mail]&lt;br /&gt;
localrepository = Local&lt;br /&gt;
remoterepository = Remote&lt;br /&gt;
[Repository Local]&lt;br /&gt;
type = IMAP&lt;br /&gt;
preauthtunnel = dovecot -c ~/.dovecotrc --exec-mail imap&lt;br /&gt;
[Repository Remote]&lt;br /&gt;
type = IMAP&lt;br /&gt;
# or &amp;quot;type = Gmail&amp;quot;, if applicable&lt;br /&gt;
remotehost = my.mail.server&lt;br /&gt;
remoteuser = myuser&lt;br /&gt;
remotepass = mypassword&lt;br /&gt;
ssl = yes&lt;br /&gt;
maxconnections = 1&lt;br /&gt;
realdelete = no&lt;br /&gt;
folderfilter = lambda foldername: re.search(&amp;quot;^Lists\.&amp;quot;, foldername)&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now, simply running "offlineimap" should sync your mailing lists into ~/Library/Caches/OfflineImap. (You'll need to do this regularly, e.g. before and after reading your lists. Julien Danjou recently wrote &lt;a href="http://julien.danjou.info/offlineimap-el.html"&gt;a nice elisp wrapper for offlineimap&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;All that remains is to tell Gnus how to access your local mail cache.&lt;/p&gt;
&lt;p&gt;In .gnus:&lt;br /&gt;
&lt;div class="geshifilter lisp" style="font-family: monospace;"&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;setq&lt;/span&gt; imap-shell-program &lt;span class="st0"&gt;&amp;quot;dovecot -c ~/.dovecotrc --exec-mail imap&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;setq&lt;/span&gt; gnus-select-method '&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nnimap &lt;span class="st0"&gt;&amp;quot;Mail&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;nnimap-stream shell&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now you can start Gnus with "M-x gnus", and then press "^" to enter the server buffer. Drill down into the "nnimap+Mail" server and use "u" to subscribe to each of the mailing lists. They should then appear in Gnus' main "*Group*" buffer.&lt;/p&gt;
&lt;p&gt;That's enough to get started reading mail more efficiently, and as with all things Emacs, there's great potential for customising Gnus to suit your own preferences.&lt;/p&gt;
&lt;h3&gt;Further reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bc.tech.coop/blog/070813.html"&gt;GNUS and Gmail setup for dummies&lt;/a&gt; - covers configuring Gnus to send mail over SMTP&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sachachua.com/blog/2008/05/geek-how-to-use-offlineimap-and-the-dovecot-mail-server-to-read-your-gmail-in-emacs-efficiently/"&gt;Sacha Chua's guide to Gnus + Offlineimap + Gmail&lt;/a&gt; - the source for much of this article&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnus.org/"&gt;Gnus homepage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=LLnqpnOAHuk:Y3c8fjG7xDk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=LLnqpnOAHuk:Y3c8fjG7xDk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=LLnqpnOAHuk:Y3c8fjG7xDk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=LLnqpnOAHuk:Y3c8fjG7xDk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=LLnqpnOAHuk:Y3c8fjG7xDk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/read-mailing-lists-in-emacs-over-imap#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/33</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/emacs">Emacs</category>
 <category domain="http://www.sanityinc.com/tags/productivity">Productivity</category>
 <pubDate>Sun, 05 Sep 2010 09:54:05 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">33 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Swimming in code: recent hacks</title>
 <link>http://www.sanityinc.com/articles/swimming-in-code</link>
 <description>&lt;p&gt;Recently I've been on a hacking high, touching a lot of code, and in touch with a lot of cool programmers. In retrospect I'm surprised at the variety of stuff I've been doing, so I thought I'd write a short list.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h3&gt;Open source&lt;/h3&gt;
&lt;h4&gt;Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;I added support for Twitter's "lists" to &lt;a href="http://tweet.seaofclouds.com/"&gt;seaofclouds' tweet.js widget&lt;/a&gt;: see my &lt;a href="http://github.com/purcell/tweet"&gt;clone on github&lt;/a&gt;. You can see it in action at the bottom of &lt;a href="http://www.looktothestars.org/"&gt;this page&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Clojure&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Congomongo - Clojure's de-facto standard library for accessing &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; - had no support for MongoDB's file &lt;a href="http://www.mongodb.org/display/DOCS/GridFS+Specification"&gt;GridFS&lt;/a&gt; file storage scheme, so I &lt;a href="http://github.com/purcell/congomongo"&gt;added it&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When I've only had a few spare minutes, I've been &lt;a href="http://github.com/purcell/rosettacode-clojure"&gt;filling in a few missing Clojure examples on Rosettacode&lt;/a&gt;. It's a great way to share knowledge, learn new libraries and algorithms, and solve puzzles.&lt;/li&gt;
&lt;li&gt;I've contributed minor patches to &lt;a href="http://github.com/technomancy/leiningen"&gt;Leiningen&lt;/a&gt;, the Clojure build tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ruby&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Accepted some patches for my &lt;a href="http://github.com/purcell/darcs-to-git"&gt;darcs-to-git&lt;/a&gt; repository conversion script. (See &lt;a href="http://www.sanityinc.com/articles/converting-darcs-repositories-to-git"&gt;my original article about this&lt;/a&gt;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Python&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;I've agreed to review (but not write) the unit-testing chapter of the PSF's planned Python book. Although I &lt;a href="http://pyunit.sf.net"&gt;wrote the unittest module&lt;/a&gt;, I'm no longer an active Python user or member of the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Emacs lisp&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;My haml-mode patch for colorizing "filter:" blocks in haml files has been &lt;a href="http://github.com/nex3/haml/commit/94a8228e"&gt;committed upstream&lt;/a&gt;, so now textile, markdown, javascript and ruby portions of these files are font-locked correctly.&lt;/li&gt;
&lt;li&gt;Naturally, while I've been doing all this diverse hacking, I've been &lt;a href="http://github.com/purcell/emacs.d/commits/master"&gt;tweaking my emacs config quite heavily&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Misc&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;As I recently blogged, I &lt;a href="http://www.sanityinc.com/articles/open-txmt-urls-from-rails-in-emacs-on-osx"&gt;customised emacs-handler&lt;/a&gt; and have played with &lt;a href="http://www.sanityinc.com/full-screen-support-for-cocoa-emacs-on-osx"&gt;full-screen support for Cocoa Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Closed-source&lt;/h3&gt;
&lt;p&gt;I have two main closed-source projects on my plate. The first, our &lt;a href="http://www.looktothestars.org"&gt;site about celebrities and the charities they support&lt;/a&gt;, has seen me doing a bunch of Twitter API hacking recently.&lt;/p&gt;
&lt;p&gt;The second project, currently Top Secret, is a Clojure data-oriented website, using MongoDB and fun stuff like geocoding and data mining.&lt;/p&gt;
&lt;h3&gt;Thoughts&lt;/h3&gt;
&lt;p&gt;The programming ecosphere is more diverse than ever, and there are more powerful tools available to programmers than ever before. It's thrilling to be involved with this, and to aid in the cross-pollination of tricks, skills and idioms between unrelated projects.&lt;/p&gt;
&lt;p&gt;As a work-from-home entrepreneur, collaborating remotely on open (and closed) source projects with interesting people is a surprisingly good proxy for having real officemates.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=Sw8xtNXZmgI:DFEn8HWp7pQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=Sw8xtNXZmgI:DFEn8HWp7pQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=Sw8xtNXZmgI:DFEn8HWp7pQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=Sw8xtNXZmgI:DFEn8HWp7pQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=Sw8xtNXZmgI:DFEn8HWp7pQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/swimming-in-code#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/32</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/clojure">clojure</category>
 <category domain="http://www.sanityinc.com/tags/emacs">Emacs</category>
 <category domain="http://www.sanityinc.com/tags/github">github</category>
 <category domain="http://www.sanityinc.com/tags/javascript">javascript</category>
 <category domain="http://www.sanityinc.com/tags/lisp">lisp</category>
 <category domain="http://www.sanityinc.com/tags/python">python</category>
 <category domain="http://www.sanityinc.com/tags/ruby">Ruby</category>
 <pubDate>Sun, 07 Feb 2010 13:06:21 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">32 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Full-screen support for Cocoa Emacs on OS X</title>
 <link>http://www.sanityinc.com/full-screen-support-for-cocoa-emacs-on-osx</link>
 <description>&lt;p&gt;Prolific Japanese hacker Daisuke Murase (a.k.a. &lt;a href="http://github.com/typester"&gt;typester&lt;/a&gt;) has recently patched Cocoa Emacs to add a full-screen display mode. Here's how to add this must-have feature into your own local Emacs tree while you wait for it to get integrated into the official Emacs sources.&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
Let's start with the assumptions that using the latest dev version of Emacs is a Good Thing, and that full-screen display is a feature so wonderful (particularly on laptops) that it's worth some small effort to obtain.&lt;/p&gt;
&lt;p&gt;I build my Emacs from a local copy of the official &lt;a href="http://repo.or.cz/r/emacs.git"&gt;Emacs git repo&lt;/a&gt;, which is automatically updated from the master bzr tree. Just a "git pull", and I'm up to date.&lt;/p&gt;
&lt;p&gt;I don't want to build from typester's repo because it hasn't been updated from upstream since December.&lt;/p&gt;
&lt;p&gt;So I add typester's repo as an additional remote:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter text" style="font-family: monospace;"&gt;$ git remote add typester git://github.com/typester/emacs.git&lt;br /&gt;
$ git fetch typester&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;However, I find that his feature branch doesn't merge cleanly with the official clone, perhaps because he started with a different git clone of the emacs sources.&lt;/p&gt;
&lt;p&gt;Looking at the history of typester's branch, the last upstream change was a3585f6c2a. So, to apply the changes he made on my current branch:&lt;/p&gt;
&lt;p&gt;&lt;code class="geshifilter text"&gt;$ git diff a3585f6c2a typester/feature/fullscreen | patch -p1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And I see it applies without any conflicts! Great! (Here's &lt;a href="http://gist.github.com/291150"&gt;a copy of the patch as it looks today&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Now I can build as usual:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter text" style="font-family: monospace;"&gt;$ ./configure --with-ns&lt;br /&gt;
$ make &amp;amp;&amp;amp; make install&lt;br /&gt;
$ mv nextstep/Emacs.app /Applications/&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;To toggle full-screen mode inside emacs:&lt;br /&gt;
&lt;code class="geshifilter text"&gt;M-x ns-toggle-fullscreen&lt;/code&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=7SatiuUtZjA:yo53WSCHJgA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=7SatiuUtZjA:yo53WSCHJgA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=7SatiuUtZjA:yo53WSCHJgA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=7SatiuUtZjA:yo53WSCHJgA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=7SatiuUtZjA:yo53WSCHJgA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/full-screen-support-for-cocoa-emacs-on-osx#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/31</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/emacs">Emacs</category>
 <category domain="http://www.sanityinc.com/tags/mac">Mac</category>
 <category domain="http://www.sanityinc.com/tags/osx">OSX</category>
 <pubDate>Sun, 31 Jan 2010 17:06:19 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">31 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Open "txmt:" URLs from Rails backtraces using Emacs on OS X</title>
 <link>http://www.sanityinc.com/articles/open-txmt-urls-from-rails-in-emacs-on-osx</link>
 <description>&lt;p&gt;When Rails prints a backtrace in HTML, it's helpfully rendered as a "txmt:" link so that users can click open the corresponding location in TextMate on OS X.  If you're an Emacs user, here's how to make those URLs open in Emacs instead.&lt;br /&gt;
&lt;!--break--&gt;&lt;br /&gt;
First, get a copy of Daisuke Murase's &lt;a href="http://github.com/typester/emacs-handler"&gt;emacs-handler&lt;/a&gt; project using either git (or by downloading a tarball).&lt;/p&gt;
&lt;p&gt;Then apply the following patch:&lt;br /&gt;
&lt;div class="geshifilter diff" style="font-family: monospace;"&gt;diff --git a/Info.plist b/Info.plist&lt;br /&gt;
index &lt;span class="nu0"&gt;1880412&lt;/span&gt;..deb1fa4 &lt;span class="nu0"&gt;100644&lt;/span&gt;&lt;br /&gt;
&lt;span class="re3"&gt;--- a/Info.plist&lt;/span&gt;&lt;br /&gt;
&lt;span class="re4"&gt;+++ b/Info.plist&lt;/span&gt;&lt;br /&gt;
&lt;span class="re6"&gt;@@ &lt;span class="nu0"&gt;-8&lt;/span&gt;,&lt;span class="nu0"&gt;6&lt;/span&gt; &lt;span class="nu0"&gt;+8&lt;/span&gt;,&lt;span class="nu0"&gt;7&lt;/span&gt; @@&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;key&amp;gt;CFBundleURLSchemes&amp;lt;/key&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;array&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;string&amp;gt;emacs&amp;lt;/string&amp;gt;&lt;br /&gt;
&lt;span class="re8"&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;string&amp;gt;txmt&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/array&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;key&amp;gt;CFBundleURLName&amp;lt;/key&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;string&amp;gt;org.unknownplace.emacshandler&amp;lt;/string&amp;gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, you can just check out &lt;a href="http://github.com/purcell/emacs-handler"&gt;my clone of emacs-handler&lt;/a&gt;, which has the above patch built-in.&lt;/p&gt;
&lt;p&gt;Finally, open the project in Xcode, and build it. Fire up the resulting EmacsHandler.app, and edit the app's preferences to point to your Emacs.&lt;/p&gt;
&lt;p&gt;That should be all you need to do -- just keep EmacsHandler.app around somewhere on your Mac.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=9RQwudg2748:Y778eeTv8-8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=9RQwudg2748:Y778eeTv8-8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=9RQwudg2748:Y778eeTv8-8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=9RQwudg2748:Y778eeTv8-8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=9RQwudg2748:Y778eeTv8-8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/open-txmt-urls-from-rails-in-emacs-on-osx#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/30</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/emacs">Emacs</category>
 <category domain="http://www.sanityinc.com/tags/mac">Mac</category>
 <category domain="http://www.sanityinc.com/tags/osx">OSX</category>
 <category domain="http://www.sanityinc.com/tags/rails">Rails</category>
 <category domain="http://www.sanityinc.com/tags/textmate">Textmate</category>
 <pubDate>Sun, 31 Jan 2010 16:29:06 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">30 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>So you think you found a bug in a library?</title>
 <link>http://www.sanityinc.com/articles/so-you-think-you-found-a-bug</link>
 <description>&lt;p&gt;From time to time I receive bug reports for the libraries I've written. Some reports describe genuine bugs (and I'll be the first to admit I'm not perfect), but far too many others demonstrate a missed step in the submitter's "bug assessment" mental process.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Specifically, ten years ago I wrote the unit testing module included in Python's standard library. The module was a fairly direct copy of JUnit's proven design at that time, and has since been used as the basis of (I'm sure) millions of unit tests in projects around the globe, including Python itself. It's fairly safe to say that the major bugs have been ironed out by this stage.&lt;/p&gt;
&lt;p&gt;But still, from time to time, I receive emails smugly pointing out a glaring bug in the module, with indignant comments such as "I am trying to teach more people in my company to use unit testing, but after the[y] discover bugs like these they come to me discouraged."&lt;/p&gt;
&lt;p&gt;Many such bug reports come complete with a short "demonstration" code snippet that shows a fundamental misunderstanding of how the library is to be used. I send polite responses, but I'd rather have simply been asked for a link to a good tutorial instead.&lt;/p&gt;
&lt;p&gt;So here's a question I'd like to request that every programmer (whatever his opinion of his own ability) ask himself before reporting a bug in a library he's using:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;"Given the number of people using this library, is it &lt;i&gt;at all&lt;/i&gt; possible that I could be the first person to discover this bug, or is it more likely that I've misunderstood how to use the library?"&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;P.S. Why not &lt;a href="http://www.sanityinc.com/rss.xml"&gt;subscribe to future articles&lt;/a&gt;?&lt;/small&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=O1ptUjfJ0zM:TOsbr7Vh6gg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=O1ptUjfJ0zM:TOsbr7Vh6gg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=O1ptUjfJ0zM:TOsbr7Vh6gg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=O1ptUjfJ0zM:TOsbr7Vh6gg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=O1ptUjfJ0zM:TOsbr7Vh6gg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/so-you-think-you-found-a-bug#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/29</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/programming">programming</category>
 <pubDate>Mon, 29 Jun 2009 11:18:09 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">29 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Adding Array#to_proc to Ruby</title>
 <link>http://www.sanityinc.com/articles/adding-array-to-proc-to-ruby</link>
 <description>&lt;p&gt;Here's a neat Ruby trick for fans of Symbol#to_proc.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;This magical method, introduced by both Rails and Ruby 1.9, lets you do things like this:&lt;br /&gt;
&lt;div class="geshifilter text" style="font-family: monospace;"&gt;&amp;gt; %w(1 2 3 4 5).map &amp;amp;:to_i&lt;br /&gt;
=&amp;gt; [1, 2, 3, 4, 5]&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;And that proc can, of course, take multiple parameters:&lt;br /&gt;
&lt;div class="geshifilter text" style="font-family: monospace;"&gt; [1,2,3,4].zip([2,3,4,5])&lt;br /&gt;
=&amp;gt; [[1, 2], [2, 3], [3, 4], [4, 5]]&amp;gt; [1,2,3,4].zip([2,3,4,5]).map &amp;amp;:sum&lt;br /&gt;
=&amp;gt; [3, 5, 7, 9]&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;However, if you want to "close" a value into the proc, you're out of luck, so you have to define a block old-school-style:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter text" style="font-family: monospace;"&gt;&amp;gt; %w(kung ruby bar).map { |e| e + &amp;quot;-fu&amp;quot; }&lt;br /&gt;
=&amp;gt; [&amp;quot;kung-fu&amp;quot;, &amp;quot;ruby-fu&amp;quot;, &amp;quot;bar-fu&amp;quot;]&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;But check out the following little hack:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter text" style="font-family: monospace;"&gt;class Array&lt;br /&gt;
&amp;nbsp; def to_proc&lt;br /&gt;
&amp;nbsp; &amp;nbsp; lambda { |target| target.send(*self) }&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
end&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now look what you can do:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter text" style="font-family: monospace;"&gt;&amp;gt; %w(kung ruby bar).map &amp;amp;[:+, &amp;quot;-fu&amp;quot;]&lt;br /&gt;
=&amp;gt; [&amp;quot;kung-fu&amp;quot;, &amp;quot;ruby-fu&amp;quot;, &amp;quot;bar-fu&amp;quot;]&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;What do you think? Handy? Disgusting? Leave a comment to let me know!&lt;/p&gt;
&lt;p&gt;Update: apparently others have had &lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/1253-arrayto_proc"&gt;similar&lt;/a&gt; &lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/199820"&gt;ideas&lt;/a&gt;, but with different semantics. So perhaps this trick is a little too opaque...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liked this? Why not &lt;a href="http://www.sanityinc.com/rss.xml"&gt;subscribe to my news feed&lt;/a&gt; to get more of the same in future.&lt;/strong&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=DHQA_EZzG34:GY7uYjnBUZU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=DHQA_EZzG34:GY7uYjnBUZU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=DHQA_EZzG34:GY7uYjnBUZU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SanityInc?a=DHQA_EZzG34:GY7uYjnBUZU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SanityInc?i=DHQA_EZzG34:GY7uYjnBUZU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/adding-array-to-proc-to-ruby#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/28</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/ruby">Ruby</category>
 <pubDate>Tue, 14 Apr 2009 19:37:30 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">28 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>All hail the innovators: 2 shining examples of lateral thinking</title>
 <link>http://www.sanityinc.com/articles/two-great-examples-of-lateral-thinking</link>
 <description>&lt;p&gt;Wonderful things happen when smart people discard limitations that everyone else has been taking for granted, and two recent examples in the online world illustrate this beautifully.&lt;br /&gt;
&lt;!--break--&gt;&lt;/p&gt;
&lt;h3&gt;Distributed version control&lt;/h3&gt;
&lt;p&gt;For years we assumed that working together on carefully versioned sets of files requires a central server to keep everyone on the same track.  Then along came arch, darcs, mercurial, bazaar, git and others -- now it seems like a god-given right that every developer should be able to independently commit his source code changes and create branches, and the "central repository" has changed from a technical necessity to a useful convention.&lt;/p&gt;
&lt;h3&gt;SEOmoz's Linkscape&lt;/h3&gt;
&lt;p&gt;It seems like every notable search engine optimisation blog or site you'll find on the web offers home-spun tools for analysing link graphs, site values, click prices and suchlike.  Many of these tools compile information desperately scraped from Yahoo's SiteExplorer and other sources, because the data that everyone really wants is locked up in Google's enormous index.&lt;/p&gt;
&lt;p&gt;In a stroke of utter genius, the SEO consultancy and community  &lt;a href="http://seomoz.org"&gt;SEOmoz&lt;/a&gt; took venture capital, and then several months later popped up with &lt;a href="http://www.seomoz.org/blog/announcing-seomozs-index-of-the-web-and-the-launch-of-our-linkscape-tool"&gt;its own index of 30 billion web pages&lt;/a&gt;, opening the way for deep SEO analysis that has been impossible up to now.&lt;/p&gt;
&lt;p&gt;Talk about thinking big.&lt;/p&gt;
&lt;h3&gt;Innovators, I salute you!&lt;/h3&gt;
&lt;p&gt;I find it thrilling to see these kinds of innovations, and it's a reminder to routinely step back from the problem in front of me, and see if I'm taking for granted a constraint that isn't really there.&lt;/p&gt;
&lt;p&gt;Do you have any other examples?  Leave a comment!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=qSHpDAGj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=jvMjvs1g"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=jvMjvs1g" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/two-great-examples-of-lateral-thinking#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/27</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/creativity">Creativity</category>
 <category domain="http://www.sanityinc.com/tags/git">Git</category>
 <category domain="http://www.sanityinc.com/tags/seo">seo</category>
 <pubDate>Wed, 08 Oct 2008 15:03:24 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">27 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Skype power-user tip: edit sent messages</title>
 <link>http://www.sanityinc.com/articles/skype-power-user-tip-edit-sent-messages</link>
 <description>&lt;p&gt;Ever quickly sent a skype message, only to immediately notice a typo?  You can fix it using the following trick.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;Imagine you just sent "The radio is borken".&lt;/p&gt;
&lt;p&gt;To fix "borken", you simply enter this follow-message: "s/borken/broken/".&lt;/p&gt;
&lt;p&gt;The sent message will be updated, and marked as "edited".  Magic, eh?&lt;/p&gt;
&lt;p&gt;This was tested between two Macs running Skype 2.7, so it may or may not work for you too.  It's only possible to alter the last sent message you sent, and not earlier messages or those sent by another member of the chat.&lt;/p&gt;
&lt;p&gt;UNIX users will note that the syntax echoes that of sed, awk, perl, vi and other tools, and the "s/old/new/" idiom is commonly used in geek-to-geek chats.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Credit to my colleague and fellow &lt;a href="http://railsexpress.de/"&gt;Ruby on Rails consultant Stefan Kaes&lt;/a&gt; for noticing this.)&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=Wh15fm6V"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=rL3o6tTX"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=rL3o6tTX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=ZFrITBZv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=ZFrITBZv" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/skype-power-user-tip-edit-sent-messages#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/26</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/skype">skype</category>
 <pubDate>Fri, 25 Jul 2008 10:24:21 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">26 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>Rails tip: easily browse and search logs in colour with "less"</title>
 <link>http://www.sanityinc.com/articles/view-rails-logs-with-less</link>
 <description>&lt;p&gt;'less' is a great tool for browsing Rails log files, though you might not guess it if you try to view your "development.log" with it.&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;h3&gt;Take the colour back&lt;/h3&gt;
&lt;p&gt;Rails writes xterm control characters into log files to colour them. Usually 'less' escapes those characters, leading to an ugly display -- run 'less -R' to stop this escaping, allowing you to browse log files in glorious technicolour.  (Set your $LESS environment variable to "-R" to make this the default.)&lt;/p&gt;
&lt;h3&gt;Follow the end of the log file&lt;/h3&gt;
&lt;p&gt;Shift-g will take you to the bottom of the log files (Use ctrl-c if less then pauses while calculating line numbers in a very large file).&lt;/p&gt;
&lt;p&gt;Shift-F makes less work like 'tail -f' -- it watches the end of the file for new data.&lt;/p&gt;
&lt;h3&gt;Search for phrases or pesky backtraces&lt;/h3&gt;
&lt;p&gt;Use / to search forwards, and ? to search backwards.&lt;/p&gt;
&lt;p&gt;To find the last Ruby stack trace in a log file, open the logfile in less, Shift-g to the end of the file, then search backwards using ?` (backtick) -- usually backticks are only found in Ruby stacktraces, at least if you're not using mysql.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=o1keSqNx"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=vQgkEX7z"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=vQgkEX7z" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=T5IK5jX7"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=T5IK5jX7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/view-rails-logs-with-less#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/25</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/rails">Rails</category>
 <category domain="http://www.sanityinc.com/tags/ruby">Ruby</category>
 <category domain="http://www.sanityinc.com/tags/unix">UNIX</category>
 <pubDate>Tue, 17 Jun 2008 19:13:58 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">25 at http://www.sanityinc.com</guid>
</item>
<item>
 <title>On vim vs emacs</title>
 <link>http://www.sanityinc.com/articles/vim-vs-emacs</link>
 <description>&lt;p&gt;I often hear the proponents of &lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt; and &lt;a href="http://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt; discussing which is better, usually pitting emacs' extensibility against vi's archaic yet arguably effective and tendon-friendly scheme of editing modes.&lt;/p&gt;
&lt;p&gt;But why choose?&lt;/p&gt;
&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;I love the "vi way". I was a die-hard vim user until I realised that, with &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/ViperMode"&gt;some&lt;/a&gt; &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/vimpulse.el"&gt;customisation&lt;/a&gt;, &lt;strong&gt;emacs can &lt;em&gt;be&lt;/em&gt; vim&lt;/strong&gt;. After all, many advanced vim users end up working with multiple windows, and keeping their vims running for an extended period, which is exactly what emacs users do.&lt;/p&gt;
&lt;p&gt;So for 8 or 9 years now, I've been a happy emacs user, working with vi key bindings all day long, while picking and choosing from emacs' vast library of useful extensions. I've got a &lt;a href="http://git.sanityinc.com/?p=emacs.d.git;a=summary"&gt;highly customised&lt;/a&gt; emacs, learned some emacs-lisp, and yet I don't even know the emacs key bindings for mark/copy/paste. And when I'm working in a shell, I can (and do) drop into vim and still feel completely at home.&lt;/p&gt;
&lt;p&gt;Curious vim users can get started by firing up emacs, hitting meta-x, and entering "viper-mode". That's built into every emacs you're likely to encounter. To get vim-specific features such as control-n/p expansion, window splitting, and rectangular selections, follow the instructions that &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/vimpulse.el"&gt;come with vimpulse&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=e3CXHTrV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=GQItF6Vq"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=GQItF6Vq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SanityInc?a=TjFscpLT"&gt;&lt;img src="http://feeds.feedburner.com/~f/SanityInc?i=TjFscpLT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.sanityinc.com/articles/vim-vs-emacs#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sanityinc.com/crss/node/24</wfw:commentRss>
 <category domain="http://www.sanityinc.com/tags/editors">editors</category>
 <category domain="http://www.sanityinc.com/tags/emacs">Emacs</category>
 <category domain="http://www.sanityinc.com/tags/unix">UNIX</category>
 <category domain="http://www.sanityinc.com/tags/vim">vim</category>
 <pubDate>Sun, 15 Jun 2008 09:40:27 +0000</pubDate>
 <dc:creator>Steve Purcell</dc:creator>
 <guid isPermaLink="false">24 at http://www.sanityinc.com</guid>
</item>
</channel>
</rss>

