#!/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{ .*? }{ handle_block('', ''); }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 }}} Sun 04 Jun 2023 12:25:56 PM MDT /home/brennen/code/bpb-kit/home/bin $ ls -lah ~/bin/filter-exec-raw -rwxr-xr-x 1 brennen brennen 1.8K Jun 4 12:25 /home/brennen/bin/filter-exec-raw {{{exec-raw ls adfasdfsf ls: cannot access 'adfasdfsf': No such file or directory }}} {{{exec-raw command-which-does-not-exist error: -1 }}}