Unambiguous command abbreviation
When using
RubyGems
from the command line, I almost always type
sudo gem i synthesis
as opposed to
sudo gem install rails
,
the emphasis targeted at using
"i"
instead of
"install",
of course. The
gem
executable happily understands what command it is being asked to execute when provided with the first few letters of the command, as long as those letters are not ambiguous, i.e. don't clash with the names of other commands. So even though
sudo gem u foo
complains that
Ambiguous command u matches [uninstall, unpack, update]
,
sudo gem uni foo
will uninstall the specified gem.
Here's how this is implemented in RubyGems.
def find_command(cmd_name) possibilities = find_command_possibilities(cmd_name) if possibilities.size > 1 raise "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]" end if possibilities.size < 1 raise "Unknown command #{cmd_name}" end self[possibilities.first] end def find_command_possibilities(cmd_name) len = cmd_name.length self.command_names.select { |n| cmd_name == n[0,len] } end
In the same vein, although not strictly a command abbreviation,
Danilo
pointed out
git
understands abbreviated revision hashes, so it's possible to use something like
git diff d0a..HEAD
even with the hash's complete representation being
d0aa7dd4aa9a95090df1e0b9d0f426d5a5bd56ae
.
Less typing is almost always a good option to have. The easy to implement Unambiguous command abbreviation trick adds a subtle usability improvement to command line interfaces and holds a nice treat to the utility's power users.