vim-patch:9.1.0386: filetype: stylus files not recognized

Problem:  filetype: stylus files not recognized
Solution: Detect '*.styl' and '*.stylus' as stylus filetype,
          include indent, filetype and syntax plugin
          (Philip H)

closes: vim/vim#14656

2d919d2744

Co-authored-by: Philip H <47042125+pheiduck@users.noreply.github.com>
This commit is contained in:
Christian Clason 2024-05-01 18:46:10 +02:00
parent e778e01161
commit 9e2f378b6d
5 changed files with 239 additions and 0 deletions

View File

@ -0,0 +1,54 @@
" Vim filetype plugin
" Language: Stylus
" Maintainer: Marc Harter
" Credits: Tim Pope
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endif
let s:save_cpo = &cpo
set cpo-=C
" Define some defaults in case the included ftplugins don't set them.
let s:undo_ftplugin = ""
let s:browsefilter = "All Files (*.*)\t*.*\n"
runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
unlet! b:did_ftplugin
" Override our defaults if these were set by an included ftplugin.
if exists("b:undo_ftplugin")
let s:undo_ftplugin = b:undo_ftplugin
unlet b:undo_ftplugin
endif
if exists("b:browsefilter")
let s:browsefilter = b:browsefilter
unlet b:browsefilter
endif
" Change the browse dialog on Win32 to show mainly Styl-related files
if has("gui_win32")
let b:browsefilter="Stylus Files (*.styl)\t*.styl\n" . s:browsefilter
endif
setlocal comments= commentstring=//\ %s
setlocal suffixesadd=.styl
setlocal formatoptions+=r
" Add '-' and '#' to the what makes up a keyword.
" This means that 'e' and 'w' work properly now, for properties
" and valid variable names.
setl iskeyword+=#,-
" Add a Stylus command (to see if it's valid)
command -buffer Stylus !clear; cat % |stylus
let b:undo_ftplugin = "setl sua< isk< cms< com< fo< "
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
let &cpo = s:save_cpo
" vim:set sw=2:

121
runtime/indent/stylus.vim Normal file
View File

@ -0,0 +1,121 @@
" Vim indent file
" Language: Stylus
" Maintainer: Marc Harter
" Last Change: 2010 May 21
" Based On: sass.vim from Tim Pope
"
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetStylusIndent()
setlocal indentkeys=o,O,*<Return>,},],0),!^F
let b:undo_indent = "setl indentexpr< indentkeys<"
if exists("*GetStylusIndent") " only define once
finish
endif
function s:prevnonblanknoncomment(lnum)
let lnum = a:lnum
while lnum > 1
let lnum = prevnonblank(lnum)
let line = getline(lnum)
if line =~ '\*/'
while lnum > 1 && line !~ '/\*'
let lnum -= 1
endwhile
if line =~ '^\s*/\*'
let lnum -= 1
else
break
endif
else
break
endif
endwhile
return lnum
endfunction
function s:count_braces(lnum, count_open)
let n_open = 0
let n_close = 0
let line = getline(a:lnum)
let pattern = '[{}]'
let i = match(line, pattern)
while i != -1
if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
if line[i] == '{'
let n_open += 1
elseif line[i] == '}'
if n_open > 0
let n_open -= 1
else
let n_close += 1
endif
endif
endif
let i = match(line, pattern, i + 1)
endwhile
return a:count_open ? n_open : n_close
endfunction
" function CheckCSSIndent()
" let line = getline(v:lnum)
" if line =~ '^\s*\*'
" return cindent(v:lnum)
" endif
"
" let pnum = s:prevnonblanknoncomment(v:lnum - 1)
" if pnum == 0
" return 0
" endif
function! GetStylusIndent()
let line = getline(v:lnum)
if line =~ '^\s*\*'
return cindent(v:lnum)
endif
let pnum = s:prevnonblanknoncomment(v:lnum - 1)
if pnum == 0
return 0
endif
let lnum = prevnonblank(v:lnum-1)
if lnum == 0
return 0
endif
let pline = getline(pnum)
if pline =~ '[}{]'
return indent(pnum) + s:count_braces(pnum, 1) * &sw - s:count_braces(v:lnum, 0) * &sw
endif
let line = substitute(getline(lnum),'[\s()]\+$','','') " get last line strip ending whitespace
let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','') " get current line, trimmed
let lastcol = strlen(line) " get last col in prev line
let line = substitute(line,'^\s\+','','') " then remove preceeding whitespace
let indent = indent(lnum) " get indent on prev line
let cindent = indent(v:lnum) " get indent on current line
let increase = indent + &sw " increase indent by the shift width
if indent == indent(lnum)
let indent = cindent <= indent ? indent : increase
endif
let group = synIDattr(synID(lnum,lastcol,1),'name')
" if group !~? 'css.*' && line =~? ')\s*$' " match user functions
" return increase
if group =~? '\v^%(cssTagName|cssClassName|cssIdentifier|cssSelectorOp|cssSelectorOp2|cssBraces|cssAttributeSelector|cssPseudo|stylusId|stylusClass)$'
return increase
elseif (group == 'stylusUserFunction') && (indent(lnum) == '0') " mixin definition
return increase
else
return indent
endif
endfunction
" vim:set sw=2;

View File

