view runtime/syntax/flexwiki.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 d46f974fd69e
children
line wrap: on
line source

" Vim syntax file
" Language:     FlexWiki, http://www.flexwiki.com/
" Maintainer:   George V. Reilly  <george@reilly.org>
" Home:         http://www.georgevreilly.com/vim/flexwiki/
" Other Home:   http://www.vim.org/scripts/script.php?script_id=1529
" Author:       George V. Reilly
" Filenames:    *.wiki
" Last Change: Wed Apr 26 11:00 PM 2006 P
" Version:      0.3

" Note: The horrible regexps were reverse-engineered from
" FlexWikiCore\EngineSource\Formatter.cs, with help from the Regex Analyzer
" in The Regulator, http://regulator.sourceforge.net/  .NET uses Perl-style
" regexes, which use a different syntax than Vim (fewer \s).
" The primary test case is FlexWiki\FormattingRules.wiki

" quit when a syntax file was already loaded
if exists("b:current_syntax")
    finish
endif

" A WikiWord (unqualifiedWikiName)
syntax match  flexwikiWord          /\%(_\?\([A-Z]\{2,}[a-z0-9]\+[A-Za-z0-9]*\)\|\([A-Z][a-z0-9]\+[A-Za-z0-9]*[A-Z]\+[A-Za-z0-9]*\)\)/
" A [bracketed wiki word]
syntax match  flexwikiWord          /\[[[:alnum:]\s]\+\]/

" text: "this is a link (optional tooltip)":http://www.microsoft.com
" TODO: check URL syntax against RFC
syntax match flexwikiLink           `\("[^"(]\+\((\([^)]\+\))\)\?":\)\?\(https\?\|ftp\|gopher\|telnet\|file\|notes\|ms-help\):\(\(\(//\)\|\(\\\\\)\)\+[A-Za-z0-9:#@%/;$~_?+-=.&\-\\\\]*\)`

" text: *strong* 
syntax match flexwikiBold           /\(^\|\W\)\zs\*\([^ ].\{-}\)\*/
" '''bold'''
syntax match flexwikiBold           /'''\([^'].\{-}\)'''/

" text: _emphasis_
syntax match flexwikiItalic         /\(^\|\W\)\zs_\([^ ].\{-}\)_/
" ''italic''
syntax match flexwikiItalic         /''\([^'].\{-}\)''/

" ``deemphasis``
syntax match flexwikiDeEmphasis     /``\([^`].\{-}\)``/

" text: @code@ 
syntax match flexwikiCode           /\(^\|\s\|(\|\[\)\zs@\([^@]\+\)@/

"   text: -deleted text- 
syntax match flexwikiDelText        /\(^\|\s\+\)\zs-\([^ <a ]\|[^ <img ]\|[^ -].*\)-/

"   text: +inserted text+ 
syntax match flexwikiInsText        /\(^\|\W\)\zs+\([^ ].\{-}\)+/

"   text: ^superscript^ 
syntax match flexwikiSuperScript    /\(^\|\W\)\zs^\([^ ].\{-}\)^/

"   text: ~subscript~ 
syntax match flexwikiSubScript      /\(^\|\W\)\zs\~\([^ ].\{-}\)\~/

"   text: ??citation?? 
syntax match flexwikiCitation       /\(^\|\W\)\zs??\([^ ].\{-}\)??/

" Emoticons: must come after the Textilisms, as later rules take precedence
" over earlier ones. This match is an approximation for the ~70 distinct
" patterns that FlexWiki knows.
syntax match flexwikiEmoticons      /\((.)\|:[()|$@]\|:-[DOPS()\]|$@]\|;)\|:'(\)/

" Aggregate all the regular text highlighting into flexwikiText
syntax cluster flexwikiText contains=flexwikiItalic,flexwikiBold,flexwikiCode,flexwikiDeEmphasis,flexwikiDelText,flexwikiInsText,flexwikiSuperScript,flexwikiSubScript,flexwikiCitation,flexwikiLink,flexwikiWord,flexwikiEmoticons

" single-line WikiProperties
syntax match flexwikiSingleLineProperty /^:\?[A-Z_][_a-zA-Z0-9]\+:/

" TODO: multi-line WikiProperties

" Header levels, 1-6
syntax match flexwikiH1             /^!.*$/
syntax match flexwikiH2             /^!!.*$/
syntax match flexwikiH3             /^!!!.*$/
syntax match flexwikiH4             /^!!!!.*$/
syntax match flexwikiH5             /^!!!!!.*$/
syntax match flexwikiH6             /^!!!!!!.*$/

" <hr>, horizontal rule
syntax match flexwikiHR             /^----.*$/

" Formatting can be turned off by ""enclosing it in pairs of double quotes""
syntax match flexwikiEscape         /"".\{-}""/

" Tables. Each line starts and ends with '||'; each cell is separated by '||'
syntax match flexwikiTable          /||/

" Bulleted list items start with one or tabs, followed by whitespace, then '*'
" Numeric  list items start with one or tabs, followed by whitespace, then '1.'
" Eight spaces at the beginning of the line is equivalent to the leading tab.
syntax match flexwikiList           /^\(\t\| \{8}\)\s*\(\*\|1\.\).*$/   contains=@flexwikiText

" Treat all other lines that start with spaces as PRE-formatted text.
syntax match flexwikiPre            /^[ \t]\+[^ \t*1].*$/


" Link FlexWiki syntax items to colors
hi def link flexwikiH1                    Title
hi def link flexwikiH2                    flexwikiH1
hi def link flexwikiH3                    flexwikiH2
hi def link flexwikiH4                    flexwikiH3
hi def link flexwikiH5                    flexwikiH4
hi def link flexwikiH6                    flexwikiH5
hi def link flexwikiHR                    flexwikiH6
    
hi def flexwikiBold                       term=bold cterm=bold gui=bold
hi def flexwikiItalic                     term=italic cterm=italic gui=italic

hi def link flexwikiCode                  Statement
hi def link flexwikiWord                  Underlined

hi def link flexwikiEscape                Todo
hi def link flexwikiPre                   PreProc
hi def link flexwikiLink                  Underlined
hi def link flexwikiList                  Type
hi def link flexwikiTable                 Type
hi def link flexwikiEmoticons             Constant
hi def link flexwikiDelText               Comment
hi def link flexwikiDeEmphasis            Comment
hi def link flexwikiInsText               Constant
hi def link flexwikiSuperScript           Constant
hi def link flexwikiSubScript             Constant
hi def link flexwikiCitation              Constant

hi def link flexwikiSingleLineProperty    Identifier

let b:current_syntax="FlexWiki"

" vim:tw=0: