Latest Posts

Next 10 posts:

Singleton Emacs Server

My .emacs file calls server-start so I can use emacsclient from the shell to send random editing jobs to emacs. However, with multiple emacs processes running, I sometimes have to hunt around for the emacs instance that emacsclient sent the editing job to do. Bummer!

I'd prefer emacsclient to send all my editing jobs to a single, known emacs process (unless I tell it to use another). The server-name variable can help with this. The server-name value, which defaults to "server", affects the name of the unix domain socket that emacs opens for emacsclient's use. The default socket file is "/tmp/emacs<user-uid>/server". The command "emacsclient -s <server-name>" uses the socket named <server-name> to send the editing job to the emacs process owning the socket. So it would seem that the following settings in your .emacs would do the trick:

(setq server-name "my-server") 
(start-server)

However, if you start another emacs process, it will clobber the existing socket file and subsequent emacsclient requests to "my-server" will go to the new process. Furthermore, emacs doesn't clean up the socket files on exit. This makes it tough to detect if a server with a particular server-name is running.

Below is a wrapper around server-start that helps. First, it allows you to easily name the server. Secondly, it arranges for emacs to delete the socket files it owns when emacs shuts down. This allows the function to use the existence of the socket file to decide if a server process exists for a given name -- so there is a way to refuse to start the server if an existing emacs process is already running it.

