view runtime/syntax/fish.vim @ 33674:021e5bb88513 v9.0.2074

patch 9.0.2074: Completion menu may be wrong Commit: https://github.com/vim/vim/commit/daef8c74375141974d61b85199b383017644978c Author: Christian Brabandt <cb@256bit.org> Date: Fri Oct 27 19:16:26 2023 +0200 patch 9.0.2074: Completion menu may be wrong Problem: Completion menu may be wrong Solution: Check for the original direction of the completion menu, add more tests, make it work with 'noselect' completion: move in right direction when filling completion_info() When moving through the insert completion menu and switching directions, we need to make sure we start at the correct position in the list and move correctly forward/backwards through it, so that we do not skip entries and the selected item points to the correct entry in the list of completion entries generated by the completion_info() function. The general case is this: 1) CTRL-X CTRL-N, we will traverse the list starting from compl_first_match and then go forwards (using the cp->next pointer) through the list (skipping the very first entry, which has the CP_ORIGINAL_TEXT flag set (since that is the empty/non-selected entry 2) CTRL-X CTRL-P, we will traverse the list starting from compl_first_match (which now points to the last entry). The previous entry will have the CP_ORIGINAL_TEXT flag set, so we need to start traversing the list from the second prev pointer. There are in fact 2 special cases after starting the completion menu with CTRL-X: 3) CTRL-N and then going backwards by pressing CTRL-P again. compl_first_match will point to the same entry as in step 1 above, but since compl_dir_foward() has been switched by pressing CTRL-P to backwards we need to pretend to be in still in case 1 and still traverse the list in forward direction using the cp_next pointer 4) CTRL-P and then going forwards by pressing CTRL-N again. compl_first_match will point to the same entry as in step 2 above, but since compl_dir_foward() has been switched by pressing CTRL-N to forwards we need to pretend to be in still in case 2 and still traverse the list in backward direction using the cp_prev pointer For the 'noselect' case however, this is slightly different again. When going backwards, we only need to go one cp_prev pointer back. And resting of the direction works again slightly different. So we need to take the noselect option into account when deciding in which direction to iterate through the list of matches. related: #13402 related: #12971 closes: #13408 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Fri, 27 Oct 2023 19:30:05 +0200
parents a9b5ffbc0428
children
line wrap: on
line source

" Vim syntax file
" Language:     fish
" Maintainer:   Nicholas Boyle (github.com/nickeb96)
" Repository:   https://github.com/nickeb96/fish.vim
" Last Change:  February 1, 2023

if exists("b:current_syntax")
    finish
endif

let s:cpo_save = &cpo
set cpo&vim


" Statements
syn cluster fishStatement contains=fishKeywordAndOr,fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand,fishVariable

syn keyword fishKeywordAndOr and or nextgroup=fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
hi def link fishKeywordAndOr fishOperator

syn keyword fishNot not skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
syn match   fishNot /!/ skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
hi def link fishNot fishOperator

syn keyword fishSelectStatement command builtin skipwhite nextgroup=fishKeyword,fishKeywordIf,fishCommand,fishOption
hi def link fishSelectStatement fishKeyword

syn keyword fishKeyword end skipwhite nextgroup=@fishTerminator

syn keyword fishKeywordIf if skipwhite nextgroup=@fishStatement
syn keyword fishKeyword else skipwhite nextgroup=fishKeywordIf,fishSemicolon
hi def link fishKeywordIf fishKeyword

syn keyword fishKeyword switch skipwhite nextgroup=@fishArgument
syn keyword fishKeyword case skipwhite nextgroup=@fishArgument

syn keyword fishKeyword while skipwhite nextgroup=@fishStatement

syn keyword fishKeyword for skipwhite nextgroup=fishForVariable
syn match   fishForVariable /[[:alnum:]_]\+/ contained skipwhite nextgroup=fishKeywordIn
syn keyword fishKeywordIn in contained skipwhite nextgroup=@fishArgument
hi def link fishForVariable fishParameter
hi def link fishKeywordIn fishKeyword

