diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/bbbindkeys | 318 | ||||
| -rwxr-xr-x | scripts/bbstartup | 6 |
2 files changed, 319 insertions, 5 deletions
diff --git a/scripts/bbbindkeys b/scripts/bbbindkeys new file mode 100755 index 0000000..8ffadc0 --- /dev/null +++ b/scripts/bbbindkeys @@ -0,0 +1,318 @@ +#!/bin/sh +# This file defines the key bindings for bb. It works by a very hacky script on +# the line below that prints out the rest of this file, converted into `bbcmd +# bind:` commands. Thanks to the hackiness, the code below is also valid shell +# code, so syntax highlighting should work normally. +# +# The format is: ## <key>(,<key>)*:[ ]+<description>(\n script)+ +# +# May God have mercy on my soul for creating this abomination: +sed '1,'$LINENO'd; /^$/d; s/^## \(.*\): \(.*\)/\x00bind:\1:# \2/; $a\\x00' "$0" | bbcmd; exit + +## 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: ")" +bbcmd goto:"$file" + +## *: Set the glob +glob="$(bbask "Show files matching: ")" +bbcmd glob:"$glob" + +## Ctrl-g: Go to directory +dir="$(bbask "Go to directory: ")" +bbcmd cd:"$dir" + +## 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 ] +mark="$(find "$XDG_CONFIG_HOME"/bb/marks/ -mindepth 1 -type l -printf '%P\0' | bbpick "Jump to: ")" +mark="$(readlink -f "$XDG_CONFIG_HOME"/bb/marks/"$mark")" +bbcmd cd:"$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: ")" +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 ] +[ $# -gt 0 ] && bbconfirm "The current selection will be discarded. " +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" + +## 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 ] +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 + +## 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 + +## ~: Regex rename files +if ! command -v rename >/dev/null; then + printf '\033[31;1mThe `rename` command is not installed. Please install it to use this key binding.\033[0m\n' + bbpause; exit 1 +fi +if [ $# -eq 0 ]; then set -- $BBGLOB; fi +patt="$(bbask "Replace pattern: ")" +rep="$(bbask "Replacement: ")" +printf "\033[1mRenaming:\n\033[33m$(rename -nv "$patt" "$rep" "$@")\033[0m" | bbunscroll | more +bbconfirm +rename -i "$patt" "$rep" "$@" +bbcmd deselect refresh + + +## Section: Shell Commands +## Colon: Run a command +cmd="$(bbask ':')" +sh -c "$cmd" -- "$@" || true +bbpause +bbcmd refresh + +## |: Pipe selected files to a command +cmd="$(bbask '|')" +if [ $# -eq 0 ]; then set -- "$BBCURSOR"; fi +printf '%s\n' "$@" | sh -c "$cmd" || true +bbpause +bbcmd refresh + +## @: Pass selected files as args to a command +cmd="$(bbask '@')" +if [ $# -eq 0 ]; then set -- "$BBCURSOR"; fi +sh -c "$cmd \"\$@\"" -- "$@" || true +bbpause +bbcmd refresh + +## $: Pass the cursor as an argument to a command +cmd="$(bbask '$')" +sh -c "$cmd \"\$1\"" -- "$BBCURSOR" || true +bbpause +bbcmd refresh + +## >: Open a shell +tput rmcup; tput cvvis +$SHELL || true +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" + + +## Section: User Bindings diff --git a/scripts/bbstartup b/scripts/bbstartup index 40de50b..21d04e3 100755 --- a/scripts/bbstartup +++ b/scripts/bbstartup @@ -4,11 +4,7 @@ [ ! -d "$XDG_DATA_HOME/bb" ] && mkdir -p "$XDG_DATA_HOME/bb" # Load key bindings -if [ "$BBPATH" ]; then - cat "$BBPATH/bindings.bb" "$XDG_CONFIG_HOME/bb/bindings.bb" -else - cat "$sysconfdir/xdg/bb/bindings.bb" "$XDG_CONFIG_HOME/bb/bindings.bb" -fi 2>/dev/null | awk '/^#/ {next} /^[^ ]/ {printf "\0bind:"} {print $0} END {printf "\0"}' >> "$BBCMD" +bbbindkeys if [ -e "$XDG_DATA_HOME/bb/settings.sh" ]; then . "$XDG_DATA_HOME/bb/settings.sh" |
