diff options
Diffstat (limited to '.config/otter-launcher')
| -rw-r--r-- | .config/otter-launcher/config.toml | 126 | ||||
| -rwxr-xr-x | .config/otter-launcher/sway-launcher-desktop.sh | 390 |
2 files changed, 0 insertions, 516 deletions
diff --git a/.config/otter-launcher/config.toml b/.config/otter-launcher/config.toml deleted file mode 100644 index a0a53ab..0000000 --- a/.config/otter-launcher/config.toml +++ /dev/null @@ -1,126 +0,0 @@ -[general] -default_module = "app" # The module to run when no prefix is matched -empty_module = "a" # run with an empty prompt -exec_cmd = "sh -c" # The exec command of your shell, default to sh -# for example: "bach -c" for bash; "zsh -c" for zsh. This can also runs wm exec commands, like hyprctl dispatch exec -vi_mode = true # set true to use vi keybinds, false to use emacs keybinds; default to emacs -esc_to_abort = true # allow to quit with esc keypress; a useful option for vi users -cheatsheet_entry = "?" # when entered, otter-launcher will show a list of configured modules -cheatsheet_viewer = "less -R; clear" # the program that otter-launcher will pipe cheatsheet into -clear_screen_after_execution = false # useful when chafa image flash back after module execution -loop_mode = false # in loop mode, otter-launcher won't quit after running a module, useful when using scratchpad -external_editor = "" # if set, pressing ctrl+e (or pressing v in vi normal mode) will edit the input field in the specified program; default to no external editor -#callback = "" # if set, otter-launcher will run the command after a module is executed; for example, it can call swaymsg to adjust window size - -# ASCII color codes are allowed with these options. However, \x1b should be replaced with \u001B (unicode escape) because the rust toml crate cannot read \x as an escaped character... -[interface] -# use three quotes to write longer commands -header = """ - \u001B[34;1m >\u001B[0m $USER@$(echo $HOSTNAME) \u001B[31m\u001B[0m $(cat /proc/loadavg | cut -d ' ' -f 1) \u001B[33m\u001B[0m $(free -h | awk 'FNR == 2 {print $3}' | sed 's/i//') - \u001B[34;1m>\u001B[0;1m """ -# Run a shell command and make the stdout printed above the header -header_cmd = "" -header_cmd_trimmed_lines = 0 # Remove a number of lines from header_cmd output, in case of some programs printing excessive empty lines at the end of its output -header_concatenate = false # print header and header_cmd output at the same line, default to false -list_prefix = " " -selection_prefix = " \u001B[31;1m> " -place_holder = "type and search" -default_module_message = " \u001B[33msearch\u001B[0m the internet" # if set, the text will be shown when the default module is in use -empty_module_message = "" # the text to show when empty module is in use -suggestion_mode = "list" # available options: list, hint -suggestion_lines = 12 # length of the suggestion list, set to 0 to disable suggestions and tab completion -indicator_with_arg_module = "\u001B[31m^\u001B[0m " # a sign showing whether the module should run with an argument -indicator_no_arg_module = "\u001B[31m$\u001B[0m " -prefix_padding = 3 # format prefixes to have a uniformed width; prefixes will be padded with spaces to have a least specified number of chars -# below color options affect all modules; per-module coloring is allowed by using ascii color codes at each module's configurations -prefix_color = "\u001B[33m" -description_color = "\u001B[39m" -place_holder_color = "\u001B[30m" -hint_color = "\u001B[30m" # the color of hint mode suggestions -# move the whole interface rightward or upward, easier for styling with chafa image -move_right = 0 -move_up = 0 - - -[[modules]] -description = "search with brave" -prefix = "br" -cmd = "setsid -f xdg-open 'https://search.brave.com/search?q={}'" -with_argument = true -url_encode = true - -[[modules]] -description = "kill a runing app" -prefix = "k" -cmd = 'ps -u "$USER" -o comm= | sort -u | fsel --dmenu | xargs -r pkill -9' -with_argument = true -url_encode = true - -[[modules]] -description = "launch apps with fsel" -prefix = "a" -cmd = "fsel -vv -r -d -ss \"{}\"" -with_argument = true - -[[modules]] -description = "launch apps instantly" -prefix = "app" -cmd = "fsel -vv -r -d -p {}" -with_argument = true - -[[modules]] -description = "manage clipboard with fsel" -prefix = "cl" -cmd = """ -fsel --cclip -""" - -[[modules]] -description = "find pkgs" -prefix = "pm" -cmd = "pmux -SD {}" -with_argument = true - -[[modules]] -description = "install pkgs" -prefix = "i" -cmd = "pmux -S {}" -with_argument = true - -[[modules]] -description = "power menu with fzf" -prefix = "p" -cmd = """ -function power { -if [[ -n $1 ]]; then -case $1 in -"logout") session=`loginctl session-status | head -n 1 | awk '{print $1}'`; loginctl terminate-session $session ;; -"suspend") systemctl suspend ;; -"hibernate") systemctl hibernate ;; -"reboot") systemctl reboot ;; -"shutdown") systemctl poweroff ;; -esac fi } -power $(echo -e 'reboot\nshutdown\nlogout\nsuspend\nhibernate' | fzf --reverse --no-scrollbar --padding 1,3 --prompt 'Power Menu: ' | tail -1) -""" - -[[modules]] -description = "run command in terminal" -prefix = "s" -cmd = """ -setsid -f "$(echo $TERM | sed 's/xterm-//g')" -e {} -""" -with_argument = true - -[[modules]] -description = "search archwiki" -prefix = "w" -cmd = "setsid -f xdg-open https://wiki.archlinux.org/index.php?search='{}'" -with_argument = true -url_encode = true - -[[modules]] -description = "cambridge dictionary" -prefix = "dc" -cmd = "setsid -f xdg-open 'https://dictionary.cambridge.org/dictionary/english/{}'" -with_argument = true -url_encode = true diff --git a/.config/otter-launcher/sway-launcher-desktop.sh b/.config/otter-launcher/sway-launcher-desktop.sh deleted file mode 100755 index 0153175..0000000 --- a/.config/otter-launcher/sway-launcher-desktop.sh +++ /dev/null @@ -1,390 +0,0 @@ -#!/usr/bin/env bash -# terminal application launcher for sway, using fzf -# Based on: https://gitlab.com/FlyingWombat/my-scripts/blob/master/sway-launcher -# https://gist.github.com/Biont/40ef59652acf3673520c7a03c9f22d2a -shopt -s nullglob globstar -set -o pipefail -if ! { exec 0>&3; } 1>/dev/null 2>&1; then - exec 3>/dev/null # If file descriptor 3 is unused in parent shell, output to /dev/null -fi -# shellcheck disable=SC2154 -trap 's=$?; echo "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR -IFS=$'\n\t' -DEL=$'\34' - -FZF_COMMAND="${FZF_COMMAND:=fzf}" -TERMINAL_COMMAND="${TERMINAL_COMMAND:="$TERMINAL -e"}" -GLYPH_COMMAND="${GLYPH_COMMAND- }" -GLYPH_DESKTOP="${GLYPH_DESKTOP- }" -CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/sway-launcher-desktop" -PROVIDERS_FILE="${PROVIDERS_FILE:=providers.conf}" -if [[ "${PROVIDERS_FILE#/}" == "${PROVIDERS_FILE}" ]]; then - # $PROVIDERS_FILE is a relative path, prepend $CONFIG_DIR - PROVIDERS_FILE="${CONFIG_DIR}/${PROVIDERS_FILE}" -fi -if [[ ! -v PREVIEW_WINDOW ]]; then - PREVIEW_WINDOW=up:2:noborder -fi - -# Provider config entries are separated by the field separator \034 and have the following structure: -# list_cmd,preview_cmd,launch_cmd,purge_cmd -declare -A PROVIDERS -if [ -f "${PROVIDERS_FILE}" ]; then - eval "$(awk -F= ' - BEGINFILE{ provider=""; } - /^\[.*\]/{sub("^\\[", "");sub("\\]$", "");provider=$0} - /^(launch|list|preview|purge)_cmd/{st = index($0,"=");providers[provider][$1] = substr($0,st+1)} - ENDFILE{ - for (key in providers){ - if(!("list_cmd" in providers[key])){continue;} - if(!("launch_cmd" in providers[key])){continue;} - if(!("preview_cmd" in providers[key])){continue;} - if(!("purge_cmd" in providers[key])){providers[key]["purge_cmd"] = "exit 0";} - for (entry in providers[key]){ - gsub(/[\x27,\047]/,"\x27\"\x27\"\x27", providers[key][entry]) - } - print "PROVIDERS[\x27" key "\x27]=\x27" providers[key]["list_cmd"] "\034" providers[key]["preview_cmd"] "\034" providers[key]["launch_cmd"] "\034" providers[key]["purge_cmd"] "\x27\n" - } - }' "${PROVIDERS_FILE}")" - if [[ ! -v HIST_FILE ]]; then - HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/${0##*/}-${PROVIDERS_FILE##*/}-history.txt" - fi -else - PROVIDERS['desktop']="${0} list-entries${DEL}${0} describe-desktop \"{1}\"${DEL}${0} run-desktop '{1}' {2}${DEL}test -f '{1}' || exit 43" - PROVIDERS['command']="${0} list-commands${DEL}${0} describe-command \"{1}\"${DEL}${TERMINAL_COMMAND} {1}${DEL}command -v '{1}' || exit 43" - if [[ ! -v HIST_FILE ]]; then - HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/${0##*/}-history.txt" - fi -fi -PROVIDERS['user']="exit${DEL}exit${DEL}{1}" # Fallback provider that simply executes the exact command if there were no matches - -if [[ -n "${HIST_FILE}" ]]; then - mkdir -p "${HIST_FILE%/*}" && touch "$HIST_FILE" - readarray HIST_LINES <"$HIST_FILE" -fi - -function describe() { - # shellcheck disable=SC2086 - readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[${1}]} - # shellcheck disable=SC2086 - [ -n "${PROVIDER_ARGS[1]}" ] && eval "${PROVIDER_ARGS[1]//\{1\}/${2}}" -} -function describe-desktop() { - description=$(sed -ne '/^Comment=/{s/^Comment=//;p;q}' "$1") - echo -e "\033[33m$(sed -ne '/^Name=/{s/^Name=//;p;q}' "$1")\033[0m" - echo "${description:-No description}" -} -function describe-command() { - readarray arr < <(whatis -l "$1" 2>/dev/null) - description="${arr[0]}" - description="${description#* - }" - echo -e "\033[33m${1}\033[0m" - echo "${description:-No description}" -} - -function provide() { - # shellcheck disable=SC2086 - readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[$1]} - eval "${PROVIDER_ARGS[0]}" -} -#function list-commands() { -# IFS=: read -ra path <<<"$PATH" -# for dir in "${path[@]}"; do -# printf '%s\n' "$dir/"* | -# awk -F / -v pre="$GLYPH_COMMAND" '{print $NF "\034command\034\033[31m" pre "\033[0m" $NF;}' -# done | sort -u -#} -function list-commands() { - # Add your path - CUSTOM_BIN_DIR="$HOME/.local/share/uspm/bin/" - - # Og PATH directories - IFS=: read -ra path <<<"$PATH" - - # directory - if [[ -d "$CUSTOM_BIN_DIR" ]]; then - path+=("$CUSTOM_BIN_DIR") - fi - - for dir in "${path[@]}"; do - printf '%s\n' "$dir/"* | - awk -F / -v pre="$GLYPH_COMMAND" '{print $NF "\034command\034\033[31m" pre "\033[0m" $NF;}' - done | sort -u -} -function list-entries() { - # Get locations of desktop application folders according to spec - # https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html - IFS=':' read -ra DIRS <<<"${XDG_DATA_HOME-${HOME}/.local/share}:${XDG_DATA_DIRS-/usr/local/share:/usr/share}" - for i in "${!DIRS[@]}"; do - if [[ ! -d "${DIRS[i]}" ]]; then - unset -v 'DIRS[$i]' - else - DIRS[$i]="${DIRS[i]}/applications/**/*.desktop" - fi - done - - # shellcheck disable=SC2068 - entries ${DIRS[@]} | sort -k2 -} -function entries() { - # shellcheck disable=SC2068 - awk -v pre="$GLYPH_DESKTOP" -F= ' - function desktopFileID(filename){ - sub("^.*applications/", "", filename); - sub("/", "-", filename); - return filename - } - BEGINFILE{ - application=0; - hidden=0; - block=""; - a=0 - - id=desktopFileID(FILENAME) - if(id in fileIds){ - nextfile; - }else{ - fileIds[id]=0 - } - } - /^\[Desktop Entry\]/{block="entry"} - /^Type=Application/{application=1} - /^\[Desktop Action/{ - sub("^\\[Desktop Action ", ""); - sub("\\]$", ""); - block="action"; - a++; - actions[a,"key"]=$0 - } - /^\[X-/{ - sub("^\\[X-", ""); - sub("\\]$", ""); - block="action"; - a++; - actions[a,"key"]=$0 - } - /^Name=/{ (block=="action")? actions[a,"name"]=$2 : name=$2 } - /^NoDisplay=true/{ (block=="action")? actions[a,"hidden"]=1 : hidden=1 } - ENDFILE{ - if (application){ - if (!hidden) - print FILENAME "\034desktop\034\033[33m" pre name "\033[0m"; - if (a>0) - for (i=1; i<=a; i++) - if (!actions[i, "hidden"]) - print FILENAME "\034desktop\034\033[33m" pre name "\033[0m (" actions[i, "name"] ")\034" actions[i, "key"] - } - }' \ - $@ </dev/null - # the empty stdin is needed in case no *.desktop files -} -function run-desktop() { - CMD="$("${0}" generate-command "$@" 2>&3)" - echo "Generated Launch command from .desktop file: ${CMD}" >&3 - eval "${CMD}" -} -function generate-command() { - # Define the search pattern that specifies the block to search for within the .desktop file - PATTERN="^\\\\[Desktop Entry\\\\]" - if [[ -n $2 ]]; then - PATTERN="^\\\\[Desktop Action ${2}\\\\]" - fi - echo "Searching for pattern: ${PATTERN}" >&3 - # 1. We see a line starting [Desktop, but we're already searching: deactivate search again - # 2. We see the specified pattern: start search - # 3. We see an Exec= line during search: remove field codes and set variable - # 3. We see a Path= line during search: set variable - # 4. Finally, build command line - awk -v pattern="${PATTERN}" -v terminal_cmd="${TERMINAL_COMMAND}" -F= ' - BEGIN{a=0;exec=0;path=0} - /^\[Desktop/{ - if(a){ a=0 } - } - $0 ~ pattern{ a=1 } - /^Terminal=/{ - sub("^Terminal=", ""); - if ($0 == "true") { terminal=1 } - } - /^Exec=/{ - if(a && !exec){ - sub("^Exec=", ""); - gsub(" ?%[cDdFfikmNnUuv]", ""); - exec=$0; - } - } - /^Path=/{ - if(a && !path){ path=$2 } - } - END{ - if(path){ printf "cd " path " && " } - printf "exec " - if (terminal){ printf terminal_cmd " " } - print exec - }' "$1" -} - -function shouldAutostart() { - local condition="$(cat $1 | grep "AutostartCondition" | cut -d'=' -f2)" - local filename="${XDG_CONFIG_HOME-${HOME}/.config}/${condition#* }" - case $condition in - if-exists*) - [[ -e $filename ]] - ;; - unless-exists*) - [[ ! -e $filename ]] - ;; - *) - return 0 - ;; - esac -} - -function autostart() { - for application in $(list-autostart); do - if shouldAutostart "$application"; then - (exec setsid /bin/sh -c "$(run-desktop "${application}")" &>/dev/null &) - fi - done -} - -function list-autostart() { - # Get locations of desktop application folders according to spec - # https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html - IFS=':' read -ra DIRS <<<"${XDG_CONFIG_HOME-${HOME}/.config}:${XDG_CONFIG_DIRS-/etc/xdg}" - for i in "${!DIRS[@]}"; do - if [[ ! -d "${DIRS[i]}" ]]; then - unset -v 'DIRS[$i]' - else - DIRS[$i]="${DIRS[i]}/autostart/*.desktop" - fi - done - - # shellcheck disable=SC2068 - awk -v pre="$GLYPH_DESKTOP" -F= ' - function desktopFileID(filename){ - sub("^.*autostart/", "", filename); - sub("/", "-", filename); - return filename - } - BEGINFILE{ - application=0; - block=""; - disabled=0; - a=0 - - id=desktopFileID(FILENAME) - if(id in fileIds){ - nextfile; - }else{ - fileIds[id]=0 - } - } - /^\[Desktop Entry\]/{block="entry"} - /^Type=Application/{application=1} - /^Name=/{ iname=$2 } - /^Hidden=true/{disabled=1} - ENDFILE{ - if (application && !disabled){ - print FILENAME; - } - }' \ - ${DIRS[@]} </dev/null -} - -purge() { - # shellcheck disable=SC2188 - >"${HIST_FILE}" - declare -A PURGE_CMDS - for PROVIDER_NAME in "${!PROVIDERS[@]}"; do - readarray -td ${DEL} PROVIDER_ARGS <<<${PROVIDERS[${PROVIDER_NAME}]} - PURGE_CMD=${PROVIDER_ARGS[3]} - [ -z "${PURGE_CMD}" ] && PURGE_CMD='test -f "{1}" || exit 43' - PURGE_CMDS[$PROVIDER_NAME]="${PURGE_CMD%$'\n'}" - done - for HIST_LINE in "${HIST_LINES[@]#*' '}"; do - readarray -td $'\034' HIST_ENTRY <<<${HIST_LINE} - ENTRY=${HIST_ENTRY[1]} - readarray -td ' ' FILTER <<<${PURGE_CMDS[$ENTRY]//\{1\}/${HIST_ENTRY[0]}} - (eval "${FILTER[@]}" 1>/dev/null) # Run filter command discarding output. We only want the exit status - if [[ $? -ne 43 ]]; then - echo "1 ${HIST_LINE[@]%$'\n'}" >>"${HIST_FILE}" - fi - done -} - -case "$1" in -describe | describe-desktop | describe-command | entries | list-entries | list-commands | list-autostart | generate-command | autostart | run-desktop | provide | purge) - "$@" - exit - ;; -esac -echo "Starting launcher instance with the following providers:" "${!PROVIDERS[@]}" >&3 - -FZFPIPE=$(mktemp -u) -mkfifo "$FZFPIPE" -trap 'rm "$FZFPIPE"' EXIT INT - -# Append Launcher History, removing usage count -(printf '%s' "${HIST_LINES[@]#* }" >>"$FZFPIPE") & - -# Iterate over providers and run their list-command -for PROVIDER_NAME in "${!PROVIDERS[@]}"; do - (bash -c "${0} provide ${PROVIDER_NAME}" >>"$FZFPIPE") & -done - -readarray -t COMMAND_STR <<<$( - ${FZF_COMMAND} --ansi +s -x -d '\034' --nth ..3 --with-nth 3 \ - --print-query \ - --preview "$0 describe {2} {1}" \ - --preview-window="${PREVIEW_WINDOW}" \ - --no-multi --cycle \ - --prompt="${GLYPH_PROMPT-# }" \ - --header='' --no-info --margin='1,2' \ - --color='16,gutter:-1' \ - <"$FZFPIPE" -) || exit 1 -# Get the last line of the fzf output. If there were no matches, it contains the query which we'll treat as a custom command -# If there were matches, it contains the selected item -COMMAND_STR=$(printf '%s\n' "${COMMAND_STR[@]: -1}") -# We still need to format the query to conform to our fallback provider. -# We check for the presence of field separator character to determine if we're dealing with a custom command -if [[ $COMMAND_STR != *$'\034'* ]]; then - COMMAND_STR="${COMMAND_STR}"$'\034user\034'"${COMMAND_STR}"$'\034' - SKIP_HIST=1 # I chose not to include custom commands in the history. If this is a bad idea, open an issue please -fi - -[ -z "$COMMAND_STR" ] && exit 1 - -if [[ -n "${HIST_FILE}" && ! "$SKIP_HIST" ]]; then - # update history - for i in "${!HIST_LINES[@]}"; do - if [[ "${HIST_LINES[i]}" == *" $COMMAND_STR"$'\n' ]]; then - HIST_COUNT=${HIST_LINES[i]%% *} - HIST_LINES[$i]="$((HIST_COUNT + 1)) $COMMAND_STR"$'\n' - match=1 - break - fi - done - if ! ((match)); then - HIST_LINES+=("1 $COMMAND_STR"$'\n') - fi - - printf '%s' "${HIST_LINES[@]}" | sort -nr >"$HIST_FILE" -fi - -# shellcheck disable=SC2086 -readarray -d $'\034' -t PARAMS <<<${COMMAND_STR} -# shellcheck disable=SC2086 -readarray -d ${DEL} -t PROVIDER_ARGS <<<${PROVIDERS[${PARAMS[1]}]} -# Substitute {1}, {2} etc with the correct values -COMMAND=${PROVIDER_ARGS[2]//\{1\}/${PARAMS[0]}} -COMMAND=${COMMAND//\{2\}/${PARAMS[3]}} -COMMAND=${COMMAND%%[[:space:]]} - -if [ -t 1 ]; then - echo "Launching command: ${COMMAND}" >&3 - setsid /bin/sh -c "${COMMAND}" >&/dev/null </dev/null & - sleep 0.01 -else - echo "${COMMAND}" -fi |
