C-strings prefixed to commands (modified by the Makefile), the helper functions are now standalone scripts in the helpers/ dir, which gets added to "$PATH" when running bb.
215 lines
8.1 KiB
BlitzBasic
215 lines
8.1 KiB
BlitzBasic
# This file defines the key bindings for bb
|
|
# The format is: <key>(,<key>)*:[ ]*#<description>(\n[ ]+script)+
|
|
Section: BB Commands
|
|
?,F1: # Show Help menu
|
|
bbcmd help
|
|
q,Q: # Quit
|
|
bbcmd quit
|
|
Ctrl-c: # Send interrupt signal
|
|
kill -INT $PPID
|
|
Ctrl-z: # Suspend
|
|
kill -TSTP $PPID
|
|
Ctrl-\: # Quit and generate core dump
|
|
kill -QUIT $PPID
|
|
|
|
Section: File Navigation
|
|
j,Down: # Next file
|
|
bbcmd move:+1
|
|
k,Up: # Previous file
|
|
bbcmd move:-1
|
|
h,Left: # Parent directory
|
|
bbcmd cd:..
|
|
l,Right: # Enter directory
|
|
if [ -d "$BBCURSOR" ]; then bbcmd cd:"$BBCURSOR"; fi
|
|
Ctrl-f: # Search for file
|
|
file="$(
|
|
find $BBGLOB -mindepth 1 -printf '%P\0' | bbpick "Find: "
|
|
)" && bbcmd goto:"$file"
|
|
/: # Pick a file
|
|
file="$(printf "%s\0" $BBGLOB | bbpick "Pick: ")" || exit
|
|
bbcmd goto:"$file"
|
|
*: # Set the glob
|
|
glob="$(bbask "Show files matching: ")" && bbcmd glob:"$glob"
|
|
Ctrl-g: # Go to directory
|
|
cd="$(bbask "Go to directory: ")" && bbcmd cd:"$cd"
|
|
m: # Mark this directory
|
|
mkdir -p "$XDG_CONFIG_HOME/bb/marks"
|
|
ln -sT "$2" "$XDG_CONFIG_HOME/bb/marks/$1" 2>/dev/null
|
|
mark="$(bbask "Mark: ") && ln -s "$PWD" "$XDG_CONFIG_HOME"/bb/marks/"$mark"
|
|
': # Go to a marked directory
|
|
[ -d "$XDG_CONFIG_HOME"/bb/marks ] || exit
|
|
mark="$(find "$XDG_CONFIG_HOME"/bb/marks/ -mindepth 1 -type l -printf '%P\0' | bbpick "Jump to: ")" &&
|
|
bbcmd cd:"$(readlink -f "$XDG_CONFIG_HOME"/bb/marks/"$mark")"
|
|
-,Backspace: # Go to previous directory
|
|
[ "$BBPREVPATH" ] && bbcmd cd:"$BBPREVPATH"
|
|
;: # Show selected files
|
|
bbcmd cd:'<selection>'
|
|
0: # Go to intitial directory
|
|
bbcmd cd:"$BBINITIALPATH"
|
|
g,Home: # Go to first file
|
|
bbcmd move:0
|
|
G,End: # Go to last file
|
|
bbcmd move:100%n
|
|
PgDn: # Page down
|
|
bbcmd scroll:+100%
|
|
PgUp: # Page up
|
|
bbcmd scroll:-100%
|
|
Ctrl-d: # Half page down
|
|
bbcmd scroll:+50%
|
|
Ctrl-u: # Half page up
|
|
bbcmd scroll:-50%
|
|
Mouse wheel down: # Scroll down
|
|
bbcmd scroll:+3
|
|
Mouse wheel up: # Scroll up
|
|
bbcmd scroll:-3
|
|
|
|
Section: File Selection
|
|
v,V,Space: # Toggle selection at cursor
|
|
bbcmd toggle:"$BBCURSOR"
|
|
Escape: # Clear selection
|
|
bbcmd deselect
|
|
S: # Select pattern
|
|
patt="$(bbask "Select: ")" && bbcmd select: $patt
|
|
U: # Unselect pattern
|
|
patt="$(bbask "Unselect: ")" && bbcmd deselect: $patt
|
|
Ctrl-s: # Save the selection
|
|
[ $# -gt 0 ] && savename="$(bbask "Save selection as: ")" || exit 1
|
|
mkdir -p "$XDG_DATA_HOME"/bb
|
|
if ! expr "$savename" : ".*\.sel" >/dev/null; then savename="$savename.sel"; fi
|
|
printf '%s\0' "$@" > "$XDG_DATA_HOME"/bb/"$savename"
|
|
Ctrl-o: # Open a saved selection
|
|
[ -d "$XDG_DATA_HOME"/bb ] || exit
|
|
[ $# -gt 0 ] && ! bbconfirm "The current selection will be discarded. " && exit 1
|
|
loadpath="$(find "$XDG_DATA_HOME"/bb/ -mindepth 1 -name '*.sel' -printf '%P\0' | bbpick "Load selection: ")" &&
|
|
cat "$XDG_DATA_HOME"/bb/"$loadpath" | bbcmd deselect select:
|
|
J: # Spread selection down
|
|
bbcmd spread:+1
|
|
K: # Spread selection up
|
|
bbcmd spread:-1
|
|
Shift-Home: # Spread the selection to the top
|
|
bbcmd spread:0
|
|
Shift-End: # Spread the selection to the bottom
|
|
bbcmd spread:100%n
|
|
Ctrl-a: # Select all files here
|
|
bbcmd select
|
|
|
|
Section: File Actions
|
|
Left click: # Move cursor to file
|
|
if [ "$BBCLICKED" = "<column label>" ]; then
|
|
bbcmd sort:"~$BBMOUSECOL"
|
|
elif [ "$BBCLICKED" -a "$BBMOUSECOL" = "*" ]; then
|
|
bbcmd toggle:"$BBCLICKED"
|
|
elif [ "$BBCLICKED" ]; then
|
|
bbcmd goto:"$BBCLICKED"
|
|
fi
|
|
Enter,Double left click: # Open file/directory
|
|
if [ -d "$BBCURSOR" ]; then bbcmd cd:"$BBCURSOR";
|
|
elif [ "$(uname)" = "Darwin" ]; then
|
|
if expr "$(file -bI "$BBCURSOR")" : '\(text/\|inode/empty\)' >/dev/null; then $EDITOR "$BBCURSOR";
|
|
else open "$BBCURSOR"; fi
|
|
else
|
|
if expr "$(file -bi "$BBCURSOR")" : '\(text/\|inode/x-empty\)' >/dev/null; then $EDITOR "$BBCURSOR";
|
|
else xdg-open "$BBCURSOR"; fi
|
|
fi
|
|
e: # Edit file in $EDITOR
|
|
$EDITOR "$BBCURSOR" || bbpause
|
|
d,Delete: # Delete
|
|
case "$(bbtargets "$BBCURSOR" "$@")" in
|
|
cursor) set -- "$BBCURSOR" ;;
|
|
both) set -- "$BBCURSOR" "$@" ;;
|
|
esac
|
|
printf "\033[1mDeleting the following:\n\033[33m$(printf ' %s\n' "$@")\033[0m" | bbunscroll | more &&
|
|
bbconfirm && rm -rf "$@" && bbcmd deselect refresh
|
|
Ctrl-v: # Move files here
|
|
printf "\033[1mMoving the following to here:\n\033[33m$(printf ' %s\n' "$@")\033[0m" | bbunscroll | more &&
|
|
bbconfirm && printf "\033[1G\033[KMoving..." && mv -i "$@" . && printf "done." &&
|
|
bbcmd deselect refresh && for f; do bbcmd sel:"$(basename "$f")"; done
|
|
c: # Copy a file
|
|
case "$(bbtargets "$BBCURSOR" "$@")" in
|
|
cursor) set -- "$BBCURSOR";;
|
|
both) set -- "$BBCURSOR" "$@";;
|
|
esac
|
|
[ $# -gt 0 ] || exit
|
|
printf "\033[1mCopying the following to here:\n\033[33m$(printf ' %s\n' "$@")\033[0m" | bbunscroll | more
|
|
bbconfirm && printf "\033[1G\033[KCopying..." &&
|
|
for f; do if [ "./$(basename "$f")" -ef "$f" ]; then
|
|
cp -ri "$f" "$f.copy" || break;
|
|
else cp -ri "$f" . || break; fi; done; printf 'done.' && bbcmd refresh
|
|
Ctrl-n: # New file/directory
|
|
case "$(printf '%s\0' File Directory | bbpick "Create new: ")" in
|
|
File)
|
|
name="$(bbask "New File: ")" && touch -- "$name"
|
|
;;
|
|
Directory)
|
|
name="$(bbask "New Directory: ")" && mkdir -- "$name"
|
|
;;
|
|
*) exit
|
|
;;
|
|
esac && bbcmd goto:"$name" refresh || bbpause
|
|
p: # Page through a file with `less`
|
|
less -XK "$BBCURSOR"
|
|
r,F2: # Rename files
|
|
case "$(bbtargets "$BBCURSOR" "$@")" in
|
|
cursor) set -- "$BBCURSOR";;
|
|
both) set -- "$BBCURSOR" "$@";;
|
|
esac
|
|
for f; do
|
|
newname="$(bbask "Rename $(printf "\033[33m%s\033[39m" "$(basename "$f")"): " "$(basename "$f")")" || break;
|
|
r="$(dirname "$f")/$newname";
|
|
[ "$r" = "$f" ] && continue;
|
|
[ -e "$r" ] && printf "\033[31;1m$r already exists! It will be overwritten.\033[0m "
|
|
&& bbconfirm && { rm -rf "$r" || { bbpause; exit; }; }
|
|
mv "$f" "$r" || { bbpause; exit; }
|
|
bbcmd deselect:"$f" select:"$r";
|
|
[ "$f" = "$BBCURSOR" ] && bbcmd goto:"$r";
|
|
done;
|
|
bbcmd refresh
|
|
Ctrl-r: # Regex rename files
|
|
case "$(bbtargets "$BBCURSOR" "$@")" in
|
|
cursor) set -- "$BBCURSOR";;
|
|
both) set -- "$BBCURSOR" "$@";;
|
|
esac
|
|
command -v rename >/dev/null ||
|
|
{ printf '\033[31;1mThe `rename` command is not installed. Please install it to use this key binding.\033[0m\n'; bbpause; exit; };
|
|
patt="$(bbask "Replace pattern: ") && rep="$(bbask "Replacement: ")" &&
|
|
printf "\033[1mRenaming:\n\033[33m$(if [ $# -gt 0 ]; then rename -nv "$patt" "$rep" "$@"; else rename -nv "$patt" "$rep" *; fi)\033[0m" | bbunscroll | more &&
|
|
bbconfirm || exit 1
|
|
if [ $# -eq 0 ]; then set -- *; ! [ -e "$1" ] && exit; fi
|
|
rename -i "$patt" "$rep" "$@"
|
|
bbcmd deselect refresh
|
|
|
|
Section: Shell Commands
|
|
:: # Run a command
|
|
cmd="$(bbask ':')" && sh -c "$cmd" -- "$@"; bbcmd refresh; bbpause
|
|
|: # Pipe selected files to a command
|
|
cmd="$(bbask '|')" && printf '%s\n' "$@" | sh -c "$cmd"; bbcmd refresh; bbpause
|
|
@: # Pipe selected files to a command
|
|
cmd="$(bbask '@')" && sh -c "$cmd \"$$@\"" -- "$@"; bbcmd refresh; bbpause
|
|
>: # Open a shell
|
|
tput rmcup; tput cvvis; $SHELL; bbcmd refresh
|
|
f: # Resume suspended process
|
|
bbcmd fg
|
|
|
|
Section: Viewing Options
|
|
s: # Sort by...
|
|
sort="$(bbask -1 "Sort (n)ame (s)ize (m)odification (c)reation (a)ccess (r)andom (p)ermissions: ")" &&
|
|
bbcmd sort:"~$sort"
|
|
---,#: # Set columns
|
|
columns="$(bbask "Set columns (*)selected (a)ccessed (c)reated (m)odified (n)ame (p)ermissions (r)andom (s)ize: ")" &&
|
|
bbcmd col:"$columns"
|
|
.: # Toggle dotfile visibility
|
|
if [ "$BBGLOB" = ".* *" ]; then
|
|
bbcmd glob:"*"
|
|
else
|
|
bbcmd glob:".* *"
|
|
fi
|
|
i: # Toggle interleaving files and directories
|
|
bbcmd interleave
|
|
F5,Ctrl-l: # Refresh view
|
|
bbcmd refresh
|
|
Ctrl-b: # Bind a key to a script
|
|
key="$(bbask -1 "Press key to bind...")" && echo && script="$(bbask "Bind script: ")" &&
|
|
bbcmd bind:"$key":"{ $script; } || bbpause" || bbpause
|
|
|
|
Section: User Bindings
|