diff --git a/.bashrc.d/cmdcopy.bash b/.bashrc.d/cmdcopy.bash new file mode 100644 index 0000000..f28c9a2 --- /dev/null +++ b/.bashrc.d/cmdcopy.bash @@ -0,0 +1,71 @@ +cmdcopy() { # Terminal output copying shortcut + # + # USAGE + # + # cmdcopy [-p ] + # + # + # DESCRIPTION + # + # Formats the output of to include "$ \n" on the + # first line for easy pasting. When -p is set, + # is added to the beginning of every resulting line. + # + # + # OPTIONS + # + # -p Add as a string to the + # beginning of every line. + # + # + # ENVIRONMENT + # + # cmdcopy_clipprog Specify the clipboard management + # program to use. Program must + # accept content on stdin. + # Default: `wl-copy` + + + # Default clipboard management program + # NOTE: Must accept final output on stdin + default_clipprog="wl-copy" + + # Set $clipprog to the contents of $cmdcopy_clipprog. If $cmdcopy_clipprog + # is empty or unset, set $clipprog to the contents of $default_clipprog instead. + clipprog="${cmdcopy_clipprog:-$default_clipprog}" + + + # Parse command line options + while getopts :p: opt; do + case $opt in + p) + preamble="$OPTARG" + ;; + \?) + echo "E: Unknown option: -$OPTARG" + return 1 + ;; + :) + echo "E: Option -$OPTARG requires an argument" + return 1 + ;; + esac + done + + # Remove parsed options from $@ + shift $((OPTIND -1)) + + + # Run the command, capturing stdout and stderr + cmd_output="$("$@" 2>&1)" + + # Add preamble + final_output="$(awk -v preamble="$preamble" '{print preamble $0}' <(printf '%s\n\n%s' "$ $*" "$cmd_output"))" + + + # Send final output to $clipprog + printf '%s' "$final_output" | $clipprog + + # Print command output to the terminal for user feedback + printf '%s\n\ncmdcopy: Command output sent to: %s\n\n' "$final_output" "$clipprog" +}