Compare commits
2 Commits
5bbbd60cfc
...
41b0293d42
Author | SHA1 | Date |
---|---|---|
Emma Tebibyte | 41b0293d42 | |
Emma Tebibyte | 4f0788048b |
110
en
110
en
|
@ -1,76 +1,61 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
# Copyright (c) 2023 Emma Tebibyte <emma@tebibyte.media>
|
||||
# Copyright (c) 2023-2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
argv0="$0"
|
||||
exec >&2 </dev/tty
|
||||
|
||||
if test -z "$1"; then
|
||||
printf "Usage: %s file...\n" "$argv0" 1>&2
|
||||
exit 64 # sysexits.h(3) EX_USAGE
|
||||
if command -v highlight >/dev/null 2>&1
|
||||
then
|
||||
HIGHLIGHT_OPTIONS='--out-format=ansi'; export HIGHLIGHT_OPTIONS
|
||||
else
|
||||
alias highlight=cat
|
||||
fi
|
||||
|
||||
if ! command -v mktemp >/dev/null 2>&1
|
||||
then
|
||||
printf "%s: mktemp(1): Missing dependency." "$argv0"
|
||||
exit 69 # sysexits.h(3) EX_UNAVAILABLE
|
||||
if test -z "$1"; then
|
||||
set -- /dev/stdin
|
||||
HIGHLIGHT_OPTIONS="$HIGHLIGHT_OPTIONS --syntax=none"
|
||||
export HIGHLIGHT_OPTIONS
|
||||
fi
|
||||
|
||||
help="$(printf "Commands:\n\
|
||||
/ – display lines containing a string.\n\
|
||||
? – displays this help message.\n\
|
||||
a – appends a line to the current buffer.\n\
|
||||
c – clears the screen.\n\
|
||||
d – deletes a line.\n\
|
||||
e – evaluates a command in the shell environment.\n\
|
||||
i – inserts a line into the buffer at position line.\n\
|
||||
p – prints the current buffer.\n\
|
||||
q – terminates editing.\n\
|
||||
r – applies a regular expression to the current buffer.\n\
|
||||
w – writes the current buffer to the file.\n\
|
||||
/ – display lines containing a string\n\
|
||||
? – display this help message\n\
|
||||
a – append a line to the current buffer\n\
|
||||
c – clear the screen\n\
|
||||
d – delete a line\n\
|
||||
e – evaluate a command in the shell environment\n\
|
||||
h – change syntax highlighting language\n\
|
||||
i – insert a line into the buffer at position line\n\
|
||||
p – print the current buffer\n\
|
||||
q – terminate editing\n\
|
||||
r – apply a regular expression to the current buffer\n\
|
||||
x – exit the program without writing output\n\
|
||||
\n\
|
||||
To learn more about a command verb, type \`? verb'.\n\
|
||||
en(1) Copyright (c) 2023 Emma Tebibyte\n")"
|
||||
en(1) Copyright (c) 2023–2024 Emma Tebibyte\n")"
|
||||
|
||||
while test -n "$1"; do
|
||||
content="$(cat "$1")"
|
||||
file="$(printf "%s\n" "$1" | tr -d '/')"
|
||||
temp_highlight="$(mktemp -t "XXXXX$file")"
|
||||
|
||||
# use bat for syntax highlighting if it’s available, but remove the frills
|
||||
if command -v bat >/dev/null
|
||||
then
|
||||
# make bat use terminal theme
|
||||
BAT_THEME=ansi; export BAT_THEME
|
||||
# there has to be a temp file for writing the highlighted text to
|
||||
syntax_h() {
|
||||
printf "%s\n" "$1" >"$temp_highlight"
|
||||
bat -pp --color always "$temp_highlight"
|
||||
}
|
||||
fi
|
||||
|
||||
while true; do
|
||||
printf ">> "
|
||||
printf ">> " >/dev/tty
|
||||
read -r command args
|
||||
|
||||
case $command in
|
||||
"/")
|
||||
if test -z "$args"; then
|
||||
printf "%s: %s: Missing argument.\n" "$argv0" "$args"
|
||||
printf "%s: %s: missing argument\n" "$0" "$args"
|
||||
else
|
||||
printf "%s" "$content" | nl | sed -n "/$args/p"
|
||||
fi
|
||||
;;
|
||||
"?")
|
||||
if test -z "$args"; then
|
||||
printf "%s: %s\n" "$argv0" "$help"
|
||||
printf "%s: %s\n" "$0" "$help"
|
||||
else
|
||||
printf "%s: Command-specific help not implemented.\n" "$argv0" 1>&2
|
||||
printf "%s: %s: %s invalid argument\n" "$0" "$command" "$args" 1>&2
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
|
@ -82,12 +67,10 @@ while test -n "$1"; do
|
|||
content="$(printf "%s\n%s" "$content" "$append")"
|
||||
fi
|
||||
;;
|
||||
"c")
|
||||
clear
|
||||
;;
|
||||
"c") clear ;;
|
||||
"d")
|
||||
if test -z "$args"; then
|
||||
printf "%s: %s: Missing argument.\n" "$argv0" "$command" 1>&2
|
||||
printf "%s: %s: Missing argument.\n" "$0" "$command" 1>&2
|
||||
else
|
||||
for line in $(printf "%s\n" "$args" | sed 's/,/\n/g')
|
||||
do
|
||||
|
@ -99,40 +82,29 @@ while test -n "$1"; do
|
|||
"e")
|
||||
eval "$args" || true
|
||||
;;
|
||||
"h")
|
||||
HIGHLIGHT_OPTIONS="$HIGHLIGHT_OPTIONS --syntax=$args"
|
||||
export HIGHLIGHT_OPTIONS
|
||||
;;
|
||||
"i")
|
||||
printf "%s: i: Command not implemented.\n" "$argv0" 1>&2
|
||||
printf "%s: i: Command not implemented.\n" "$0" 1>&2
|
||||
;;
|
||||
"p")
|
||||
out="$(syntax_h "$content" 2>/dev/null || printf "%s\n" "$content")"
|
||||
printf "%s\n" "$out" | nl -ba
|
||||
;;
|
||||
"q")
|
||||
if test -n "$(printf "%s\n" "$content" | diff "$1" -)"
|
||||
then
|
||||
printf "%s: %s: Unsaved changes in the buffer. Quit anyway? [y/N] " \
|
||||
"$argv0" \
|
||||
"$1"
|
||||
read -r quit
|
||||
if [ "$quit" = "y" ]; then
|
||||
break
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
break
|
||||
fi
|
||||
printf "%s\n" "$content" | highlight | nl -ba >/dev/tty
|
||||
;;
|
||||
"q") break ;;
|
||||
"r")
|
||||
content="$(printf "%s" "$content" | sed -e "$args")"
|
||||
;;
|
||||
"w")
|
||||
printf "%s\n" "$content" > "$1"
|
||||
;;
|
||||
"x") exit ;;
|
||||
"") ;;
|
||||
*)
|
||||
printf "%s: %s: No such command.\n" "$argv0" "$command"
|
||||
printf "%s: %s: unrecognized command\n" "$0" "$command"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
printf '%s\n' "$content"
|
||||
|
||||
shift
|
||||
done
|
||||
|
|
Loading…
Reference in New Issue