aboutsummaryrefslogtreecommitdiff
path: root/scripts/bbkeys
blob: 87934c0e762eba773f289e8b4a9d69bead608c59 (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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
#!/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 "$BB" ]; then bbcmd cd:"$BB";
elif [ -L "$BB" ]; then bbcmd goto:"$(readlink -f "$BB")"; fi

## Ctrl-f: Search for file
file="$(find . -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
bbcmd cd:-

## +,=: Go to next directory
bbcmd cd:+

## ;: Show selected files
printf '%s\n' "$@" | less

## 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:"$BB"

## Escape: Clear selection
bbcmd deselect

## S: Select pattern
patt="$(bbask "Select: ")"
bbcmd select: $patt

## U: Unselect pattern
patt="$(bbask "Unselect: ")"
bbcmd deselect: $patt

## Comma: Save the current settings
bbconfirm "Save the current settings? "
echo "bbcmd glob:'$BBGLOB' sort:'$BBSORT' columns:'$BBCOLUMNS' $BBINTERLEAVE" > "$XDG_DATA_HOME"/bb/settings.sh

## Ctrl-s: Save the selection
savename="$(bbask "Save selection as: ")"
savedir="$XDG_DATA_HOME/bb/${savename%.sel}.sel"
! [ -d "$savedir" ] || bbconfirm "Do you want to overwrite the existing save? "
rm -rf "$savedir"
[ $# -gt 0 ] && mkdir -p "$savedir"
for f; do ln -sT "$f" "$savedir/${f##*/}" || exit 1; done
echo "Saved."
bbpause

## 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 -maxdepth 1 -name '*.sel' -printf '%P\0' | bbpick "Load selection: ")"
find "$XDG_DATA_HOME/bb/$loadpath" -mindepth 1 -maxdepth 1 -printf '%l\0' | bbcmd deselect select:
bbcmd goto

## 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 "$BB" ]; then bbcmd cd:"$BB"
elif [ "$(uname)" = "Darwin" ]; then
    if expr "$(file -bI "$BB")" : '\(text/\|inode/empty\)' >/dev/null; then $EDITOR "$BB"
    else open "$BB"; fi
else
    if expr "$(file -bi "$BB")" : '\(text/\|inode/x-empty\)' >/dev/null; then $EDITOR "$BB"
    else xdg-open "$BB"; fi
fi

## e: Edit file in $EDITOR
$EDITOR "$BB"

## d,Delete: Delete
case "$(bbtargets "$BB" "$@")" in
    cursor) set -- "$BB" ;;
    both) set -- "$BB" "$@" ;;
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
bbcmd sel: "${@##*/}"

## c: Copy a file
[ $# -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 [ "./${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: ")" && printf '' >"$name"
        ;;
    Directory)
        name="$(bbask "New Directory: ")" && mkdir -- "$name"
        ;;
    *) exit
        ;;
esac
bbcmd goto:"$name" refresh

## p: Page through a file with `less`
less -XK "$BB"

## r,F2: Rename files
case "$(bbtargets "$BB" "$@")" in
    cursor) set -- "$BB";;
    both) set -- "$BB" "$@";;
esac
for f; do
    newname="$(bbask "Rename $(printf "\033[33m%s\033[39m" "${f##*/}"): " "${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" = "$BB" ] && 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 -- "$BB"; 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 -- "$BB"; fi
sh -c "$cmd \"\$@\"" -- "$@" || true
bbpause
bbcmd refresh

## $: Pass the cursor as an argument to a command
cmd="$(bbask '$')"
sh -c "$cmd \"\$1\"" -- "$BB" || 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,Ctrl-r: 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