commit 1084caf1edef5c6e0e196c705cfb9ee433010cd8
parent 7e43002d69b3642e31807e118eb735a7d37c9542
Author: Jacob R. Edwards <n/a>
Date: Wed, 28 Dec 2022 18:51:08 -0800
Update buf script
The major change--and improvement--is using programs for external
buffers instead of shell fragments in a custom file format.
Additionally, a delete command is required of all external buffers
(although it isn't required to work), so now all buffers may be
deleted.
Diffstat:
4 files changed, 91 insertions(+), 56 deletions(-)
diff --git a/local/bin/bin/buf b/local/bin/bin/buf
@@ -4,66 +4,81 @@
#
# This (ugly) script provides a more-or-less common interface to
# X and tmux buffers (dubbed "external") aswell as it's own internal
-# ones. Additional external buffers may be added in the external
-# config ($XDG_CONFIG_HOME/bufs/external), the format is like this:
+# ones. Additional external buffers may be added by writing a
+# program which accepts the following four commands to
+# ($XDG_CONFIG_HOME/bufs/external), all except list may return
+# errors:
#
-# name (get|set) sh(1) command to get or set
+# 1. list -- List buffers
+# 2. get -- Get contents of buffer
+# 3. set -- Set contents of buffer
+# 4. del -- Delete buffer
#
# If no buffer is specified, $XDG_CONFIG_HOME/bufs/default is
# read to determine the default buffer to use.
-# There is currently no way of removing buffers (since I would
-# only implement it for internal buffers, I'm not sure I want to
-# add the feature).
bufs=/tmp/bufs/$(id -u)
config="${XDG_CONFIG_HOME:-"$HOME"/.config}"/buf
+external="$config"/external
-buffers() (
- {
- test -f "$config"/external &&
- awk '$2 == "get" { print $1 }' < "$config"/external
- (cd "$bufs" &&
- find . -type f | cut -c3-)
- } | sort -u | egrep -e "${1:-.}"
+isexternal() {
+ test -x "$external"/"$(echo "$1" | cut -d/ -f1)"
+}
+
+external() (
+ com="$1"
+ shift
+ IFS=/
+ set -- $1
+ name="$1"
+ shift
+ arg="$*"
+ "$external"/"$name" "$com" "$arg"
)
-external() {
- awk -vtype="$1" -vname="$2" '
- BEGIN {
- if (!name)
- exit 1;
- }
- $1 == name && $2 == type {
- sub("^[^ ]+[ +]+(get|set)[ ]+", "", $0);
- p=$0;
- exit
- }
- END {
- if (!p) {
- if (name)
- printf "%s not found\n", name > "/dev/stderr";
- exit 1
+list() (
+ cd "$1"
+ find . -type f | cut -c3-
+)
+
+bufs() {
+ {
+ test -d "$external" && {
+ list "$external" | while read name
+ do
+ external list "$name" |
+ awk -vn="$name" '{ printf "%s/%s\n", n, $0 }'
+ done
}
- print p
- }' < "$config"/external
+ test -d "$bufs" && list "$bufs"
+ } | sort -u | egrep -e "${1:-.}"
}
getbuf() (
- IFS=/
cat "$bufs/$1" 2>/dev/null ||
- sh -c "$(external get "$1")" "$@"
+ external get "$1"
)
setbuf() (
- if set="$(external set "$1" 2>/dev/null)"
+ if isexternal "$1"
then
- IFS=/
- sh -c "$set" "$@"
+ external set "$1"
else
+ mkdir -p "$bufs/$(dirname "$1")"
cat > "$bufs/$1"
fi
)
+delbuf() {
+ if isexternal "$1"
+ then
+ external del "$1"
+ else
+ rm "$bufs"/"$1"
+ rmdir "$bufs"/"$(dirname "$1")" 2>/dev/null || true
+ fi
+}
+
swap() {
swap="$(mktemp "$bufs"/swapXXXXXX)"
swapname="$(basename "$swap")"
@@ -85,33 +100,38 @@ usage() {
buf show [regex]
buf get [buf]
buf set [buf]
+ buf del buf
buf swap buf1 [buf2]' 1>&2
exit 1
}
-set -eu
+set -e
test $# -eq 0 &&
usage 'No command'
-mkdir -p "$bufs"
com="$1"
shift
-case "$#$com" in
-([01]list)
- buffers "$@" ;;
-([01]brief|[01]show)
- for buf in $(buffers "$@")
+case "$com#$#" in
+(list#[01])
+ bufs "$@" ;;
+(get#[01])
+ getbuf "${1:-"$(default)"}" ;;
+(set#[01])
+ setbuf "${1:-"$(default)"}" ;;
+(del#1)
+ delbuf "$1" ||
+ setbuf "$1" < /dev/null ;;
+(swap#[12])
+ swap "$1" "${2:-"$(default)"}" ;;
+(brief#[01]|show#[01])
+ IFS='
+ '
+ for buf in $(bufs "$@")
do
echo "$buf" = "$(getbuf "$buf" | summerize)"
done
;;
-([01]get)
- getbuf "${1:-"$(default)"}" ;;
-([01]set)
- setbuf "${1:-"$(default)"}" ;;
-([12]swap)
- swap "$1" "${2:-"$(default)"}" ;;
(*)
- usage "$com: Command not found"
+ usage "$com: Command not found, or given an invalid number of arguments"
esac
diff --git a/local/buf/sys/config/buf/external b/local/buf/sys/config/buf/external
@@ -1,6 +0,0 @@
-tmux get tmux show-buffer
-tmux set tmux set-buffer "$(cat)"
-x/clipboard get xclip -selection clipboard -out
-x/clipboard set xclip -r -selection clipboard
-x/primary get xclip -out
-x/primary set xclip -r
diff --git a/local/buf/sys/config/buf/external/tmux b/local/buf/sys/config/buf/external/tmux
@@ -0,0 +1,9 @@
+#!/bin/sh
+# Tmux buffer program
+
+case "$1" in
+(list) tmux list-buffers -F '#{buffer_name}' ;;
+(get) tmux show-buffer ${2:+-b "$2"} ;;
+(set) tmux set-buffer ${2:+-b "$2"} "$(cat)" ;;
+(del) tmux delete-buffer ${2:+-b "$2"} ;;
+esac
diff --git a/local/buf/sys/config/buf/external/x b/local/buf/sys/config/buf/external/x
@@ -0,0 +1,12 @@
+#!/bin/sh
+# X buffer program
+
+case "$1" in
+(list) echo 'clipboard
+primary' ;;
+(get) xclip -o -selection "${2:-primary}" ;;
+(set) xclip -selection "${2:-primary}" ;;
+(del)
+ echo 'Cannot delete X buffers' 1>&2
+ exit 1 ;;
+esac