== A new building block of my environment: dmenu [[Nick Coleman http://www.nickcoleman.org/]]'s comment on [[my last tools entry ToolsPyhosts]] introduced me on to [[dmenu http://tools.suckless.org/dmenu/]], which has rapidly become an important component of my environment. The basics of [[dmenu]] are described nicely in Nick's comment, but I do two unconventional things with it. The first is that I drastically restrict dmenu's command completion. The 'standard' dmenu setup has it doing command completion on everything in your _$PATH_. After trying this briefly, I rapidly came to the conclusion that it made no sense and only created clutter. There's only a few X programs that I run frequently (and most of the things on my _$PATH_ need to be run in a terminal anyways), and it is much simpler and less cluttered to list them explicitly. Explicitly controlling dmenu's command completion also lets me list my most frequent program first, so that it takes two keystrokes to start it (dmenu starts with the first entry in the command list selected). The main unconventional thing I do is that I use dmenu not so much to run commands but to provide abbreviations for things that I do very frequently. Some of these things are themselves commands, such as [[my test Firefox environment ../linux/IsolatingFirefox]]. Some of these things are done by small helper scripts, such as a script that uses [[Firefox remote control ../unix/MyFirefoxRemoteControl]] to run a Google search on its command line arguments; a similar script runs a search on our internal system documentation. (These helper scripts have deliberately short names, usually single letters, and so are not in my normal _$PATH_. My dmenu frontend adds their directory, actually several directories, to _$PATH_.) But a lot of the things I do a lot don't fit in the command model, so I handle them directly with heuristics in the driver script. Some examples: * if I type the name of an internal machine, I want to run an [[sshterm ToolsSshterm]] to it. * '@' means a root sshterm to that machine * the name of an external machine or anything matching ((*.*/*)) is taken as a URL and handed to Firefox through remote control. * I have brief abbreviations for a number of websites that I visit frequently (mechanically these are implemented as little scripts using Firefox remote control on fixed urls). The result of all of this hackery works extremely well for me. Although I only started using dmenu a few months ago, it has already become an essential and reflexive part of my desktop environment and it's well on the way to supplanting various previously heavily used parts of my environment, to some extent including [[pyhosts itself ToolsPyhosts]]. (This is all the more startling to me because my desktop environment tends to change only slowly and rarely. Rapid revolutions are quite rare, although not unknown; sometimes when I fall in love with things I *really* fall in love with them.)