#!/bin/zsh zparseopts -D \ h=H -help=H \ a=A -append=A \ p:=P -prompt:=P if [[ -n $H ]]; then cat <] options: -h --help this help -a --append append url to the command -p --prompt TEXT use TEXT as a prompt environment: MATCH_RE must be set to grep extended regular expression to match description: Checks current tmux buffer for regexp matches and shows them using slmenu. When user selects one match it is then passed to a command that was given as an argument via stdin. In case -a option was used, it is passed as last argument instead. If no command was given, the result is saved as new tmux buffer. END exit 0 fi if [[ -z $MATCH_RE ]]; then echo 'please set MATCH_RE environment variable (use --help for details)' exit 1 fi MATCH_TYPE=${MATCH_TYPE:--E} # check if command was passed if [[ $# == 0 ]]; then cmd=( tmux load-buffer - ) A=() else cmd=( "$@" ) fi # check if prompt text was passed if [[ $#P == 2 ]]; then sl_args=( -p ${P[2]} ) else sl_args=( -p 'select item' ) fi # grep for matches in the buffer, read them into list and reverse them typeset -a -U matches # remove duplicates matches=( ${(fOa)"$( tmux save-buffer - | grep $MATCH_TYPE -oe $MATCH_RE )"} ) # print error if none was found if [[ -z "$matches" ]]; then echo "no matches found!" read -t 1 -q # wait for any keypress, up to 1 sec exit fi # display menu and print result print -rl -- $matches | slmenu $sl_args -l $(($LINES-2)) | read match # exit on canceled [[ -z "$match" ]] && exit # execute command depending on --append flag if (($#A)); then $cmd $match else print -r -- $match | $cmd fi