Skip to content

Commit 1f82a68

Browse files
committed
main: Highlight partially quoted arguments correctly
Closes #130
1 parent dd17273 commit 1f82a68

File tree

1 file changed

+45
-19
lines changed

1 file changed

+45
-19
lines changed

highlighters/main/main-highlighter.zsh

+45-19
Original file line numberDiff line numberDiff line change
@@ -683,19 +683,7 @@ _zsh_highlight_highlighter_main_paint()
683683
;|
684684
'--'*) style=double-hyphen-option;;
685685
'-'*) style=single-hyphen-option;;
686-
"'"*) _zsh_highlight_main_highlighter_highlight_single_quote 1
687-
already_added=1
688-
;;
689-
'"'*) _zsh_highlight_main_highlighter_highlight_double_quote
690-
already_added=1
691-
;;
692-
\$\'*) _zsh_highlight_main_highlighter_highlight_dollar_quote
693-
already_added=1
694-
;;
695686
'`'*) style=back-quoted-argument;;
696-
[$][*]) style=default;;
697-
[*?]*|*[^\\][*?]*)
698-
$highlight_glob && style=globbing || style=default;;
699687
*) if false; then
700688
elif [[ $arg = $'\x7d' ]] && $right_brace_is_recognised_everywhere; then
701689
# was handled by the $'\x7d' case above
@@ -713,7 +701,8 @@ _zsh_highlight_highlighter_main_paint()
713701
if _zsh_highlight_main_highlighter_check_path; then
714702
style=$REPLY
715703
else
716-
style=default
704+
_zsh_highlight_main_highlighter_highlight_argument
705+
already_added=1
717706
fi
718707
fi
719708
;;
@@ -812,6 +801,41 @@ _zsh_highlight_main_highlighter_check_path()
812801
return 1
813802
}
814803

804+
# Highlight an argument and possibly special chars in quotes
805+
_zsh_highlight_main_highlighter_highlight_argument()
806+
{
807+
local i
808+
809+
_zsh_highlight_main_add_region_highlight $start_pos $end_pos default
810+
for (( i = 1 ; i <= end_pos - start_pos ; i += 1 )); do
811+
case "$arg[$i]" in
812+
"\\") (( i += 1 )); continue;;
813+
"'") _zsh_highlight_main_highlighter_highlight_single_quote $i; (( i = REPLY ));;
814+
'"') _zsh_highlight_main_highlighter_highlight_double_quote $i; (( i = REPLY ));;
815+
'$')
816+
if [[ $arg[i+1] == "'" ]]; then
817+
_zsh_highlight_main_highlighter_highlight_dollar_quote $i
818+
(( i = REPLY ))
819+
elif [[ $arg[i+1] == [\^=~#+] ]]; then
820+
while [[ $arg[i+1] == [\^=~#+] ]]; do
821+
(( i += 1 ))
822+
done
823+
if [[ $arg[i+1] == [*@#?-$!] ]]; then
824+
(( i += 1 ))
825+
fi
826+
elif [[ $arg[i+1] == [*@#?-$!] ]]; then
827+
(( i += 1 ))
828+
fi;;
829+
[*?])
830+
if $highlight_glob; then
831+
_zsh_highlight_main_add_region_highlight $start_pos $end_pos globbing
832+
break
833+
fi;;
834+
*) continue;;
835+
esac
836+
done
837+
}
838+
815839
# Highlight single-quoted strings
816840
_zsh_highlight_main_highlighter_highlight_single_quote()
817841
{
@@ -841,11 +865,11 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
841865
local MATCH; integer MBEGIN MEND
842866
local i j k style
843867

844-
# Starting quote is at 1, so start parsing at offset 2 in the string.
845-
for (( i = 2 ; i < end_pos - start_pos ; i += 1 )) ; do
868+
for (( i = $1 + 1 ; i < end_pos - start_pos ; i += 1 )) ; do
846869
(( j = i + start_pos - 1 ))
847870
(( k = j + 1 ))
848871
case "$arg[$i]" in
872+
'"') break;;
849873
'$' ) style=dollar-double-quoted-argument
850874
# Look for an alphanumeric parameter name.
851875
if [[ ${arg:$i} =~ ^([A-Za-z_][A-Za-z0-9_]*|[0-9]+) ]] ; then
@@ -889,8 +913,9 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
889913
highlights+=($j $k $style)
890914
done
891915

892-
highlights=($start_pos $end_pos double-quoted-argument $highlights)
916+
highlights=($(( start_pos + $1 - 1)) $(( start_pos + i )) double-quoted-argument $highlights)
893917
_zsh_highlight_main_add_region_highlights $highlights
918+
REPLY=$i
894919
}
895920

896921
# Highlight special chars inside dollar-quoted strings
@@ -902,11 +927,11 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
902927
local AA
903928
integer c
904929

905-
# Starting dollar-quote is at 1:2, so start parsing at offset 3 in the string.
906-
for (( i = 3 ; i < end_pos - start_pos ; i += 1 )) ; do
930+
for (( i = $1 + 2 ; i < end_pos - start_pos ; i += 1 )) ; do
907931
(( j = i + start_pos - 1 ))
908932
(( k = j + 1 ))
909933
case "$arg[$i]" in
934+
"'") break;;
910935
"\\") style=back-dollar-quoted-argument
911936
for (( c = i + 1 ; c <= end_pos - start_pos ; c += 1 )); do
912937
[[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break
@@ -935,8 +960,9 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
935960
highlights+=($j $k $style)
936961
done
937962

938-
highlights+=($start_pos $end_pos dollar-quoted-argument $highlights)
963+
highlights+=($(( start_pos + $1 - 1 )) $(( start_pos + i )) dollar-quoted-argument $highlights)
939964
_zsh_highlight_main_add_region_highlights $highlights
965+
REPLY=$i
940966
}
941967

942968
# Called with a single positional argument.

0 commit comments

Comments
 (0)