Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

runtime(stylus): include syntax and ftplugin #14656

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions Filelist
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ SRC_ALL = \
src/testdir/shared.vim \
src/testdir/vim9.vim \
src/testdir/script_util.vim \
src/testdir/stylus/test.styl \
src/testdir/summarize.vim \
src/testdir/term_util.vim \
src/testdir/view_util.vim \
Expand Down
67 changes: 67 additions & 0 deletions runtime/ftplugin/stylus.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
" 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"
let s:match_words = ""
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

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
if exists("b:match_words")
let s:match_words = b:match_words
pheiduck marked this conversation as resolved.
Show resolved Hide resolved
unlet b:match_words
endif
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

" 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

" Load the combined list of match_words for matchit.vim
if exists("loaded_matchit")
let b:match_words = s:match_words
endif
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

setlocal comments= commentstring=//\ %s

setlocal suffixesadd=.styl
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

" 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+=#,-
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

let b:undo_ftplugin = "setl cms< com< "
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin

let &cpo = s:save_cpo

" Add a Stylus command (to see if it's valid)
command! Stylus !clear; cat % | stylus

" Stylus
autocmd BufNewFile,BufReadPost *.styl set filetype=stylus
autocmd BufNewFile,BufReadPost *.stylus set filetype=stylus
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

" vim:set sw=2:
129 changes: 129 additions & 0 deletions runtime/indent/stylus.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
" 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
unlet! b:did_indent
let b:did_indent = 1

setlocal indentexpr=GetStylusIndent()
setlocal indentkeys=o,O,*<Return>,},],0),!^F
setlocal formatoptions+=r
pheiduck marked this conversation as resolved.
Show resolved Hide resolved
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

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
"
" return indent(pnum) + s:count_braces(pnum, 1) * &sw
" \ - s:count_braces(v:lnum, 0) * &sw
" endfunction
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

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')

" for debugging only
echo group
pheiduck marked this conversation as resolved.
Show resolved Hide resolved

" 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;