~geb/numen

6615a76590d0ed0d6a707531acebbc7fdbf7b3f8 — John Gebbie 2 months ago bd9febd libexec
install: support setting the libexec and etc dirs

This also makes the mawk workaround not a script.
D awk => awk +0 -6
@@ 1,6 0,0 @@
#!/bin/sh
# A workaround to stop mawk buffering stdin.
case "$(realpath "$(command -v awk)")" in
	*/mawk) exec awk -Winteractive "$@";;
	*) exec awk "$@";;
esac

M handlers/gadget => handlers/gadget +1 -1
@@ 69,7 69,7 @@ while IFS= read -r line; do
		fi
		export -- "${line%% *}=$value"
	elif prefixed "$line" handler; then
		exec "/usr/libexec/numen/handlers/${line#handler }"
		exec "${NUMEN_LIBEXEC:-/usr/libexec/numen}/handlers/${line#handler }"
	else
		print "$line"
	fi

M handlers/kernel => handlers/kernel +1 -1
@@ 70,7 70,7 @@ while IFS= read -r line; do
		fi
		export -- "${line%% *}=$value"
	elif prefixed "$line" handler; then
		exec "/usr/libexec/numen/handlers/${line#handler }"
		exec "${NUMEN_LIBEXEC:-/usr/libexec/numen}/handlers/${line#handler }"
	else
		print "$line"
	fi

M handlers/x11 => handlers/x11 +1 -1
@@ 76,6 76,6 @@ while IFS= read -r line; do
		line="${line#set }"
		export -- "${line%% *}=$(shell -c "${line#* }")"
	elif prefixed "$line" handler; then
		exec "/usr/libexec/numen/handlers/${line#handler }"
		exec "${NUMEN_LIBEXEC:-/usr/libexec/numen}/handlers/${line#handler }"
	fi
done | myxdotool

M install-numen.sh => install-numen.sh +9 -6
@@ 1,5 1,5 @@
#!/bin/sh
# ./install-numen.sh [DESTDIR] [BINDIR]
# ./install-numen.sh [DESTDIR] [BINDIR] [LIBEXECDIR] [ETCDIR]
#
# If the environment variable PACKAGING is set, compiling speech.go is left
# to you to do beforehand. It is meant for build systems packaging numen.


@@ 24,24 24,27 @@ if ! [ "$PACKAGING" ]; then
	go build speech.go || exit
fi

bin="$1/${2:-usr/local/bin}"
libexec="${3:-/usr/libexec/numen}"
etc="${4:-/etc/numen}"

# Install executables for internal use
libexec="$1/usr/libexec/numen"
rm -rf "$libexec" && mkdir -p "$libexec" || exit
cp awk instructor numen record scribe speech "$libexec" || exit
cp instructor numen record scribe speech "$libexec" || exit
cp -r handlers "$libexec" || exit

# Install the numen and numenc command
bin="$1/${2:-/usr/local/bin}"
mkdir -p "$bin" || exit
sed "1 a \
export NUMEN_VERSION=$version" wrapper > "$bin/numen" && chmod +x "$bin/numen" || exit
export NUMEN_VERSION=$version NUMEN_LIBEXEC=$libexec NUMEN_ETC=$etc" wrapper > "$bin/numen" || exit
chmod +x "$bin/numen" || exit
cp numenc "$bin" || exit

# Install scripts used in the default phrases
mkdir -p "$libexec/phrases" && cp phrasescripts/* "$libexec/phrases" || exit

# Install the default phrases
mkdir -p "$1/etc/numen" && rm -rf "$1/etc/numen/phrases" && cp -r phrases "$1/etc/numen" || exit
mkdir -p "$etc" && rm -rf "$etc/phrases" && cp -r phrases "$etc" || exit
# Install the manpage
mkdir -p "$1/usr/share/man/man1" && scdoc < doc/numen.1.scd > "$1/usr/share/man/man1/numen.1" || exit


M instructor => instructor +8 -1
@@ 1,6 1,12 @@
#!/usr/libexec/numen/awk -f
#!/bin/sh
# Simplifies actions for the handlers.

# a workaround to stop mawk buffering stdin
case "$(realpath "$(command -v awk)")" in
*/mawk) exec awk -Winteractive -f /proc/self/fd/3;;
*) exec awk -f /proc/self/fd/3;;
esac 3<< 'EOF'

BEGIN {
	ModDir = ENVIRON["HOME"]"/.local/share/numen/mods"
	if (length(ENVIRON["XDG_DATA_HOME"])) ModDir = ENVIRON["XDG_DATA_HOME"]"/numen/mods"


@@ 205,3 211,4 @@ for (;;) {
	next
}
}
EOF