@ -1015,6 +1015,8 @@ local extension = {
mata = 'stata',
ado = 'stata',
stp = 'stp',
styl = 'stylus',
stylus = 'stylus',
quark = 'supercollider',
sface = 'surface',
svelte = 'svelte',

61
runtime/syntax/stylus.vim Normal file
View File

@ -0,0 +1,61 @@
" Vim syntax file
" Language: Stylus
" Maintainer: Hsiaoming Yang <lepture@me.com>, Marc Harter
" Filenames: *.styl, *.stylus
" Based On: Tim Pope (sass.vim)
" Created: Dec 14, 2011
" Modified: Apr 29, 2024
if main_syntax == "css"
syn sync minlines=10
endif
" let b:current_syntax = "css"
"
if main_syntax == 'css'
unlet main_syntax
endif
syn case ignore
syn cluster stylusCssSelectors contains=cssTagName,cssSelector,cssPseudo
syn cluster stylusCssValues contains=cssValueLength,cssValueInteger,cssValueNumber,cssValueAngle,cssValueTime,cssValueFrequency,cssColorVal,cssCommonVal,cssFontVal,cssListVal,cssTextVal,cssVisualVal,cssBorderVal,cssBackgroundVal,cssFuncVal,cssAdvancedVal
syn cluster stylusCssProperties contains=cssProp,cssBackgroundProp,cssTableProp,cssBorderProp,cssFontProp,cssColorProp,cssBoxProp,cssTextProp,cssListProp,cssVisualProp,cssAdvancedProp,cssCommonProp,cssSpecialProp
syn match stylusVariable "$\?[[:alnum:]_-]\+"
syn match stylusVariableAssignment "\%([[:alnum:]_-]\+\s*\)\@<==" nextgroup=stylusCssAttribute,stylusVariable skipwhite
syn match stylusProperty "\%([{};]\s*\|^\)\@<=\%([[:alnum:]-]\|#{[^{}]*}\)\+:" contains=@stylusCssProperties,@stylusCssSelectors skipwhite nextgroup=stylusCssAttribute contained containedin=cssDefineBlock
syn match stylusProperty "^\s*\zs\s\%(\%([[:alnum:]-]\|#{[^{}]*}\)\+[ :]\|:[[:alnum:]-]\+\)"hs=s+1 contains=@stylusCssProperties,@stylusCssSelectors skipwhite nextgroup=stylusCssAttribute
syn match stylusProperty "^\s*\zs\s\%(:\=[[:alnum:]-]\+\s*=\)"hs=s+1 contains=@stylusCssProperties,@stylusCssSelectors skipwhite nextgroup=stylusCssAttribute
syn match stylusCssAttribute +\%("\%([^"]\|\\"\)*"\|'\%([^']\|\\'\)*'\|#{[^{}]*}\|[^{};]\)*+ contained contains=@stylusCssValues,cssImportant,stylusFunction,stylusVariable,stylusControl,stylusUserFunction,stylusInterpolation,cssString,stylusComment,cssComment
syn match stylusInterpolation %{[[:alnum:]_-]\+}%
syn match stylusFunction "\<\%(red\|green\|blue\|alpha\|dark\|light\)\>(\@=" contained
syn match stylusFunction "\<\%(hue\|saturation\|lightness\|push\|unshift\|typeof\|unit\|match\)\>(\@=" contained
syn match stylusFunction "\<\%(hsla\|hsl\|rgba\|rgb\|lighten\|darken\)\>(\@=" contained
syn match stylusFunction "\<\%(abs\|ceil\|floor\|round\|min\|max\|even\|odd\|sum\|avg\|sin\|cos\|join\)\>(\@=" contained
syn match stylusFunction "\<\%(desaturate\|saturate\|invert\|unquote\|quote\|s\)\>(\@=" contained
syn match stylusFunction "\<\%(operate\|length\|warn\|error\|last\|p\|\)\>(\@=" contained
syn match stylusFunction "\<\%(opposite-position\|image-size\|add-property\)\>(\@=" contained
syn keyword stylusVariable null true false arguments
syn keyword stylusControl if else unless for in return
syn match stylusImport "@\%(import\|require\)" nextgroup=stylusImportList
syn match stylusImportList "[^;]\+" contained contains=cssString.*,cssMediaType,cssURL
syn match stylusAmpersand "&"
syn match stylusClass "[[:alnum:]_-]\+" contained
syn match stylusClassChar "\.[[:alnum:]_-]\@=" nextgroup=stylusClass
syn match stylusEscape "^\s*\zs\\"
syn match stylusId "[[:alnum:]_-]\+" contained
syn match stylusIdChar "#[[:alnum:]_-]\@=" nextgroup=stylusId
syn region stylusComment start="//" end="$" contains=cssTodo,@Spell fold
let b:current_syntax = "stylus"
" vim:set sw=2:

View File

@ -687,6 +687,7 @@ func s:GetFilenameChecks() abort
\ 'starlark': ['file.ipd', 'file.star', 'file.starlark'],
\ 'stata': ['file.ado', 'file.do', 'file.imata', 'file.mata'],
\ 'stp': ['file.stp'],
\ 'stylus': ['a.styl', 'file.stylus'],
\ 'sudoers': ['any/etc/sudoers', 'sudoers.tmp', '/etc/sudoers', 'any/etc/sudoers.d/file'],
\ 'supercollider': ['file.quark'],
\ 'surface': ['file.sface'],