[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

[ANN] Bash completion for the gem command

Michael Schuerig

2/24/2007 1:53:00 AM


To my surprise there apparently hasn't been support for bash command
line completion for the gem command. I've cobbled together a file that
add just that. See

http://schuerig.de/michael/blog/index.php/2007/02/24/gem-bash-c...

I've only tested it on Debian/Linux, on other Linux/Unix variants things
might work somewhat differently. Also, I don't even try to do
completion for gem names; doing that for remote gems would be much to
slow and I haven't looked into getting that information from the local
source_cache.

Michael

--
Michael Schuerig
mailto:michael@schuerig.de
http://www.schuerig.d...

3 Answers

Thomas Hurst

2/26/2007 7:42:00 PM

0

* Michael Schuerig (michael@schuerig.de) wrote:

> To my surprise there apparently hasn't been support for bash command
> line completion for the gem command. I've cobbled together a file that
> add just that. See
>
> http://schuerig.de/michael/blog/index.php/2007/02/24/gem-bash-c...
>
> I've only tested it on Debian/Linux, on other Linux/Unix variants things
> might work somewhat differently. Also, I don't even try to do
> completion for gem names; doing that for remote gems would be much to
> slow and I haven't looked into getting that information from the local
> source_cache.

I have this in my tcsh completions.rc, it provides basic command
completion and completion for installed gems:

set gemcommands=(build cert check cleanup repository contents dependency environment help install list outdated pristine query rdoc search sources specification uninstall unpack update repository)
complete gem 'p/1/$gemcommands/' 'n/help/$gemcommands/' 'p%*%D:/usr/local/lib/ruby/gems/1.8/gems/% %' 'n/*/f:*/'

I haven't bothered with option completion, but of course that can be
added with a similar effort to yours.

Remote gems should indeed be doable; it would mostly need a fast command
to dump a list of gem names, or have something write them to a text file
beforehand. If the full list is too big for that to be reasonable, the
plaintext index could be split by prefix.

--
Thomas 'Freaky' Hurst
http...

George

3/3/2007 12:33:00 PM

0

On 2/24/07, Michael Schuerig <michael@schuerig.de> wrote:
>
> To my surprise there apparently hasn't been support for bash command
> line completion for the gem command. I've cobbled together a file that
> add just that. See
>
> http://schuerig.de/michael/blog/index.php/2007/02/24/gem-bash-c...
>
> I've only tested it on Debian/Linux, on other Linux/Unix variants things
> might work somewhat differently. Also, I don't even try to do
> completion for gem names; doing that for remote gems would be much to
> slow and I haven't looked into getting that information from the local
> source_cache.
>
> Michael

Hi Michael,

Thanks for the script.

I've had a go at hacking in gem name completion for install and
uninstall. For uninstall it uses installed names, for install it uses
the names in the source cache. Only tested with gem 0.9.1.

Regards,
George.

----------------------------------------------------------------------

# Michael Schuerig, michael@schuerig.de, 2007-02-24
# George Ogata, george.ogata@gmail.com, 2007-03-01
# Free for all uses.

GEM_CACHE_FILE=`ruby -rubygems -rrubygems/source_info_cache -e 'print Gem::SourceInfoCache.new.cache_file'`
GEM_AVAILABLE_FILE=`dirname $GEM_CACHE_FILE`/source_cache_names

#
# Output all available gem names.
#
function available_gems {
if [ ! -e $GEM_AVAILABLE_FILE -o $GEM_CACHE_FILE -nt $GEM_AVAILABLE_FILE ]; then
ruby <<EOF > $GEM_AVAILABLE_FILE
require 'rubygems/source_info_cache_entry'
text = File.read('$GEM_CACHE_FILE')
names = Marshal.load(text).values.map do |entry|
entry.source_index.latest_specs.keys
end.flatten
puts names.uniq
EOF
fi

cat $GEM_AVAILABLE_FILE
}

#
# Output all installed gem names.
#
function installed_gems {
ruby <<EOF
require 'rubygems'
names = Gem::SourceIndex.from_installed_gems.map do |name, spec|
spec.name
end.uniq
puts names
EOF
}

_gem()
{
local cur prev completions

COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}

COMMANDS='build cert check cleanup contents dependency environment help install list query rdoc search specification uninstall unpack update'

COMMON_OPTIONS=' --source
-p --http-proxy --no-http-proxy -h --help --config-file --backtrace --debug'

CERT_OPTIONS=' -a -add -l --list -r --remove -b --build -C --certificate -K --private-key -s --sign'

CHECK_OPTIONS=' -v --verify -a --alien -t --test -V --version'

CLEANUP_OPTIONS=' -d --dry-run'

CONTENTS_OPTIONS=' -l --list -V --version -s --spec-dir -v --verbose'

DEPENDENCY_OPTIONS=' -v --version -r --reverse-dependencies --no-reverse-dependencies -p --pipe'

HELP_OPTIONS=$COMMANDS

INSTALL_OPTIONS=' -v --version -l --local -r --remote -b --both -i --install-dir -B --build-root -d --rdoc --no-rdoc --ri --no-ri -f --force --no-force -t --test --no-test -w --wrappers --no-wrappers -P --trust-policy --ignore-dependencies -y --include-dependencies'

LIST_OPTIONS=' -d --details --no-details -l --local -r --remote -b --both'

QUERY_OPTIONS=' -n --name-matches -d --details --no-details -l --local -r --remote -b --both'

RDOC_OPTIONS=' --all --rdoc --no-rdoc --ri --no-ri -v --version'

SEARCH_OPTIONS=' -d --details --no-details -l --local -r --remote -b --both'

SPECIFICATION_OPTIONS=' -v --version -l --local -r --remote -b --both -all'

UNINSTALL_OPTIONS=' -a --all --no-all -i --ignore-dependencies --no-ignore-dependencies -x --executables --no-executables -v --version'

UNPACK_OPTIONS=' -v --version'

UPDATE_OPTIONS=' -i --install-dir -B --build-root -d --rdoc --no-rdoc -ri --no-ri -f --force --no-force -t --test --no-test -w --wrappers --no-wrappers -P --trust-policy --ignore-dependencies -y --include-dependencies --system'

case "${prev}" in
build)
completions="$COMMON_OPTIONS $BUILD_OPTIONS"
;;
cert)
completions="$COMMON_OPTIONS $CERT_OPTIONS"
;;
check)
completions="$COMMON_OPTIONS $CHECK_OPTIONS"
;;
cleanup)
completions="$COMMON_OPTIONS $CLEANUP_OPTIONS"
;;
contents)
completions="$COMMON_OPTIONS $CONTENTS_OPTIONS"
;;
dependency)
completions="$COMMON_OPTIONS $DEPENDENCY_OPTIONS"
;;
environment)
completions="$COMMON_OPTIONS $ENVIRONMENT_OPTIONS"
;;
help)
completions="$COMMON_OPTIONS $HELP_OPTIONS"
;;
install)
completions="$COMMON_OPTIONS $INSTALL_OPTIONS `available_gems`"
;;
list)
completions="$COMMON_OPTIONS $LIST_OPTIONS"
;;
query)
completions="$COMMON_OPTIONS $QUERY_OPTIONS"
;;
rdoc)
completions="$COMMON_OPTIONS $RDOC_OPTIONS"
;;
search)
completions="$COMMON_OPTIONS $SEARCH_OPTIONS"
;;
specification)
completions="$COMMON_OPTIONS $SPECIFICATION_OPTIONS"
;;
uninstall)
completions="$COMMON_OPTIONS $UNINSTALL_OPTIONS `installed_gems`"
;;
unpack)
completions="$COMMON_OPTIONS $UNPACK_OPTIONS"
;;
update)
completions="$COMMON_OPTIONS $UPDATE_OPTIONS"
;;
*)
completions="$COMMANDS $COMMON_OPTIONS"
;;
esac

