Mercurial > vim
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