- #!/usr/bin/env perl
-
- # Execute shell commands and include their output in the current buffer.
- #
- # This is brittle and probably very subject to quoting problems, but in
- # practice it's been a useful hack for local notes and technical writing.
- #
- # See also:
- #
- # - filter-exec for formatted output including the original command
- #
- # - filter-exec-stdin for a version that passes the contained block to
- # stdin of the executed command
-
- use strict;
- use warnings;
- use 5.10.0;
-
- my $text;
- {
- # Line separator:
- local $/ = undef;
- $text = <>;
- }
-
- # HTML quote markers / commands:
- $text =~ s{
- <!--[ ]exec-raw[ ](.*?)[ ]-->
- .*?
- <!--[ ]end[ ]-->
- }{
- handle_block('<!-- ', $1, ' -->', '<!-- end -->');
- }egsx;
-
- # Vim/VimWiki-style markers:
- $text =~ s/
- [{]{3}exec-raw[ ](.*?)$
- .*?
- [}]{3}
- /
- handle_block('{{{', $1, '', '}}}');
- /egmsx;
-
- print $text;
-
- sub handle_block {
- my ($start, $command, $command_end, $end) = @_;
-
- # Note that we're redirecting stderr here, so it shows up inside the
- # output block rather than at the top of the filtered file:
- my $result = qx{$command 2>&1};
-
- unless (defined $result) {
- # TODO: Make this handle malformed or missing commands better by
- # piping the command string to a shell instead of system()ing
- # directly.
- $result = "Command not found? Exit status: $?\n";
- }
-
- return "${start}exec-raw ${command}${command_end}\n${result}${end}";
- }
-
- __DATA__
- A self-test - use ,r in vim to check:
-
- {{{exec-raw date
- Sun 04 Jun 2023 12:25:56 PM MDT
- }}}
-
- <!-- exec-raw date -->
- Sun 04 Jun 2023 12:25:56 PM MDT
- <!-- end -->
-
- <!-- exec-raw pwd -->
- /home/brennen/code/bpb-kit/home/bin
- <!-- end -->
-
- <!-- exec -->
-
- $ ls -lah ~/bin/filter-exec-raw
- -rwxr-xr-x 1 brennen brennen 1.8K Jun 4 12:25 /home/brennen/bin/filter-exec-raw
-
- <!-- end -->
-
- {{{exec-raw ls adfasdfsf
- ls: cannot access 'adfasdfsf': No such file or directory
- }}}
-
- {{{exec-raw command-which-does-not-exist
- error: -1
- }}}
|