From 35521af0ecf0f76bd76a9be4042a5449efb5cbc1 Mon Sep 17 00:00:00 2001 From: Chris Down Date: Mon, 27 Jul 2015 19:58:05 -0700 Subject: [PATCH 1/5] Make sure that the clipboard data is not just whitespace before copying This avoids getting a bad array subscript, and polluting the menu. Thanks to @kaihendry for noticing this issue and suggesting a fix. This commit is a modified version of his suggestion, using [:blank:] instead of [:space:]. Closes #7. --- clipmenud | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clipmenud b/clipmenud index cf55b04..5eb2bd9 100755 --- a/clipmenud +++ b/clipmenud @@ -15,7 +15,7 @@ while sleep 1; do data=${data%x} - [[ $data ]] || continue + [[ $data == *[^[:blank:]]* ]] || continue [[ ${last_data[$selection]} == "$data" ]] && continue last_data[$selection]=$data From 5b2754868b88c143f44a97163cbf4d7e93ccbd35 Mon Sep 17 00:00:00 2001 From: Chris Down Date: Mon, 27 Jul 2015 20:01:41 -0700 Subject: [PATCH 2/5] Make clipmenu cache directory user-specific Fixes #2. --- clipmenu | 2 +- clipmenud | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clipmenu b/clipmenu index 27d963b..579bfe4 100755 --- a/clipmenu +++ b/clipmenu @@ -4,7 +4,7 @@ dmenu_lines=${CLIPMENU_LINES-8} declare -A selections -for file in /tmp/clipmenu/*; do +for file in /tmp/clipmenu.$USER/*; do first_line=$(sed -n '/./{p;q}' "$file") lines=$(wc -l "$file") diff --git a/clipmenud b/clipmenud index 5eb2bd9..bbbeadf 100755 --- a/clipmenud +++ b/clipmenud @@ -1,6 +1,6 @@ #!/bin/bash -cache_dir=/tmp/clipmenu/ +cache_dir=/tmp/clipmenu.$USER/ mkdir -p "$cache_dir" declare -A last_data From 0418bf2e6db9b2c9722e580ff689b4b8c2c1f198 Mon Sep 17 00:00:00 2001 From: Chris Down Date: Sun, 12 Apr 2015 18:51:46 +0100 Subject: [PATCH 3/5] Sort selections by recency Fixes #5. --- clipmenu | 15 +++++++++++++-- clipmenud | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/clipmenu b/clipmenu index 579bfe4..7267c06 100755 --- a/clipmenu +++ b/clipmenu @@ -1,10 +1,17 @@ #!/bin/bash +LC_COLLATE=C + dmenu_lines=${CLIPMENU_LINES-8} declare -A selections +ordered_selections=() + +files=("/tmp/clipmenu.$USER/"*) + +for (( i=${#files[@]}-1; i>=0; i-- )); do + file=${files[$i]} -for file in /tmp/clipmenu.$USER/*; do first_line=$(sed -n '/./{p;q}' "$file") lines=$(wc -l "$file") @@ -14,10 +21,14 @@ for file in /tmp/clipmenu.$USER/*; do first_line+=" ($lines lines)" fi + ordered_selections+=("$first_line") selections[$first_line]=$file done -chosen_line=$(printf '%s\n' "${!selections[@]}" | dmenu -l "$dmenu_lines" "$@") +chosen_line=$( + printf '%s\n' "${ordered_selections[@]}" | + awk '!x[$0]++' | dmenu -l "$dmenu_lines" "$@" +) [[ $chosen_line ]] || exit 1 diff --git a/clipmenud b/clipmenud index bbbeadf..4dfc8fe 100755 --- a/clipmenud +++ b/clipmenud @@ -23,6 +23,6 @@ while sleep 1; do md5=$(md5sum <<< "$data") md5=${md5%% *} - printf '%s' "$data" > "$cache_dir/$md5" + printf '%s' "$data" > "$cache_dir/$(LC_ALL=C date +%F-%H-%M-%S)-$md5" done done From d246b63f2700e26809e6b8d5e07834e298fcc0e9 Mon Sep 17 00:00:00 2001 From: Chris Down Date: Mon, 27 Jul 2015 20:16:13 -0700 Subject: [PATCH 4/5] Set perms to 0700 when creating cache dir --- clipmenud | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clipmenud b/clipmenud index 4dfc8fe..ec30e29 100755 --- a/clipmenud +++ b/clipmenud @@ -1,7 +1,7 @@ #!/bin/bash cache_dir=/tmp/clipmenu.$USER/ -mkdir -p "$cache_dir" +mkdir -p -m0700 "$cache_dir" declare -A last_data From d4390324f535faae2db6316facfd051d53646d21 Mon Sep 17 00:00:00 2001 From: Chris Down Date: Mon, 27 Jul 2015 20:19:41 -0700 Subject: [PATCH 5/5] Document why we add/remove an "x" when grabbing the clipboard data --- clipmenud | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clipmenud b/clipmenud index ec30e29..c37169f 100755 --- a/clipmenud +++ b/clipmenud @@ -13,6 +13,9 @@ while sleep 1; do data=$(xclip -o -sel "$selection"; printf x) fi + # We add and remove the x so that trailing newlines are not stripped. + # Otherwise, they would be stripped by the very nature of how POSIX + # defines command substitution. data=${data%x} [[ $data == *[^[:blank:]]* ]] || continue