aboutsummaryrefslogtreecommitdiff
path: root/bindings.bb
blob: 36882286654f68a825c1e18eea4a4c350efaa984 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# 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
~: # 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
    set -e
    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
    if [ $# -eq 0 ]; then set -- *; [ -e "$1" ] || exit 1; 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