mirror of
				https://github.com/zsh-users/zsh-syntax-highlighting.git
				synced 2025-11-03 19:45:46 +00:00 
			
		
		
		
	
							parent
							
								
									f8b1470314
								
							
						
					
					
						commit
						a238647df9
					
				@ -50,13 +50,6 @@
 | 
			
		||||
- Fix `echo >&p` highlighting the `p` as a filename if a file by that name happened to exist
 | 
			
		||||
  [part of #645]
 | 
			
		||||
 | 
			
		||||
- Fix `: $((42))` being highlighted as a subshell.
 | 
			
		||||
  [part of #607]
 | 
			
		||||
 | 
			
		||||
- Regress highlighting of `: $((ls); (ls))`: is a subshell, but will now be
 | 
			
		||||
  incorrectly highlighted as an arithmetic expansion.
 | 
			
		||||
  [#704]
 | 
			
		||||
 | 
			
		||||
- Fix wrong highlighting of unquoted parameter expansions under zsh 5.2 and older
 | 
			
		||||
  [e165f18c758e]
 | 
			
		||||
 | 
			
		||||
@ -89,6 +82,8 @@
 | 
			
		||||
  (such as `;`, `|`, `&&`) before a newline
 | 
			
		||||
  [#677; had regressed in 0.7.0]
 | 
			
		||||
 | 
			
		||||
- Highlight arithmetic expansions (e.g., `$(( 42 ))`)
 | 
			
		||||
  [#607 #649 #704]
 | 
			
		||||
 | 
			
		||||
# Changes in version 0.7.1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,7 @@ This highlighter defines the following styles:
 | 
			
		||||
* `command-substitution-delimiter-quoted` - a quoted command substitution delimiters (`"$(` and `)"`)
 | 
			
		||||
* `process-substitution` - process substitutions (`<(echo foo)`)
 | 
			
		||||
* `process-substitution-delimiter` - process substitution delimiters (`<(` and `)`)
 | 
			
		||||
* `arithmetic-expansion` - arithmetic expansion `$(( 42 ))`)
 | 
			
		||||
* `single-hyphen-option` - single-hyphen options (`-o`)
 | 
			
		||||
* `double-hyphen-option` - double-hyphen options (`--option`)
 | 
			
		||||
* `back-quoted-argument` - backtick command substitution (`` `foo` ``)
 | 
			
		||||
 | 
			
		||||
@ -1350,8 +1350,13 @@ _zsh_highlight_main_highlighter_highlight_argument()
 | 
			
		||||
          (( i = REPLY ))
 | 
			
		||||
          highlights+=($reply)
 | 
			
		||||
          continue
 | 
			
		||||
        elif [[ $arg[i+1] == $'\x28' && ${arg:$i} != $'\x28\x28'*$'\x29\x29'* ]]; then
 | 
			
		||||
          # command substitution that doesn't look like an arithmetic expansion
 | 
			
		||||
        elif [[ $arg[i+1] == $'\x28' ]]; then
 | 
			
		||||
          if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
 | 
			
		||||
            # Arithmetic expansion
 | 
			
		||||
            (( i = REPLY ))
 | 
			
		||||
            highlights+=($reply)
 | 
			
		||||
            continue
 | 
			
		||||
          fi
 | 
			
		||||
          start=$i
 | 
			
		||||
          (( i += 2 ))
 | 
			
		||||
          _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
 | 
			
		||||
@ -1366,10 +1371,6 @@ _zsh_highlight_main_highlighter_highlight_argument()
 | 
			
		||||
            highlights+=($(( start_pos + i - 1)) $(( start_pos + i )) command-substitution-delimiter-unquoted)
 | 
			
		||||
          fi
 | 
			
		||||
          continue
 | 
			
		||||
        else
 | 
			
		||||
          # TODO: if it's an arithmetic expansion, skip past it, to prevent
 | 
			
		||||
          # multiplications from being highlighted as globbing (issue #607,
 | 
			
		||||
          # test-data/arith1.zsh)
 | 
			
		||||
        fi
 | 
			
		||||
        while [[ $arg[i+1] == [=~#+'^'] ]]; do
 | 
			
		||||
          (( i += 1 ))
 | 
			
		||||
@ -1497,11 +1498,17 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
 | 
			
		||||
              # $#, $*, $@, $?, $- - like $$ above
 | 
			
		||||
              (( k += 1 )) # highlight both dollar signs
 | 
			
		||||
              (( i += 1 )) # don't consider the second one as introducing another parameter expansion
 | 
			
		||||
            elif [[ $arg[i+1] == $'\x28' && ${arg:$i} != $'\x28\x28'*$'\x29\x29'* ]]; then
 | 
			
		||||
              # command substitution that doesn't look like an arithmetic expansion
 | 
			
		||||
            elif [[ $arg[i+1] == $'\x28' ]]; then
 | 
			
		||||
              saved_reply=($reply)
 | 
			
		||||
              if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
 | 
			
		||||
                # Arithmetic expansion
 | 
			
		||||
                (( i = REPLY ))
 | 
			
		||||
                reply=($saved_reply $reply)
 | 
			
		||||
                continue
 | 
			
		||||
              fi
 | 
			
		||||
 | 
			
		||||
              breaks+=( $last_break $(( start_pos + i - 1 )) )
 | 
			
		||||
              (( i += 2 ))
 | 
			
		||||
              saved_reply=($reply)
 | 
			
		||||
              _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
 | 
			
		||||
              ret=$?
 | 
			
		||||
              (( i += REPLY ))
 | 
			
		||||
@ -1682,6 +1689,96 @@ _zsh_highlight_main_highlighter_highlight_backtick()
 | 
			
		||||
  REPLY=$i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Highlight special chars inside arithmetic expansions
 | 
			
		||||
_zsh_highlight_main_highlighter_highlight_arithmetic()
 | 
			
		||||
{
 | 
			
		||||
  local -a saved_reply
 | 
			
		||||
  local style
 | 
			
		||||
  integer i j k paren_depth ret
 | 
			
		||||
  reply=()
 | 
			
		||||
 | 
			
		||||
  for (( i = $1 + 3 ; i <= end_pos - start_pos ; i += 1 )) ; do
 | 
			
		||||
    (( j = i + start_pos - 1 ))
 | 
			
		||||
    (( k = j + 1 ))
 | 
			
		||||
    case "$arg[$i]" in
 | 
			
		||||
      [\'\"\\@{}])
 | 
			
		||||
        style=unknown-token
 | 
			
		||||
        ;;
 | 
			
		||||
      '(')
 | 
			
		||||
        (( paren_depth++ ))
 | 
			
		||||
        continue
 | 
			
		||||
        ;;
 | 
			
		||||
      ')')
 | 
			
		||||
        if (( paren_depth )); then
 | 
			
		||||
          (( paren_depth-- ))
 | 
			
		||||
          continue
 | 
			
		||||
        fi
 | 
			
		||||
        [[ $arg[i+1] == ')' ]] && { (( i++ )); break; }
 | 
			
		||||
        # Special case ) at the end of the buffer to avoid flashing command substitution for a character
 | 
			
		||||
        (( has_end && (len == k) )) && break
 | 
			
		||||
        # This is a single paren and there are no open parens, so this isn't an arithmetic expansion
 | 
			
		||||
        return 1
 | 
			
		||||
        ;;
 | 
			
		||||
      '`')
 | 
			
		||||
        saved_reply=($reply)
 | 
			
		||||
        _zsh_highlight_main_highlighter_highlight_backtick $i
 | 
			
		||||
        (( i = REPLY ))
 | 
			
		||||
        reply=($saved_reply $reply)
 | 
			
		||||
        continue
 | 
			
		||||
        ;;
 | 
			
		||||
      '$' )
 | 
			
		||||
        if [[ $arg[i+1] == $'\x28' ]]; then
 | 
			
		||||
          saved_reply=($reply)
 | 
			
		||||
          if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
 | 
			
		||||
            # Arithmetic expansion
 | 
			
		||||
            (( i = REPLY ))
 | 
			
		||||
            reply=($saved_reply $reply)
 | 
			
		||||
            continue
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
          (( i += 2 ))
 | 
			
		||||
          _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,end_pos]
 | 
			
		||||
          ret=$?
 | 
			
		||||
          (( i += REPLY ))
 | 
			
		||||
          reply=(
 | 
			
		||||
            $saved_reply
 | 
			
		||||
            $j $(( start_pos + i )) command-substitution-quoted
 | 
			
		||||
            $j $(( j + 2 )) command-substitution-delimiter-quoted
 | 
			
		||||
            $reply
 | 
			
		||||
          )
 | 
			
		||||
          if (( ret == 0 )); then
 | 
			
		||||
            reply+=($(( start_pos + i - 1 )) $(( start_pos + i )) command-substitution-delimiter)
 | 
			
		||||
          fi
 | 
			
		||||
          continue
 | 
			
		||||
        else
 | 
			
		||||
          continue
 | 
			
		||||
        fi
 | 
			
		||||
        ;;
 | 
			
		||||
      ($histchars[1]) # ! - may be a history expansion
 | 
			
		||||
        if [[ $arg[i+1] != ('='|$'\x28'|$'\x7b'|[[:blank:]]) ]]; then
 | 
			
		||||
          style=history-expansion
 | 
			
		||||
        else
 | 
			
		||||
          continue
 | 
			
		||||
        fi
 | 
			
		||||
        ;;
 | 
			
		||||
      *)
 | 
			
		||||
        continue
 | 
			
		||||
        ;;
 | 
			
		||||
 | 
			
		||||
    esac
 | 
			
		||||
    reply+=($j $k $style)
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [[ $arg[i] != ')' ]]; then
 | 
			
		||||
    # If unclosed, i points past the end
 | 
			
		||||
    (( i-- ))
 | 
			
		||||
  fi
 | 
			
		||||
    style=arithmetic-expansion
 | 
			
		||||
  reply=($(( start_pos + $1 - 1)) $(( start_pos + i )) arithmetic-expansion $reply)
 | 
			
		||||
  REPLY=$i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Called with a single positional argument.
 | 
			
		||||
# Perform filename expansion (tilde expansion) on the argument and set $REPLY to the expanded value.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
@ -33,14 +33,14 @@ BUFFER=$': $((ls); (ls))'
 | 
			
		||||
expected_region_highlight=(
 | 
			
		||||
  '1 1 builtin' # :
 | 
			
		||||
  '3 15 default' # $((ls); (ls))
 | 
			
		||||
  '3 15 command-substitution-unquoted "issue #704"' # $((ls); (ls))
 | 
			
		||||
  '3 4 command-substitution-delimiter-unquoted "issue #704"' # $(
 | 
			
		||||
  '5 5 reserved-word "issue #704"' # (
 | 
			
		||||
  '6 7 command "issue #704"' # ls
 | 
			
		||||
  '8 8 reserved-word "issue #704"' # )
 | 
			
		||||
  '9 9 commandseparator "issue #704"' # ;
 | 
			
		||||
  '11 11 reserved-word "issue #704"' # (
 | 
			
		||||
  '12 13 command "issue #704"' # ls
 | 
			
		||||
  '14 14 reserved-word "issue #704"' # )
 | 
			
		||||
  '15 15 command-substitution-delimiter-unquoted "issue #704"' # )
 | 
			
		||||
  '3 15 command-substitution-unquoted' # $((ls); (ls))
 | 
			
		||||
  '3 4 command-substitution-delimiter-unquoted' # $(
 | 
			
		||||
  '5 5 reserved-word' # (
 | 
			
		||||
  '6 7 command' # ls
 | 
			
		||||
  '8 8 reserved-word' # )
 | 
			
		||||
  '9 9 commandseparator' # ;
 | 
			
		||||
  '11 11 reserved-word' # (
 | 
			
		||||
  '12 13 command' # ls
 | 
			
		||||
  '14 14 reserved-word' # )
 | 
			
		||||
  '15 15 command-substitution-delimiter-unquoted' # )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -33,5 +33,5 @@ BUFFER=$': $(( 6 * 9 ))'
 | 
			
		||||
expected_region_highlight=(
 | 
			
		||||
  '1 1 builtin' # :
 | 
			
		||||
  '3 14 default' # $(( 6 * 9 ))
 | 
			
		||||
  '3 14 arithmetic-expansion' # $(( 6 * 9 ))
 | 
			
		||||
)
 | 
			
		||||
expected_mismatch="currently the actual highlighting has one superfluous group that highlights the asterisk is highlighted as 'globbing'"
 | 
			
		||||
 | 
			
		||||
@ -34,4 +34,5 @@ expected_region_highlight=(
 | 
			
		||||
  '1 1 builtin' # :
 | 
			
		||||
  '3 16 default' # "$(( 6 * 9 ))"
 | 
			
		||||
  '3 16 double-quoted-argument' # "$(( 6 * 9 ))"
 | 
			
		||||
  '4 15 arithmetic-expansion' # $(( 6 * 9 ))
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user