221 lines
8.6 KiB
Bash
221 lines
8.6 KiB
Bash
#!/bin/sh
|
|
|
|
#
|
|
# This file runs the highlighter on a specified file
|
|
# i.e. parses the file with the highlighter. Outputs
|
|
# running time (stderr) and resulting region_highlight
|
|
# (file parse.out, or $2 if given).
|
|
#
|
|
# Can be also run in line-wise mode on own input (-o
|
|
# option in $1), no region_highlight file then.
|
|
#
|
|
|
|
[[ -z "$ZSH_VERSION" ]] && exec /usr/bin/env /usr/local/bin/zsh-5.5.1 -f -c "source \"$0\" \"$1\" \"$2\" \"$3\""
|
|
|
|
ZERO="${(%):-%N}"
|
|
|
|
if [[ -e "${ZERO}/../fast-highlight" ]]; then
|
|
source "${ZERO}/../fast-highlight"
|
|
source "${ZERO}/../fast-string-highlight"
|
|
fpath+=( "${ZERO}/.." )
|
|
elif [[ -e "../fast-highlight" ]]; then
|
|
source "../fast-highlight"
|
|
source "../fast-string-highlight"
|
|
fpath+=( "$PWD/.." )
|
|
elif [[ -e "${ZERO}/fast-highlight" ]]; then
|
|
source "${ZERO}/fast-highlight"
|
|
source "${ZERO}/fast-string-highlight"
|
|
fpath+=( "${ZERO}" )
|
|
elif [[ -e "./fast-highlight" ]]; then
|
|
source "./fast-highlight"
|
|
source "./fast-string-highlight"
|
|
fpath+=( "./" )
|
|
else
|
|
print -u2 "Could not find fast-highlight, aborting"
|
|
exit 1
|
|
fi
|
|
|
|
zmodload zsh/zprof
|
|
autoload is-at-least chroma/-git.ch
|
|
|
|
setopt interactive_comments extendedglob
|
|
|
|
# Own input?
|
|
if [[ "$1" = "-o" || "$1" = "-oo" || "$1" = "-ooo" || "$1" = "-git" || "$1" = "-hue" || "$1" = "-hol" ]]; then
|
|
typeset -a input
|
|
input=()
|
|
if [[ "$1" = "-o" ]]; then
|
|
input+=( "./parse.zsh ../fast-highlight parse2.out" )
|
|
input+=( "rm -f parse*.out" )
|
|
input+=( "./mh-parse.zsh ../fast-highlight > out" )
|
|
input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" )
|
|
input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" )
|
|
input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' )
|
|
input+=( 'func() { echo "a" >! phist2.db; echo "b" >>! phist2.db; fc -Rap "phist2.db"; list=( ${history[@]} ); echo "${history[1]}"; }' )
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
|
|
elif [[ "$1" = "-oo" ]]; then
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
|
|
elif [[ "$1" = "-ooo" ]]; then
|
|
local in='
|
|
# This is an example code that is diverse and allows to test a theme
|
|
text="An example quite long string $with variable in it"
|
|
local param1="text $variable" param2='"'"'other $variable'"'"'
|
|
math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 ))
|
|
|
|
for (( ii = 1; ii <= size; ++ ii )); do
|
|
if [[ "${cmds[ii]} string" = "| string" ]]
|
|
then
|
|
sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening $(
|
|
(( sidx <= len )) && {
|
|
eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing )
|
|
}
|
|
fi
|
|
done'
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
|
input+=( "$in" )
|
|
input+=( "$in" )
|
|
elif [[ "$1" = "-git" ]]; then
|
|
local in="git lp
|
|
git push origin master
|
|
git commit
|
|
git add safari.ini zdharma.ini
|
|
git st .
|
|
git diff --cached
|
|
git commit --allow-empty
|
|
git checkout themes/zdharma.ini
|
|
git commit --amend
|
|
git commit -m \"Example commit message\"
|
|
git tag -a 'v1.18' -m 'Here-string is highlighted, descriptor-variables passed to exec are correctly highlighted'
|
|
git tag -l -n9
|
|
git checkout cb66b11
|
|
"
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
|
input+=( "$in" )
|
|
input+=( "$in" )
|
|
elif [[ "$1" = "-hue" ]]; then
|
|
local in="var=\$other; local var=\$other
|
|
() { eval \"\$var\"; }
|
|
case \$other in
|
|
\$var)
|
|
( echo OK; )
|
|
;;
|
|
esac
|
|
sudo -i -s ls -1 /var/log
|
|
() { ( eval \"command ls -1\" ); } argument"
|
|
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
|
|
|
input+=( "$in" "$in" )
|
|
elif [[ "$1" = "-hol" ]]; then
|
|
local in="var=\$( other )
|
|
local var2=\$(( other + 1 ))
|
|
() { eval \"\$var\"; }
|
|
sudo -i -s ls -1 >/tmp/ls-log.txt /var/log
|
|
IFS=\$'\\n' print -rl -- \$(command ls -1 | tee -a /tmp/ls-1.txt)
|
|
var3=\$(( HISTSIZE + 10 + \$var ))
|
|
local var4=\$( other command )
|
|
touch \$(( HISTSIZE + \$SAVEHIST + 10 ))
|
|
case \$other in
|
|
\$var)
|
|
( echo OK; )
|
|
;;
|
|
\$var3)
|
|
( if { true } { noglob echo yes } )
|
|
esac
|
|
( builtin cd /var/log; ls -1; noglob cd \"/var/log\" 'log' )
|
|
noglob cat <<<\"\$PATH\" | tr : \"\\n\"
|
|
if [[ \"\$var\" -gt 10 ]]; then
|
|
(( var = HISTSIZE + \$SAVEHIST ))
|
|
fi
|
|
/var/log
|
|
sidx=\${buffer[(in:ii:)\\\$\\(?#[^\\\\\\\\]\\)]} # find opening cmd-subst
|
|
{
|
|
exec {MYFD}<&0 {MYFD2}>&1
|
|
( read <&\$MYFD line; echo \$line >&\$MYFD2 && { builtin print \${match[1]}Written. } )
|
|
} always {
|
|
(( MYFD > 0 )) && { print -rl -- -myfd:\$MYFD >&\$MYFD2 && print \"Sent.\" '(to filedescriptor)'; }
|
|
}
|
|
command sleep \"\$(( \$a + b + \${cde} + \${(s::)fgh[ijk]} + \\\$l + \\m + \\\" ))\"
|
|
for (( i = 0; i <= 2; ++ i )) { print \$i; }
|
|
"
|
|
|
|
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
|
|
|
input+=( "$in" )
|
|
fi
|
|
|
|
typeset -a long_input
|
|
integer i
|
|
for (( i=1; i<= 50; i ++ )); do
|
|
long_input+=( "${input[@]}" )
|
|
done
|
|
|
|
typeset -F SECONDS
|
|
SECONDS=0
|
|
|
|
local right_brace_is_recognised_everywhere
|
|
integer path_dirs_was_set multi_func_def ointeractive_comments
|
|
-fast-highlight-fill-option-variables
|
|
|
|
local BUFFER
|
|
for BUFFER in "${long_input[@]}"; do
|
|
reply=( )
|
|
() {
|
|
-fast-highlight-init
|
|
-fast-highlight-process "" "$BUFFER" "0"
|
|
-fast-highlight-string-process "" "$BUFFER"
|
|
}
|
|
done
|
|
|
|
print "Running time: $SECONDS"
|
|
zprof | head
|
|
# File input?
|
|
elif [[ -r "$1" ]]; then
|
|
# Load from given file
|
|
local BUFFER="$(<$1)"
|
|
|
|
typeset -F SECONDS
|
|
SECONDS=0
|
|
|
|
reply=( )
|
|
-fast-highlight-init
|
|
|
|
local right_brace_is_recognised_everywhere
|
|
integer path_dirs_was_set multi_func_def ointeractive_comments
|
|
-fast-highlight-fill-option-variables
|
|
|
|
() {
|
|
-fast-highlight-process "" "$BUFFER" "0"
|
|
-fast-highlight-string-process "" "$BUFFER"
|
|
}
|
|
|
|
print "Running time: $SECONDS"
|
|
zprof | head
|
|
|
|
# This output can be diffed to detect changes in operation
|
|
if [[ -z "$2" ]]; then
|
|
print -rl -- "${reply[@]}" >! out.parse
|
|
else
|
|
print -rl -- "${reply[@]}" >! "$2"
|
|
fi
|
|
else
|
|
if [[ -z "$1" ]]; then
|
|
print -u2 "Usage: ./parse.zsh {to-parse file} [region_highlight output file]"
|
|
exit 2
|
|
else
|
|
print -u2 "Unreadable to-parse file \`$1', aborting"
|
|
exit 3
|
|
fi
|
|
fi
|
|
|
|
exit 0
|
|
|
|
# vim:ft=zsh
|