/todo

To get this branch, use:
bzr branch http://bzr.ed.am/todo

« back to all changes in this revision

Viewing changes to todo

  • Committer: edam
  • Date: 2012-08-01 19:54:49 UTC
  • Revision ID: tim@ed.am-20120801195449-fcyrejq9aazxa5l5
detect extra arguments and extend --help message

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/perl
2
2
 
 
3
use feature "state";
 
4
 
3
5
use strict;
4
6
use warnings;
5
7
use Getopt::Long;
14
16
my $display_section = "TODO";
15
17
my $display_headers = 0;
16
18
my $mode_edit = 0;
 
19
my $mode_less = 0;
17
20
my $mode_help = 0;
18
21
my $mode_version = 0;
19
22
 
23
26
    'a|all' => \$display_all,
24
27
    'e|edit' => \$mode_edit,
25
28
    'h|headers' => \$display_headers,
26
 
    'section=s' => \$display_section,
 
29
        'l|list' => \$mode_less,
 
30
    's|section=s' => \$display_section,
27
31
    'help' => \$mode_help,
28
32
    'version' => \$mode_version,
29
 
) ) {
 
33
) || @ARGV > 0 ) {
30
34
    print "Try `$app_name --help' for more information.\n";
31
35
    exit( 1 );
32
36
}
34
38
# help mode
35
39
if( $mode_help ) {
36
40
    print "todo - display your todo file\n\n".
 
41
        #01234567890123456789012345678901234567890123456789012345678901234567890123456789
37
42
    "Usage: $app_name [OPTIONS]\n\n".
38
43
    "Options:\n".
39
44
    "  -a, --all              display all sections\n".
40
45
    "  -e, --edit             edit your todo file\n".
41
46
    "  -h, --headers          show setion headers\n".
42
 
    "  -s, --section=SECTION  display this named section\n".
 
47
        "  -l, --list             show the list in your pager (see notes)\n".
 
48
    "  -s, --section=SECTION  display sections matching the regular expression\n".
43
49
    "      --help     display this help and exit\n".
44
 
    "      --version  output version information and exit\n";
 
50
    "      --version  output version information and exit\n".
 
51
        "\n".
 
52
        "Running without any options is the same as running with --section=TODO and\n".
 
53
        "lists the default section of the todo file.\n".
 
54
        "\n".
 
55
        "The advantage of using '--list' is that the pager is run as if the\n".
 
56
        "todo list were being edited. This means that if you decide to spawn an\n".
 
57
        "editor from you pager and edit the list, these changes get noticed.\n".
 
58
        "\n".
 
59
        "The environment variables EDITOR and PAGER are used.\n".
 
60
        "\n".
 
61
        "Please report bugs to Tim Marston <tim\@ed.am>.\n";
45
62
    exit( 0 );
46
63
}
47
64
 
48
65
# version mode
49
66
if( $mode_version ) {
50
67
    print "todo 1.0\n".
51
 
        "Copyright (C) 2011 Tim Marston.\n".
 
68
        "Copyright (C) 2011, 2012 Tim Marston.\n".
52
69
        "http://ed.am/software/todo\n";
53
70
    exit( 0 );
54
71
}
65
82
$todo_dir = glob( $todo_dir );
66
83
( -f $todo_dir ) and die "$todo_dir exists and is a file";
67
84
 
 
85
# less mode
 
86
if( $mode_less )
 
87
{
 
88
    ( ! -f "$todo_dir/todo" ) && die "no todo file";
 
89
        $mode_edit = 1;
 
90
}
 
91
 
68
92
# edit mode
69
93
if( $mode_edit )
70
94
{
100
124
    }
101
125
 
102
126
    # determine editor from environment, default to "emacs -nw"
103
 
    my $editor = $ENV{ 'EDITOR' };
104
 
    defined $editor or $editor = 'emacs -nw';
 
127
        my $editor;
 
128
        if( $mode_less ) {
 
129
                $editor = $ENV{ 'PAGER' };
 
130
                defined $editor or $editor = 'less';
 
131
        }
 
132
        else {
 
133
                $editor = $ENV{ 'EDITOR' };
 
134
                defined $editor or $editor = 'emacs -nw';
 
135
        }
105
136
    my @exec_array = split( / +/, $editor );
106
137
    push( @exec_array, "$todo_dir/todo" );
107
138
 
127
158
    exit
128
159
}
129
160
 
 
161
# function to display a line
 
162
sub display_line
 
163
{
 
164
        my ( $line, $section ) = @_;
 
165
        state $old_section = '';
 
166
 
 
167
        # detect section change
 
168
        if( $section ne $old_section ) {
 
169
                $old_section = $section;
 
170
                
 
171
                # display section heading
 
172
                if( $display_headers || $display_all ) {
 
173
                        print "$section\n".
 
174
                                ( "=" x length( $section ) )."\n";
 
175
                }
 
176
        }
 
177
 
 
178
        # replace tabs with 4 spaces
 
179
        $line =~ s/\t/    /g;
 
180
        
 
181
        # display the line
 
182
        print $line;
 
183
}
 
184
 
 
185
 
130
186
# scan through file
131
 
my $next_section = '';
 
187
my $candidate_section = '';
132
188
my $section = '';
133
 
my $old_section = '';
 
189
my $last_line = '';
134
190
open FILE, "<$todo_dir/todo" or die "can't open todo file";
135
 
while( <FILE> ) {
136
 
    my $display = 0;
137
 
 
 
191
while( <FILE> )
 
192
{
138
193
    # detect the line after section headings, and thus sections
139
 
    if( /^[-=]{2,}/ && $next_section ne '' ) {
140
 
        $section = $next_section;
141
 
        $next_section = '';
 
194
    if( /^[-=]{2,}/ && $candidate_section ne '' ) {
 
195
        $section = $candidate_section;
 
196
        $candidate_section = '';
 
197
                $last_line = '';
 
198
                next;
142
199
    }
 
200
 
143
201
    # detect section headings
144
 
    elsif( /^[A-Z]+$/ ) {
145
 
        $next_section = $_;
146
 
        chomp( $next_section );
147
 
    }
148
 
    # we have neither a section heading nor the line after
 
202
    if( /^[-_\.A-Za-z0-9 ]+$/ ) {
 
203
        $candidate_section = $_;
 
204
                chomp $candidate_section;
 
205
        }
149
206
    else {
150
 
        $next_section = '';
151
 
 
152
 
        # display line
153
 
        if( ( $section eq $display_section ) ||
154
 
            ( $section && $display_all ) )
155
 
        {
156
 
            # detect section change
157
 
            if( $section ne $old_section ) {
158
 
                $old_section = $section;
159
 
                
160
 
                # display section heading
161
 
                if( $display_headers ||
162
 
                    $display_all )
163
 
                {
164
 
                    print "$section\n".
165
 
                        ( "=" x length( $section ) )."\n";
166
 
                }
167
 
            }
168
 
 
169
 
            # replace tabs with 4 spaces
170
 
            s/\t/    /g;
171
 
 
172
 
            # display the line
173
 
            print;
174
 
        }
 
207
        $candidate_section = '';
 
208
        }
 
209
 
 
210
        # display last line
 
211
        display_line( $last_line, $section ) if( $last_line ne '' );
 
212
 
 
213
    # display line
 
214
        if( ( lc( $section ) eq lc( $display_section ) ) ||
 
215
                ( $section && $display_all ) )
 
216
        {
 
217
                $last_line = $_;
175
218
    }
 
219
        else {
 
220
                $last_line = '';
 
221
        }
176
222
}
 
223
display_line( $last_line, $section ) if( $last_line ne '' );