blog/rails/@done/TextMate Insert text into self.down - samhuri.net.html
2011-12-02 23:24:03 -08:00

528 lines
No EOL
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0121)http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down -->
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TextMate: Insert text into self.down - samhuri.net</title>
<meta content="48.472,-123.3683" name="ICBM">
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/xml/rsd">
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/xml/rss20/article/20/feed.xml">
<link rel="alternate" type="application/atom+xml" title="Atom" href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/xml/atom10/article/20/feed.xml">
<script src="./TextMate Insert text into self.down - samhuri.net_files/cookies.js" type="text/javascript"></script>
<script src="./TextMate Insert text into self.down - samhuri.net_files/prototype.js" type="text/javascript"></script>
<script src="./TextMate Insert text into self.down - samhuri.net_files/effects.js" type="text/javascript"></script>
<script src="./TextMate Insert text into self.down - samhuri.net_files/typo.js" type="text/javascript"></script>
<script type="text/javascript"></script>
<link href="./TextMate Insert text into self.down - samhuri.net_files/island.css" media="all" rel="Stylesheet" type="text/css">
<link href="./TextMate Insert text into self.down - samhuri.net_files/user-styles.css" media="all" rel="Stylesheet" type="text/css">
<link href="./TextMate Insert text into self.down - samhuri.net_files/print.css" media="print" rel="Stylesheet" type="text/css">
<style type="text/css" style="display: none !important;">object:not([type]),object[classid$=":D27CDB6E-AE6D-11cf-96B8-444553540000"],object[classid$=":d27cdb6e-ae6d-11cf-96b8-444553540000"],object[codebase*="swflash.cab"],object[data*=".swf"],object[type="application/x-shockwave-flash"],object[src*=".swf"],object[codetype="application/x-shockwave-flash"],embed[type="application/x-shockwave-flash"],embed[src*=".swf"],embed[allowscriptaccess],embed[flashvars],embed[wmode],object[classid$=":166B1BCA-3F9C-11CF-8075-444553540000"],object[codebase*="sw.cab"],object[data*=".dcr"],object[type="application/x-director"],object[src*=".dcr"],embed[type="application/x-director"],embed[src*=".dcr"],object[classid$=":15B782AF-55D8-11D1-B477-006097098764"],object[codebase*="awswaxf.cab"],object[data*=".aam"],object[type="application/x-authorware-map"],object[src*=".aam"],embed[type="application/x-authorware-map"],embed[src*=".aam"],object[classid$="32C73088-76AE-40F7-AC40-81F62CB2C1DA"],object[type="application/ag-plugin"],object[type="application/x-silverlight"],object[type="application/x-silverlight-2"],object[source*=".xaml"],object[sourceelement*="xaml"],embed[type="application/ag-plugin"],embed[source*=".xaml"]{display: none !important;}</style></head>
<body><div id="wm-ipp" style="position: relative; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; min-height: 70px; min-width: 800px; z-index: 9000; display: block; ">
<div id="wm-ipp-inside" style="position:fixed;padding:0!important;margin:0!important;width:97%;min-width:780px;border:5px solid #000;border-top:none;background-image:url(http://staticweb.archive.org/images/toolbar/wm_tb_bk_trns.png);text-align:center;-moz-box-shadow:1px 1px 3px #333;-webkit-box-shadow:1px 1px 3px #333;box-shadow:1px 1px 3px #333;font-size:11px!important;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif!important;">
<table style="border-collapse:collapse;margin:0;padding:0;width:100%;"><tbody><tr>
<td style="padding:10px;vertical-align:top;min-width:110px;">
<a href="http://wayback.archive.org/web/" title="Wayback Machine home page" style="background-color:transparent;border:none;"><img src="./TextMate Insert text into self.down - samhuri.net_files/wayback-toolbar-logo.png" alt="Wayback Machine" width="110" height="39" border="0"></a>
</td>
<td style="padding:0!important;text-align:center;vertical-align:top;width:100%;">
<table style="border-collapse:collapse;margin:0 auto;padding:0;width:570px;"><tbody><tr>
<td style="padding:3px 0;" colspan="2">
<form target="_top" method="get" action="http://wayback.archive.org/web/form-submit.jsp" name="wmtb" id="wmtb" style="margin:0!important;padding:0!important;"><input type="text" name="url" id="wmtbURL" value="http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down" style="width:400px;font-size:11px;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;" onfocus="javascript:this.focus();this.select();"><input type="hidden" name="type" value="replay"><input type="hidden" name="date" value="20060303052933"><input type="submit" value="Go" style="font-size:11px;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;margin-left:5px;"><span id="wm_tb_options" style="display:block;"></span></form>
</td>
<td style="vertical-align:bottom;padding:5px 0 0 0!important;" rowspan="2">
<table style="border-collapse:collapse;width:110px;color:#99a;font-family:&#39;Helvetica&#39;,&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;"><tbody>
<!-- NEXT/PREV MONTH NAV AND MONTH INDICATOR -->
<tr style="width:110px;height:16px;font-size:10px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
Feb
</td>
<td id="displayMonthEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight:bold;text-transform:uppercase;width:34px;height:15px;padding-top:1px;text-align:center;" title="You are here: 5:29:33 Mar 3, 2006">MAR</td>
<td style="padding-left:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="http://web.archive.org/web/20060623033346/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="23 Jun 2006"><strong>JUN</strong></a>
</td>
</tr>
<!-- NEXT/PREV CAPTURE NAV AND DAY OF MONTH INDICATOR -->
<tr>
<td style="padding-right:9px;white-space:nowrap;overflow:visible;text-align:right!important;vertical-align:middle!important;" nowrap="nowrap">
<img src="./TextMate Insert text into self.down - samhuri.net_files/wm_tb_prv_off.png" alt="Previous capture" width="14" height="16" border="0">
</td>
<td id="displayDayEl" style="background:#000;color:#ff0;width:34px;height:24px;padding:2px 0 0 0;text-align:center;font-size:24px;font-weight: bold;" title="You are here: 5:29:33 Mar 3, 2006">3</td>
<td style="padding-left:9px;white-space:nowrap;overflow:visible;text-align:left!important;vertical-align:middle!important;" nowrap="nowrap">
<a href="http://web.archive.org/web/20060623033346/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down" title="3:33:46 Jun 23, 2006" style="background-color:transparent;border:none;"><img src="./TextMate Insert text into self.down - samhuri.net_files/wm_tb_nxt_on.png" alt="Next capture" width="14" height="16" border="0"></a>
</td>
</tr>
<!-- NEXT/PREV YEAR NAV AND YEAR INDICATOR -->
<tr style="width:110px;height:13px;font-size:9px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight: bold;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
2005
</td>
<td id="displayYearEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight: bold;padding-top:1px;width:34px;height:13px;text-align:center;" title="You are here: 5:29:33 Mar 3, 2006">2006</td>
<td style="padding-left:9px;font-size:11px!important;font-weight: bold;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="http://web.archive.org/web/20070316061001/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="16 Mar 2007"><strong>2007</strong></a>
</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td style="vertical-align:middle;padding:0!important;">
<a href="http://wayback.archive.org/web/20060303052933*/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down" style="color:#33f;font-size:11px;font-weight:bold;background-color:transparent;border:none;" title="See a list of every capture for this URL"><strong>4 captures</strong></a>
<div style="margin:0!important;padding:0!important;color:#666;font-size:9px;padding-top:2px!important;white-space:nowrap;" title="Timespan for captures of this URL">3 Mar 06 - 16 Mar 07</div>
</td>
<td style="padding:0!important;">
<a style="position:relative; white-space:nowrap; width:400px;height:27px;" href="" id="wm-graph-anchor">
<div id="wm-ipp-sparkline" style="position:relative; white-space:nowrap; width:400px;height:27px;background-color:#fff;cursor:pointer;border-right:1px solid #ccc;" title="Explore captures for this URL">
<img id="sparklineImgId" style="position:absolute; z-index:9012; top:0px; left:0px;" onmouseover="showTrackers(&#39;inline&#39;);" onmouseout="showTrackers(&#39;none&#39;);" onmousemove="trackMouseMove(event,this)" alt="sparklines" width="400" height="27" border="0" src="./TextMate Insert text into self.down - samhuri.net_files/graph.jsp">
<img id="wbMouseTrackYearImg" style="display:none; position:absolute; z-index:9010;" width="25" height="27" border="0" src="./TextMate Insert text into self.down - samhuri.net_files/transp-yellow-pixel.png">
<img id="wbMouseTrackMonthImg" style="display:none; position:absolute; z-index:9011; " width="2" height="27" border="0" src="./TextMate Insert text into self.down - samhuri.net_files/transp-red-pixel.png">
</div>
</a>
</td>
</tr></tbody></table>
</td>
<td style="text-align:right;padding:5px;width:65px;font-size:11px!important;">
<a href="javascript:;" onclick="document.getElementById(&#39;wm-ipp&#39;).style.display=&#39;none&#39;;" style="display:block;padding-right:18px;background:url(http://staticweb.archive.org/images/toolbar/wm_tb_close.png) no-repeat 100% 0;color:#33f;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;margin-bottom:23px;background-color:transparent;border:none;" title="Close the toolbar">Close</a>
<a href="http://faq.web.archive.org/" style="display:block;padding-right:18px;background:url(http://staticweb.archive.org/images/toolbar/wm_tb_help.png) no-repeat 100% 0;color:#33f;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;background-color:transparent;border:none;" title="Get some help using the Wayback Machine">Help</a>
</td>
</tr></tbody></table>
</div>
</div>
<!-- BEGIN WAYBACK TOOLBAR INSERT -->
<script type="text/javascript" src="./TextMate Insert text into self.down - samhuri.net_files/disclaim-element.js"></script>
<script type="text/javascript" src="./TextMate Insert text into self.down - samhuri.net_files/graph-calc.js"></script>
<script type="text/javascript" src="./TextMate Insert text into self.down - samhuri.net_files/jquery.min.js"></script>
<script type="text/javascript">
//<![CDATA[
var firstDate = 820454400000;
var lastDate = 1325375999999;
var wbPrefix = "http://web.archive.org/web/";
var wbCurrentUrl = "http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down";
var curYear = -1;
var curMonth = -1;
var yearCount = 16;
var firstYear = 1996;
var imgWidth=400;
var yearImgWidth = 25;
var monthImgWidth = 2;
var trackerVal = "none";
var displayDay = "3";
var displayMonth = "Mar";
var displayYear = "2006";
var prettyMonths = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function showTrackers(val) {
if(val == trackerVal) {
return;
}
if(val == "inline") {
document.getElementById("displayYearEl").style.color = "#ec008c";
document.getElementById("displayMonthEl").style.color = "#ec008c";
document.getElementById("displayDayEl").style.color = "#ec008c";
} else {
document.getElementById("displayYearEl").innerHTML = displayYear;
document.getElementById("displayYearEl").style.color = "#ff0";
document.getElementById("displayMonthEl").innerHTML = displayMonth;
document.getElementById("displayMonthEl").style.color = "#ff0";
document.getElementById("displayDayEl").innerHTML = displayDay;
document.getElementById("displayDayEl").style.color = "#ff0";
}
document.getElementById("wbMouseTrackYearImg").style.display = val;
document.getElementById("wbMouseTrackMonthImg").style.display = val;
trackerVal = val;
}
function getElementX2(obj) {
var thing = jQuery(obj);
if((thing == undefined)
|| (typeof thing == "undefined")
|| (typeof thing.offset == "undefined")) {
return getElementX(obj);
}
return Math.round(thing.offset().left);
}
function trackMouseMove(event,element) {
var eventX = getEventX(event);
var elementX = getElementX2(element);
var xOff = eventX - elementX;
if(xOff < 0) {
xOff = 0;
} else if(xOff > imgWidth) {
xOff = imgWidth;
}
var monthOff = xOff % yearImgWidth;
var year = Math.floor(xOff / yearImgWidth);
var yearStart = year * yearImgWidth;
var monthOfYear = Math.floor(monthOff / monthImgWidth);
if(monthOfYear > 11) {
monthOfYear = 11;
}
// 1 extra border pixel at the left edge of the year:
var month = (year * 12) + monthOfYear;
var day = 1;
if(monthOff % 2 == 1) {
day = 15;
}
var dateString =
zeroPad(year + firstYear) +
zeroPad(monthOfYear+1,2) +
zeroPad(day,2) + "000000";
var monthString = prettyMonths[monthOfYear];
document.getElementById("displayYearEl").innerHTML = year + 1996;
document.getElementById("displayMonthEl").innerHTML = monthString;
// looks too jarring when it changes..
//document.getElementById("displayDayEl").innerHTML = zeroPad(day,2);
var url = wbPrefix + dateString + '/' + wbCurrentUrl;
document.getElementById('wm-graph-anchor').href = url;
//document.getElementById("wmtbURL").value="evX("+eventX+") elX("+elementX+") xO("+xOff+") y("+year+") m("+month+") monthOff("+monthOff+") DS("+dateString+") Moy("+monthOfYear+") ms("+monthString+")";
if(curYear != year) {
var yrOff = year * yearImgWidth;
document.getElementById("wbMouseTrackYearImg").style.left = yrOff + "px";
curYear = year;
}
if(curMonth != month) {
var mtOff = year + (month * monthImgWidth) + 1;
document.getElementById("wbMouseTrackMonthImg").style.left = mtOff + "px";
curMonth = month;
}
}
//]]>
</script>
<style type="text/css">body{margin-top:0!important;padding-top:0!important;min-width:800px!important;}#wm-ipp a:hover{text-decoration:underline!important;}</style>
<script type="text/javascript">
var wmDisclaimBanner = document.getElementById("wm-ipp");
if(wmDisclaimBanner != null) {
disclaimElement(wmDisclaimBanner);
}
</script>
<!-- END WAYBACK TOOLBAR INSERT -->
<div id="content" class="clearfix">
<div id="main">
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description
rdf:about=""
trackback:ping="http://sami.samhuri.net/articles/trackback/20"
dc:title="TextMate: Insert text into self.down"
dc:identifier="http://sami.samhuri.net/articles/read/20"
dc:description="UPDATE: I got everything working and it&amp;#8217;s all packaged up here. There&amp;#8217;s an installation script this t"
dc:creator="sjs"
dc:date="2006-02-22T21:03:40-08:00" />
</rdf:RDF>
-->
<div class="post" onmouseover="if (getCookie(&#39;is_admin&#39;) == &#39;yes&#39;) { Element.show(&#39;admin_article&#39;); }" onmouseout="Element.hide(&#39;admin_article&#39;);">
<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/admin/content/edit/20" class="admintools" id="admin_article" style="display: none">edit</a>
<h2>TextMate: Insert text into self.down</h2>
<p class="auth"><!-- Posted by <a href="mailto:sjs@uvic.ca">Sami Jensen Samhuri</a> -->
<span class="typo_date" title="Tue, 21 Feb 2006 22:55:00 GMT">on Tuesday, February 21, 2006</span></p>
<p><em><strong><span class="caps">UPDATE</span>:</strong> I got everything working and its all packaged up <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/22/intelligent-migration-snippets-0_1">here</a>. Theres an installation script this time as well.</em></p>
<p>Thanks to <a href="http://web.archive.org/web/20060303052933/http://thread.gmane.org/gmane.editors.textmate.general/8520">a helpful thread</a> on the TextMate mailing list I have the beginning of a solution to insert text at 2 (or more) locations in a file.</p>
<p>I implemented this for a new snippet I was working on for migrations, <code>rename_column</code>. Since the command is the same in self.up and self.down simply doing a reverse search for <code>rename_column</code> in my <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-move-selection-to-self-down">hackish macro</a> didnt return the cursor the desired location.</p><p>Thats enough introduction, heres the program to do the insertion:</p>
<div class="typocode"><pre><code class="typocode_ruby "><span class="comment">#!/usr/bin/env ruby</span>
<span class="keyword">def </span><span class="method">indent</span><span class="punct">(</span><span class="ident">s</span><span class="punct">)</span>
<span class="ident">s</span> <span class="punct">=~</span> <span class="punct">/</span><span class="regex">^(<span class="escape">\s</span>*)</span><span class="punct">/</span>
<span class="punct">'</span><span class="string"> </span><span class="punct">'</span> <span class="punct">*</span> <span class="global">$1</span><span class="punct">.</span><span class="ident">length</span>
<span class="keyword">end</span>
<span class="ident">up_line</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">rename_column "${1:table}", "${2:column}", "${3:new_name}"$0</span><span class="punct">'</span>
<span class="ident">down_line</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">rename_column <span class="escape">\"</span>$$1<span class="escape">\"</span>, <span class="escape">\"</span>$$3<span class="escape">\"</span>, <span class="escape">\"</span>$$2<span class="escape">\"\n</span></span><span class="punct">"</span>
<span class="comment"># find the end of self.down and insert 2nd line</span>
<span class="ident">lines</span> <span class="punct">=</span> <span class="constant">STDIN</span><span class="punct">.</span><span class="ident">read</span><span class="punct">.</span><span class="ident">to_a</span><span class="punct">.</span><span class="ident">reverse</span>
<span class="ident">ends_seen</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">lines</span><span class="punct">.</span><span class="ident">each_with_index</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">line</span><span class="punct">,</span> <span class="ident">i</span><span class="punct">|</span>
<span class="ident">ends_seen</span> <span class="punct">+=</span> <span class="number">1</span> <span class="keyword">if</span> <span class="ident">line</span> <span class="punct">=~</span> <span class="punct">/</span><span class="regex">^<span class="escape">\s</span>*end<span class="escape">\b</span></span><span class="punct">/</span>
<span class="keyword">if</span> <span class="ident">ends_seen</span> <span class="punct">==</span> <span class="number">2</span>
<span class="ident">lines</span><span class="punct">[</span><span class="ident">i</span><span class="punct">..</span><span class="ident">i</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">[</span><span class="ident">lines</span><span class="punct">[</span><span class="ident">i</span><span class="punct">],</span> <span class="ident">indent</span><span class="punct">(</span><span class="ident">lines</span><span class="punct">[</span><span class="ident">i</span><span class="punct">])</span> <span class="punct">*</span> <span class="number">2</span> <span class="punct">+</span> <span class="ident">down_line</span><span class="punct">]</span>
<span class="keyword">break</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="comment"># return the new text, escaping special chars</span>
<span class="ident">print</span> <span class="ident">up_line</span> <span class="punct">+</span> <span class="ident">lines</span><span class="punct">.</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">to_s</span><span class="punct">.</span><span class="ident">gsub</span><span class="punct">('</span><span class="string">[$`<span class="escape">\\</span>]</span><span class="punct">',</span> <span class="punct">'</span><span class="string"><span class="escape">\\\\</span>\1</span><span class="punct">').</span><span class="ident">gsub</span><span class="punct">('</span><span class="string"><span class="escape">\\</span>$<span class="escape">\\</span>$</span><span class="punct">',</span> <span class="punct">'</span><span class="string">$</span><span class="punct">')</span></code></pre></div>
<p>Save this as a command in your Rails, or <a href="http://web.archive.org/web/20060303052933/http://blog.inquirylabs.com/">syncPeople on Rails</a>, bundle. The command options should be as follows:</p>
<ul>
<li><strong>Save:</strong> Nothing</li>
<li><strong>Input:</strong> Selected Text or Nothing</li>
<li><strong>Output:</strong> Insert as Snippet</li>
<li><strong>Activation:</strong> Whatever you want, Im going to use a macro described below and leave this empty</li>
<li><strong>Scope Selector:</strong> source.ruby.rails</li>
</ul>
<p>The first modification it needs is to get the lines to insert as command line arguments so we can use it for other snippets. Secondly, regardless of the <strong>Re-indent pasted text</strong> setting the text returned is indented incorrectly.</p>
The macro Im thinking of to invoke this is tab-triggered and will simply:
<ul>
<li>Select word (<tt><strong>⌃W</strong></tt>)</li>
<li>Delete (<tt><strong></strong></tt>)</li>
<li>Select to end of file (<tt><strong>⇧⌘↓</strong></tt>)</li>
<li>Run command “Put in self.down”</li>
</ul>
</div>
<p class="meta">
Posted in <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/textmate" rel="tag">textmate</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/rails" rel="tag">rails</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/hacking" rel="tag">hacking</a>&nbsp;<strong>|</strong>&nbsp;Tags <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/tag/commands" rel="tag">commands</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/tag/macro" rel="tag">macro</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/tag/rails" rel="tag">rails</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/tag/snippets" rel="tag">snippets</a>, <a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/tag/textmate" rel="tag">textmate</a>&nbsp;<strong>|</strong>&nbsp;<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down#comments">no comments</a>&nbsp;<strong>|</strong>&nbsp;<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down#trackbacks">no trackbacks</a>
</p>
<a name="comments"></a><h4 class="blueblk">Comments</h4>
<p class="postmetadata alt">
<small><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down#respond">Leave a response</a></small>
</p>
<ol class="comment-list" id="commentList">
<li id="dummy_comment" style="display: none"></li>
</ol>
<a name="trackbacks"></a><h4 class="blueblk">Trackbacks</h4>
<p>
Use the following link to trackback from your own site:<br>
<span class="light-bg">http://sami.samhuri.net/articles/trackback/20</span>
</p>
<p class="postmetadata alt">
<small>
<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/xml/rss20/article/20/feed.xml" title="RSS Feed">RSS feed for this post</a>
<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/trackback/20">trackback uri</a>
</small>
</p>
<form action="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/comment/20" class="commentform" id="commentform" method="post" onsubmit="new Ajax.Updater({success:&#39;commentList&#39;}, &#39;/articles/comment/20&#39;, {asynchronous:true, evalScripts:true, insertion:Insertion.Bottom, onComplete:function(request){complete(request)}, onFailure:function(request){failure(request)}, onLoading:function(request){loading()}, parameters:Form.serialize(this)}); return false;">
<div class="comment-box">
<div id="errors"></div>
<div id="preview" style="display: none"></div>
<a name="respond"></a>
<table cellpadding="4" cellspacing="0" class="frm-tbl">
<tbody><tr>
<td><p><label for="comment_author">Your name</label></p></td>
<td> <input id="comment_author" name="comment[author]" size="20" type="text"> <small><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down#" onclick="Element.toggle(&#39;guest_url&#39;); Element.toggle(&#39;guest_email&#39;); return false;">(leave url/email »)</a></small></td>
</tr>
<tr id="guest_url" style="display:none;">
<td><p><label for="comment_url">Your blog</label></p></td>
<td> <input id="comment_url" name="comment[url]" size="30" type="text"></td>
</tr>
<tr id="guest_email" style="display:none;">
<td><p><label for="comment_email">Your email</label></p></td>
<td> <input id="comment_email" name="comment[email]" size="30" type="text"></td>
</tr>
<tr>
<td><p><label for="comment_body">Your message</label></p></td>
<td valign="top" colspan="2">
<textarea cols="40" id="comment_body" name="comment[body]" rows="20"></textarea>
</td>
</tr>
<tr>
<td colspan="2" id="frm-btns">
<span id="comment_loading" style="display:none;"><img alt="Spinner" src="./TextMate Insert text into self.down - samhuri.net_files/spinner.gif"></span>&nbsp;&nbsp;
<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02/21/textmate-insert-text-into-self-down#" onclick="new Ajax.Updater(&#39;preview&#39;, &#39;/articles/comment_preview&#39;, {asynchronous:true, evalScripts:true, parameters:Form.serialize(&#39;commentform&#39;), onComplete:function(request){Element.show(&#39;preview&#39;)}}); return false;">Preview comment</a>
<input type="submit" name="submit" id="form-submit-button" value="submit" class="button">
</td>
</tr>
</tbody></table>
</div>
</form>
<script type="text/javascript">
//<![CDATA[
show_dates_as_local_time()
//]]>
</script>
</div>
</div>
<div id="leftcolumn">
<div id="header">
<h1 id="sitename"><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/">sjs</a></h1>
<h2 id="subtitle">&nbsp;</h2>
</div>
<div id="sidebar">
<div id="search"><form action="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/search" id="sform" method="get">
<label for="q">Search: </label><input type="text" id="q" name="q" value="" size="15">
<img alt="Spinner-blue" id="search_spinner" src="./TextMate Insert text into self.down - samhuri.net_files/spinner-blue.gif" style="display:none;">
</form>
<script type="text/javascript">
//<![CDATA[
new Form.Element.Observer('q', 1, function(element, value) {new Ajax.Updater('search-results', '/live/search', {asynchronous:true, evalScripts:true, onComplete:function(request){Element.hide('search_spinner')}, onLoading:function(request){Element.show('search_spinner')}, parameters:'q=' + escape($F('q'))})})
//]]>
</script></div>
<div id="search-results"></div>
<div class="sidebar-node">
<h3>All about...</h3>
<ul>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/pages/about">me in 3 paragraphs</a></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/pages/how-i-became-a-geek">geek background</a></li>
</ul>
</div>
<div class="sidebar-node">
<h3>Categories</h3>
<ul id="categories">
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/amusement">amusement</a> <em>(3)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/gentoo">gentoo</a> <em>(1)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/hacking">hacking</a> <em>(10)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/life">life</a> <em>(2)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/mac-os-x">mac os x</a> <em>(2)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/rails">rails</a> <em>(9)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/technology">technology</a> <em>(1)</em></li>
<li><a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/category/textmate">textmate</a> <em>(8)</em></li>
</ul>
</div>
<div class="sidebar-node">
<h3>Archives</h3>
<ul id="archives">
<li>
<a href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/articles/2006/02">February 2006</a>
<em>(15)</em>
</li>
</ul>
</div>
<div class="sidebar-node">
<h3>Links</h3>
<ul>
<li><a href="http://web.archive.org/web/20060303052933/http://jim.roepcke.com/">Have Browser, Will Travel</a></li>
<li><a href="http://web.archive.org/web/20060303052933/http://www.mirage.org/">encieno</a></li>
<li><a href="http://web.archive.org/web/20060303052933/http://www.nofxwiki.net/">nofxwiki.net</a></li>
</ul>
</div>
<div class="sidebar-node">
<p></p><ul>
<li><a class="feed" href="http://web.archive.org/web/20060303052933/http://sami.samhuri.net/xml/rss20/feed.xml" title="Articles feed"><img src="./TextMate Insert text into self.down - samhuri.net_files/feed-icon32x32.png" alt="RSS 2.0" width="28" height="28"></a></li>
<!--
-->
</ul><p></p>
</div>
<br clear="all">
</div>
</div>
<div id="footer">
<ul>
<li><a href="http://web.archive.org/web/20060303052933/http://typo.leetsoft.com/">Typo</a></li>
<li></li>
<li><a href="http://web.archive.org/web/20060303052933/http://validator.w3.org/check?uri=referer">Valid XHTML</a></li>
<li></li>
<li><a href="http://web.archive.org/web/20060303052933/http://jigsaw.w3.org/css-validator/validator?uri=http://sami.samhuri.net/">Valid CSS</a></li>
</ul>
</div>
<script src="./TextMate Insert text into self.down - samhuri.net_files/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-214054-3";
urchinTracker();
</script>
<!--
FILE ARCHIVED ON 5:29:33 Mar 3, 2006 AND RETRIEVED FROM THE
INTERNET ARCHIVE ON 2:46:40 Aug 21, 2011.
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
SECTION 108(a)(3)).
-->
<div id="footnotify_lightbox" style="position: fixed; width: 100%; height: 100%; top: 0px; left: 0px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.699219); display: none; background-position: initial initial; background-repeat: initial initial; "></div><div id="footnotify_holder" style="position: absolute; display: none; "><div id="footnotify_arrow" style="letter-spacing: -1px; width: 32px; margin-top: 0px; margin-right: -11px; margin-bottom: 0px; margin-left: -11px; text-align: center; font-size: 13px; padding-top: 2em; line-height: 0.9em; color: rgb(0, 0, 0); ">◢◣</div><div id="footnotify_panel" style="padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; margin-top: 0px; margin-right: -240px; margin-bottom: 0px; margin-left: -240px; width: 480px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(0, 0, 0); color: inherit; background-position: initial initial; background-repeat: initial initial; "><div id="footnotify_content" style="margin-top: 2em; margin-right: 2em; margin-bottom: 2em; margin-left: 2em; "></div></div></div><div id="footnotify_notification" style="position: fixed; top: 5px; left: 5px; z-index: 999; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; color: rgb(255, 255, 255); background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.699219); display: none; background-position: initial initial; background-repeat: initial initial; "></div></body></html>