M numen => numen +2 -2
@@ 42,7 42,7 @@ if [ $# = 0 ]; then
	if [ -d "${XDG_CONFIG_HOME:-$HOME/.config}"/numen/phrases ]; then
		set -- "${XDG_CONFIG_HOME:-$HOME/.config}/numen/phrases/"*.phrases
	else
		set -- /etc/numen/phrases/*.phrases
		set -- "${NUMEN_ETC:-/etc/numen}/phrases/"*.phrases
	fi
fi



@@ 66,7 66,7 @@ export NUMEN_HANDLER="$handler"
export NUMEN_PIPE="$pipe"
export NUMEN_SHELL="${NUMEN_SHELL:-/bin/sh}"

libexec=/usr/libexec/numen
libexec="${NUMEN_LIBEXEC:-/usr/libexec/numen}"
if ! [ "$speechless" ]; then
	: "${audiolog:=/dev/null}"
	: "${phraselog:=/dev/null}"

M phrases/mouse.phrases => phrases/mouse.phrases +1 -1
@@ 11,5 11,5 @@ implicate:scrolldown

# Center the cursor in the active window
# (Requires the xdotool command and is X11 specific)
center:set DISPLAY /usr/libexec/numen/phrases/displaying\
center:set DISPLAY "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/displaying"\
eval xdotool mousemove $(xdotool getactivewindow getwindowgeometry | awk '{sub(/[,x]/, " ")}; NR==2 {x=$2;y=$3}; NR==3 {print x+($2)/2, y+($3)/2}')

M phrases/voice.phrases => phrases/voice.phrases +14 -14
@@ 5,42 5,42 @@
# Transcribe a sentence
# For example, "scribe please type this".
@transcribe scribe:set fmt echo normal\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"

# Transcribe a sentence formatted...
# With the first letter uppercase
@transcribe transcribe:set fmt echo sentence\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# With Each First Letter Uppercase
@transcribe title scribe:set fmt echo title\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# UPPERCASE
@transcribe shout scribe:set fmt echo upper\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# with_underscrores_inbetween
@transcribe snake scribe:set fmt echo snake\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# UPPERCASE_WITH_UNDERSCRORES_INBETWEEN
@transcribe trench scribe:set fmt echo uppersnake\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# with-dashes-inbetween
@transcribe dash scribe:set fmt echo dash\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# with.dots.inbetween
@transcribe dot scribe:set fmt echo dot\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# with/slashes/inbetween
@transcribe path scribe:set fmt echo path\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# allsmashedtogether
@transcribe smash scribe:set fmt echo smash\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# camelCase
@transcribe cam scribe:set fmt echo camel\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"
# UpperCamelCase
@transcribe camel scribe:set fmt echo uppercamel\
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | /usr/libexec/numen/phrases/fmt "$fmt"
localpen printf %s\\n "$NUMEN_TRANSCRIPT" | "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/fmt" "$fmt"

# Erase the transcription
nevermind:localeval awk -v n=${#NUMEN_TEXT} 'BEGIN {for(;n--;) print "press BackSpace"}'


@@ 50,7 50,7 @@ initial:localeval awk -v n=${#NUMEN_TEXT} 'BEGIN {for(;n--;) print "press Left"}

# Menu of transcription results
# (Requires the dmenu command)
transcripts:eval /usr/libexec/numen/phrases/transcripts "$fmt" &
transcripts:eval "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/transcripts" "$fmt" &
# Menu to change transcription result
# (Requires the dmenu command)
change:eval /usr/libexec/numen/phrases/transcripts "$fmt" change &
change:eval "${NUMEN_LIBEXEC:-/usr/libexec/numen}/phrases/transcripts" "$fmt" change &

M phrasescripts/transcripts => phrasescripts/transcripts +4 -3
@@ 1,12 1,13 @@
#!/bin/sh
# transcripts FORMAT [CHANGE]

export DISPLAY="$(/usr/libexec/numen/phrases/displaying)"
libexec="${NUMEN_LIBEXEC:-/usr/libexec/numen}"
export DISPLAY="$("$libexec/phrases/displaying")"

f="${XDG_DATA_HOME:-$HOME/.local/share}/numen/transcripts"
if [ "$2" ]; then
	if [ "$(wc -l < "$f")" -gt 1 ]; then
		if transcript="$(tail -n +2 "$f" | /usr/libexec/numen/phrases/fmt "$1" | dmenu -i -l 10)"; then
		if transcript="$(tail -n +2 "$f" | "$libexec/phrases/fmt" "$1" | dmenu -i -l 10)"; then
			awk -v n=${#NUMEN_TEXT} 'BEGIN {for(;n--;) print "press BackSpace"}'
			printf 'type %s\n' "$transcript"
		fi


@@ 14,7 15,7 @@ if [ "$2" ]; then
		notify-send 'No alternative transcripts' &
	fi
elif [ -s "$f" ]; then
	printf 'type %s\n' "$(/usr/libexec/numen/phrases/fmt "$1" < "$f" | dmenu -i -l 10)"
	printf 'type %s\n' "$("$libexec/phrases/fmt" "$1" < "$f" | dmenu -i -l 10)"
else
	notify-send 'No transcripts' &
fi

M scribe => scribe +9 -1
@@ 1,5 1,12 @@
#!/usr/libexec/numen/awk -f
#!/bin/sh
# Filters the output of ./speech for ./instructor and continuously writes transcript results to a file.

# a workaround to stop mawk buffering stdin
case "$(realpath "$(command -v awk)")" in
*/mawk) exec awk -Winteractive -f /proc/self/fd/3;;
*) exec awk -f /proc/self/fd/3;;
esac 3<< 'EOF'

function erase(file) { system("> "file) }
BEGIN {
	f = ENVIRON["HOME"]"/.local/share/numen/transcripts"


@@ 8,3 15,4 @@ BEGIN {
/^transcript1[^0-9]/ { erase(f); close(f); print "set NUMEN_TRANSCRIPT echo \""substr($0, 13)"\""; fflush() }
/^transcript/ { sub(/^[^:]*:/, ""); print > f; fflush(f); next }  # Note > appends after the first time until close
{ print; fflush() }
EOF

M wrapper => wrapper +1 -1
@@ 9,4 9,4 @@ if [ -z "$NUMEN_MODEL" ]; then
		exit 1
	fi
fi
exec /usr/libexec/numen/numen "$@"
exec "${NUMEN_LIBEXEC:-/usr/libexec/numen}/numen" "$@"