#!/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