From b92698e785ffb41ca5d0e160bf7f7b705ee52e5a Mon Sep 17 00:00:00 2001 From: t470p Date: Sat, 11 May 2024 22:18:04 -0500 Subject: [PATCH] + dmenu_recency --- dots/bin/dmenu_recency | 102 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 dots/bin/dmenu_recency diff --git a/dots/bin/dmenu_recency b/dots/bin/dmenu_recency new file mode 100644 index 0000000..b20d92f --- /dev/null +++ b/dots/bin/dmenu_recency @@ -0,0 +1,102 @@ +#!/bin/bash + +# src: https://github.com/manjaro/packages-community/blob/master/dmenu-manjaro/dmenu_recency + +# Originally based on code by Dieter Plaetinck. +# Pretty much re-written by Mina Nagy (mnzaki) +# Edited by Chrysostomus to create/source .dmenurc + +if ! [ -f "$HOME/.dmenurc" ]; then + cp /usr/share/dmenu/dmenurc $HOME/.dmenurc +fi +. $HOME/.dmenurc + +if [ -z "$TERMINAL_CMD" ]; then + if [ "$(which terminal)" ]; then + TERMINAL_CMD="terminal -e" + elif [ "$(which urxvt)" ]; then + TERMINAL_CMD="urxvt -e" + elif [ "$(which termite)" ]; then + TERMINAL_CMD="termite -e" + elif [ "$(which terminator)" ]; then + TERMINAL_CMD="terminator -e" + elif [ "$(which gnome-terminal)" ]; then + TERMINAL_CMD="gnome-terminal -e" + elif [ "$(which lxterminal)" ]; then + TERMINAL_CMD="lxterminal -e" + elif [ "$(which sakura)" ]; then + TERMINAL_CMD="sakura -e" + elif [ "$(which xfce4-terminal)" ]; then + TERMINAL_CMD="xfce4-terminal -e" + elif [ "$(which xterm)" ]; then + TERMINAL_CMD="xterm -e" + fi +fi + +dmenu_cmd="dmenu $DMENU_OPTIONS" +max_recent=199 # Number of recent commands to track + +cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/dmenu-recent" +recent_cache="$cache_dir/recent" +rest_cache="$cache_dir/all" +known_types=" background terminal terminal_hold " + +config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/dmenu-recent" +mkdir -p "$cache_dir" +mkdir -p "$config_dir" +touch "$recent_cache" + +# Without this, it won't remember $type +GREP_OPTIONS='--color=never' + +IFS=: +if stest -dqr -n "$rest_cache" $PATH 2>/dev/null; then + stest -flx $PATH | sort -u | grep -vf "$recent_cache" > "$rest_cache" +fi + +IFS=" " +cmd=$(cat "$recent_cache" "$rest_cache" | $dmenu_cmd -p run: "$@") || exit + +if ! grep -qx "$cmd" "$recent_cache" &> /dev/null; then + grep -vx "$cmd" "$rest_cache" > "$rest_cache.$$" + if -s "$rest_cache.$$"; then + mv "$rest_cache.$$" "$rest_cache" + else + rm "$rest_cache.$$" + fi +fi + +if [[ ! $cmd == *[[]* ]]; then + echo "$cmd" > "$recent_cache.$$" + grep -vx "$cmd" "$recent_cache" | head -n "$max_recent" >> "$recent_cache.$$" + mv "$recent_cache.$$" "$recent_cache" +fi + +# Figure out how to run the command based on the command name, disregarding +# arguments, if any. +word0=${cmd%% *} +match="^$word0$" + +get_type () { + while type=$(echo $known_types | xargs -n1 | $dmenu_cmd -p Type:); do + [[ $known_types =~ " $type " ]] || continue + echo "$word0" >> "$config_dir/$type" + break + done + echo $type +} + +if ! type=$(grep -lx "$match" -R "$config_dir"); then + type=$(get_type) +else + type=${type##*/} + if ! [[ $known_types =~ " $type " ]]; then + rm "$config_dir/$type" + type=$(get_type) + fi +fi + +[[ "$type" = "background" ]] && exec $cmd +[[ "$type" = "terminal" ]] && exec $TERMINAL_CMD "$cmd" +[[ "$type" = "terminal_hold" ]] && + exec $TERMINAL_CMD sh -c "$cmd && echo Press Enter to kill me... && read line"