MooseX::App::Cmd::Command::BashComplete - Bash completion for your MooseX::App::Cmd programs.


MooseX-App-Cmd-Command-BashComplete documentation Contained in the MooseX-App-Cmd-Command-BashComplete distribution.

Index


Code Index:

NAME

Top

MooseX::App::Cmd::Command::BashComplete - Bash completion for your MooseX::App::Cmd programs.

VERSION

Top

Version 0.03

SYNOPSIS

Top

 package MyApp::Command::BashComplete;
 use Moose;
 extends 'MooseX::App::Cmd::Command::BashComplete';

 ...

 bash$ myapp bashcomplete > myapp-complete.sh
 bash$ source myapp-complete.sh

DESCRIPTION

Top

This package provides you with a way for getting bash auto completion for your MooseX::App::Cmd programs. What you have to do is to add a module under the same namespace as the other MooseX::App::Cmd::Command modules that extends MooseX::App::Cmd::Command::BashComplete (See the synopsis). Doing so will give you a command that outputs a shell script to STDOUT. This script can be saved and then sourced by bash (again, see the synopsis).

AUTHOR

Top

Kjell-Magne Øierud, <kjellm at acm.org>

BUGS

Top

Please report any bugs or feature requests to bug-moosex-app-cmd-command-bashcomplete at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MooseX-App-Cmd-Command-BashComplete. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


MooseX-App-Cmd-Command-BashComplete documentation Contained in the MooseX-App-Cmd-Command-BashComplete distribution.

package MooseX::App::Cmd::Command::BashComplete;
use Moose;
extends 'MooseX::App::Cmd::Command';

our $VERSION = '0.04';

use MooseX::Getopt;

sub execute {
    my ($self, $opts, $args) = @_;

    my @commands = grep {
        !/bashcomplete|-h|--help|-\?|help|commands/
    } $self->app->command_names;

    my %command_map = ();
    for my $cmd (@commands) {
        $command_map{$cmd} 
            = [$self->app->plugin_for($cmd)->_attrs_to_options()];
    }

    my $cmd_list = join ' ', @commands;
    my $package  = __PACKAGE__;
    my $prefix = $self->app->arg0;
    $prefix =~ tr/./_/;

    print <<"EOT";
#!/bin/bash

# Built with $package;

${prefix}_COMMANDS='help commands bashcomplete $cmd_list'

_${prefix}_macc_help() {
    if [ \$COMP_CWORD = 2 ]; then
        _${prefix}_compreply "\$${prefix}_COMMANDS"
    else
        COMPREPLY=()
    fi
}

_${prefix}_macc_commands() {
    COMPREPLY=()
}

_${prefix}_macc_bashcomplete() {
    COMPREPLY=()
}

EOT

    while (my ($c, $o) = each %command_map) {
        print "_${prefix}_macc_$c() {\n    _compreply \"",
            join(" ", map {"--" . $_->{name}} @$o),
                "\"\n}\n\n";
    }


print <<"EOT";

_${prefix}_compreply() {
    COMPREPLY=(\$(compgen -W "\$1" -- \${COMP_WORDS[COMP_CWORD]}))
}

_${prefix}_macc() {
    case \$COMP_CWORD in
        0)
            ;;
        1)
            _${prefix}_compreply "\$${prefix}_COMMANDS"
            ;;
        *)
            eval _${prefix}_macc_\${COMP_WORDS[1]}
            
    esac
}

EOT

    print "complete -o default -F _${prefix}_macc ", $self->app->arg0, "\n";
}


1;
__END__