source: perl/lib/BarnOwl/Complete/Client.pm @ fbe04c6

Last change on this file since fbe04c6 was fbe04c6, checked in by David Benjamin <davidben@mit.edu>, 11 years ago
Revamp set/unset completion - unset <tab> only completes takes_on_off variables - Variables with validsettings <path> complete as file paths - Variables with validsettings a comma-separated list of options complete appropriately.
  • Property mode set to 100644
File size: 6.8 KB
RevLine 
[f80ada8]1use strict;
2use warnings;
3
4# Completers for client state
5
6package BarnOwl::Complete::Client;
7
[dc8f6e0]8use BarnOwl::Completion::Util qw(complete_flags complete_file);
[a3a9eb7]9use BarnOwl::Complete::Filter qw(complete_filter_name complete_filter_expr);
[f80ada8]10
[d4ecc78]11my @all_colors = qw(default
12                    black
13                    blue
14                    cyan
15                    green
16                    magenta
17                    red
18                    white
19                    yellow);
20
[1610e5b]21my %show = (
22    colors      => undef,
23    commands    => undef,
24    command     => \&complete_command,
[02a72bf]25    errors      => undef,
[1610e5b]26    filters     => undef,
27    filter      => \&complete_filter_name,
28    license     => undef,
[02a72bf]29    keymaps     => undef,
30    keymap      => \&complete_keymap,
[1610e5b]31    quickstart  => undef,
32    startup     => undef,
33    status      => undef,
34    styles      => undef,
35    subscriptions       => undef,
36    subs        => undef,
37    terminal    => undef,
38    variables   => undef,
39    variable    => \&complete_variable,
40    version     => undef,
41    view        => undef,
42    zpunts      => undef,
43   );
44
[f80ada8]45sub complete_command { return sort @BarnOwl::all_commands; }
[d4ecc78]46sub complete_color { return @all_colors; }
[3ff3d86]47sub complete_variable    { return @{BarnOwl::all_variables()}; }
48sub complete_style       { return @{BarnOwl::all_styles()}; }
[02a72bf]49sub complete_keymap      { return @{BarnOwl::all_keymaps()}; }
[f80ada8]50
51sub complete_help {
52    my $ctx = shift;
[7940ac2]53    if($ctx->word == 1) {
54        return complete_command();
55    }
[f80ada8]56}
57
[1610e5b]58sub complete_show {
59    my $ctx = shift;
60    if($ctx->word == 1) {
61        return keys %show;
62    } elsif ($ctx->word == 2) {
63        my $cmd = $show{$ctx->words->[1]};
64        if($cmd) {
65            return $cmd->($ctx);
66        }
67    }
68}
69
[d4ecc78]70sub complete_filter {
71    my $ctx = shift;
[76e0e4a]72    # Syntax: filter FILTERNAME FLAGS EXPR
73
74    # FILTERNAME
75    return complete_filter_name() if $ctx->word == 1;
76
77    # FLAGS
78    $ctx = $ctx->shift_words(1); # complete_flags starts at the second word
[d4ecc78]79    return complete_flags($ctx,
80        [qw()],
81        {
82           "-c" => \&complete_color,
83           "-b" => \&complete_color,
84        },
[76e0e4a]85        # EXPR
86        sub {
87            my $ctx = shift;
88            my $arg = shift;
89
90            # We pass stop_at_nonflag, so we can rewind to the start
91            my $idx = $ctx->word - $arg;
[6035008]92            $ctx = $ctx->shift_words($idx);
93            return complete_filter_expr($ctx);
[76e0e4a]94        },
95        stop_at_nonflag => 1
[d4ecc78]96        );
97}
98
[dab89e28]99sub complete_filter_no_flags
100{
101    my $ctx = shift;
102    # Syntax: filter FILTERNAME EXPR
103
104    # FILTERNAME
105    return complete_filter_name() if $ctx->word == 1;
106
107    $ctx = $ctx->shift_words(2);
108    return complete_filter_expr($ctx);
109}
110
111sub complete_filter_append {
112    my $ctx = shift;
113    # Syntax: filterappend FILTERNAME EXPR
114
115    # FILTERNAME
116    return complete_filter_name() if $ctx->word == 1;
117    return qw(and or) if $ctx->word == 2;
118    $ctx = $ctx->shift_words(3);
119    return complete_filter_expr($ctx);
120}
121
[bd25f30]122sub complete_view {
123    my $ctx = shift;
124    if ($ctx->word == 1) {
[6bc35b4]125        return ("--home", "-d", "-r", "-s", complete_filter_name());
[bd25f30]126    }
127    if ($ctx->words->[1] eq "--home") {
128        return;
129    }
130    if ($ctx->words->[1] eq "-d") {
[6035008]131        $ctx = $ctx->shift_words(2);
132        return complete_filter_expr($ctx);
[bd25f30]133    }
[6bc35b4]134    if ($ctx->words->[1] eq "-s") {
135        return complete_style();
136    }
[bd25f30]137    return;
138}
139
[28cf94b]140sub complete_getvar {
141    my $ctx = shift;
142    return unless ($ctx->word == 1);
143    return complete_variable();
144}
145
146sub complete_set {
147    my $ctx = shift;
[fbe04c6]148    my $is_unset = ($ctx->words->[0] eq "unset");
149
150    # Shift away the -q if seen.
151    my $seen_q = 0;
152    if ($ctx->word > 1 && $ctx->words->[1] eq "-q") {
153        $seen_q = 1;
154        $ctx = $ctx->shift_words(1);
155    }
156
157    # First argument is the variable.
[76682af]158    if ($ctx->word == 1) {
[fbe04c6]159        my @vars = complete_variable();
160        if ($is_unset) {
161            # Only complete the variables which are unsettable.
162            @vars = grep { BarnOwl::get_variable_info($_)->{takes_on_off} } @vars;
163        }
164        unshift(@vars, "-q") unless $seen_q;
165        return @vars;
[76682af]166    }
[fbe04c6]167    # For set, second argument is the value.
168    if (!$is_unset && $ctx->word == 2) {
169        # Parse what we can out of validsettings.
170        my $info;
171        eval { $info = BarnOwl::get_variable_info($ctx->words->[1]) };
172        return if $@;
173        if ($info->{validsettings} eq "<path>") {
174            return complete_file($ctx->words->[2]);
175        } elsif ($info->{validsettings} !~ /^<.*>$/) {
176            # Assume it's a comma-separated list of values;
177            return split(",", $info->{validsettings});
178        }
[76682af]179    }
180    return;
[28cf94b]181}
182
[b06a888]183sub complete_startup {
184    my $ctx = shift;
185    my $new_ctx = $ctx->shift_words(1);
186    return BarnOwl::Completion::get_completions($new_ctx);
187}
188
[1dc839b]189sub complete_bindkey {
190    my $ctx = shift;
191    # bindkey KEYMAP KEYSEQ command COMMAND
192    #   0      1       2      3        4
193    if ($ctx->word == 1) {
194        return complete_keymap();
195    } elsif ($ctx->word == 2) {
196        return;
197    } elsif ($ctx->word == 3) {
198        return ('command');
199    } else {
200        my $new_ctx = $ctx->shift_words(4);
201        return BarnOwl::Completion::get_completions($new_ctx);
202    }
203}
204
[4d26776]205sub complete_print {
206    my $ctx = shift;
207    return unless $ctx->word == 1;
208    return complete_variable();
209}
210
[dc8f6e0]211sub complete_one_file_arg {
212    my $ctx = shift;
213    return unless $ctx->word == 1;
214    return complete_file($ctx->words->[1]);
215}
216
[d4ecc78]217BarnOwl::Completion::register_completer(help    => \&complete_help);
218BarnOwl::Completion::register_completer(filter  => \&complete_filter);
[dab89e28]219BarnOwl::Completion::register_completer(filteror        => \&complete_filter_no_flags);
220BarnOwl::Completion::register_completer(filterand       => \&complete_filter_no_flags);
221BarnOwl::Completion::register_completer(filterappend    => \&complete_filter_append);
[bd25f30]222BarnOwl::Completion::register_completer(view    => \&complete_view);
[1610e5b]223BarnOwl::Completion::register_completer(show    => \&complete_show);
[28cf94b]224BarnOwl::Completion::register_completer(getvar  => \&complete_getvar);
225BarnOwl::Completion::register_completer(set     => \&complete_set);
[d5ccf4e8]226BarnOwl::Completion::register_completer(unset   => \&complete_set);
[d973a73]227BarnOwl::Completion::register_completer(startup   => \&complete_startup);
228BarnOwl::Completion::register_completer(unstartup => \&complete_startup);
[1dc839b]229BarnOwl::Completion::register_completer(bindkey => \&complete_bindkey);
[4d26776]230BarnOwl::Completion::register_completer(print   => \&complete_print);
[f80ada8]231
[dc8f6e0]232BarnOwl::Completion::register_completer(source      => \&complete_one_file_arg);
233BarnOwl::Completion::register_completer('load-subs' => \&complete_one_file_arg);
234BarnOwl::Completion::register_completer(loadsubs    => \&complete_one_file_arg);
235BarnOwl::Completion::register_completer(loadloginsubs    => \&complete_one_file_arg);
236BarnOwl::Completion::register_completer(dump        => \&complete_one_file_arg);
237
[f80ada8]2381;
Note: See TracBrowser for help on using the repository browser.