From 173c717be51acffc5f59f935b0ae3309639f41d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Fri, 12 Sep 2025 13:26:19 +0200 Subject: [PATCH] keybinding help --- src/main.sh | 41 ++++-- src/sh/api.sh | 1 + src/sh/keys.sh | 327 +++++++++++++++++++++++++++++++--------------- src/sh/preview.sh | 5 + src/sh/theme.sh | 13 ++ 5 files changed, 272 insertions(+), 115 deletions(-) diff --git a/src/main.sh b/src/main.sh index 2ef7526..28f0ecf 100755 --- a/src/main.sh +++ b/src/main.sh @@ -80,6 +80,9 @@ MODE_INSERT="show" # FZF handlers . "sh/fzf.sh" +# Load keys +. "sh/keys.sh" + # Command-line options that may only be used internally. # --lines # --playback @@ -89,7 +92,8 @@ MODE_INSERT="show" # --action-gotoartist # --action-draw # --mbsearch -# --preview-artist +# --preview +# --show-keybindings case "${1:-}" in "--lines") # Print lines that are fed into fzf. @@ -301,14 +305,26 @@ case "${1:-}" in mb_search_async "$2" exit 0 ;; -"--preview-artist") - # Generate content for artist preview +"--preview") + # Generate content for preview window # - # @argument $2: MusicBrainz Artist ID + # @argument $2: view + # @argument $3: MusicBrainz ID of selected item # - # This prints the text to be displayed in the preview window for the - # specified artist. - preview_artist "$2" + # This prints the text to be displayed in the preview window. + view=$2 + mbid="${3:-}" + case "$view" in + "$VIEW_LIST_ARTISTS" | "$VIEW_SEARCH_ARTIST") preview_artist "$mbid" ;; + *) preview_nothing ;; + esac + exit 0 + ;; +"--show-keybindings") + # Print keybindings for current view + # + # @argument $2: view + print_keybindings "$2" exit 0 ;; esac @@ -432,7 +448,6 @@ esac # Start application: # - load and export preset filters -# - load and export keys # - set title # - check for missing data from MusicBrainz # - precompute main views @@ -443,9 +458,6 @@ esac # Load filters . "sh/filter.sh" -# Load keys -. "sh/keys.sh" - # Set window title printf '\033]0;%s\007' "$WINDOW_TITLE" @@ -641,13 +653,18 @@ open \"\$(dirname {4})\"" \ --bind="$KEYS_N_YANK:transform:$IN_NORMAL_MODE && echo \"execute-silent(printf {3} | $CLIP)\" || $PUT_FZF_KEY_LOGIC" \ --bind="$KEYS_YANK_CURRENT:execute-silent:printf {2} | $CLIP" \ --bind="$KEYS_SHOW_PLAYLIST:transform:echo \"print($VIEW_PLAYLIST)+print()+print($FZF_CURRENT_VIEW)+print({2})+accept\"" \ + --bind="$KEYS_KEYBINDINGS:preview:$0 --show-keybindings $FZF_CURRENT_VIEW" \ --bind="$KEYS_QUIT:print($VIEW_QUIT)+accept" \ --bind="$KEYS_N_QUIT:transform:$IN_NORMAL_MODE && ($IN_LIST_ARTISTS_VIEW && echo \"print($VIEW_QUIT)+accept\" || $0 --action-draw $MODE_NORMAL $VIEW_LIST_ARTISTS) || $PUT_FZF_KEY_LOGIC" \ + --bind="$KEYS_SCROLL_PREVIEW_DOWN:preview-down" \ + --bind="$KEYS_SCROLL_PREVIEW_UP:preview-up" \ + --bind="$KEYS_PREVIEW_OPEN:show-preview" \ + --bind="$KEYS_PREVIEW_CLOSE:hide-preview" \ --bind="$KEYS_PLAYBACK:transform:$0 --playback $FZF_CURRENT_VIEW {2} {3} {4}" \ --bind="$KEYS_N_PLAYBACK:transform:$IN_NORMAL_MODE && $0 --playback $FZF_CURRENT_VIEW {2} {3} {4} || $PUT_FZF_KEY_LOGIC" \ --bind="change:execute-silent($0 --mbsearch $FZF_CURRENT_VIEW &)+reload:$0 --lines $FZF_CURRENT_VIEW" \ --preview-window="right,25%,border-left,wrap,<30(hidden)" \ - --preview="$0 --preview-artist {3}" \ + --preview="$0 --preview $FZF_CURRENT_VIEW {3}" \ --delimiter="\t" \ --with-nth="{1}" || true ) diff --git a/src/sh/api.sh b/src/sh/api.sh index 7acbd65..76bce13 100644 --- a/src/sh/api.sh +++ b/src/sh/api.sh @@ -103,6 +103,7 @@ __api_mb() { errormsg=$($JQ -e '.error // ""' "$tmpout") if [ "$errormsg" ]; then err "Failed to fetch MusicBrainz data for $1 $2: $errormsg" + [ "$errormsg" = "Not Found" ] && break sleep "$SLEEP_ON_ERROR" else cat "$tmpout" diff --git a/src/sh/keys.sh b/src/sh/keys.sh index a6bf6e9..0e5a908 100644 --- a/src/sh/keys.sh +++ b/src/sh/keys.sh @@ -51,9 +51,14 @@ # - KEYS_N_YANK: Copy MusicBrainz ID of selected item to clipboard # - KEYS_YANK_CURRENT: Copy MusicBrainz ID of current item to clipboard # - KEYS_SHOW_PLAYLIST: Switch to playlist view +# - KEYS_KEYBINDINGS: Show keybindings # - KEYS_QUIT: Quit application # - KEYS_N_QUIT: Quit application if we are in VIEW_LIST_ARTISTS, else go to # view VIEW_LIST_ARTISTS (normal mode) +# - KEYS_SCROLL_PREVIEW_DOWN: Scroll preview down +# - KEYS_SCROLL_PREVIEW_UP: Scroll preview up +# - KEYS_PREVIEW_OPEN: Open preview window +# - KEYS_PREVIEW_CLOSE: Close preview window # # Playback: # - KEYS_PLAY: Play selected release or selected track @@ -80,108 +85,224 @@ # - KEYS_PLAYLIST_STORE: Store current playlist as file # - KEYS_PLAYLIST_LOAD: Load playlist from file # - KEYS_PLAYLIST_QUIT: Quit playlist view + +if [ ! "${KEYS_LOADED:-}" ]; then + # Mode selection: + KEYS_I_NORMAL="${KEYS_I_NORMAL:-"esc"}" + KEYS_N_INSERT="${KEYS_N_INSERT:-"a,i,/,?"}" + export KEYS_I_NORMAL KEYS_N_INSERT + + # Vertical navigation: + KEYS_DOWN="${KEYS_DOWN:-"ctrl-j,down"}" + KEYS_UP="${KEYS_UP:-"ctrl-k,up"}" + KEYS_HALFPAGE_DOWN="${KEYS_HALFPAGE_DOWN:-"ctrl-d"}" + KEYS_HALFPAGE_UP="${KEYS_HALFPAGE_UP:-"ctrl-u"}" + KEYS_N_DOWN="${KEYS_N_DOWN:-"j"}" + KEYS_N_UP="${KEYS_N_UP:-"k"}" + KEYS_N_BOT="${KEYS_N_BOT:-"G"}" + KEYS_N_TOP="${KEYS_N_TOP:-"1"}" + export KEYS_DOWN KEYS_UP KEYS_HALFPAGE_DOWN KEYS_HALFPAGE_UP KEYS_N_DOWN \ + KEYS_N_UP KEYS_N_BOT KEYS_N_TOP + + # Horizontal navigation: + KEYS_IN="${KEYS_IN:-"ctrl-l"}" + KEYS_OUT="${KEYS_OUT:-"ctrl-h"}" + KEYS_N_IN="${KEYS_N_IN:-"l"}" + KEYS_N_OUT="${KEYS_N_OUT:-"h"}" + KEYS_SELECT_ARTIST="${KEYS_SELECT_ARTIST:-"ctrl-a"}" + KEYS_LIST_ARTISTS="${KEYS_LIST_ARTISTS:-"alt-a"}" + KEYS_LIST_ALBUMS="${KEYS_LIST_ALBUMS:-"alt-s"}" + KEYS_SEARCH_ARTIST="${KEYS_SEARCH_ARTIST:-"alt-z"}" + KEYS_SEARCH_ALBUM="${KEYS_SEARCH_ALBUM:-"alt-x"}" + KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}" + KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}" + export KEYS_IN KEYS_OUT KEYS_N_IN KEYS_N_OUT KEYS_SELECT_ARTIST \ + KEYS_LIST_ARTISTS KEYS_LIST_ALBUMS KEYS_SEARCH_ARTIST KEYS_SEARCH_ALBUM \ + KEYS_SWITCH_ARTIST_ALBUM KEYS_SWITCH_LOCAL_REMOTE + + # Filtering: + KEYS_FILTER_LOCAL="${KEYS_FILTER_LOCAL:-"alt-l"}" + KEYS_FILTER_1="${KEYS_FILTER_1:-"alt-1"}" + KEYS_FILTER_2="${KEYS_FILTER_2:-"alt-2"}" + KEYS_FILTER_3="${KEYS_FILTER_3:-"alt-3"}" + KEYS_FILTER_4="${KEYS_FILTER_4:-"alt-4"}" + KEYS_FILTER_5="${KEYS_FILTER_5:-"alt-5"}" + KEYS_FILTER_6="${KEYS_FILTER_6:-"alt-6"}" + KEYS_FILTER_7="${KEYS_FILTER_7:-"alt-7"}" + KEYS_FILTER_8="${KEYS_FILTER_8:-"alt-8"}" + KEYS_FILTER_9="${KEYS_FILTER_9:-"alt-9"}" + KEYS_FILTER_0="${KEYS_FILTER_0:-"alt-0"}" + KEYS_FILTER="$KEYS_FILTER_LOCAL,$KEYS_FILTER_1,$KEYS_FILTER_2,$KEYS_FILTER_3,$KEYS_FILTER_4,$KEYS_FILTER_5,$KEYS_FILTER_6,$KEYS_FILTER_7,$KEYS_FILTER_8,$KEYS_FILTER_9,$KEYS_FILTER_0" + export KEYS_FILTER_LOCAL KEYS_FILTER_1 KEYS_FILTER_2 KEYS_FILTER_3 \ + KEYS_FILTER_4 KEYS_FILTER_5 KEYS_FILTER_6 KEYS_FILTER_7 KEYS_FILTER_8 \ + KEYS_FILTER_9 KEYS_FILTER_0 KEYS_FILTER + + # Specials: + KEYS_BROWSE="${KEYS_BROWSE:-"alt-b"}" + KEYS_OPEN="${KEYS_OPEN:-"alt-o"}" + KEYS_N_YANK="${KEYS_N_YANK:-"y"}" + KEYS_YANK_CURRENT="${KEYS_YANK_CURRENT:-"ctrl-y"}" + KEYS_SHOW_PLAYLIST="${KEYS_SHOW_PLAYLIST:-"ctrl-p"}" + KEYS_KEYBINDINGS="${KEYS_KEYBINDINGS:-"alt-?"}" + KEYS_QUIT="${KEYS_QUIT:-"ctrl-c"}" + KEYS_N_QUIT="${KEYS_N_QUIT:-"q"}" + KEYS_SCROLL_PREVIEW_DOWN="${KEYS_SCROLL_PREVIEW_DOWN:-"page-down"}" + KEYS_SCROLL_PREVIEW_UP="${KEYS_SCROLL_PREVIEW_UP:-"page-up"}" + KEYS_PREVIEW_OPEN="${KEYS_PREVIEW_OPEN:-"alt-up"}" + KEYS_PREVIEW_CLOSE="${KEYS_PREVIEW_CLOSE:-"alt-down"}" + export KEYS_BROWSE KEYS_OPEN KEYS_N_YANK KEYS_YANK_CURRENT KEYS_SHOW_PLAYLIST \ + KEYS_KEYBINDINGS KEYS_QUIT KEYS_N_QUIT KEYS_SCROLL_PREVIEW_DOWN \ + KEYS_SCROLL_PREVIEW_UP KEYS_PREVIEW_CLOSE KEYS_PREVIEW_OPEN + + # Playback: + KEYS_PLAY="${KEYS_PLAY:-"enter"}" + KEYS_QUEUE="${KEYS_QUEUE:-"ctrl-alt-m"}" # That's actually alt-enter + KEYS_QUEUE_NEXT="${KEYS_QUEUE_NEXT:-"ctrl-alt-n"}" + KEYS_TOGGLE_PLAYBACK="${KEYS_TOGGLE_PLAYBACK:-"ctrl-space"}" + KEYS_PLAY_NEXT="${KEYS_PLAY_NEXT:-"alt-n"}" + KEYS_PLAY_PREV="${KEYS_PLAY_PREV:-"alt-p"}" + KEYS_SEEK_FORWARD="${KEYS_SEEK_FORWARD:-"alt-N"}" + KEYS_SEEK_BACKWARD="${KEYS_SEEK_BACKWARD:-"alt-P"}" + KEYS_PLAYBACK="$KEYS_PLAY,$KEYS_QUEUE,$KEYS_QUEUE_NEXT,$KEYS_TOGGLE_PLAYBACK,$KEYS_PLAY_NEXT,$KEYS_PLAY_PREV,$KEYS_SEEK_FORWARD,$KEYS_SEEK_BACKWARD" + KEYS_N_PLAY="${KEYS_N_PLAY:-"."}" + KEYS_N_QUEUE="${KEYS_N_QUEUE:-";"}" + KEYS_N_QUEUE_NEXT="${KEYS_N_QUEUE_NEXT:-":"}" + KEYS_N_TOGGLE_PLAYBACK="${KEYS_N_TOGGLE_PLAYBACK:-"space"}" + KEYS_N_PLAY_NEXT="${KEYS_N_PLAY_NEXT:-"right,n"}" + KEYS_N_PLAY_PREV="${KEYS_N_PLAY_PREV:-"left,p"}" + KEYS_N_SEEK_FORWARD="${KEYS_N_SEEK_FORWARD:-"N,f"}" + KEYS_N_SEEK_BACKWARD="${KEYS_N_SEEK_BACKWARD:-"P,b"}" + KEYS_N_PLAYBACK="$KEYS_N_PLAY,$KEYS_N_QUEUE,$KEYS_N_QUEUE_NEXT,$KEYS_N_TOGGLE_PLAYBACK,$KEYS_N_PLAY_NEXT,$KEYS_N_PLAY_PREV,$KEYS_N_SEEK_FORWARD,$KEYS_N_SEEK_BACKWARD" + export KEYS_PLAY KEYS_QUEUE KEYS_QUEUE_NEXT KEYS_TOGGLE_PLAYBACK \ + KEYS_PLAY_NEXT KEYS_PLAY_PREV KEYS_SEEK_FORWARD KEYS_SEEK_BACKWARD \ + KEYS_PLAYBACK KEYS_N_PLAY KEYS_N_QUEUE KEYS_N_QUEUE_NEXT \ + KEYS_N_TOGGLE_PLAYBACK KEYS_N_PLAY_NEXT KEYS_N_PLAY_PREV \ + KEYS_N_SEEK_FORWARD KEYS_N_SEEK_BACKWARD KEYS_N_PLAYBACK + + # Playlist (in the playlist, there is no `insert` mode): + KEYS_PLAYLIST_RELOAD="${KEYS_PLAYLIST_RELOAD:-"r,ctrl-r"}" + KEYS_PLAYLIST_REMOVE="${KEYS_PLAYLIST_REMOVE:-"x,delete"}" + KEYS_PLAYLIST_UP="${KEYS_PLAYLIST_UP:-"u"}" + KEYS_PLAYLIST_DOWN="${KEYS_PLAYLIST_DOWN:-"d"}" + KEYS_PLAYLIST_CLEAR="${KEYS_PLAYLIST_CLEAR:-"C"}" + KEYS_PLAYLIST_CLEAR_ABOVE="${KEYS_PLAYLIST_CLEAR_ABOVE:-"U"}" + KEYS_PLAYLIST_CLEAR_BELOW="${KEYS_PLAYLIST_CLEAR_BELOW:-"D"}" + KEYS_PLAYLIST_SHUFFLE="${KEYS_PLAYLIST_SHUFFLE:-"s"}" + KEYS_PLAYLIST_UNSHUFFLE="${KEYS_PLAYLIST_UNSHUFFLE:-"S"}" + KEYS_PLAYLIST_GOTO_RELEASE="${KEYS_PLAYLIST_GOTO_RELEASE:-"ctrl-g"}" + KEYS_PLAYLIST_STORE="${KEYS_PLAYLIST_STORE:-"ctrl-s"}" + KEYS_PLAYLIST_LOAD="${KEYS_PLAYLIST_LOAD:-"ctrl-o"}" + export KEYS_PLAYLIST_RELOAD KEYS_PLAYLIST_REMOVE KEYS_PLAYLIST_UP \ + KEYS_PLAYLIST_DOWN KEYS_PLAYLIST_CLEAR KEYS_PLAYLIST_CLEAR_ABOVE \ + KEYS_PLAYLIST_CLEAR_BELOW KEYS_PLAYLIST_SHUFFLE KEYS_PLAYLIST_UNSHUFFLE \ + KEYS_PLAYLIST_GOTO_RELEASE KEYS_PLAYLIST_STORE KEYS_PLAYLIST_LOAD + + export KEYS_LOADED=1 +fi + +# Local method to print keybindin groups # +# @argument $1: Group name +# @argument $2: Keys for first item +# @argument $3: Description of first item +# @argument $4: Keys for second item (optional) +# @argument $5: Description of second item (optional) +# @argument ... +# +# This is a helper method for printing key-binding groups. +__keybindinggroup_from_args() { + printf "$KBF_GROUP\n" "$1" + shift + { + while [ "$*" ]; do + printf "$KBF_KEY:\t$KBF_DESC\n" "$1" "${2:-"no description"}" + shift + shift + done + } | column -t -s "$(printf '\t')" + #} | column -t -s "$(printf '\t')" -c "$FZF_PREVIEW_COLUMNS" -W 2 + printf "\n\n" +} -# Mode selection: -KEYS_I_NORMAL="${KEYS_I_NORMAL:-"esc"}" -KEYS_N_INSERT="${KEYS_N_INSERT:-"a,i,/,?"}" -export KEYS_I_NORMAL KEYS_N_INSERT - -# Vertical navigation: -KEYS_DOWN="${KEYS_DOWN:-"ctrl-j,down"}" -KEYS_UP="${KEYS_UP:-"ctrl-k,up"}" -KEYS_HALFPAGE_DOWN="${KEYS_HALFPAGE_DOWN:-"ctrl-d"}" -KEYS_HALFPAGE_UP="${KEYS_HALFPAGE_UP:-"ctrl-u"}" -KEYS_N_DOWN="${KEYS_N_DOWN:-"j"}" -KEYS_N_UP="${KEYS_N_UP:-"k"}" -KEYS_N_BOT="${KEYS_N_BOT:-"G"}" -KEYS_N_TOP="${KEYS_N_TOP:-"1"}" -export KEYS_DOWN KEYS_UP KEYS_HALFPAGE_DOWN KEYS_HALFPAGE_UP KEYS_N_DOWN \ - KEYS_N_UP KEYS_N_BOT KEYS_N_TOP - -# Horizontal navigation: -KEYS_IN="${KEYS_IN:-"ctrl-l"}" -KEYS_OUT="${KEYS_OUT:-"ctrl-h"}" -KEYS_N_IN="${KEYS_N_IN:-"l"}" -KEYS_N_OUT="${KEYS_N_OUT:-"h"}" -KEYS_SELECT_ARTIST="${KEYS_SELECT_ARTIST:-"ctrl-a"}" -KEYS_LIST_ARTISTS="${KEYS_LIST_ARTISTS:-"alt-a"}" -KEYS_LIST_ALBUMS="${KEYS_LIST_ALBUMS:-"alt-s"}" -KEYS_SEARCH_ARTIST="${KEYS_SEARCH_ARTIST:-"alt-z"}" -KEYS_SEARCH_ALBUM="${KEYS_SEARCH_ALBUM:-"alt-x"}" -KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}" -KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}" -export KEYS_IN KEYS_OUT KEYS_N_IN KEYS_N_OUT KEYS_SELECT_ARTIST \ - KEYS_LIST_ARTISTS KEYS_SELECT_ARTIST KEYS_SEARCH_ALBUM \ - KEYS_SWITCH_ARTIST_ALBUM KEYS_SWITCH_LOCAL_REMOTE - -# Filtering: -KEYS_FILTER_LOCAL="${KEYS_FILTER_LOCAL:-"alt-l"}" -KEYS_FILTER_1="${KEYS_FILTER_1:-"alt-1"}" -KEYS_FILTER_2="${KEYS_FILTER_2:-"alt-2"}" -KEYS_FILTER_3="${KEYS_FILTER_3:-"alt-3"}" -KEYS_FILTER_4="${KEYS_FILTER_4:-"alt-4"}" -KEYS_FILTER_5="${KEYS_FILTER_5:-"alt-5"}" -KEYS_FILTER_6="${KEYS_FILTER_6:-"alt-6"}" -KEYS_FILTER_7="${KEYS_FILTER_7:-"alt-7"}" -KEYS_FILTER_8="${KEYS_FILTER_8:-"alt-8"}" -KEYS_FILTER_9="${KEYS_FILTER_9:-"alt-9"}" -KEYS_FILTER_0="${KEYS_FILTER_0:-"alt-0"}" -KEYS_FILTER="$KEYS_FILTER_LOCAL,$KEYS_FILTER_1,$KEYS_FILTER_2,$KEYS_FILTER_3,$KEYS_FILTER_4,$KEYS_FILTER_5,$KEYS_FILTER_6,$KEYS_FILTER_7,$KEYS_FILTER_8,$KEYS_FILTER_9,$KEYS_FILTER_0" -export KEYS_FILTER_LOCAL KEYS_FILTER_1 KEYS_FILTER_2 KEYS_FILTER_3 \ - KEYS_FILTER_4 KEYS_FILTER_5 KEYS_FILTER_6 KEYS_FILTER_7 KEYS_FILTER_8 \ - KEYS_FILTER_9 KEYS_FILTER_0 KEYS_FILTER - -# Specials: -KEYS_BROWSE="${KEYS_BROWSE:-"alt-b"}" -KEYS_OPEN="${KEYS_OPEN:-"alt-o"}" -KEYS_N_YANK="${KEYS_N_YANK:-"y"}" -KEYS_YANK_CURRENT="${KEYS_YANK_CURRENT:-"ctrl-y"}" -KEYS_SHOW_PLAYLIST="${KEYS_SHOW_PLAYLIST:-"ctrl-p"}" -KEYS_QUIT="${KEYS_QUIT:-"ctrl-c"}" -KEYS_N_QUIT="${KEYS_N_QUIT:-"q"}" -export KEYS_BROWSE KEYS_OPEN KEYS_N_YANK KEYS_YANK_CURRENT KEYS_SHOW_PLAYLIST \ - KEYS_QUIT KEYS_N_QUIT - -# Playback: -KEYS_PLAY="${KEYS_PLAY:-"enter"}" -KEYS_QUEUE="${KEYS_QUEUE:-"ctrl-alt-m"}" # That's actually alt-enter -KEYS_QUEUE_NEXT="${KEYS_QUEUE_NEXT:-"ctrl-alt-n"}" -KEYS_TOGGLE_PLAYBACK="${KEYS_TOGGLE_PLAYBACK:-"ctrl-space"}" -KEYS_PLAY_NEXT="${KEYS_PLAY_NEXT:-"alt-n"}" -KEYS_PLAY_PREV="${KEYS_PLAY_PREV:-"alt-p"}" -KEYS_SEEK_FORWARD="${KEYS_SEEK_FORWARD:-"alt-N"}" -KEYS_SEEK_BACKWARD="${KEYS_SEEK_BACKWARD:-"alt-P"}" -KEYS_PLAYBACK="$KEYS_PLAY,$KEYS_QUEUE,$KEYS_QUEUE_NEXT,$KEYS_TOGGLE_PLAYBACK,$KEYS_PLAY_NEXT,$KEYS_PLAY_PREV,$KEYS_SEEK_FORWARD,$KEYS_SEEK_BACKWARD" -KEYS_N_PLAY="${KEYS_N_PLAY:-"."}" -KEYS_N_QUEUE="${KEYS_N_QUEUE:-";"}" -KEYS_N_QUEUE_NEXT="${KEYS_N_QUEUE_NEXT:-":"}" -KEYS_N_TOGGLE_PLAYBACK="${KEYS_N_TOGGLE_PLAYBACK:-"space"}" -KEYS_N_PLAY_NEXT="${KEYS_N_PLAY_NEXT:-"right,n"}" -KEYS_N_PLAY_PREV="${KEYS_N_PLAY_PREV:-"left,p"}" -KEYS_N_SEEK_FORWARD="${KEYS_N_SEEK_FORWARD:-"N,f"}" -KEYS_N_SEEK_BACKWARD="${KEYS_N_SEEK_BACKWARD:-"P,b"}" -KEYS_N_PLAYBACK="$KEYS_N_PLAY,$KEYS_N_QUEUE,$KEYS_N_QUEUE_NEXT,$KEYS_N_TOGGLE_PLAYBACK,$KEYS_N_PLAY_NEXT,$KEYS_N_PLAY_PREV,$KEYS_N_SEEK_FORWARD,$KEYS_N_SEEK_BACKWARD" -export KEYS_PLAY KEYS_QUEUE KEYS_QUEUE_NEXT KEYS_TOGGLE_PLAYBACK \ - KEYS_PLAY_NEXT KEYS_PLAY_PREV KEYS_SEEK_FORWARD KEYS_SEEK_BACKWARD \ - KEYS_PLAYBACK KEYS_N_PLAY KEYS_N_QUEUE KEYS_N_QUEUE_NEXT \ - KEYS_N_TOGGLE_PLAYBACK KEYS_N_PLAY_NEXT KEYS_N_PLAY_PREV \ - KEYS_N_SEEK_FORWARD KEYS_N_SEEK_BACKWARD KEYS_N_PLAYBACK - -# Playlist (in the playlist, there is no `insert` mode): -KEYS_PLAYLIST_RELOAD="${KEYS_PLAYLIST_RELOAD:-"r,ctrl-r"}" -KEYS_PLAYLIST_REMOVE="${KEYS_PLAYLIST_REMOVE:-"x,delete"}" -KEYS_PLAYLIST_UP="${KEYS_PLAYLIST_UP:-"u"}" -KEYS_PLAYLIST_DOWN="${KEYS_PLAYLIST_DOWN:-"d"}" -KEYS_PLAYLIST_CLEAR="${KEYS_PLAYLIST_CLEAR:-"C"}" -KEYS_PLAYLIST_CLEAR_ABOVE="${KEYS_PLAYLIST_CLEAR_ABOVE:-"U"}" -KEYS_PLAYLIST_CLEAR_BELOW="${KEYS_PLAYLIST_CLEAR_BELOW:-"D"}" -KEYS_PLAYLIST_SHUFFLE="${KEYS_PLAYLIST_SHUFFLE:-"s"}" -KEYS_PLAYLIST_UNSHUFFLE="${KEYS_PLAYLIST_UNSHUFFLE:-"S"}" -KEYS_PLAYLIST_GOTO_RELEASE="${KEYS_PLAYLIST_GOTO_RELEASE:-"ctrl-g"}" -KEYS_PLAYLIST_STORE="${KEYS_PLAYLIST_STORE:-"ctrl-s"}" -KEYS_PLAYLIST_LOAD="${KEYS_PLAYLIST_LOAD:-"ctrl-o"}" -export KEYS_PLAYLIST_RELOAD KEYS_PLAYLIST_REMOVE KEYS_PLAYLIST_UP \ - KEYS_PLAYLIST_DOWN KEYS_PLAYLIST_CLEAR KEYS_PLAYLIST_CLEAR_ABOVE \ - KEYS_PLAYLIST_CLEAR_BELOW KEYS_PLAYLIST_SHUFFLE KEYS_PLAYLIST_UNSHUFFLE \ - KEYS_PLAYLIST_GOTO_RELEASE KEYS_PLAYLIST_STORE KEYS_PLAYLIST_LOAD +# Print view-dependent keybindings +# +# @argument $1: view +# +# This method pretty-prints the keybindings active at the given view. +print_keybindings() { + view=$1 + case "$view" in + "$VIEW_SELECT_ARTIST") ;; + "$VIEW_PLAYLIST") ;; + *) + __keybindinggroup_from_args "Switch between modes" \ + "$KEYS_I_NORMAL" "Swtich to normal mode (insert)" \ + "$KEYS_N_INSERT" "Swtich to insert mode (normal)" + __keybindinggroup_from_args "Previews" \ + "$KEYS_SCROLL_PREVIEW_DOWN" "Scroll preview down" \ + "$KEYS_SCROLL_PREVIEW_UP" "Scroll preview up" \ + "$KEYS_KEYBINDINGS" "Show these keybindings" \ + "$KEYS_PREVIEW_OPEN" "Open preview window" \ + "$KEYS_PREVIEW_CLOSE" "Close preview window" + __keybindinggroup_from_args "Navigation" \ + "$KEYS_DOWN" "Down" \ + "$KEYS_UP" "Up" \ + "$KEYS_N_DOWN" "Down (normal)" \ + "$KEYS_N_UP" "Up (normal)" \ + "$KEYS_HALFPAGE_DOWN" "Down half a page" \ + "$KEYS_HALFPAGE_UP" "Up half a page" \ + "$KEYS_N_TOP" "Go to first entry (normal)" \ + "$KEYS_N_BOT" "Go to last entry (normal)" \ + "$KEYS_IN" "Open selected item" \ + "$KEYS_N_IN" "Open selected item (normal)" \ + "$KEYS_OUT" "Leave current item" \ + "$KEYS_N_OUT" "Leave current item (normal)" \ + "$KEYS_SELECT_ARTIST" "Go to artist of selected item" + __keybindinggroup_from_args "Views" \ + "$KEYS_LIST_ARTISTS" "Display artists in local database" \ + "$KEYS_LIST_ALBUMS" "Display albums in local database" \ + "$KEYS_SEARCH_ARTIST" "Show artist on MusicBrainz" \ + "$KEYS_SEARCH_ALBUM" "Show album on MusicBrainz" \ + "$KEYS_SWITCH_ARTIST_ALBUM" "Swtich artist / album" \ + "$KEYS_SWITCH_LOCAL_REMOTE" "Swtich local database / MusicBrainz" + __keybindinggroup_from_args "Filtering" \ + "$KEYS_FILTER_LOCAL" "Show only entries in local database" \ + "$KEYS_FILTER_0" "Clear filter" \ + "$KEYS_FILTER_1" "Reset filter to default for current view" \ + "$KEYS_FILTER_2" "Custom filter" \ + "$KEYS_FILTER_3" "Custom filter" \ + "$KEYS_FILTER_4" "Custom filter" \ + "$KEYS_FILTER_5" "Custom filter" \ + "$KEYS_FILTER_6" "Custom filter" \ + "$KEYS_FILTER_7" "Custom filter" \ + "$KEYS_FILTER_8" "Custom filter" \ + "$KEYS_FILTER_9" "Custom filter" + __keybindinggroup_from_args "Playback" \ + "$KEYS_PLAY" "Play selected item" \ + "$KEYS_QUEUE" "Queue selected item" \ + "$KEYS_QUEUE_NEXT" "Play selected item next" \ + "$KEYS_TOGGLE_PLAYBACK" "Toggle playback" \ + "$KEYS_PLAY_NEXT" "Play next track" \ + "$KEYS_PLAY_PREV" "Play previous track" \ + "$KEYS_SEEK_FORWARD" "Seek forward" \ + "$KEYS_SEEK_BACKWARD" "Seek backward" + __keybindinggroup_from_args "Playback (normal)" \ + "$KEYS_N_PLAY" "Play selected item" \ + "$KEYS_N_QUEUE" "Queue selected item" \ + "$KEYS_N_QUEUE_NEXT" "Play selected item next" \ + "$KEYS_N_TOGGLE_PLAYBACK" "Toggle playback" \ + "$KEYS_N_PLAY_NEXT" "Play next track" \ + "$KEYS_N_PLAY_PREV" "Play previous track" \ + "$KEYS_N_SEEK_FORWARD" "Seek forward" \ + "$KEYS_N_SEEK_BACKWARD" "Seek backward" + __keybindinggroup_from_args "Special operations" \ + "$KEYS_SHOW_PLAYLIST" "Show playlist" \ + "$KEYS_BROWSE" "Open selected item in browser" \ + "$KEYS_OPEN" "Open selected item in file manager" \ + "$KEYS_N_YANK" "Copy selected MusicBrainz ID (normal)" \ + "$KEYS_YANK_CURRENT" "Copy current MusicBrainz ID" \ + "$KEYS_QUIT" "Quit applicaion" \ + "$KEYS_N_QUIT" "First view or quit (normal)" + ;; + esac +} diff --git a/src/sh/preview.sh b/src/sh/preview.sh index 1df3fc4..58ead9c 100644 --- a/src/sh/preview.sh +++ b/src/sh/preview.sh @@ -46,3 +46,8 @@ preview_artist() { #link=$(printf "More info:\033]8;;%s\033\\ %s\033]8;;\033\\" "https://musicbrainz.org/" "[MusicBrainz]") printf "$APV_FORMAT" "$desc" "${lifespan:-}" } + +# Print message if there is nothing to be shown +preview_nothing() { + echo "No preview available." +} diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 20f81dd..30ed42a 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -6,7 +6,9 @@ # Colors (internal only) ESC=$(printf '\033') +BOLD="${ESC}[1m" FAINT="${ESC}[2m" +UNDERLINE="${ESC}[4m" CARTIST="${ESC}[38;5;209m" CTITLE="${ESC}[38;5;229m" CRELINFO="${ESC}[38;5;179m" @@ -16,6 +18,7 @@ CNOTE="${ESC}[38;5;242m" CXXX="${ESC}[38;5;109m" CDESC="${ESC}[38;5;254m" CLIFE="${ESC}[38;5;251m" +CKB="${ESC}[38;5;224m" OFF="${ESC}[m" # Pointers @@ -153,3 +156,13 @@ REC_FORMAT="${REC_FORMAT:-"${CNOTE}${FAINT}<>\t${CNOTE}<>$OFF\t${CTITLE # Format of a track in the playlist REC_FORMAT_NO_NUMBER="${REC_FORMAT_NO_NUMBER:-"${CTITLE}<>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"}" export REC_FORMAT REC_FORMAT_NO_NUMBER + +# Keybinding themes +# ================= +# Format keybinding group +KBF_GROUP="${KBF_GROUP:-"${UNDERLINE}${CKB}%s$OFF"}" +# Format key +KBF_KEY="${KBF_KEY:-"${BOLD}${CKB}%s$OFF"}" +# Format description +KBF_DESC="${KBF_DESC:-"${CKB}%s$OFF"}" +export KBF_GROUP KBF_KEY KBF_DESC