summaryrefslogtreecommitdiff
path: root/scripts/clip
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/clip')
-rwxr-xr-xscripts/clip63
1 files changed, 63 insertions, 0 deletions
diff --git a/scripts/clip b/scripts/clip
new file mode 100755
index 0000000..b7bab10
--- /dev/null
+++ b/scripts/clip
@@ -0,0 +1,63 @@
1#!/bin/sh
2
3# A primitive clipboard manager. Saves the current selection and clipboard
4# to a temporary file and shows all saved selections in dmenu for the user
5# to select one. Duplicate selections are avoided.
6
7# Bugs (wontfix): the program fails if it can't create the temporary
8# directory with the designated name.
9
10# Usage: clip [-m menu]
11
12# Requires: xsel, dmenu (or similar)
13
14menu="dmenu -i -l 25"
15
16usage() {
17 echo "Usage: clip [-m MENU]"
18}
19
20while getopts "m:" opt; do
21 case "$opt" in
22 m)
23 menu="$OPTARG"
24 ;;
25 *)
26 usage
27 exit 1
28 ;;
29 esac
30done
31shift "$((OPTIND - 1))"
32
33dir="/tmp/clipdir"
34mkdir -p "$dir"
35
36file1="$(mktemp -p "$dir" "$(date +%s)".XXXXXX)"
37file2="$(mktemp -p "$dir" "$(date +%s)"b.XXXXX)"
38echo "created $file1"
39echo "created $file2"
40xsel > "$file1"
41xsel -b > "$file2"
42
43# Avoid duplicates
44for f in "$dir"/*; do
45 [ "$f" != "$file1" ] && if diff "$f" "$file1"; then rm "$file1"; fi
46 [ "$f" != "$file2" ] && if diff "$f" "$file2"; then rm "$file2"; fi
47done
48
49list="$(mktemp)"
50ls "$dir" > "$list";
51
52lines="$(mktemp)"
53for f in "$dir"/*; do
54 nlines="$(wc -l "$f" | awk '{print $1}')"
55 fclean="$(echo "$f" | sed "s|$dir\/||")"
56 printf '%s (%s) | %s\n' \
57 "$fclean" "$((1+nlines))" "$(head -n 1 "$f")" >> "$lines"
58done
59
60selected=$(sort -r "$lines" | $menu | awk '{print $1}')
61if [ -n "$selected" ]; then
62 xsel -ib < "$dir/$selected"
63fi

Generated with cgit - Back to sebastiano.tronto.net