# This file defines the key bindings for bb # The format is: (,)*:[ ]*#(\n[ ]+script)+ Section: BB Commands ?,F1: # Show Help menu bb +help q,Q: # Quit bb +quit Section: File Navigation j,Down: # Next file bb +move:+1 k,Up: # Previous file bb +move:-1 h,Left: # Parent directory bb +cd:.. l,Right: # Enter directory [ -d "$BBCURSOR" ] && bb +cd:"$BBCURSOR" Ctrl-f: # Search for file bb +goto:"$( if [ $BBDOTFILES ]; then find -mindepth 1; else find -mindepth 1 ! -path '*/.*'; fi | pick "Find: " )" /: # Pick a file bb +goto:"$( if [ $BBDOTFILES ]; then find -mindepth 1 -maxdepth 1; else find -mindepth 1 -maxdepth 1 ! -path '*/.*'; fi | pick "Pick: " )" Ctrl-g: # Go to directory ask goto "Go to directory: " && bb +cd:"$goto" m: # Mark this directory ask mark "Mark: " && ln -s "$PWD" ~/.config/bb/marks/"$mark" ': # Go to a marked directory mark="$(ls ~/.config/bb/marks | pick "Jump to: ")" && bb +cd:"$(readlink -f ~/.config/bb/marks/"$mark")" -,Backspace: # Go to previous directory [ $BBPREVPATH ] && bb +cd:"$BBPREVPATH" ;: # Show selected files bb +cd:'' 0: # Go to intitial directory bb +cd:"$BBINITIALPATH" g,Home: # Go to first file bb +move:0 G,End: # Go to last file bb +move:100%n PgDn: # Page down bb +scroll:+100% PgUp: # Page up bb +scroll:-100% Ctrl-d: # Half page down bb +scroll:+50% Ctrl-u: # Half page up bb +scroll:-50% Mouse wheel down: # Scroll down bb +scroll:+3 Mouse wheel up: # Scroll up bb +scroll:-3 Section: File Selection v,V,Space: # Toggle selection at cursor bb +toggle Escape: # Clear selection [ $# -gt 0 ] && bb +deselect: "$@" Ctrl-s: # Save the selection [ $# -gt 0 ] && ask savename "Save selection as: " && printf '%s\0' "$@" > ~/.config/bb/"$savename" Ctrl-o: # Open a saved selection loadpath="$(find ~/.config/bb -maxdepth 1 -type f | pick "Load selection: ")" && [ -e "$loadpath" ] && bb +deselect: "$@" && while IFS= read -r -d $'\0'; do bb +select:"$REPLY"; done < "$loadpath" J: # Spread selection down bb +spread:+1 K: # Spread selection up bb +spread:-1 Ctrl-a: # Select all files here if [ $BBDOTFILES ]; then find -mindepth 1 -maxdepth 1 -print0; else find -mindepth 1 -maxdepth 1 ! -path '*/.*' -print0; fi | bb +sel: Section: File Actions Enter,Double left click: # Open file/directory if [ "$(uname)" = "Darwin" ]; then if [ -d "$BBCURSOR" ]; then bb +cd:"$BBCURSOR"; elif file -bI "$BBCURSOR" | grep -q '^\(text/\|inode/empty\)'; then $EDITOR "$BBCURSOR"; else open "$BBCURSOR"; fi else if [ -d "$BBCURSOR" ]; then bb +cd:"$BBCURSOR"; elif file -bi "$BBCURSOR" | grep -q '^\(text/\|inode/empty\)'; then $EDITOR "$BBCURSOR"; else xdg-open "$BBCURSOR"; fi fi e: # Edit file in $EDITOR $EDITOR "$BBCURSOR" || pause d: # Delete a file printf "\033[1mDeleting \033[33m$BBCURSOR\033[0;1m...\033[0m " && confirm && rm -rf "$BBCURSOR" && bb +deselect:"$BBCURSOR" && bb +refresh D: # Delete all selected files [ $# -gt 0 ] && printf "\033[1mDeleting the following:\n \033[33m$(printf ' %s\n' "$@")\033[0m" | more && confirm && rm -rf "$@" && bb +deselect: "$@" && bb +refresh Ctrl-v: # Move files here printf "\033[1mMoving the following to here:\n \033[33m$(printf ' %s\n' "$@")\033[0m" | more && confirm && spin mv -i "$@" . && bb +refresh && bb +deselect:"$@" && for f; do bb +sel:"$(basename "$f")"; done || pause c: # Copy a file printf "\033[1mCreating copy of \033[33m$BBCURSOR\033[0;1m...\033[0m " && confirm && cp -ri "$BBCURSOR" "$BBCURSOR.copy" && bb +refresh C: # Copy all selected files here [ $# -gt 0 ] && printf "\033[1mCopying the following to here:\n \033[33m$(printf ' %s\n' "$@")\033[0m" | more && confirm && for f; do if [ "./$(basename "$f")" -ef "$f" ]; then spin cp -ri "$f" "$f.copy"; else spin cp -ri "$f" .; fi; done; bb +refresh Ctrl-n: # New file/directory case "$(printf '%s\n' File Directory | pick "Create new: ")" in File) ask name "New File: " || exit touch "$name" ;; Directory) ask name "New Directory: " || exit mkdir "$name" ;; *) exit ;; esac && bb +goto:"$name" +refresh || pause p: # Page through a file with $PAGER $PAGER "$BBCURSOR" |: # Pipe selected files to a command ask cmd '|' && printf '%s\n' "$@" | sh -c "$BBSHELLFUNC$cmd"; bb +r; pause :: # Run a command ask cmd ':' && sh -c "$BBSHELLFUNC$cmd" -- "$@"; bb +r; pause >: # Open a shell tput rmcup; $SHELL; bb +r r,F2: # Rename a file ask newname "Rename \033[33m$(basename "$BBCURSOR")\033[39m: " "$(basename "$BBCURSOR")" || exit r="$(dirname "$BBCURSOR")/$newname" || exit [ "$r" != "$BBCURSOR" ] && mv -i "$BBCURSOR" "$r" && bb +refresh && while [ $# -gt 0 ]; do "$1" = "$BBCURSOR" && bb +deselect:"$BBCURSOR" +select:"$r"; shift; done && bb +goto:"$r" R: # Rename all selected files bb +refresh; for f; do ask newname "Rename \033[33m$(basename "$f")\033[39m: " "$(basename "$f")" || break; r="$(dirname "$f")/$newname"; [ "$r" != "$f" ] && mv -i "$f" "$r" && bb "+deselect:$f" "+select:$r"; [ "$f" = "$BBCURSOR" ] && bb +goto:"$r"; done Ctrl-r: # Regex rename files command -v rename >/dev/null || { echo 'The `rename` command is not installed. Please install it to use this key binding.'; pause; exit; }; ask patt "Replace pattern: " && ask rep "Replacement: " && printf "\033[1mRenaming:\n\033[33m$(if [ $# -gt 0 ]; then rename -nv "$patt" "$rep" "$@"; else rename -nv "$patt" "$rep" *; fi)\033[0m" | more && confirm && if [ $# -gt 0 ]; then rename -i "$patt" "$rep" "$@"; else rename -i "$patt" "$rep" *; fi; bb +deselect: "$@"; bb +refresh Section: Viewing Options s: # Sort by... ask1 sort "Sort (n)ame (s)ize (m)odification (c)reation (a)ccess (r)andom (p)ermissions: " && bb +sort:"~$sort" +refresh ---,#: # Set columns ask columns "Set columns (*)selected (a)ccessed (c)reated (m)odified (n)ame (p)ermissions (r)andom (s)ize: " && bb +col:"$columns" .: # Toggle dotfile visibility bb +dotfiles i: # Toggle interleaving files and directories bb +interleave F5: # Refresh view bb +refresh Ctrl-b: # Bind a key to a script ask1 key "Press key to bind..." && echo && ask script "Bind script: " && bb +bind:"$(printf "$key:$script")" Section: User Bindings