(require 'server)

(defun start-named-server (name)
  "Start a server named 'name' - ensure only 1 server of that name is running"
  (interactive "sServer Name: ")
  (setq server-name name)
  (setq mk-server-socket-file (concat server-socket-dir "/" name))
  (unless (file-exists-p mk-server-socket-file)
    (server-start)
    (add-hook 'kill-emacs-hook
              (lambda ()
                (when (file-exists-p mk-server-socket-file)
                  (delete-file mk-server-socket-file))))))

(start-named-server "server") ; default server-name

Additional emacs instances can start a server via "M-x start-named-server ENTER <server-name>".

Technorati tags for this post:

Another Emacs Project Library

I've posted a new project handling library to the Emacs Wiki: mk-project.el. A "project" in this sense is a directory of source files. You define a named project and provide settings for it: base directory, source file patterns, file patterns to ignore, the TAGS file, the compile command, etc.

Features:

  • Quickly switch between projects, optionally closing the files in the old project.
  • Use the new project's TAGS file -- and be able to rebuild the TAGS file based on project settings.
  • Run find-grep from the new project's base directory, ignoring certain files or directories based on project settings.
  • Run compile with the project's preferred compile command.
  • Open any file in the project quickly based on regex matches.
  • Quickly open dired on the project's base directory.
  • Define per-project startup and shutdown hooks -- useful for opening often-used files.

Perhaps the feature I'm happiest with is project-find-file. The library maintains a list of all the files under the project's base directory in a special buffer, *file-list*. Project-find-file ask for a regular expression representing part of a file's path or name and either 1) opens the file if there is only one match in *file-list*, or 2) allows selecting among the matching files with Emacs' built-in completion mechanism. Also, it sometimes comes in handy to search buffer *file-list* directly when you want an overview of the entire project. I often work with projects having thousands of files in deep folder hierarchies so project-find-file is very convenient.

After writing my library, I discovered a similar library, ProjMan by David Shilvock. The project operations we offer are similar - we even recommend similar keybindings! ProjMan is perhaps more complete, but I don't feel my time was wasted writing mk-project.el -- elisp is pleasure to code in.

Technorati tags for this post:

Suspend/Resume on a Lenovo T61 Running Ubuntu 8.04

As I've discussed before, I have a Lenovo T61 laptop with a Nvidia Nv140m video card running Ubuntu 8.04 (Hardy Heron). With the proprietary "nvidia" video driver, suspend/resume works fine. However, I use the open source "nv" driver as it supports xrandr which I need to hotdock my machine. The laptop fails to fully resume when running "nv": the screen is black; the keyboard and mouse are unresponsive.

The T61 thinkwiki pages for Ubuntu 8.04 and 7.10, the hal sleep quirk page and David Goodlad's post helped identify the root problem.

First, gnome-power-manager has taken over suspend/resume duty from acpid in 8.04 -- so the changes I had made to /etc/default/acpi-support are no longer used. Secondly, as David noted, the nv driver requires the s3_bios and vbemode_restore video quirk settings. However, my many attempts to edit /usr/share/hal/fdi/information/10freedesktop/20-video-quirk-pm-lenovo.fdi so that hal would set these particular quirks for my hardware failed. (The thinkwiki page has complaints from people who could not get hal to recognize their edits as well -- does anybody definitively know how to edit these files?) I resorted to adding these lines to my /etc/rc.local file:

hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.s3_bios --bool true
hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.s3_mode --bool false
hal-set-property --udi /org/freedesktop/Hal/devices/computer --key power_management.quirk.vbemode_restore --bool true

For the record, hal reports my hardware model as:

# hal-device | grep system.hardware
...
system.hardware.vendor = 'LENOVO'  (string)
system.hardware.product = '6459CTO'  (string)
system.hardware.version = 'ThinkPad T61'  (string)

And finally, now hal reports my quirk settings as:

# lshal | grep quirk
power_management.quirk.s3_bios = true  (bool)
power_management.quirk.s3_mode = false  (bool)
power_management.quirk.save_pci = true  (bool)
power_management.quirk.vbemode_restore = true  (bool)

Suspend/resume functionality has been resumed (ugh) for me.

As an aside, hibernate works now too. It did not work in 7.10. I don't know if these changes fixed it, or if the upgrade to 8.04 did the trick.

Update 2008/09/04: After reading the HAL spec, I discovered that the /etc/hal/fdi/information directory is where an administrator should drop custom device information for the system. Settings in this location will override the /usr/share/hal/fdi/information data. Looking there, I discovered Ubuntu had already created a lenovo.fdi file. Editing the file to look like below fixed suspend:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
  <device>
    <match key="system.hardware.vendor" string="LENOVO">
      <!-- Ubuntu default settings: good for nvidia driver
      <merge key="power_management.quirk.s3_mode" type="bool">true</merge>
      <merge key="power_management.quirk.s3_bios" type="bool">false</merge>
      <merge key="power_management.quirk.save_pci" type="bool">true</merge>
      -->

      <!-- My settings: good for the nv driver -->
      <merge key="power_management.quirk.s3_bios" type="bool">true</merge>
      <merge key="power_management.quirk.save_pci" type="bool">true</merge>
      <merge key="power_management.quirk.vbemode_restore" type="bool">true</merge>
      <merge key="power_management.quirk.s3_mode" type="bool">false</merge>
    </match>
  </device>
</deviceinfo>

Why I Quit Facebook

I joined Facebook out of technical curiosity. My curiosity was satisfied after a week of light use; my patience was finally depleted after 2 1/2 months. I completed deleted my account. Not deactivated it, deleted it.

Sorry friends -- I owe you an explanation. And given my motivation for joining, I was planning a long, technical evaluation of Facebook's failings.

But this is much funnier:

Compiling SBCL with Threads and Unicode

This is one of those note-to-self posts. For whatever reason, I nearly always forget to enable threads and unicode when I build SBCL. Threads are required by hunchentoot; I enable Unicode just for kicks.

Here's my build recipe for SBCL:

  1. > git clone git://sbcl.boinkor.net/sbcl.git sbcl-git ./sbcl.git
  2. > cd sbcl.git
  3. > git checkout sbcl_1_0_18
  4. Edit customize-target-features.lisp to enable the features you want.
     (lambda (features)
       (flet ((enable (x)
                (pushnew x features))
              (disable (x)
                (setf features (remove x features))))
         ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
         ;; and x86 Mac OS X (experimental).
         (enable :sb-thread)
         (enable :sb-unicode)))
    
  5. > screen
  6. > sh make.sh
  7. detach screen from terminal while compiling -- too much output! Ctrl-a, d
  8. > sudo INSTALL_ROOT=/opt/sbcl sh install.sh

Defining Recursion Algorithmically

This is too much text to twitter, so it finds a home on my blog. From Andrew Plotkin via Wikipedia:

"If you already know what recursion is, just remember the answer. Otherwise, find someone who is standing closer to Douglas Hofstadter than you are; then ask him or her what recursion is."

Lisp Advocacy at its Best

Kenny says, Go Write Something in Lisp!

Technorati tags for this post:

Xrandr solved my linux docking station woes

I had to switch from the proprietary nvidia drivers to the vanilla 'nv' driver, but that enabled xrandr and now I can take my T61 (running Ubuntu Hardy) on and off my docking station -- without restarting X!

Technorati tags for this post:

OSS wifi (finally) on on my T61

From dmesg on my new(ish) Lenovo T61 running Ubuntu Hardy Heron:

iwl4965: Intel(R) Wireless WiFi Link 4965AGN driver for Linux, 1.2.26k
iwl4965: Copyright(c) 2003-2008 Intel Corporation
iwl4965: Detected Intel Wireless WiFi Link 4965AGN
iwl4965: Tunable channels: 11 802.11bg, 13 802.11a channels

I finally got the OSS driver for my wifi card to work - thanks to the Linux Wireless project. Version 1.2.0 of iwl4965, included with Hardy Heron, didn't work for me - neither did its predecessor that shipped with Gutsy. But version 1.2.6k is working fine. Joy! - no more ndiswrapper for me. <grin />

Boston Lisp Meeting

The inaugural Boston Lisp meeting was well attended. Lisp is not dead language - at least not in Cambridge and within sight of the MIT campus. I'm a relatively new lisper (thanks Peter for the excellent introduction) and it was fun to talk with people who code full time in common lisp.

Technorati tags for this post:

« earlier :: later »