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
|
# It might be possible to attempt to share KBDs between `lf` and `dired`.
# Currently shared KBDs with `dired`:
# - D: delete file
# - R: rename file
# - +: create directory
# - c: create file
#
# The following command prefixes are used by lf (taken from the docs):
#
# : read (default) builtin/custom command
# $ shell shell command
# % shell-pipe shell command running with the ui
# ! shell-wait shell command waiting for key press
# & shell-async shell command running asynchronously
# / search search file in current directory
# ? search-back search file in the reverse order
# TODO: move most of these commands to function.zsh and call those functions
# herein. Especially the `archive` and `extract` functions.
#
# TODO: consider integrations with `xdg-open` and configuring filetypes to
# behave in expected "dwim" ways.
#
# TODO: learn more about the terms "archive", "compress", "decompress",
# "expand", "extract", etc. See if a larger abstraction can be created on top
# without sacrificing too much nuance. This might be the case of "serialize",
# "deserialize", "pickle", "unpickle", "marshal", "unmarshal", "encode",
# "decode" -- in which case, a broader abstraction would be nice to decrease the
# surface area of the vocabulary.
#
# TODO: find a way to visualize all of the bound or unbound KBDs.
#
# TODO: support polymorphic way encrypt/decrypt a file or directory.
#
# TODO: support "toggle" for encryption/decryption that detects which function
# to run based on the extension.
#
# TODO: support "toggle" for archive/unarchive that detects which function to
# run based on the extension.
# Arguably the most import function herein
cmd help $lf -doc | less
# delete a file, dir
map D delete
cmd rename %{{
# Renames files, dirs.
set -f
if [ -e "$1" ]; then
printf 'file exists'
else
mv "$f" "$1"
fi
}}
map R push :rename<space>
cmd mkdir %{{
mkdir -p "$1"
}}
map + push :mkdir<space>
cmd touch %{{
# Create a file
touch "$1"
}}
map c push :touch<space>
cmd encrypt_file %{{
# Encrypts the file and deletes the cleartext version.
# Run `decrypt_file` to return the file to its cleartext version.
printf "recipient: "
read recipient
gpg --encrypt --recipient "$recipient" "$f" && rm "$f"
}}
cmd decrypt_file %{{
# Decrypts a file that was encrypted with `encrypt_file`.
# Assumes encrypted files have the .gpg extension and decrypted files omit the
# .gpg extension.
# Deletes the original .gpg file when finished.
# check if file exists without .gpg extension
if [ -e "${f%.gpg}" ]; then
printf "${f%.gpg} exists. Consider deleting or renaming it. Aborting..."
else
gpg --decrypt "$f" >"${f%.gpg}" 2>/dev/null && rm "$f"
fi
}}
cmd archive %{{
# Generic function for archiving directories.
# TODO: support selections of multiple files.
set -f
printf "Which type of archive would you like to create? (tar,tar.gz,zip) "
read answer
case $answer in
tar.gz) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";;
tar) tar -cf "$f.tar" "$(basename $f)"; rm -rf "$f";;
zip) zip -r "$f.zip" "$(basename $f)"; rm -rf "$f";;
*) printf "\"$1\" is not a support archive. Aborting..."
esac
}}
cmd unarchive %{{
# Generic function for extracting archived directories.
# Assumes directories were archived with the `archive`.
set -f
case $f in
*.tar.gz) tar -xzvf $f; rm "$f";;
*.tar) tar -xvf $f; rm "$f";;
*.zip) unzip "$f"; rm "$f";;
# TODO: grab extension from $f and display it in `printf` call.
*) printf "Unsupported archive type. Aborting..."
esac
}}
cmd tar %{{
# tars a directory
set -f
printf "gzip? (y,n) "
read answer
case $answer in
y) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";;
n) tar -cf "$f.tar" "$(basename $f)"; rm -rf "$f";;
*) printf "\"$answer\" is not a supported answer. Aborting...";;
esac
}}
cmd untar %{{
# untars a directory tar'd with `tar`.
set -f
case $f in
*.tar.gz) tar -xzvf $f; rm "$f";;
*.tar) tar -xvf $f; rm "$f";;
esac
}}
cmd zip %{{
# zip a directory
set -f
zip -r "$f.zip" "$(basename $f)"
rm -rf "$f"
}}
cmd unzip %{{
# unzip a directory
set -f
unzip "$f"
rm "$f"
}}
|