diff --git a/bin/launcher.sh b/bin/launcher.sh index 45e7d63..64c1efd 100755 --- a/bin/launcher.sh +++ b/bin/launcher.sh @@ -1,36 +1,66 @@ -#!/bin/bash +#!/bin/sh # terminal application launcher for sway, using fzf -# inspired by https://github.com/Biont/sway-launcher-desktop +# original command: +# Based on: https://github.com/swaywm/sway/issues/1367 +# bindsym $altkey+space exec termite --name=launcher -e \ +# "bash -c 'compgen -c | sort -u | fzf --no-extended --print-query | \ +# tail -n1 | xargs -r swaymsg -t command exec'" -set -o pipefail -shopt -s nullglob globstar HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/sway-launcher-history.txt" -export FZF_DEFAULT_OPTS="--layout=reverse --no-extended --print-query --no-sort" +FZF_OPTIONS="--layout=reverse --no-extended --print-query --no-sort" -[ ! -f "$HIST_FILE" ] && touch {"$HIST_FILE" -# Create fifo for populate fzf in async mode -FZFPIPE=$(mktemp -u) -mkfifo "$FZFPIPE" -trap 'rm "$FZFPIPE"' EXIT INT - -#retrieve history and pipe it into our fifo -readarray HIST_LINES <"$HIST_FILE" -(printf '%s' "${HIST_LINES[@]#* }" >>"$FZFPIPE") & - -# Get command, if empty exit -command=$(fzf <"$FZFPIPE" | tail -n1 || exit 1) -[[ "$command" == "" ]] && exit 0 - -# Update history -index=$(printf '%s' "${HIST_LINES[@]}" | grep -n -Pe "^[0-9]+ ${command}$" | awk -F ':' '{print $1-1}') -if [ -n "$index" ]; then - occurences=${HIST_LINES[$index]%% *} - occurences=$((occurences + 1)) - HIST_LINES[$index]="${occurences} ${command}"$'\n' +# Get shell command list +# This may include the occasional non-executable file +# command_list=$({ IFS=:; ls -H $PATH; } | grep -v '/.*' | sort -u) +command_list=$(\ + find $(echo $PATH | tr ':' ' ') -type f -executable -printf "\n%f" | \ + sort -u) +# read existing command history +if [ -f "$HIST_FILE" ]; then + command_history=$(cat "$HIST_FILE") else - HIST_LINES+=("1 $command"$'\n') + command_history="" fi -printf '%s' "${HIST_LINES[@]}" | sort --numeric-sort --reverse > "$HIST_FILE" -swaymsg -t command exec "$command" -exit 0 +# search command list +command_str=$(printf "%s\n" "${command_history}" "${command_list}" | \ + sed -E 's/^[0-9]+ (.+)$/\1/' | \ + fzf $FZF_OPTIONS | \ + tail -n1) || exit 1 + +if [ "$command_str" = "" ]; then + exit 1 +fi +# echo "Command: $command_str" + +# using \E flag from https://github.com/junegunn/fzfperl regex +test "${command_str#*\\E}" != "$command_str" && echo "command can't contain '\E'" +test "${command_str#*\\E}" != "$command_str" && exit 1 + +# get full line from history (with count number) +hist_line=$(echo "$command_history" | grep -Pe "^[0-9]+ \Q$command_str\E$") +# echo "Hist Line: $hist_line" + +if [ "$hist_line" = "" ]; then + hist_count=1 +else + # Increment usage count + hist_count=$(echo "$hist_line" | sed -E 's/^([0-9]+) .+$/\1/') + hist_count=$((hist_count + 1)) + # delete line, to add updated later + # echo "Hist Before: $command_history" + command_history=$(echo "$command_history" | \ + grep --invert-match -Pe "^[0-9]+ \Q$command_str\E$") + # echo "Hist After: $command_history" +fi + +# update history +update_line="${hist_count} ${command_str}" +printf "%s\n" "${update_line}" "${command_history}" | \ + sort --numeric-sort --reverse > "$HIST_FILE" +# echo "$update_line" + +# execute command +echo "$command_str" +swaymsg -t command exec "$command_str" + diff --git a/config/mako/config b/config/mako/config index f8d975c..b053c7c 100644 --- a/config/mako/config +++ b/config/mako/config @@ -2,7 +2,6 @@ markup=1 actions=1 anchor=top-right -group-by=urgency,app-name,app-icon # Format font=Fira Code 10 diff --git a/config/sway/config b/config/sway/config index d16d34b..8f0f130 100644 --- a/config/sway/config +++ b/config/sway/config @@ -47,11 +47,11 @@ bindsym $mod+Shift+Right move right # Workspaces: # ----------- -set $ws1 1:  -set $ws2 2:  -set $ws3 3:  -set $ws4 4:  -set $ws5 5:  +set $ws1 "1: " +set $ws2 "2: " +set $ws3 "3: " +set $ws4 "4:  +set $ws5 "5: " assign [app_id="^firefox$"] $ws3 assign [class="keepassxc"] $ws3 @@ -163,7 +163,4 @@ exec_always import-gsettings.sh \ gtk-theme:gtk-theme-name \ font-name:gtk-font-name -# Notifications -#-------------- exec mako -bindsym $mod+n exec makoctl dismiss