#!/bin/bash set -e set -o pipefail dir=/tmp/clipmenu.$USER cache_file=$dir/line_cache if [[ $0 == /* ]]; then location=${0%/*} else location=$PWD/${0#./} location=${location%/*} fi cat - "$location/../clipmenu" > /tmp/clipmenu << 'EOF' #!/bin/bash shopt -s expand_aliases shim() { printf '%s args:' "$1" >&2 printf ' %q' "${@:2}" >&2 printf '\n' >&2 i=0 while IFS= read -r line; do let i++ printf '%s line %d stdin: %s\n' "$1" "$i" "$line" >&2 done if [[ -v SHIM_STDOUT ]]; then printf '%s\n' "$SHIM_STDOUT" fi } alias dmenu='SHIM_STDOUT="Selected text. (2 lines)" shim dmenu' alias xsel='shim xsel' alias xclip='shim xclip' EOF chmod a+x /tmp/clipmenu rm -rf "$dir" mkdir -p "$dir" cat > "$cache_file" << 'EOF' Selected text. (2 lines) Selected text 2. (2 lines) EOF cat > "$dir/$(cksum <<< 'Selected text. (2 lines)')" << 'EOF' Selected text. Yes, it's selected text. EOF ### TESTS ### output=$(/tmp/clipmenu --foo bar 2>&1) printf '%s\n' "$output" > /tmp/qq # Arguments are transparently passed to dmenu grep -Fxq 'dmenu args: -l 8 --foo bar' <<< "$output" # Output from cache file should get to dmenu, reversed grep -Fxq 'dmenu line 1 stdin: Selected text 2. (2 lines)' <<< "$output" grep -Fxq 'dmenu line 2 stdin: Selected text. (2 lines)' <<< "$output" # xsel should copy both to clipboard *and* primary grep -Fxq 'xsel args: --logfile /dev/null -i --clipboard' <<< "$output" grep -Fxq 'xsel args: --logfile /dev/null -i --primary' <<< "$output" grep -Fxq 'xsel line 1 stdin: Selected text.' <<< "$output" grep -Fxq "xsel line 2 stdin: Yes, it's selected text." <<< "$output"