'main': Highlight mismatched parentheses and braces.

This commit is contained in:
Daniel Shahaf 2016-09-22 04:52:32 +00:00
parent 0a9b347483
commit 51b9d79c3b
4 changed files with 112 additions and 5 deletions

View file

@ -155,6 +155,20 @@ _zsh_highlight_main__resolve_alias() {
fi fi
} }
# Check that the top of $braces_stack has the expected value. If it does, set
# the style according to $2; otherwise, set style=unknown-token.
#
# $1: character expected to be at the top of $braces_stack
# $2: assignment to execute it if matches
_zsh_highlight_main__stack_pop() {
if [[ $braces_stack[1] == $1 ]]; then
braces_stack=${braces_stack:1}
eval "$2"
else
style=unknown-token
fi
}
# Main syntax highlighting function. # Main syntax highlighting function.
_zsh_highlight_highlighter_main_paint() _zsh_highlight_highlighter_main_paint()
{ {
@ -194,6 +208,8 @@ _zsh_highlight_highlighter_main_paint()
local buf="$PREBUFFER$BUFFER" local buf="$PREBUFFER$BUFFER"
integer len="${#buf}" integer len="${#buf}"
local braces_stack # "R" for round, "Q" for square, "Y" for curly
if (( path_dirs_was_set )); then if (( path_dirs_was_set )); then
options_to_set+=( PATH_DIRS ) options_to_set+=( PATH_DIRS )
fi fi
@ -418,7 +434,15 @@ _zsh_highlight_highlighter_main_paint()
fi fi
} }
case $res in case $res in
reserved) style=reserved-word;; reserved) # reserved word
style=reserved-word
if [[ $arg == $'\x7b' ]]; then
braces_stack='Y'"$braces_stack"
elif [[ $arg == $'\x7d' ]]; then
# We're at command word, so no need to check $right_brace_is_recognised_everywhere
_zsh_highlight_main__stack_pop 'Y' style=reserved-word
fi
;;
'suffix alias') style=suffix-alias;; 'suffix alias') style=suffix-alias;;
alias) () { alias) () {
integer insane_alias integer insane_alias
@ -488,10 +512,13 @@ _zsh_highlight_highlighter_main_paint()
_zsh_highlight_main_add_region_highlight $((end_pos - 2)) $end_pos $style _zsh_highlight_main_add_region_highlight $((end_pos - 2)) $end_pos $style
already_added=1 already_added=1
fi fi
elif [[ $arg == '()' || $arg == $'\x28' ]]; then elif [[ $arg == '()' ]]; then
# anonymous function # anonymous function
style=reserved-word
elif [[ $arg == $'\x28' ]]; then
# subshell # subshell
style=reserved-word style=reserved-word
braces_stack='R'"$braces_stack"
else else
if _zsh_highlight_main_highlighter_check_path; then if _zsh_highlight_main_highlighter_check_path; then
style=$REPLY style=$REPLY
@ -516,7 +543,7 @@ _zsh_highlight_highlighter_main_paint()
in_array_assignment=false in_array_assignment=false
next_word+=':start:' next_word+=':start:'
else else
style=reserved-word _zsh_highlight_main__stack_pop 'R' style=reserved-word
fi;; fi;;
$'\x7d') # right brace $'\x7d') # right brace
# #
@ -525,7 +552,7 @@ _zsh_highlight_highlighter_main_paint()
# Additionally, `tt(})' is recognized in any position if neither the # Additionally, `tt(})' is recognized in any position if neither the
# tt(IGNORE_BRACES) option nor the tt(IGNORE_CLOSE_BRACES) option is set.""" # tt(IGNORE_BRACES) option nor the tt(IGNORE_CLOSE_BRACES) option is set."""
if $right_brace_is_recognised_everywhere; then if $right_brace_is_recognised_everywhere; then
style=reserved-word _zsh_highlight_main__stack_pop 'Y' style=reserved-word
else else
# Fall through to the catchall case at the end. # Fall through to the catchall case at the end.
fi fi

View file

@ -38,5 +38,5 @@ expected_region_highlight=(
'6 9 builtin' # echo '6 9 builtin' # echo
'11 11 reserved-word' # } '11 11 reserved-word' # }
'12 12 commandseparator' # \n '12 12 commandseparator' # \n
'13 13 unknown-token "issue #344 (balanced parentheses/braces)"' # } '13 13 unknown-token' # }
) )

View file

@ -0,0 +1,40 @@
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER='() { echo foo )'
expected_region_highlight=(
'1 2 reserved-word' # ()
'4 4 reserved-word' # {
'6 9 builtin' # echo
'11 13 default' # foo
'15 15 unknown-token' # )
)

View file

@ -0,0 +1,40 @@
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER='() ( echo foo }'
expected_region_highlight=(
'1 2 reserved-word' # ()
'4 4 reserved-word' # (
'6 9 builtin' # echo
'11 13 default' # foo
'15 15 unknown-token' # }
)