diff --git a/.config/zsh/.zprofile b/.config/zsh/.zprofile index 8b2ae48..7a97821 100644 --- a/.config/zsh/.zprofile +++ b/.config/zsh/.zprofile @@ -57,15 +57,7 @@ export PASSWORD_STORE_GENERATED_LENGTH="43" export LESS="--tabs=4 --RAW-CONTROL-CHARS --LONG-PROMPT" -if command -v highlight > /dev/null; then - # ~/.lessfilter handles the highlighting - LESSOPEN="| $(command -v lesspipe) %s" - export CATOPEN="highlight --force --out-format=truecolor --style=base16/unikitty-reversible --stdout %s" -elif command -v pygmentize > /dev/null; then - LESSOPEN="| $(command -v pygmentize) -f terminal16m -g -O style=paraiso-dark %s" -elif command -v source-highlight > /dev/null; then - LESSOPEN="| $(command -v source-highlight) --failsafe --infer-lang --out-format=esc --style-file=esc.style --input=%s" -elif command -v lesspipe > /dev/null; then +if command -v lesspipe > /dev/null; then LESSOPEN="| $(command -v lesspipe) %s" elif command -v lesspipe.sh > /dev/null; then LESSOPEN="| $(command -v lesspipe.sh) %s" diff --git a/.config/zsh/functions/cat-highlight b/.config/zsh/functions/cat-highlight index 8a15329..e92ba2e 100755 --- a/.config/zsh/functions/cat-highlight +++ b/.config/zsh/functions/cat-highlight @@ -1,42 +1,54 @@ #!/usr/bin/env zsh -# Highlight cat output with either $CATOPEN or $LESSOPEN. The command needs to -# have %s in it that will be replaced with all input files. Some programs that -# are known to not work will be ignored in $LESSOPEN but not in $CATOPEN. +# Highlight cat output with either $CATOPEN, ~/.lessfilter or $LESSOPEN. The +# command needs to have %s in it that will be replaced with input files (one by +# one). Some programs that are known to not work will be ignored in $LESSOPEN +# but not in $CATOPEN. # Example: # export CATOPEN="highlight --force --out-format=truecolor --stdout %s" # alias cat='cat-highlight' -setopt LOCAL_OPTIONS ERR_RETURN PIPE_FAIL +setopt LOCAL_OPTIONS PIPE_FAIL -# Check if we are in a terminal and a highlighter is defined -if [[ -t 1 ]] && [[ -n "${CATOPEN}" || -n "${LESSOPEN}" ]]; then - if [[ -z "${CATOPEN}" ]]; then - # Programs that won't work with cat - local -a known_bad=("lesspipe" "pygmentize" "source-highlight") - for baddy in ${known_bad}; do - if [[ "${LESSOPEN}" =~ "${baddy}" ]]; then - \cat "${@}" - return ${?} - fi - done - local catopen="${LESSOPEN/|/}" - else - local catopen="${CATOPEN}" - fi +# Check if we are in a terminal +if [[ ! -t 1 ]]; then + \cat ${@} + return ${?} +fi - local -a args - local -a files - for arg in ${@}; do - # Filter out file names - if [[ "${arg[1]}" != "-" ]]; then - files+=${(q)arg} - else - args+="${arg}" +# Try to find highlighter +if [[ -v CATOPEN && -n ${CATOPEN} ]]; then + local catopen=${CATOPEN} +elif [[ -x ~/.lessfilter ]]; then + local catopen="~/.lessfilter %s" +elif [[ -v LESSOPEN && -n ${LESSOPEN} ]]; then + local catopen="${LESSOPEN/|/}" + # Programs that won't work with cat + local -a known_bad=("lesspipe") + for baddy in ${known_bad}; do + if [[ ${LESSOPEN} =~ ${baddy} ]]; then + unset catopen fi done - - eval "${catopen/\%s/${files}} | \cat ${args}" -else - \cat "${@}" fi + +if [[ ! -v catopen ]]; then + \cat ${@} + return ${?} +fi + +local -a args +local -a files +for arg in ${@}; do + # Filter out file names + if [[ ${arg[1]} != "-" ]]; then + files+=${(q)arg} + else + args+=${arg} + fi +done + +for file in ${files}; do + eval "${catopen/\%s/${file}}" 2>& - + [[ ${?} -ne 0 ]] && \cat ${file} +done | \cat ${args} diff --git a/.lessfilter b/.lessfilter index 7c5659b..d18aa91 100755 --- a/.lessfilter +++ b/.lessfilter @@ -4,14 +4,27 @@ setopt LOCAL_OPTIONS ERR_RETURN NO_UNSET PIPE_FAIL -command -v highlight > /dev/null -file="${1}" +local file="${1}" +local ret +local output -local output="$(highlight --force \ - --out-format=truecolor \ - --style=base16/unikitty-reversible \ - --stdout "${file}")" -ret=${?} +if type highlight >& -; then + output="$(highlight --force \ + --out-format=truecolor \ + --style=base16/unikitty-reversible \ + --stdout "${file}")" + ret=${?} +elif type pygmentize >& -; then + output="$(pygmentize -f terminal16m -g -O style=paraiso-dark ${file})" + ret=${?} +elif type source-highlight >& -; then + output="$(source-highlight --failsafe \ + --infer-lang \ + --out-format=esc \ + --style-file=esc.style \ + --input=${file})" + ret=${?} +fi [[ ${ret} -eq 0 ]] || return ${ret} # Try to catch when the output is just the magic string