<?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"
	>

<channel>
	<title>sacha chua :: enterprise 2.0 consultant, storyteller, geek &#187; emacs</title>
	<atom:link href="http://sachachua.com/wp/category/emacs/feed/" rel="self" type="application/rss+xml" />
	<link>http://sachachua.com/wp</link>
	<description>I help people connect through blogs, wikis, other Web 2.0 tools. I'm also writing a book about Emacs.</description>
	<pubDate>Sat, 06 Sep 2008 03:47:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Emacs: Jump to anything</title>
		<link>http://sachachua.com/wp/2008/09/05/emacs-jump-to-anything/</link>
		<comments>http://sachachua.com/wp/2008/09/05/emacs-jump-to-anything/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 13:51:52 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/09/05/emacs-jump-to-anything/</guid>
		<description><![CDATA[I just came across the Anything extension for Emacs. After you load anything.el, you can type M-x anything RET and a substring of, well, anything. Looks like a handy shortcut. It&#039;s like Quicksilver, but for Emacs. Grab anything-config.el for a bunch of useful functions.
Here&#039;s my current configuration:

(require 'anything)
(require 'anything-config)
(setq anything-sources
      [...]]]></description>
			<content:encoded><![CDATA[<p>I just came across the <a href="http://www.emacswiki.org/cgi-bin/wiki/Anything">Anything</a> extension for Emacs. After you load anything.el, you can type M-x anything RET and a substring of, well, anything. Looks like a handy shortcut. It&#039;s like Quicksilver, but for Emacs. Grab <a href="http://www.emacswiki.org/cgi-bin/wiki/download/anything-config.el">anything-config.el</a> for a bunch of useful functions.</p>
<p>Here&#039;s my current configuration:</p>
<pre>
(require 'anything)
(require 'anything-config)
(setq anything-sources
      (list anything-c-source-buffers
            anything-c-source-file-name-history
            anything-c-source-info-pages
            anything-c-source-man-pages
	    anything-c-source-file-cache
            anything-c-source-emacs-commands))
(global-set-key (kbd "M-X") 'anything)
</pre>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/09/05/emacs-jump-to-anything/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and W3M: Toggling between work and the Web</title>
		<link>http://sachachua.com/wp/2008/08/27/emacs-and-w3m-toggling-between-work-and-the-web/</link>
		<comments>http://sachachua.com/wp/2008/08/27/emacs-and-w3m-toggling-between-work-and-the-web/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 12:24:12 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<category><![CDATA[w3m]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5088</guid>
		<description><![CDATA[Here&#039;s a handy shortcut that toggles between the W3M web browser and other buffers you&#039;re working on. I use it to quickly switch between code and documentation (or your favorite timewasting site, as it also makes a handy boss key).
Define the function by adding the following code to your ~/.emacs:

(defun wicked/toggle-w3m ()
  "Switch to [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#039;s a handy shortcut that toggles between the W3M web browser and other buffers you&#039;re working on. I use it to quickly switch between code and documentation (or your favorite timewasting site, as it also makes a handy boss key).</p>
<p>Define the function by adding the following code to your ~/.emacs:</p>
<pre>
(defun wicked/toggle-w3m ()
  "Switch to a w3m buffer or return to the previous buffer."
  (interactive)
  (if (derived-mode-p 'w3m-mode)
      ;; Currently in a w3m buffer
      ;; Bury buffers until you reach a non-w3m one
      (while (derived-mode-p 'w3m-mode)
	(bury-buffer))
    ;; Not in w3m
    ;; Find the first w3m buffer
    (let ((list (buffer-list)))
      (while list
	(if (with-current-buffer (car list)
	      (derived-mode-p 'w3m-mode))
	    (progn
	      (switch-to-buffer (car list))
	      (setq list nil))
	  (setq list (cdr list))))
      (unless (derived-mode-p 'w3m-mode)
	(call-interactively 'w3m)))))
</pre>
<p>Then bind it to a shortcut key sequence (F7 F7 in this example) by adding the following code to your ~/.emacs:</p>
<pre>
(global-set-key (kbd "<f7> </f7><f7>") 'wicked/toggle-w3m)
</f7></pre>
<p>You can then use F7 F7 to switch back and forth between your web browser and whatever else you&#039;re working on.</p>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/emacs' rel='tag' target='_self'>emacs</a>, <a class='technorati-link' href='http://technorati.com/tag/w3m' rel='tag' target='_self'>w3m</a>, <a class='technorati-link' href='http://technorati.com/tag/wickedcoolemacs' rel='tag' target='_self'>wickedcoolemacs</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/27/emacs-and-w3m-toggling-between-work-and-the-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and w3m: Fake your user agent</title>
		<link>http://sachachua.com/wp/2008/08/19/emacs-and-w3m-fake-your-user-agent/</link>
		<comments>http://sachachua.com/wp/2008/08/19/emacs-and-w3m-fake-your-user-agent/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 23:49:14 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<category><![CDATA[emacs-lisp]]></category>

		<category><![CDATA[user-agent]]></category>

		<category><![CDATA[w3m]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5076</guid>
		<description><![CDATA[
In an ideal world, you would never need to make your browser pretend to be a different browser. In reality, a number of websites check for specific browsers such as Mozilla or Internet Explorer, or even specific versions of those browsers. Other websites check for popular search engine crawlers such as the Googlebot in order [...]]]></description>
			<content:encoded><![CDATA[<p>
In an ideal world, you would never need to make your browser pretend to be a different browser. In reality, a number of websites check for specific browsers such as Mozilla or Internet Explorer, or even specific versions of those browsers. Other websites check for popular search engine crawlers such as the Googlebot in order to display content optimized for that search engine. You may want to change your user agent to work around such limitations, or you might want to change your user agent string just for fun.
</p>
<p>
The following code allows you to set your user agent (wicked/w3m-set-user-agent), reload the current page using a specified user agent (wicked/w3m-reload-this-page-with-user-agent), and define regular expression matches for URLs to control user agent strings (wicked/w3m-fake-user-agent-sites). To use this, add the following to your ~/.emacs:
</p>
<p><pre class="example">
 (defvar wicked/w3m-fake-user-agents ;; (1)
   `(("w3m" . ,(concat "Emacs-w3m/" emacs-w3m-version " " w3m-version))
     ("ie6" . "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")
     ("ff3" . "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1")
     ("ff2" . "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080208 Firefox/2.0.0.13")
     ("ie7" . "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)")
     ("ie5.5" . "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)")
     ("iphone" . "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.20")
     ("safari" . "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13")
     ("google" . "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"))
   "*Associative list of user agent names and strings.")

 (defvar wicked/w3m-fake-user-agent-sites ;; (2)
   '(("^https?://www\\.useragentstring\\.com" . "ff2"))
   "*Associative list of regular expressions matching URLs and the agent keyword or value.
 The first matching entry will be used.")

 (defun wicked/w3m-set-user-agent (agent)
   "Set the user agent to AGENT based on `wicked/w3m-fake-user-agents'.
 If AGENT is not defined in `wicked/w3m-fake-user-agents', it is used as the user agent.
 If AGENT is empty, the default w3m user agent will be used."
   (interactive
    (list
     (completing-read "User-agent [w3m]: "
                    (mapcar 'car wicked/w3m-fake-user-agents)
                    nil nil nil nil "w3m"))) ;; (3)
   (if agent
       (progn
        (setq w3m-user-agent
              (or
               (and (string= agent "") (assoc "w3m" wicked/w3m-fake-user-agents)) ;; (4)
               (cdr (assoc agent wicked/w3m-fake-user-agents)) ;; (5)
               agent)) ;; (6)
        (setq w3m-add-user-agent t))
     (setq w3m-add-user-agent nil)))

 (defun wicked/w3m-reload-this-page-with-user-agent (agent)
   "Browse this page using AGENT based on `wicked/w3m-fake-user-agents'.
 If AGENT is not defined in `wicked/w3m-fake-user-agents', it is used as the user agent.
 If AGENT is empty, the default w3m user agent will be used."
   (interactive (list (completing-read "User-agent [w3m]: "
                    (mapcar 'car wicked/w3m-fake-user-agents)
                    nil nil nil nil "w3m")))
   (let ((w3m-user-agent w3m-user-agent)
       (w3m-add-user-agent w3m-add-user-agent))
     (wicked/w3m-set-user-agent agent) ;; (7)
     (w3m-reload-this-page)))

 (defadvice w3m-header-arguments (around wicked activate) ;; (8)
   "Check `wicked/w3m-fake-user-agent-sites' for fake user agent definitions."
   (let ((w3m-user-agent w3m-user-agent)
         (w3m-add-user-agent w3m-add-user-agent)
         (sites wicked/w3m-fake-user-agent-sites))
     (while sites
       (if (string-match (caar sites) (ad-get-arg 1))
         (progn
           (wicked/w3m-set-user-agent (cdar sites))
           (setq sites nil))
       (setq sites (cdr sites))))
     ad-do-it))
</pre>
</p>
<p>
wicked/w3m-fake-user-agents sets up a number of common user agents(1) using examples from <a href="http://www.useragentstring.com">http://www.useragentstring.com</a>. If you frequently use other user agents, add them to this associative list. wicked/w3m-fake-user-agent-sites sets up some rules for URLs so that you can work around specific websites(2). The first matching rule will be used.
</p>
<p>
wicked/w3m-set-user-agent can be called from a w3m browser session to set the user agent for all new pages visited. By default, it uses the w3m user agent(3). It will also use the w3m user agent if the agent is blank(4). If the user agent is one of the frequently-used agents defined in wicked/w3m-fake-user-agents, then the corresponding user agent string will be used(5). If not, the string will be used as-is(6). If the agent is nil, the user agent string will be disabled.(7)
</p>
<p>
You can check a single page using a different user agent by using M-x wicked/w3m-reload-this-page-with-user-agent. It temporarily sets the user agent and then reloads the current page.(7)
</p>
<p>
The last segment of code modifies the behavior of w3m-header-arguments(8), matching wicked/w3m-fake-user-agents against the URL. This temporarily sets the user agent for matching sites.</p>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/emacs-lisp' rel='tag' target='_self'>emacs-lisp</a>, <a class='technorati-link' href='http://technorati.com/tag/user-agent' rel='tag' target='_self'>user-agent</a>, <a class='technorati-link' href='http://technorati.com/tag/w3m' rel='tag' target='_self'>w3m</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/19/emacs-and-w3m-fake-your-user-agent/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and w3m: Quick searches</title>
		<link>http://sachachua.com/wp/2008/08/18/emacs-and-w3m-quick-searches/</link>
		<comments>http://sachachua.com/wp/2008/08/18/emacs-and-w3m-quick-searches/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 02:14:59 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5072</guid>
		<description><![CDATA[A number of browsers allow you to define quick searches so that you can type keywords into your address bar in order to search predetermined sites. With a little bit of code, you can do this in Emacs, too. In this project, you&#039;ll learn how to set up your own keywords to work with w3m [...]]]></description>
			<content:encoded><![CDATA[<p>A number of browsers allow you to define quick searches so that you can type keywords into your address bar in order to search predetermined sites. With a little bit of code, you can do this in Emacs, too. In this project, you&#039;ll learn how to set up your own keywords to work with w3m and browse-url, so you can use your keywords for browsing both inside and outside Emacs.</p>
<p>First, set up keywords by adding the following lines to your ~/.emacs. We&#039;ll use an associative list of regular expressions and substitutions, like this:</p>
<pre>
(setq wicked/quick-search-alist
      '((&quot;^g?:? +\\(.*\\)&quot; . ;; Google Web
         &quot;http://www.google.com/search?q=\\1&quot;)

        (&quot;^g!:? +\\(.*\\)&quot; . ;; Google Lucky
         &quot;http://www.google.com/search?btnI=I%27m+Feeling+Lucky&amp;q=\\1&quot;)

	(&quot;^dict:? +\\(.*\\)&quot; . ;; Dictionary
	 &quot;http://dictionary.reference.com/search?q=\\1&quot;)))
</pre>
<p>This will turn &quot;g keyword1 keyword2&quot; into a Google search for keyword1 and keyword2.</p>
<p>Next, define advice for the functions that open URLs. Before-type advice allows you to modify arguments before the function is run, and we&#039;ll use that to change the URLs. To modify the URL behavior of w3m, add the following to your ~/.emacs:</p>
<pre>
(require 'cl-seq)
(defadvice w3m-goto-url (before wicked activate)
  &quot;Use the quick searches defined in `wicked/quick-search-alist'.&quot;
  (let* ((my-url (replace-regexp-in-string
		  &quot;^ *\\| *$&quot; &quot;&quot;
		  (replace-regexp-in-string &quot;[ \t\n]+&quot; &quot; &quot; (ad-get-arg 0))))
	 (match (assoc-if
		 (lambda (a) (string-match a my-url))
		 wicked/quick-search-alist)))
    (if match
	(ad-set-arg 0 (replace-regexp-in-string
		       (car match) (cdr match) my-url)))))
</pre>
<p>This sets up your quick searches for use within w3m. To set up quick searches for use with browse-url and external browsers, add the following to your ~/.emacs:</p>
<pre>
(defadvice browse-url (before wicked activate)
  &quot;Use the quick searches defined in `wicked/quick-search-alist'.&quot;
  (let* ((my-url (replace-regexp-in-string
		  &quot;^ *\\| *$&quot; &quot;&quot;
		  (replace-regexp-in-string &quot;[ \t\n]+&quot; &quot; &quot; (ad-get-arg 0))))
	 (match (assoc-if
		 (lambda (a) (string-match a my-url))
		 wicked/quick-search-alist)))
    (if match
	(ad-set-arg 0 (replace-regexp-in-string
		       (car match) (cdr match) my-url)))))
</pre>
<p>To try out your searches, use M-x browse-url RET g emacs RET to do a Google search for all things Emacs, and use M-x w3m-goto-url (usually bound to g) inside w3m to use the quick searches.</p>
<p>You can define more quick searches like this:</p>
<pre>
(add-to-list 'wicked/quick-search-alist
          '(&quot;^ew:? *?\\(.*\\)&quot; . ;; Emacs Wiki Search
            &quot;http://www.emacswiki.org/cgi-bin/wiki?search=\\1&quot;))
</pre>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/18/emacs-and-w3m-quick-searches/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sweet! Facebook in Emacs!</title>
		<link>http://sachachua.com/wp/2008/08/12/sweet-facebook-in-emacs/</link>
		<comments>http://sachachua.com/wp/2008/08/12/sweet-facebook-in-emacs/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 01:18:50 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5066</guid>
		<description><![CDATA[So here&#039;s how to access Facebook from w3m, one of the web browsers in
Emacs:
1. Enable cookies by setting w3m-use-cookies to t.
2. Go to http://m.facebook.com .
3. Choose the HTTP login.
4. Log in with your username and password.
Hooray for mobile interfaces that don&#039;t require Javascript! =D
So far, it seems to work. I can update my status! Sweet!
Next [...]]]></description>
			<content:encoded><![CDATA[<p>So here&#039;s how to access Facebook from w3m, one of the web browsers in<br />
Emacs:</p>
<p>1. Enable cookies by setting w3m-use-cookies to t.<br />
2. Go to http://m.facebook.com .<br />
3. Choose the HTTP login.<br />
4. Log in with your username and password.</p>
<p>Hooray for mobile interfaces that don&#039;t require Javascript! =D</p>
<p>So far, it seems to work. I can update my status! Sweet!</p>
<p>Next step: Figure out how to set up shimbun for Facebook mail so that I can read my Facebook mail like a newsgroup&#8230;</p>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/facebook' rel='tag' target='_self'>facebook</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/12/sweet-facebook-in-emacs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why browse the Web in Emacs?</title>
		<link>http://sachachua.com/wp/2008/08/12/why-browse-the-web-in-emacs/</link>
		<comments>http://sachachua.com/wp/2008/08/12/why-browse-the-web-in-emacs/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:57:20 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<category><![CDATA[browsing]]></category>

		<category><![CDATA[w3]]></category>

		<category><![CDATA[w3m]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5064</guid>
		<description><![CDATA[&#034;Are you browsing Slashdot in Emacs?&#034;, W- asked me after he glanced at my screen.
With Emacs&#039; reputation for including everything _and_ the kitchen sink, you probably won&#039;t be surprised to hear that there&#039;s more than one way to surf the Internet using your text editor. With today&#039;s Javascript- and image-heavy websites, it can be hard [...]]]></description>
			<content:encoded><![CDATA[<p>&#034;Are you browsing Slashdot in Emacs?&#034;, W- asked me after he glanced at my screen.</p>
<p>With Emacs&#039; reputation for including everything _and_ the kitchen sink, you probably won&#039;t be surprised to hear that there&#039;s more than one way to surf the Internet using your text editor. With today&#039;s Javascript- and image-heavy websites, it can be hard to believe that anyone would use a text-based browser with limited support for many of the things we take for granted. Still, a Web browser in your text editor can be surprisingly useful. Here are some of the reasons why you might like it:</p>
<ul>
<li><b>Browsing is faster and less distracting.</b> Forget flashing ads, garish colors, and large images. When you surf the Web in Emacs, you can focus on reading, and you can use all the typical Emacs shortcuts for navigating around. You can view images when you want to.<br />
 If you need to see something that Emacs doesn&#039;t support, you can easily open the current page in an external Web browser.</li>
<li><b>You can integrate it into your work.</b> With a little bit of Emacs Lisp, you can qucikly look up information on the Web based on what you&#039;re currently working on. For example, PHP mode comes with a shortcut that lets you look up the current function&#039;s documentation in the PHP manual. You can look up bug report details, dictionary definitions, and Wikipedia pages with minimal typing, too. If you use Emacspeak, you can set up the web browser to speech-synthesize more than what&#039;s displayed on screen. The more you use Emacs, the more benefits you get from the integration.</li>
<li><b>You can customize everything.</b> You can customize your Emacs experience quickly and easily, and if you spend a lot of time on the Net, you&#039;ll appreciate having your own shortcuts and functions. For example, I&#039;ve completely remapped my keyboard shortcuts to support tabbed browsing on a Dvorak keyboard, and I&#039;ve defined a few functions to make frequently-used commands much easier. You can even use functions to process Web pages and either summarize the information you&#039;re interested in or make pages more navigable. It&#039;s all just Emacs Lisp.</li>
<li><b>You&#039;re safe from browser exploits.</b> No Javascript pop-ups, no image bugs, no browser-based malware that can take over your comuter or steal data. Just content.</li>
<li><b>You need less memory.</b> Why open up a memory-intensive graphical Web-based browser when you&#039;ve got Emacs open anyway?</li>
</ul>
<p>There&#039;s more than one way to browse the Web in Emacs, of course. Browse-url is a package that makes it easy to open URLs in your preferred browser or browsers. For example, you can use it to browse the Web in Mozilla Firefox, and (of course) you can use it to browse the Web within Emacs itself. For browsing within Emacs, you can use w3m.el, an interface to the external W3M browser, or w3, a Web browser written entirely in Emacs Lisp. Of the two, I prefer w3m.el, which is much faster and more featureful than w3. Both can display graphics, tables, and frames, and w3 supports stylesheets.</p>
<p>More about Emacs and browsing the Web soon! Planned projects for this chapter of <a href="http://sachachua.com/category/wp/wickedcoolemacs">Wicked Cool Emacs</a>:</p>
<pre>
*** Project XXX: Browse the Web
*** Project XXX: Open the current webpage in an external browser
*** Project XXX: Different browsers for different pages
*** Project XXX: Toggle between Web and work
*** Project XXX: Quick search
*** Project XXX: Customize your keymap
*** Project XXX: Download files
*** Project XXX: Add access keys
*** Project XXX: Use social bookmarking
*** Project XXX: Typeahead
*** Project XXX: Preview HTML
*** Project XXX: Read Web pages as news
</pre>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/browsing' rel='tag' target='_self'>browsing</a>, <a class='technorati-link' href='http://technorati.com/tag/emacs' rel='tag' target='_self'>emacs</a>, <a class='technorati-link' href='http://technorati.com/tag/w3' rel='tag' target='_self'>w3</a>, <a class='technorati-link' href='http://technorati.com/tag/w3m' rel='tag' target='_self'>w3m</a>, <a class='technorati-link' href='http://technorati.com/tag/wickedcoolemacs' rel='tag' target='_self'>wickedcoolemacs</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/12/why-browse-the-web-in-emacs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Drupal, Emacs, and templates: Module update functions</title>
		<link>http://sachachua.com/wp/2008/08/06/drupal-emacs-and-templates-module-update-functions/</link>
		<comments>http://sachachua.com/wp/2008/08/06/drupal-emacs-and-templates-module-update-functions/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 19:00:46 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[drupal]]></category>

		<category><![CDATA[emacs]]></category>

		<category><![CDATA[template]]></category>

		<category><![CDATA[yasnippet]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5044</guid>
		<description><![CDATA[Drupal&#039;s coding conventions make it easier to hook into system behavior, but they also result in a lot of repetitive typing. For example, you can run code when upgrading a module by putting the code in a function named modulename_update_N() in your module&#039;s install file. I found myself scrolling up and copy-pasting stuff too many [...]]]></description>
			<content:encoded><![CDATA[<p>Drupal&#039;s coding conventions make it easier to hook into system behavior, but they also result in a lot of repetitive typing. For example, you can run code when upgrading a module by putting the code in a function named <i>modulename</i>_update_<i>N</i>() in your module&#039;s install file. I found myself scrolling up and copy-pasting stuff too many times, so I decided to automate it instead.</p>
<p>I&#039;ve been using <a href="http://sachachua.com/wp/2008/07/26/yet-another-snippet-mode-for-emacs/">yasnippet</a> for my Emacs templates. All I needed to do to automate that little update bit was to write some code that figured out what the next update number should be. Here&#039;s the snippet file I&#039;ve just added (~/elisp/snippets/php-mode/drupal-mode/_update):</p>
<pre>
function `(sacha/drupal-module-name)`_update_`(sacha/drupal-module-update-number)`() {
  $ret = array();
  $0
  $ret[] = array(
    'success' => true,
    'query' => '$1',
  );
  return $ret;
}
</pre>
<p>The relevant functions from my ~/.emacs:</p>
<pre>
(defun sacha/drupal-module-update-number ()
  "Return the number of the next module update function.
This is one more than the highest number used so far.
This function should be called in a module's .install file."
  (save-excursion
    (save-restriction
      (widen)
      (goto-char (point-min))
      (let ((module-name (sacha/drupal-module-name))
	    (max 0))
	(while (re-search-forward
		(concat "function[ \t\n]+" module-name "_update_\\([0-9]+\\)") nil t)
	  (setq max (max (string-to-number (match-string 1)) max)))
	(number-to-string (1+ max))))))

(defun sacha/drupal-module-name ()
  "Return the Drupal module name for .module and .install files."
  (file-name-sans-extension (file-name-nondirectory (buffer-file-name))))
</pre>
<p>I can&#039;t think of how I&#039;d do that in Eclipse. =) Don&#039;t get me wrong&#8211;I still like Eclipse&#8211;but I heart being able to hack my editor on the fly.</p>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/template' rel='tag' target='_self'>template</a>, <a class='technorati-link' href='http://technorati.com/tag/yasnippet' rel='tag' target='_self'>yasnippet</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/06/drupal-emacs-and-templates-module-update-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and Gnus: zomg, new chapter out the door!</title>
		<link>http://sachachua.com/wp/2008/08/04/emacs-and-gnus-zomg-new-chapter-out-the-door/</link>
		<comments>http://sachachua.com/wp/2008/08/04/emacs-and-gnus-zomg-new-chapter-out-the-door/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 18:25:34 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[gnus]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/08/04/emacs-and-gnus-zomg-new-chapter-out-the-door/</guid>
		<description><![CDATA[So I _finally_ pulled everything together and got my Gnus chapter out the door. Hooray, hooray, hooray!

Reading Mail with Gnus (PDF)
Reading Mail with Gnus (HTML), produced by Org

Disclaimers: It&#039;s rough, it probably makes a few assumptions about whatever version of Emacs I&#039;m running, it&#039;s probably missing your favorite tips (and I&#039;d love to add them!), [...]]]></description>
			<content:encoded><![CDATA[<p>So I _finally_ pulled everything together and got my Gnus chapter out the door. Hooray, hooray, hooray!</p>
<ul>
<li><a href="http://sachachua.com/notebook/wickedcool/wc-emacs-05-gnus.pdf">Reading Mail with Gnus (PDF)</a></li>
<li><a href="http://sachachua.com/notebook/wickedcool/wc-emacs-05-gnus.html">Reading Mail with Gnus (HTML)</a>, produced by Org</li>
</ul>
<p>Disclaimers: It&#039;s rough, it probably makes a few assumptions about whatever version of Emacs I&#039;m running, it&#039;s probably missing your favorite tips (and I&#039;d love to add them!), and it probably has typos. Meep. But it&#039;s out there!</p>
<p>Hooray, hooray, hooray!</p>
<p>Next step: write about web-browsing in Emacs&#8230;</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/04/emacs-and-gnus-zomg-new-chapter-out-the-door/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs: Caps lock as M-x</title>
		<link>http://sachachua.com/wp/2008/08/04/emacs-caps-lock-as-m-x/</link>
		<comments>http://sachachua.com/wp/2008/08/04/emacs-caps-lock-as-m-x/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 10:59:02 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/08/04/emacs-caps-lock-as-m-x/</guid>
		<description><![CDATA[Inspired by Lennart Borgman&#039;s recent post on help.gnu.emacs about binding Caps Lock to M-x on Microsoft Windows, I set my system up with the Linux equivalent.
To make Caps Lock a shortcut for M-x, add the following lines to your ~/.emacs:

(if (eq window-system 'x)
    (shell-command "xmodmap -e 'clear Lock' -e 'keycode 66 = [...]]]></description>
			<content:encoded><![CDATA[<p>Inspired by Lennart Borgman&#039;s recent post on help.gnu.emacs about <a href="http://groups.google.com/group/gnu.emacs.help/msg/5196ae31694b6052">binding Caps Lock to M-x on Microsoft Windows</a>, I set my system up with the Linux equivalent.</p>
<p>To make Caps Lock a shortcut for M-x, add the following lines to your ~/.emacs:</p>
<pre>
(if (eq window-system 'x)
    (shell-command "xmodmap -e 'clear Lock' -e 'keycode 66 = F13'"))
(global-set-key [f13] 'execute-extended-command)
</pre>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/08/04/emacs-caps-lock-as-m-x/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and PHP: On-the-fly syntax checking with Flymake</title>
		<link>http://sachachua.com/wp/2008/07/31/emacs-and-php-on-the-fly-syntax-checking-with-flymake/</link>
		<comments>http://sachachua.com/wp/2008/07/31/emacs-and-php-on-the-fly-syntax-checking-with-flymake/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 10:50:22 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[flymake]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5021</guid>
		<description><![CDATA[The dreaded white screen of nothingness usually means that I&#039;ve misplaced a quotation mark or brace somewhere in my PHP code. On-the-fly syntax checking in Eclipse helped me find those errors quickly because I could scan the right scrollbar for areas marked with red. I knew that shifting to Emacs wouldn&#039;t automatically cure me of [...]]]></description>
			<content:encoded><![CDATA[<p>The dreaded white screen of nothingness usually means that I&#039;ve misplaced a quotation mark or brace somewhere in my PHP code. On-the-fly syntax checking in Eclipse helped me find those errors quickly because I could scan the right scrollbar for areas marked with red. I knew that shifting to Emacs wouldn&#039;t automatically cure me of the propensity to mismatch my parentheses. If I could get on-the-fly syntax checking working in Emacs, I&#039;d save myself a lot of time.</p>
<p>It took me a while to sort out various configuration problems. Most were due to the fact that PHP didn&#039;t report parse errors with my original configuration, even though I had uncommented the line after &#034;Show only errors&#034;. As it turned out, the error_reporting option in php.ini needs to include E_PARSE in order for php to report parsing error details. Here&#039;s the value I&#039;m currently using in /etc/php.ini:</p>
<pre>
error_reporting = E_ERROR|E_COMPILE_ERROR|E_CORE_ERROR|E_PARSE
</pre>
<p>Flymake is the package responsible for on-the-fly syntax checking in Emacs. Out of the box, it supports C, C++, XML, XHTML, Perl, Java, TeX, and IDL. To load Flymake and add support for PHP, add the following to your ~/.emacs:</p>
<pre>
(require 'flymake)

(defun flymake-php-init ()
  "Use php to check the syntax of the current file."
  (let* ((temp (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace))
	 (local (file-relative-name temp (file-name-directory buffer-file-name))))
    (list "php" (list "-f" local "-l"))))

(add-to-list 'flymake-err-line-patterns
  '("\\(Parse\\|Fatal\\) error: +\\(.*?\\) in \\(.*?\\) on line \\([0-9]+\\)$" 3 4 nil 2))

(add-to-list 'flymake-allowed-file-name-masks '("\\.php$" flymake-php-init))

;; Drupal-type extensions
(add-to-list 'flymake-allowed-file-name-masks '("\\.module$" flymake-php-init))
(add-to-list 'flymake-allowed-file-name-masks '("\\.install$" flymake-php-init))
(add-to-list 'flymake-allowed-file-name-masks '("\\.inc$" flymake-php-init))
(add-to-list 'flymake-allowed-file-name-masks '("\\.engine$" flymake-php-init))

(add-hook 'php-mode-hook (lambda () (flymake-mode 1)))
(define-key php-mode-map '[M-S-up] 'flymake-goto-prev-error)
(define-key php-mode-map '[M-S-down] 'flymake-goto-next-error)
</pre>
<p>Evaluate that code, open one of your PHP files, and intentionally break it. The syntax error should be highlighted. To change the highlighting, move your point to the error and type M-x customize-face. Accept the default (flymake-errline), then customize it as desired. Don&#039;t forget to save your customizations for future sessions.</p>
<p>If your syntax errors are not highlighted and you get a message like this:</p>
<pre>
Configuration error occured while running (php -f test_flymake.php -l). flymake will be switched OFF
</pre>
<p>double-check your /etc/php.ini to make sure that E_PARSE is included as one of the options for error_reporting. You can check the output by running <kbd>php -f <i>yourfile.php</i> -l</kbd>. You should see the line number of the parse error. Make sure that this matches the regular expression added to flymake-err-line-patterns in your ~/.emacs. If your PHP returns a slightly different message, modify your flymake-err-line-patterns accordingly.</p>
<p>Flymake can save you a lot of programmer frustration for the cost of a little CPU time. Use it to check for errors before you save files or commit them to your source code control repository, and you and other developers will be much happier.</p>
<p>(UPDATE: Fixed typo in flymake-php-init)</p>

<!-- start wp-tags-to-technorati 0.95 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/emacs' rel='tag' target='_self'>emacs</a>, <a class='technorati-link' href='http://technorati.com/tag/flymake' rel='tag' target='_self'>flymake</a>, <a class='technorati-link' href='http://technorati.com/tag/php' rel='tag' target='_self'>php</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/31/emacs-and-php-on-the-fly-syntax-checking-with-flymake/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and PHP tutorial: php-mode</title>
		<link>http://sachachua.com/wp/2008/07/30/emacs-and-php-tutorial-php-mode/</link>
		<comments>http://sachachua.com/wp/2008/07/30/emacs-and-php-tutorial-php-mode/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 13:16:43 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=5014</guid>
		<description><![CDATA[php-mode is responsible for syntax highlighting, indentation, and other major PHP-specific modifications to your editing environment. There are a number of PHP modes available for Emacs. In this project, you&#039;ll learn how to set up the php-mode available from http://sourceforge.net/projects/php-mode/ . At the time of this writing, the current version is 1.4.0 and the maintainer [...]]]></description>
			<content:encoded><![CDATA[<p>php-mode is responsible for syntax highlighting, indentation, and other major PHP-specific modifications to your editing environment. There are a number of PHP modes available for Emacs. In this project, you&#039;ll learn how to set up the php-mode available from <a href="http://sourceforge.net/projects/php-mode/">http://sourceforge.net/projects/php-mode/</a> . At the time of this writing, the current version is 1.4.0 and the maintainer is Aaron Hawley.</p>
<p>
Download the latest php-mode.el from <a href="http://php-mode.sourceforge.net/">http://php-mode.sourceforge.net/</a> and save it to a directory in your load-path. I like to organize my Emacs Lisp files in a directory called ~/elisp. To add PHP support to your Emacs, add the following lines to your ~/.emacs:
</p>
<p><pre class="example" lang="lisp">
 (add-to-list 'load-path "~/elisp")
 (require 'php-mode)
</pre>
</p>
<p>
This configures Emacs to automatically recognize files ending in &#034;.php&#034;, &#034;.phps&#034;, &#034;.php3&#034;, &#034;.php4&#034;, &#034;.phtml&#034;, and &#034;.inc&#034; as PHP files. To associate more extensions with PHP files, add lines like this example to your ~/.emacs: </p>
<p><pre class="example" lang="lisp">
 (add-to-list 'auto-mode-alist '("\\.module$" . php-mode))
 (add-to-list 'auto-mode-alist '("\\.inc$" . php-mode))
 (add-to-list 'auto-mode-alist '("\\.install$" . php-mode))
 (add-to-list 'auto-mode-alist '("\\.engine$" . php-mode))
</pre>
</p>
<p>
This associates php-mode with the extensions used by Drupal, a PHP framework. When you open a file with the specified extension, it should be highlighted according to PHP syntax.
</p>
<p>
Here are some useful commands:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<col align="left"></col><col align="left"></col><col align="left"></col></p>
<tbody>
<tr>
<td>TAB</td>
<td>c-indent-command</td>
<td>Indent the current line</td>
</tr>
<tr>
<td>M-;</td>
<td>comment-dwim</td>
<td>Add a line comment, comments or uncomments the currently-selected region, or does other smart comment-related actions</td>
</tr>
<tr>
<td>C-c C-f</td>
<td>php-search-documentation</td>
<td>Search the online PHP manual for the current word</td>
</tr>
<tr>
<td>C-c RET</td>
<td>php-browse-manual</td>
<td>View the online PHP manual</td>
</tr>
<tr>
<td>C-c .</td>
<td>c-set-style</td>
<td>Change coding style</td>
</tr>
<tr>
<td>C-M-a, C-M-e</td>
<td>c-beginning-of-defun, c-end-of-defun</td>
<td>Go to the beginning or end of the current function</td>
</tr>
<tr>
<td>C-M-h</td>
<td>c-mark-function</td>
<td>Select the current function</td>
</tr>
<tr>
<td>M-a, M-e</td>
<td>c-beginning-of-statement, c-end-of-statement</td>
<td>Go to the beginning or end of the current statement</td>
</tr>
</tbody>
</table>
<p>
Here are some variables you may wish to customize:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<col align="left"></col><col align="left"></col></p>
<tbody>
<tr>
<td>indent-tabs-mode</td>
<td>Set this to nil if you want to insert spaces instead of tabs</td>
</tr>
<tr>
<td>case-fold-search</td>
<td>Set this to t if you want case-insensitive search.</td>
</tr>
<tr>
<td>c-basic-offset</td>
<td>Set your tab size or number of spaces used as a basis for indentation</td>
</tr>
</tbody>
</table>
<p>
You can either customize these variables globally with M-x customize or set them for php-mode. Here&#039;s an example that sets up a buffer with the coding style recommended for Drupal:
</p>
<p><pre class="example" lang="lisp">
 (defun wicked/php-mode-init ()
   "Set some buffer-local variables."
   (setq case-fold-search t)
   (setq indent-tabs-mode nil)
   (setq fill-column 78)
   (setq c-basic-offset 2)
   (c-set-offset 'arglist-cont 0)
   (c-set-offset 'arglist-intro '+)
   (c-set-offset 'case-label 2)
   (c-set-offset 'arglist-close 0))
 (add-hook 'php-mode-hook 'wicked/php-mode-init)
</pre>
</p>
<p>
You can further customize the indentation by moving the point to where the indentation needs improvement and typing C-c C-o (c-set-offset).
</p>
<p>
To try automatic indentation, press C-j (newline-and-indent). If you like that behavior, you can make it the default in php-mode by adding the following line in ~/.emacs:
</p>
<p>
(define-key php-mode-map (kbd &#034;RET&#034;) &#039;newline-and-indent)
</p>
<p>
You may also be interested in M-x show-paren-mode, which shows the matching parenthesis, bracket or brace for the character at point. You can enable it automatically by adding the following line to your ~/.emacs:
</p>
<p><pre class="example" lang="lisp">
   (setq show-paren-mode t)
</pre>
</p>
<p>
It&#039;s a good idea to separate PHP and HTML code. This is not only better coding practice, but it also makes developing in Emacs much easier. php-mode focuses on PHP-specific behavior and does not have special support for HTML. Emacs has a number of packages that allow you to work with multiple modes like php-mode and html-helper-mode in a single buffer, but they don&#039;t always work, and indentation can be confusing. If you must work with large segments of both PHP and HTML in the same file, check out MultipleModes (<a href="http://www.emacswiki.org/cgi-bin/wiki/MultipleModes">http://www.emacswiki.org/cgi-bin/wiki/MultipleModes</a>) for tips.</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/30/emacs-and-php-tutorial-php-mode/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs and PHP: There&#039;s more than one way to do it, of course</title>
		<link>http://sachachua.com/wp/2008/07/30/emacs-and-php-theres-more-than-one-way-to-do-it-of-course/</link>
		<comments>http://sachachua.com/wp/2008/07/30/emacs-and-php-theres-more-than-one-way-to-do-it-of-course/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 12:25:04 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/30/emacs-and-php-theres-more-than-one-way-to-do-it-of-course/</guid>
		<description><![CDATA[The PhpMode page on EmacsWiki lists five options for developing PHP in Emacs. I&#039;m currently using the php-mode maintained by Aaron Hawley, and I&#039;m quite happy with it. I&#039;m curious about the php-mode maintained by Ahmet Usal, though, as it has extensive templating support and electric behavior. It seems to have abbreviations and argument lists [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.emacswiki.org/cgi-bin/wiki/PhpMode">PhpMode</a> page on EmacsWiki lists five options for developing PHP in Emacs. I&#039;m currently using the <a href="http://sourceforge.net/projects/php-mode/">php-mode maintained by Aaron Hawley</a>, and I&#039;m quite happy with it. I&#039;m curious about the <a href="http://mewde.googlecode.com/files/php-mode.el">php-mode maintained by Ahmet Usal</a>, though, as it has extensive templating support and electric behavior. It seems to have abbreviations and argument lists for every PHP function, and I might borrow the code and convert it to a yasnippet file if I don&#039;t end up using this. I&#039;ll switch to Ahmet Usal&#039;s php-mode today, see what it feels like, and post my notes. Has anyone else tried both? </p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/30/emacs-and-php-theres-more-than-one-way-to-do-it-of-course/feed/</wfw:commentRss>
		</item>
		<item>
		<title>From Eclipse to Emacs: Drupal development with Subversion, tags, templates, and xdebug</title>
		<link>http://sachachua.com/wp/2008/07/29/from-eclipse-to-emacs-drupal-development-with-subversion-tags-templates-and-xdebug/</link>
		<comments>http://sachachua.com/wp/2008/07/29/from-eclipse-to-emacs-drupal-development-with-subversion-tags-templates-and-xdebug/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 13:33:01 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[drupal]]></category>

		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/29/from-eclipse-to-emacs-drupal-development-with-subversion-tags-templates-and-xdebug/</guid>
		<description><![CDATA[Yesterday, I started working on my Drupal project in Emacs. I can&#039;t believe I hadn&#039;t moved to Emacs earlier. =)
I really like being able to diff a file with C-x v = (vc-diff) and check in a file with C-x v v (vc-next-action). I also like the way that svn-status (from psvn.el) lets me examine [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I started working on my Drupal project in Emacs. I can&#039;t believe I hadn&#039;t moved to Emacs earlier. =)</p>
<p>I really like being able to diff a file with C-x v = (vc-diff) and check in a file with C-x v v (vc-next-action). I also like the way that svn-status (from psvn.el) lets me examine a directory tree, mark a set of files, and commit them&#8211;all without using the mouse. I probably should&#039;ve set up keyboard shortcuts for these in Eclipse, but Eclipse made it too easy to just use the mouse. Emacs encourages you to use the keyboard, and it&#039;s easy to customize any keyboard shortcut.</p>
<p>php-mode&#039;s C-c . (php-show-arglist) works beautifully with the TAGS file that I&#039;d set up using Exuberant Ctags, so I don&#039;t need to do anything special in order to get function definitions. Definition functions for PHP functions would be nice. In the meantime, there&#039;s C-c C-f (php-search-documentation).</p>
<p>The yasnippet template engine came in handy when I was writing test cases. I updated <a href="http://sachachua.com/notebook/elisp/snippets/php-mode/drupal-mode/dmodule">my module template</a> to include the simpletest hook, added a <a href="http://sachachua.com/notebook/elisp/snippets/php-mode/drupal-mode/test">test case template</a>, and added a template for the <a href="http://sachachua.com/notebook/elisp/snippets/php-mode/drupal-mode/_simpletest">simpletest hook</a> as well. Yay dynamic templates!</p>
<p>And I just got Xdebug working with <a href="http://www.emacswiki.org/cgi-bin/wiki/PhpMode">PhpMode and Geben</a>&#8230; Sweet!</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/29/from-eclipse-to-emacs-drupal-development-with-subversion-tags-templates-and-xdebug/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs, Remember, and GTD</title>
		<link>http://sachachua.com/wp/2008/07/28/emacs-remember-and-gtd/</link>
		<comments>http://sachachua.com/wp/2008/07/28/emacs-remember-and-gtd/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 11:17:14 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[remember]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/28/emacs-remember-and-gtd/</guid>
		<description><![CDATA[Charles Cave has written an excellent Remember Mode Tutorial with useful templates for notes, receipts, books read, daily reviews, and all sorts of other good stuff. Check it out!




]]></description>
			<content:encoded><![CDATA[<p>Charles Cave has written an excellent <a href="http://members.optusnet.com.au/~charles57/GTD/remember.html">Remember Mode Tutorial</a> with useful templates for notes, receipts, books read, daily reviews, and all sorts of other good stuff. Check it out!</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/28/emacs-remember-and-gtd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Eclipse to Emacs: Navigating your source tree</title>
		<link>http://sachachua.com/wp/2008/07/27/eclipse-to-emacs-navigating-your-source-tree/</link>
		<comments>http://sachachua.com/wp/2008/07/27/eclipse-to-emacs-navigating-your-source-tree/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 00:17:29 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/?p=4998</guid>
		<description><![CDATA[Two other things I like about the Eclipse development environment are the ability to jump to a function definition and the ability to open any resource in the workspace. Fortunately, these shortcuts are easy to duplicate in Emacs.
Exuberant Ctags is a utility that builds an index of the function definitions in your source code. You [...]]]></description>
			<content:encoded><![CDATA[<p>Two other things I like about the Eclipse development environment are the ability to jump to a function definition and the ability to open any resource in the workspace. Fortunately, these shortcuts are easy to duplicate in Emacs.</p>
<p><a href="http://ctags.sourceforge.net/">Exuberant Ctags</a> is a utility that builds an index of the function definitions in your source code. You can use this index to jump to any function definition using editors such as vi or emacs. To index your Drupal source code, for example, go to the root of your source directory and use a command like this:</p>
<pre>
find . -name \*.module -o -name \*.php -o -name \*.inc -o -name \*.install -o -name \*.engine -o -name \*.profile | etags -l php -
</pre>
<p>To use this index in Emacs, add the following code to your ~/.emacs, changing drupal-project-path as necessary:</p>
<pre>
(defvar drupal-project-path "~/proj/example" "*Base path for your project")

(require 'etags)
(setq tags-file-name (expand-file-name "TAGS" drupal-project-path))
</pre>
<p>Evaluate the code. You can then use M-. (find-tag) to jump to the declaration of a function in your project.</p>
<p>To open any resource in your source tree with a few keystrokes, index the files with filecache and use ido to open the file. Ido is well worth learning how to use. Here&#039;s the code I use, taken almost directly from the filecache documentation:</p>
<pre>
(require 'filecache)
(require 'ido)
(defun file-cache-ido-find-file (file)
  "Using ido, interactively open file from file cache'.
First select a file, matched using ido-switch-buffer against the contents
in `file-cache-alist'. If the file exist in more than one
directory, select directory. Lastly the file is opened."
  (interactive (list (file-cache-ido-read "File: "
                                          (mapcar
                                           (lambda (x)
                                             (car x))
                                           file-cache-alist))))
  (let* ((record (assoc file file-cache-alist)))
    (find-file
     (expand-file-name
      file
      (if (= (length record) 2)
          (car (cdr record))
        (file-cache-ido-read
         (format "Find %s in dir: " file) (cdr record)))))))

(defun file-cache-ido-read (prompt choices)
  (let ((ido-make-buffer-list-hook
	 (lambda ()
	   (setq ido-temp-list choices))))
    (ido-read-buffer prompt)))

(ido-mode t)
;; Change this to filter out your version control files
(add-to-list 'file-cache-filter-regexps "\\.svn-base$")
(if drupal-project-path
    (file-cache-add-directory-using-find drupal-project-path))

(global-set-key (kbd "ESC ESC f") 'file-cache-ido-find-file)
</pre>
<p>This turns ESC ESC f into a handy shortcut for finding files anywhere in your project tree. Read the source code (ido.el) for more information on ido shortcuts.</p>
<p>Good luck and have fun!</p>
<p>(UPDATE: Added &#034;.&#034; to the find command - two people suggested it! =) )<br />
(UPDATE: Forced etags to detect files as php and added .engine and .profile to the list of extensions)<br />
(UPDATE: Added version control filter for file-cache)</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/27/eclipse-to-emacs-navigating-your-source-tree/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs: Keyboard shortcuts for navigating code</title>
		<link>http://sachachua.com/wp/2008/07/27/emacs-keyboard-shortcuts-for-navigating-code/</link>
		<comments>http://sachachua.com/wp/2008/07/27/emacs-keyboard-shortcuts-for-navigating-code/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 09:48:33 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[development]]></category>

		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/27/emacs-keyboard-shortcuts-for-navigating-code/</guid>
		<description><![CDATA[One of the lines on my list of things I can do in order to make progress on my book is to move my Drupal development environment from Eclipse to Emacs, as immersion would no doubt give me plenty of things to tweak and describe. When you use something every day, you notice the rough [...]]]></description>
			<content:encoded><![CDATA[<p>One of the lines on my list of things I can do in order to make progress on my book is to move my Drupal development environment from Eclipse to Emacs, as immersion would no doubt give me plenty of things to tweak and describe. When you use something every day, you notice the rough edges. With Emacs, you can sand those edges down. I already use Emacs every day, but I had been doing most of my development work in Eclipse because Eclipse packaged a number of useful features I wanted. If I can move my environment to Emacs, though, I&#039;ll be able to customize it a lot more freely.</p>
<p>Take something as simple as navigation, for example. In Eclipse, I can hit Ctrl+K to search for the next instance of the current word, which is a handy way to look for function calls or definitions in the same file. How would you do that in Emacs? The built-in search functions allow me to take text from the buffer, but I wanted something even faster. Here are some of the ways you can tweak navigation, too.</p>
<p>If you haven&#039;t tried it yet, you&#039;ll probably like interactive search (C-s) because you can modify the search and see the results as you type. All you need to do to make it better than Eclipse&#039;s Ctrl+K  is to add a function to grab the current word, even if the point in the middle of  the word. Add the following code to your ~/.emacs:</p>
<pre>
(defun sacha/isearch-yank-current-word ()
  "Pull current word from buffer into search string."
  (interactive)
  (save-excursion
    (skip-syntax-backward "w_")
    (isearch-yank-internal
     (lambda ()
       (skip-syntax-forward "w_")
       (point)))))
(define-key isearch-mode-map (kbd "C-x") 'sacha/isearch-yank-current-word)
</pre>
<p>Type C-s (isearch-forward) to start interactively searching forward, and type C-x to get the current word. Use C-s and C-r to search forward and backward. You can modify your search, too.</p>
<p>Want to make it even faster? Use these functions to bind similar searches to shortcut keys:</p>
<pre>
(defun sacha/search-word-backward ()
  "Find the previous occurrence of the current word."
  (interactive)
  (let ((cur (point)))
    (skip-syntax-backward "w_")
    (goto-char
     (if (re-search-backward (concat "\\_&lt;" (current-word) "\\_&gt;") nil t)
	 (match-beginning 0)
       cur))))

(defun sacha/search-word-forward ()
  "Find the next occurrance of the current word."
  (interactive)
  (let ((cur (point)))
    (skip-syntax-forward "w_")
    (goto-char
     (if (re-search-forward (concat "\\_&lt;" (current-word) "\\_&gt;") nil t)
	 (match-beginning 0)
       cur))))
(global-set-key '[M-up] 'sacha/search-word-backward)
(global-set-key '[M-down] 'sacha/search-word-forward)
</pre>
<p>Feel free to change the keybindings or otherwise improve the code. =) Good luck and have fun!</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/27/emacs-keyboard-shortcuts-for-navigating-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs is not just for computer geeks; also, these are the things that keep me going</title>
		<link>http://sachachua.com/wp/2008/07/26/emacs-is-not-just-for-computer-geeks-also-these-are-the-things-that-keep-me-going/</link>
		<comments>http://sachachua.com/wp/2008/07/26/emacs-is-not-just-for-computer-geeks-also-these-are-the-things-that-keep-me-going/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 18:50:18 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[goodkarma]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/26/emacs-is-not-just-for-computer-geeks-also-these-are-the-things-that-keep-me-going/</guid>
		<description><![CDATA[Reposted with permission because (a) it shows that people who aren&#039;t computer geeks can also love Emacs, and (b) it gave me a warm and fuzzy feeling and encouraged me to keep writing, so I want to keep it around just in case I get in a rut again.

Sacha,
I&#039;m an emacs newbie who&#039;s trying to [...]]]></description>
			<content:encoded><![CDATA[<p><i>Reposted with permission because (a) it shows that people who aren&#039;t computer geeks can also love Emacs, and (b) it gave me a warm and fuzzy feeling and encouraged me to keep writing, so I want to keep it around just in case I get in a rut again.</i></p>
<blockquote><p>
Sacha,</p>
<p>I&#039;m an emacs newbie who&#039;s trying to both simplify and empower my computing life, and I&#039;ve chosen emacs as the tool to do that. I&#039;m pretty excited about that, and overwhelmed, too.</p>
<p>Actually, a little background might help: I&#039;m a PhD student in early modern (read: renaissance) English literature. Yeah, I&#039;m a Shakespeare guy. I work in a field in which computers are, to most folks, MS Word, MS Entourage, and MS Explorer. I&#039;m a nut who actually plays with stuff. (Actually, I don&#039;t tell my colleagues about it. It could honestly damage my career. I know, it&#039;s disturbing.) I also have some tech chops, being a refugee from the heady late 1990s tech boom where I co-founded a small company that made some money before it collapsed.  I&#039;ve been able to do the basics in emacs for years. The basics, but nothing more.</p>
<p>My introduction this time was a rather circuitous route: I moved from Mellel (on the Mac), to Scrivener where I discovered the wonders of MultiMarkdown. Happily I discovered that I could use MMD and TextMate to create LaTeX files without having to look at a bunch of distracting LaTeX markup. I could write plain text and, with a couple of handy keystrokes, create beautiful PDF files that my committee would appreciate. The plain text files took up no space and could be edited anywhere. I could fit a bazillion of them on my USB drive and carry loads of research with me to my office on campus (where I got a hand-me-down Dell running XP v.e.r.y.s.l.o.w.l.y) and on my much speedier Mac at home and even in Linux. Neat. Still, MMD felt hack-y and was only supported by one guy and I wondered if there was anything else like it out there.</p>
<p>Which lead me to muse-mode. From there you can guess my path of discovery: org-mode, planner-mode, remember: oh my!</p>
<p>For a prose writer like myself, the ability to have the cursor jump forward and backward by letter, word, line, and paragraph was nothing new, but M-a and M-e have changed my life. Why don&#039;t all word/text processors understand that the sentence is the fundamental unit of prose writing? Why don&#039;t they all allow me to navigate using units that make logical sense?</p>
<p>Whoever said that emacs was for programmers only surely isn&#039;t a writer.</p>
<p>(This is becoming much longer than I had anticipated, sorry.) My point in writing is to tell you how invaluable I have found your two public chapters (I think they&#039;re 7 and <img src='http://sachachua.com/wp/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> have been for me. The whole idea of writing a book about emacs as cool (as opposed to just highly functional) is both obvious and revolutionary. Know that I would buy a copy today if only it were available.</p>
<p>I noticed in your blog that you felt you had lost some steam on the book. Please don&#039;t. My life is better, my writing is better, my research is better, and, much to the joy of my wife, my progress toward a completed PhD is better, all thanks to emacs which, based on the tools I&#039;m using, is also in thanks to you.</p>
<p>So thank you, and keep writing. I, for one, and hungry for more. I&#039;m sure others are, too.
</p></blockquote>
<p>Jeffrey Windsor</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/26/emacs-is-not-just-for-computer-geeks-also-these-are-the-things-that-keep-me-going/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Yet another snippet mode for Emacs</title>
		<link>http://sachachua.com/wp/2008/07/26/yet-another-snippet-mode-for-emacs/</link>
		<comments>http://sachachua.com/wp/2008/07/26/yet-another-snippet-mode-for-emacs/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 10:55:22 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/26/yet-another-snippet-mode-for-emacs/</guid>
		<description><![CDATA[While reading gnu.emacs.help, I came across yasnippet (yet another snippet extension for Emacs). It provides interactive templates for text or code entry. It&#039;s similar to SkeletonMode, but with TextMate-type syntax, simpler prompting for information, and more focus on expanding mode-sensitive text in the buffer.
Here&#039;s what I did to get started with it on my system:

Download [...]]]></description>
			<content:encoded><![CDATA[<p>While reading gnu.emacs.help, I came across <a href="http://code.google.com/p/yasnippet/">yasnippet</a> (yet another snippet extension for Emacs). It provides interactive templates for text or code entry. It&#039;s similar to <a href="http://www.emacswiki.org/cgi-bin/wiki/SkeletonMode">SkeletonMode</a>, but with TextMate-type syntax, simpler prompting for information, and more focus on expanding mode-sensitive text in the buffer.</p>
<p>Here&#039;s what I did to get started with it on my system:</p>
<ol>
<li>Download <a href="http://yasnippet.googlecode.com/files/yasnippet-0.5.5.tar.bz2">http://yasnippet.googlecode.com/files/yasnippet-0.5.5.tar.bz2</a> and unpack it as ~/elisp/snippets.</li>
<li>Download <a href="http://yasnippet.googlecode.com/files/yasnippet-bundle-0.5.5.el.tgz">http://yasnippet.googlecode.com/files/yasnippet-bundle-0.5.5.el.tgz</a> and unpack it as ~/elisp/yasnippet-bundle.el .</li>
<li>Symlink lisp-interaction-mode to emacs-lisp-mode with the command
<pre>
ln -s ~/elisp/snippets/emacs-lisp-mode ~/elisp/snippets/lisp-interaction-mode
</pre>
</li>
<li>Add the following lines to <i>~/.emacs</i>
<pre>
(require 'yasnippet-bundle)
(yas/initialize)
(yas/load-directory "~/elisp/snippets")
;; I don't like using partial words for completion
(setq yas/key-syntaxes '("w_" "w_." "^ "))
</pre>
</li>
</ol>
<p>So far, so good. <i>M-x yas/minor-mode</i> lets me use TAB as the completion key, and I can use TAB and S-TAB to navigate between the fields of a snippet as well. I think it&#039;s a decent snippets mode if you don&#039;t need the complexity of skeleton.el.</p>
<p>After some experimentation, I see how this might make me even happier working on Drupal. I&#039;ve put together this <a href="http://sachachua.com/notebook/elisp/snippets/php-mode/drupal-mode/dmodule">first try at a template for Drupal modules</a>. Drupal code has a lot of repetitive typing and/or search-and-replacing because all the hook functions need to start with the module name. With yasnippet, I can type in the module name once, and all the other functions will be updated. I often find myself looking up the argument lists for the hook functions, too, and the template includes the hooks I tend to use. I think this snippet will save me a lot of start-up time.</p>
<p>You know what would be even cooler? If I could create snippets that dynamically calculate values using Emacs Lisp. Then I could create, for example, a hook_user abbreviation that automatically picked up the module name from the filename or from the other functions. Wouldn&#039;t that be cool?</p>
<p>UPDATE: Putting Emacs Lisp in templates is awesome. With this function in my ~/.emacs:</p>
<pre>
(defun sacha/drupal-module-name ()
  "Return the Drupal module name for .module and .install files."
  (file-name-sans-extension (file-name-nondirectory (buffer-file-name))))
</pre>
<p>I can make templates like this one for <a href="http://sachachua.com/notebook/elisp/snippets/php-mode/drupal-mode/_user">hook_user</a>. Sweet!</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/26/yet-another-snippet-mode-for-emacs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Things I can do to make progress on my book</title>
		<link>http://sachachua.com/wp/2008/07/26/things-i-can-do-to-make-progress-on-my-book/</link>
		<comments>http://sachachua.com/wp/2008/07/26/things-i-can-do-to-make-progress-on-my-book/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 09:22:26 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[emacs]]></category>

		<category><![CDATA[wickedcoolemacs]]></category>

		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/26/things-i-can-do-to-make-progress-on-my-book/</guid>
		<description><![CDATA[
Switch my development environment to Emacs
Put together the existing book chapters I have so far
Process the tech reviews I&#039;ve gotten back
Work on one outline item
Work on a different chapter
View and explain a random person&#039;s .emacs file
Have regular release schedules
Work on the outline
Just write
Hang out in #emacs
Read Emacs-related blogs
Read random wiki pages on emacswiki.org
Post tidbits
Dig through [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Switch my development environment to Emacs</li>
<li>Put together the existing book chapters I have so far</li>
<li>Process the tech reviews I&#039;ve gotten back</li>
<li>Work on one outline item</li>
<li>Work on a different chapter</li>
<li>View and explain a random person&#039;s .emacs file</li>
<li>Have regular release schedules</li>
<li>Work on the outline</li>
<li>Just write</li>
<li>Hang out in #emacs</li>
<li>Read Emacs-related blogs</li>
<li>Read random wiki pages on emacswiki.org</li>
<li>Post tidbits</li>
<li>Dig through my old Emacs configuration</li>
<li>Answer Emacs-related mail</li>
<li>Monitor help.gnu.emacs and other Emacs-related newsgroups/mailing lists</li>
<li>Learn about a random Emacs symbol</li>
<li>Write for 10 minutes</li>
<li>Brainstorm ideas</li>
<li>Upgrade my packages</li>
</ul>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/26/things-i-can-do-to-make-progress-on-my-book/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Emacs: Someone who&#039;s even geekier about BBDB!</title>
		<link>http://sachachua.com/wp/2008/07/25/emacs-someone-whos-even-geekier-about-bbdb/</link>
		<comments>http://sachachua.com/wp/2008/07/25/emacs-someone-whos-even-geekier-about-bbdb/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 01:40:24 +0000</pubDate>
		<dc:creator>Sacha Chua</dc:creator>
		
		<category><![CDATA[bbdb]]></category>

		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://sachachua.com/wp/2008/07/25/emacs-someone-whos-even-geekier-about-bbdb/</guid>
		<description><![CDATA[Remember all those tweaks I posted for working with contacts using Emacs&#039; Big Brother Database? John Sturdy has even cooler stuff. Check out his BBDB extensions. His bbdb-export-lists.el can divide people into different phone and address lists, and his bbdb-human-names.el will even try to address people properly. Clearly, I don&#039;t talk to enough Reverend Doctors [...]]]></description>
			<content:encoded><![CDATA[<p>Remember all those tweaks I posted for <a href="http://sachachua.com/wp/category/bbdb">working with contacts using Emacs&#039; Big Brother Database</a>? John Sturdy has even cooler stuff. Check out his <a href="http://www.cb1.com/~john/computing/emacs/lisp/my-extensions-to-packages/bbdb/index.html">BBDB extensions</a>. His <a href="http://www.cb1.com/~john/computing/emacs/lisp/my-extensions-to-packages/bbdb/bbdb-export-lists.el">bbdb-export-lists.el</a> can divide people into different phone and address lists, and his <a href="http://www.cb1.com/~john/computing/emacs/lisp/my-extensions-to-packages/bbdb/bbdb-human-names.el">bbdb-human-names.el</a> will even try to address people properly. Clearly, I don&#039;t talk to enough Reverend Doctors to require code like this. (And shouldn&#039;t there be &#034;Right Honorables&#034; and &#034;His Grace&#034;s in there, too? <img src='http://sachachua.com/wp/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>

<!-- start wp-tags-to-technorati 0.95 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://sachachua.com/wp/2008/07/25/emacs-someone-whos-even-geekier-about-bbdb/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
