Dotfiles, utilities, and other apparatus.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

72 lines
1.3 KiB

#!/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 -->