summaryrefslogtreecommitdiff
path: root/bin/cle
blob: b26d8b7fcb8e728fd7f38961b9803eb506b65201 (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
#!/bin/sh -Ce

clip() { print "$1" | tee /dev/tty | head -n 1 | pbcopy; }

checkpath() { set -- $(realpath "$1"); [ "${1#~/.cle/}" != "$1" ]; }

del() {
	set -- ~/.cle/"$1"
	checkpath "$1" || die "invalid path $1"
	rm -i "$1"
	rmdir -p "${1%/*}" 2>/dev/null || true
}

die() { echo "$@" >&2; exit 1; }

edit() {
	[ "$1" ] || die 'missing argument'
	tmp=$(mktemp) f=~/.cle/"$1"
	trap 'rm -f "$tmp"' EXIT
	print "$1" >| "$tmp" || mkdir -p "${f%/*}"
	[ -s "$tmp" ] || gen >| "$tmp"
	"${EDITOR:-vim}" "$tmp"
	crypt < "$tmp" >| "$f"
}

gen() { LC_ALL=C tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 10; }

list() { cd ~/.cle && find -- * -name .git -prune -o -type f -print; }

print() { [ -f ~/.cle/"$1" ] && crypt -d < ~/.cle/"$1"; }

tui() {
	list | fzf --preview 'cle print {}' \
		--preview-window hidden \
		--header 'Ret Select, Esc Cancel, ^E Edit, ^N New, ^P Preview, ^Del Delete' \
		--bind 'ctrl-delete:execute(cle del {})+reload(cle list)' \
		--bind 'ctrl-e:execute(cle edit {})' \
		--bind 'ctrl-n:execute(cle edit {q})+reload(cle list)' \
		--bind 'ctrl-p:toggle-preview' \
		--query "$1" --select-1 |
		xargs cle clip
}

case $1 in
	(clip|del|edit|gen|list|print)
		cmd=$1; shift; $cmd "$@" ;;
	(*) 
		tui "$@" ;;
esac