- #!/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) = @_;
- my $result = `$command`;
- return "${start}exec-raw ${command}${command_end}\n${result}${end}";
- }
-
- __DATA__
- A self-test - use ,r in vim to check:
-
- {{{exec-raw date
- Thu 02 Apr 2020 11:49:22 AM MDT
- }}}
-
- <!-- exec-raw date -->
- Thu 02 Apr 2020 11:49:22 AM MDT
- <!-- end -->
-
- <!-- exec-raw pwd -->
- /home/brennen/notes
- <!-- end -->
-
- <!-- exec -->
-
- $ ls ~/bin/filter-exec-raw
- /home/brennen/bin/filter-exec-raw
-
- <!-- end -->
|