syn keyword fishKeyword _ abbr argparse begin bg bind block break breakpoint cd commandline
    \ complete continue count disown echo emit eval exec exit false fg function functions
    \ history jobs math printf pwd random read realpath return set set_color source status
    \ string test time true type ulimit wait
    \ skipwhite nextgroup=@fishNext
syn match   fishKeyword /\<contains\>/ skipwhite nextgroup=@fishNext

syn match   fishCommand /[[:alnum:]_\/[][[:alnum:]+._-]*/ skipwhite nextgroup=@fishNext


" Internally Nested Arguments

syn cluster fishSubscriptArgs contains=fishInnerVariable,fishIndexNum,fishIndexRange,fishInnerCommandSub

syn match   fishInnerVariable /\$\+[[:alnum:]_]\+/ contained
syn match   fishInnerVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 contained nextgroup=fishInnerSubscript
hi def link fishInnerVariable fishVariable

syn region  fishInnerSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained
    \ keepend contains=@fishSubscriptArgs
hi def link fishInnerSubscript fishSubscript

syn match   fishIndexNum /[+-]?[[:digit:]]\+/ contained
hi def link fishIndexNum fishParameter

syn match   fishIndexRange /\.\./ contained
hi def link fishIndexRange fishParameter

syn region  fishInnerCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained
    \ contains=@fishStatement
hi def link fishInnerCommandSub fishCommandSub

syn region  fishQuotedCommandSub matchgroup=fishOperator start=/\$(/ end=/)/ contained
    \ contains=@fishStatement
hi def link fishQuotedCommandSub fishCommandSub

syn match   fishBraceExpansionComma /,/ contained
hi def link fishBraceExpansionComma fishOperator

syn match   fishBracedParameter '[[:alnum:]\u5b\u5d@:=+.%/!_-]\+' contained contains=fishInnerPathGlob
hi def link fishBracedParameter fishParameter

syn region  fishBracedQuote start=/'/ skip=/\\'/ end=/'/ contained
    \ contains=fishEscapedEscape,fishEscapedSQuote
syn region  fishBracedQuote start=/"/ skip=/\\"/ end=/"/ contained
    \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishInnerCommandSub
hi def link fishBracedQuote fishQuote


" Arguments

syn cluster fishArgument contains=fishParameter,fishOption,fishVariable,fishPathGlob,fishBraceExpansion,fishQuote,fishCharacter,fishCommandSub,fishRedirection,fishSelfPid

syn match   fishParameter '[[:alnum:]\u5b\u5d@:=+.,%/!_-]\+' contained skipwhite nextgroup=@fishNext

syn match   fishOption /-[[:alnum:]=_-]*/ contained skipwhite nextgroup=@fishNext

syn match   fishPathGlob /\(\~\|*\|?\)/ contained skipwhite nextgroup=@fishNext

syn region  fishBraceExpansion matchgroup=fishOperator start=/{/ end=/}/ contained
    \ contains=fishBraceExpansionComma,fishInnerVariable,fishInnerCommandSub,fishBracedParameter,fishBracedQuote
    \ skipwhite nextgroup=@fishNext

syn match   fishVariable /\$\+[[:alnum:]_]\+/ skipwhite nextgroup=@fishNext
syn match   fishVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 nextgroup=fishSubscript

syn region  fishSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained
    \ keepend contains=@fishSubscriptArgs
    \ skipwhite nextgroup=@fishNext

syn region  fishCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained
    \ contains=@fishStatement
    \ skipwhite nextgroup=@fishNext

syn region  fishQuote start=/'/ skip=/\\'/ end=/'/ contained
    \ contains=fishEscapedEscape,fishEscapedSQuote
    \ skipwhite nextgroup=@fishNext
syn region  fishQuote start=/"/ skip=/\\"/ end=/"/ contained
    \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishQuotedCommandSub
    \ skipwhite nextgroup=@fishNext

syn match   fishEscapedEscape /\\\\/ contained
syn match   fishEscapedSQuote /\\'/ contained
syn match   fishEscapedDQuote /\\"/ contained
syn match   fishEscapedDollar /\\\$/ contained
hi def link fishEscapedEscape fishCharacter
hi def link fishEscapedSQuote fishCharacter
hi def link fishEscapedDQuote fishCharacter
hi def link fishEscapedDollar fishCharacter

syn match   fishCharacter /\\[0-7]\{1,3}/                          contained skipwhite nextgroup=@fishNext
syn match   fishCharacter /\\u[0-9a-fA-F]\{4}/                     contained skipwhite nextgroup=@fishNext
syn match   fishCharacter /\\U[0-9a-fA-F]\{8}/                     contained skipwhite nextgroup=@fishNext
syn match   fishCharacter /\\x[0-7][0-9a-fA-F]\|\\x[0-9a-fA-F]/    contained skipwhite nextgroup=@fishNext
syn match   fishCharacter /\\X[0-9a-fA-F]\{1,2}/                   contained skipwhite nextgroup=@fishNext
syn match   fishCharacter /\\[abcefnrtv[\](){}<>\\*?~%#$|&;'" ]/   contained skipwhite nextgroup=@fishNext

syn match   fishRedirection /</ contained skipwhite nextgroup=fishRedirectionTarget
syn match   fishRedirection /[0-9&]\?>[>?]\?/ contained skipwhite nextgroup=fishRedirectionTarget
syn match   fishRedirection /[0-9&]\?>&[0-9-]/ contained skipwhite nextgroup=@fishNext

syn match   fishRedirectionTarget /[[:alnum:]$~*?{,}"'\/._-]\+/ contained contains=fishInnerVariable skipwhite nextgroup=@fishNext
hi def link fishRedirectionTarget fishRedirection

syn match fishSelfPid /%self\>/ contained nextgroup=@fishNext
hi def link fishSelfPid fishOperator


" Terminators

syn cluster fishTerminator contains=fishPipe,fishBackgroundJob,fishSemicolon,fishSymbolicAndOr

syn match   fishPipe /\(1>\|2>\|&\)\?|/ contained skipwhite nextgroup=@fishStatement
hi def link fishPipe fishEnd

syn match   fishBackgroundJob /&$/ contained skipwhite nextgroup=@fishStatement
syn match   fishBackgroundJob /&[^<>&|]/me=s+1,he=s+1 contained skipwhite nextgroup=@fishStatement
hi def link fishBackgroundJob fishEnd

syn match   fishSemicolon /;/ skipwhite nextgroup=@fishStatement
hi def link fishSemicolon fishEnd

syn match   fishSymbolicAndOr /\(&&\|||\)/ contained skipwhite skipempty nextgroup=@fishStatement
hi def link fishSymbolicAndOr fishOperator


" Other

syn cluster fishNext contains=fishEscapedNl,@fishArgument,@fishTerminator

syn match   fishEscapedNl /\\$/ skipnl skipwhite contained nextgroup=@fishNext

syn match   fishComment /#.*/ contains=fishTodo,@Spell

syn keyword fishTodo TODO contained



syn sync minlines=200
syn sync maxlines=300


" Intermediate highlight groups matching $fish_color_* variables

hi def link fishCommand                 fish_color_command
hi def link fishComment                 fish_color_comment
hi def link fishEnd                     fish_color_end
hi def link fishCharacter               fish_color_escape
hi def link fishKeyword                 fish_color_keyword
hi def link fishEscapedNl               fish_color_normal
hi def link fishOperator                fish_color_operator
hi def link fishVariable                fish_color_operator
hi def link fishInnerVariable           fish_color_operator
hi def link fishPathGlob                fish_color_operator
hi def link fishOption                  fish_color_option
hi def link fishParameter               fish_color_param
hi def link fishQuote                   fish_color_quote
hi def link fishRedirection             fish_color_redirection


" Default highlight groups 

hi def link fish_color_param        Normal
hi def link fish_color_normal       Normal
hi def link fish_color_option       Normal
hi def link fish_color_command      Function
hi def link fish_color_keyword      Keyword
hi def link fish_color_end          Delimiter
hi def link fish_color_operator     Operator
hi def link fish_color_redirection  Type
hi def link fish_color_quote        String
hi def link fish_color_escape       Character
hi def link fish_color_comment      Comment

hi def link fishTodo                Todo


let b:current_syntax = 'fish'

let &cpo = s:cpo_save
unlet s:cpo_save