config

OpenBSD system configuration
git clone git://jacobedwards.org/config
Log | Files | Refs | README

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:
Mlocal/bin/bin/buf | 120++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Dlocal/buf/sys/config/buf/external | 6------
Alocal/buf/sys/config/buf/external/tmux | 9+++++++++
Alocal/buf/sys/config/buf/external/x | 12++++++++++++
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