COMPREPLY=( $( compgen -W "$completions" -- $cur ))
return 0
}

[ -n "${have:-}" ] && complete -F _gem $filenames gem

Eric Hodel

3/5/2007 9:24:00 PM

0

On Mar 3, 2007, at 04:33, George Ogata wrote:
> On 2/24/07, Michael Schuerig <michael@schuerig.de> wrote:
>>
>> To my surprise there apparently hasn't been support for bash command
>> line completion for the gem command. I've cobbled together a file
>> that
>> add just that. See
>>
>> http://schuerig.de/michael/blog/index.php/2007/02/24...
>> completion/
>>
>> I've only tested it on Debian/Linux, on other Linux/Unix variants
>> things
>> might work somewhat differently. Also, I don't even try to do
>> completion for gem names; doing that for remote gems would be much to
>> slow and I haven't looked into getting that information from the
>> local
>> source_cache.
>
> I've had a go at hacking in gem name completion for install and
> uninstall. For uninstall it uses installed names, for install it uses
> the names in the source cache. Only tested with gem 0.9.1.
>
> # Michael Schuerig, michael@schuerig.de, 2007-02-24
> # George Ogata, george.ogata@gmail.com, 2007-03-01
> # Free for all uses.
>
> GEM_CACHE_FILE=`ruby -rubygems -rrubygems/source_info_cache > -e 'print Gem::SourceInfoCache.new.cache_file'`
> GEM_AVAILABLE_FILE=`dirname $GEM_CACHE_FILE`/source_cache_names
>
> #
> # Output all available gem names.
> #
> function available_gems {
> if [ ! -e $GEM_AVAILABLE_FILE -o > $GEM_CACHE_FILE -nt $GEM_AVAILABLE_FILE ]; then
> ruby <<EOF > $GEM_AVAILABLE_FILE
> require 'rubygems/source_info_cache_entry'
> text = File.read('$GEM_CACHE_FILE')
> names = Marshal.load(text).values.map do |entry|
> entry.source_index.latest_specs.keys
> end.flatten
> puts names.uniq
> EOF
> fi
>
> cat $GEM_AVAILABLE_FILE
> }

RubyGems needs a way to get the source_cache information without
updating :/ I should file myself a bug.