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,
39
43
" -a, --all display all sections\n".
40
44
" -e, --edit edit your todo file\n".
41
45
" -h, --headers show setion headers\n".
46
" -l, --list show the list in your pager (see notes)\n".
42
47
" -s, --section=SECTION display this named section\n".
43
48
" --help display this help and exit\n".
44
" --version output version information and exit\n";
49
" --version output version information and exit\n".
51
"The advantage of using '--list' is that the pager is run as if the\n".
52
"todo list were being edited. This means that if you decide to spawn an\n".
53
"editor from you pager and edit the list, these changes get noticed.\n".
55
"The environment variables EDITOR and PAGER are used.\n".
57
"Please report bugs to Tim Marston <tim\@ed.am>.\n";
49
62
if( $mode_version ) {
50
63
print "todo 1.0\n".
51
"Copyright (C) 2011 Tim Marston.\n".
64
"Copyright (C) 2011, 2012 Tim Marston.\n".
52
65
"http://ed.am/software/todo\n";
102
122
# determine editor from environment, default to "emacs -nw"
103
my $editor = $ENV{ 'EDITOR' };
104
defined $editor or $editor = 'emacs -nw';
125
$editor = $ENV{ 'PAGER' };
126
defined $editor or $editor = 'less';
129
$editor = $ENV{ 'EDITOR' };
130
defined $editor or $editor = 'emacs -nw';
105
132
my @exec_array = split( / +/, $editor );
106
133
push( @exec_array, "$todo_dir/todo" );
157
# function to display a line
160
my ( $line, $section ) = @_;
161
state $old_section = '';
163
# detect section change
164
if( $section ne $old_section ) {
165
$old_section = $section;
167
# display section heading
168
if( $display_headers || $display_all ) {
170
( "=" x length( $section ) )."\n";
174
# replace tabs with 4 spaces
130
182
# scan through file
131
my $next_section = '';
183
my $candidate_section = '';
132
184
my $section = '';
133
my $old_section = '';
134
186
open FILE, "<$todo_dir/todo" or die "can't open todo file";
138
189
# detect the line after section headings, and thus sections
139
if( /^[-=]{2,}/ && $next_section ne '' ) {
140
$section = $next_section;
190
if( /^[-=]{2,}/ && $candidate_section ne '' ) {
191
$section = $candidate_section;
192
$candidate_section = '';
143
197
# detect section headings
144
elsif( /^[A-Z]+$/ ) {
146
chomp( $next_section );
148
# we have neither a section heading nor the line after
198
if( /^[-_\.A-Za-z0-9 ]+$/ ) {
199
$candidate_section = $_;
200
chomp $candidate_section;
153
if( ( $section eq $display_section ) ||
154
( $section && $display_all ) )
156
# detect section change
157
if( $section ne $old_section ) {
158
$old_section = $section;
160
# display section heading
161
if( $display_headers ||
165
( "=" x length( $section ) )."\n";
169
# replace tabs with 4 spaces
203
$candidate_section = '';
207
display_line( $last_line, $section ) if( $last_line ne '' );
210
if( ( lc( $section ) eq lc( $display_section ) ) ||
211
( $section && $display_all ) )
219
display_line( $last_line, $section ) if( $last_line ne '' );