diff --git a/README.md b/README.md index 2ef3f6d..144e7d8 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,15 @@ - An implementation of POSIX Utilities (`coreutils`, `bsdutils`, `busybox`, ...) - An implementation of `file(1)` that supports `-b` and `-i` for mime-types (yours should) - `ed` (mentioning this separately since many unixes/distributions have it separately) +- [`clipnotify`](https://github.com/cdown/clipnotify) - A newline-delimited menu program (`dmenu`, `rofi`, `bemenu`, `fzfmenu`, ...) - (Optional, but recommended) `notify-send` ## using put `shclip-{daemon,menu}` in your `$PATH` and start `shclip-daemon` in a way where it can read `$DISPLAY`. everything should Just Work, hopefully. to use the menu, run `shclip-menu` +to see the command-line opticons for `shclip-daemon`, run `shclip-daemon -h` + `shclip` reads a config file at `$XDG_CONFIG_HOME/shclip/config` and reads filters from `$XDG_CONFIG_HOME/shclip/filter.sh`. if `config` doesn't exist, then the defaults as specified in the file are used. if `filter.sh` doesn't exist, then filtering won't happen whether it's enabled or not. if filtering is enabled, every text clip will be sent to the stdin of `filter.sh` and be replaced by its stdout. A simple replacement filter is provided as an example diff --git a/shclip-daemon b/shclip-daemon index d45eaac..4a2c1fd 100755 --- a/shclip-daemon +++ b/shclip-daemon @@ -22,10 +22,13 @@ SHCLIP_TEMP_DIR="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}/shclip-$USER-$DISPLAY" errecho() { printf '%s\n' "$*" >&2; } exists() { command -v "$@" >/dev/null 2>&1; } - +notify() { + errecho "$*" + exists notify-send && notify-send "$*" + : +} fail() { - errecho "error: $BN: $*" - exists notify-send && notify-send "error: $BN: $*" + notify "error: $BN: $*" exit 1 } @@ -41,12 +44,10 @@ cleanup() { toggle() { if [ -z "$SHCLIP_ENABLED" ]; then SHCLIP_ENABLED=1 - errecho "shclip enabled!" - exists notify-send && notify-send "shclip enabled!" + notify "shclip enabled!" else SHCLIP_ENABLED="" - errecho "shclip disabled!" - exists notify-send && notify-send "shclip disabled!" + notify "shclip disabled!" fi kill "$clipnotify_pid" } @@ -54,12 +55,10 @@ toggle() { filter_toggle() { if [ -z "$SHCLIP_FILTER_ENABLED" ]; then SHCLIP_FILTER_ENABLED=1 - errecho "shclip filter enabled!" - exists notify-send && notify-send "shclip filter enabled!" + notify "shclip filter enabled!" else SHCLIP_FILTER_ENABLED="" - errecho "shclip filter disabled!" - exists notify-send && notify-send "shclip filter disabled!" + notify "shclip filter disabled!" fi kill "$clipnotify_pid" } @@ -124,8 +123,7 @@ updateclip() { # check if clip exceeds memory limit sz="$(du -k "$BUFFER")" if [ "${sz%%${TAB}*}" -gt "$SHCLIP_MEMORY_LIMIT" ]; then - errecho 'clip exceeds memory threshold! not caching...' - exists notify-send && notify-send 'clip exceeds memory threshold! not caching...' + notify 'clip exceeds memory threshold! not caching...' rm -f "$BUFFER" return 0 fi @@ -141,7 +139,7 @@ updateclip() { # apply text filters [ -n "$SHCLIP_FILTER_ENABLED" ] && [ -f "$SHCLIP_CONFIG_DIR/filter.sh" ] && \ sh "$SHCLIP_CONFIG_DIR/filter.sh" < "$BUFFER" | diff "$BUFFER" - | patch "$BUFFER" - xclip -sel clipboard "$BUFFER" + xclip -sel clipboard "$BUFFER" [ -n "$SHCLIP_SYNC_CLIPBOARD" ] && xclip -sel primary "$BUFFER" ;; *) ;; @@ -166,16 +164,34 @@ updateclip() { [ -z "${DISPLAY:-}" ] && fail 'Cannot find $DISPLAY. Is your X server running?' # parse options -while getopts :pnf OPT; do +while getopts :hn:f:s:p:c:m OPT; do case $OPT in - n) SHCLIP_ENABLED="" ;; - f) SHCLIP_FILTER_ENABLED=1 ;; + h) cat >&2 <<-EOF + please refer to README for general usage: + https://git.unix.dog/yosh/shclip + + options that exist (overrides config file): + -h show this help + -n enable/disable shclip on startup + -f enable/disable filtering + -s enable/disable syncing clipboard to primary + -p enable/disable caching kde passwords + -c set max clips to clips + -m set memory limit to kibibytes + EOF + ;; + n) [ "$OPTARG" = "on" ] && SHCLIP_ENABLED=1 || SHCLIP_ENABLED="" ;; + f) [ "$OPTARG" = "on" ] && SHCLIP_FILTER_ENABLED=1 || SHCLIP_FILTER_ENABLED="" ;; + s) [ "$OPTARG" = "on" ] && SHCLIP_SYNC_CLIPBOARD=1 || SHCLIP_SYNC_CLIPBOARD="" ;; + p) [ "$OPTARG" = "on" ] && SHCLIP_CACHE_PASSWORDS=1 || SHCLIP_CACHE_PASSWORDS="" ;; + c) SHCLIP_MAX_CLIPS=$OPTARG ;; + m) SHCLIP_MEMORY_LIMIT=$OPTARG ;; *) fail "$BN: unknown option: -$OPTARG" ;; esac done setup -while +while if [ -z "$SHCLIP_ENABLED" ]; then : else