feat(chroma/make): new makefile colorization caching strategy (#82)

* fix(chroma/make): huge delay on big units

* fix(fast-make): code-style indentation

* feat(fast-make): allow shared cache

One may enable the shared cache by setting the following prior to
loading the fast-synthax-highlighting module

```sh
typeset -gA FAST_HIGHLIGHT
FAST_HIGHLIGHT[chroma-make-cache-global]=1
```

This new implementation change the way the cached makefile' parsed
content are expired. Prior to this commit, cached item expired after
7s. The new implementation get ride of the timer limit and
replace it with a good old "is my file content's different"
This commit is contained in:
Quentin Burgess 2025-07-16 10:37:53 +02:00 committed by GitHub
parent dcee72bb99
commit 5ecd353c81
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 6 deletions

View file

@ -18,7 +18,7 @@ local -a TARGETS
rest=${rest[3,-1]}
continue
;;
(\() # Variable of the form $(foobar)
(\() # Variable of the form $(foobar)
open='('
close=')'
;;
@ -87,10 +87,44 @@ local -a TARGETS
done
}
if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then
.make-parseMakefile
FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS"
FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}"
# Cache generated parsing for 1sec per session or globally if configured, per Makefile path.
if [[ -n "${FAST_HIGHLIGHT[chroma-make-cache-global]}" ]]; then
# Determine Makefile path.
# TODO: find a way to expand path and resolve alias - this cause deduplicated cache file.
local makefile_path
makefile_path=${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}
# If not absolute, resolve to absolute path
[[ $makefile_path != /* ]] && makefile_path="$PWD/$makefile_path"
# Generate a safe hash for the cache file name using sha1sum
local makefile_hash
makefile_hash=$(print -n -- "$makefile_path" | sha1sum | awk '{print $1}')
# Generate a sha1sum hash from the input variable
local input var val target dep TAB=$'\t' tmp IFS=
local input_hash
input_hash=$(print -n -- "$input" | sha1sum | awk '{print $1}')
# Generate the cache file path.
local cache_file
cache_file="/tmp/fast-highlight-make-cache-${makefile_hash}-${input_hash}"
if [[ ! -f $cache_file ]]; then
# Clean up old cache files.
rm -rf /tmp/fast-highlight-make-cache-${makefile_hash}-*
# Generate new cache file.
.make-parseMakefile "$input"
print -r -- "${(j:;:)TARGETS}" >| "$cache_file"
fi
FAST_HIGHLIGHT[chroma-make-cache]="$(<$cache_file)"
FAST_HIGHLIGHT[chroma-make-cache-born-at]="0"
else
if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then
.make-parseMakefile
FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS"
FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}"
fi
fi
reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" )

View file

@ -73,7 +73,7 @@ local -a __lines_list reply2
__wrd="${(Q)__wrd}"
if [[ -f "${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}" ]] && \
make -f "${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}" -pn | .fast-make-targets
make -f "${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}" -Rrpq | awk '/^[a-zA-Z0-9][^$#\t=]*:/' | .fast-make-targets
then
if [[ "${reply2[(r)$__wrd]}" ]]; then
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")