mirror of
https://github.com/wuelnerdotexe/vim-astro.git
synced 2025-12-06 17:24:25 +08:00
Initial release
This commit is contained in:
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
custom: https://paypal.me/wuelnerdotexe
|
||||||
11
CHANGELOG.md
Normal file
11
CHANGELOG.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.0.0] - 2022-08-05
|
||||||
|
|
||||||
|
- Initial release
|
||||||
|
|
||||||
|
<p align="center">¡Con 💖 de <strong>Latinoamérica</strong> para el mundo!</p>
|
||||||
54
README.md
54
README.md
@@ -1,2 +1,52 @@
|
|||||||
# vim-astro
|
# Astro support for Vim or Neovim
|
||||||
Astro Components indentation and syntax support in Vim.
|
|
||||||
|
> 🧑🚀 Not sure what Astro is? See their website at [astro.build](https://astro.build)!
|
||||||
|
|
||||||
|
Provides syntax highlighting and indentation (beta) support for `.astro` files.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Syntax highlighting for embedded languages:
|
||||||
|
- JavaScript and JSX.
|
||||||
|
- TypeScript and TSX.
|
||||||
|
- CSS, SCSS, SASS, and LESS.
|
||||||
|
- Stylus (need external support).
|
||||||
|
- Indentation (beta).
|
||||||
|
- Code folding.
|
||||||
|
- No dependencies.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Install via your preferred package manager. Example using [vim-plug](https://github.com/junegunn/vim-plug):
|
||||||
|
|
||||||
|
```vim
|
||||||
|
Plug 'wuelnerdotexe/vim-astro'
|
||||||
|
```
|
||||||
|
|
||||||
|
alternatively, install manually.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The following variables control certain syntax highlighting features. You can add them to your `.vimrc` or `init.vim`.
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let g:astro_typescript = 'enable'
|
||||||
|
```
|
||||||
|
|
||||||
|
Enables TypeScript and TSX for `.astro` files.
|
||||||
|
|
||||||
|
Default Value: 'disable'
|
||||||
|
|
||||||
|
## Maintainer
|
||||||
|
|
||||||
|
> Hi 👋, I'm **[Wuelner](https://linktr.ee/wuelnerdotexe)**, a **software developer from Guatemala**, passionate about creating minimalist solutions using solid fundamentals focused on **"how things should be"**.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
- Based on: [Evan Lecklider's](https://github.com/evanleck) [vim-svelte](https://github.com/evanleck/vim-svelte).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT © Wuelner Martínez.](https://github.com/wuelnerdotexe/vim-astro/blob/main/LICENSE)
|
||||||
|
|
||||||
|
<p align="center">¡Con 💖 de <strong>LATAM</strong> para el mundo!</p>
|
||||||
|
|||||||
17
doc/astro.txt
Normal file
17
doc/astro.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
*astro.txt* Astro language indentation and syntax support in Vim or Neovim.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
1. Configuration *astro-configuration*
|
||||||
|
|
||||||
|
The following variables control certain syntax highlighting features.
|
||||||
|
You can add them to your `.vimrc` or `init.vim`.
|
||||||
|
|
||||||
|
`let g:astro_typescript = 'enable'`
|
||||||
|
|
||||||
|
Enables TypeScript and TSX for `.astro` files.
|
||||||
|
|
||||||
|
Default Value: 'disable'
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
vim:textwidth=78:tabstop=8:filetype=help:
|
||||||
2
doc/tags
Normal file
2
doc/tags
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
astro-configuration astro.txt /*astro-configuration*
|
||||||
|
astro.txt astro.txt /*astro.txt*
|
||||||
13
ftdetect/astro.vim
Normal file
13
ftdetect/astro.vim
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
" Vim ftdetect file.
|
||||||
|
" Language: Astro
|
||||||
|
" Author: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" Maintainer: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" URL: https://github.com/wuelnerdotexe/vim-astro
|
||||||
|
" Last Change: 2022 Aug 05
|
||||||
|
" Based On: Evan Lecklider's vim-svelte
|
||||||
|
" Changes: See https://github.com/evanleck/vim-svelte
|
||||||
|
" Credits: See vim-svelte on github
|
||||||
|
|
||||||
|
|
||||||
|
" Whether to set the Astro filetype on *.astro files.
|
||||||
|
autocmd BufNewFile,BufRead *.astro setfiletype astro
|
||||||
95
indent/astro.vim
Normal file
95
indent/astro.vim
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
" Vim indent file.
|
||||||
|
" Language: Astro
|
||||||
|
" Author: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" Maintainer: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" URL: https://github.com/wuelnerdotexe/vim-astro
|
||||||
|
" Last Change: 2022 Aug 05
|
||||||
|
" Based On: Evan Lecklider's vim-svelte
|
||||||
|
" Changes: See https://github.com/evanleck/vim-svelte
|
||||||
|
" Credits: See vim-svelte on github
|
||||||
|
|
||||||
|
" Only load this indent file when no other was loaded yet.
|
||||||
|
if exists('b:did_indent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Astro indent variables are initialized.
|
||||||
|
let g:astro_indent = get(g:, 'astro_indent', 'disable')
|
||||||
|
|
||||||
|
" Only load this indent file (experimental) when is explicit enable.
|
||||||
|
" TODO: When the indentation is stable, this option will be removed.
|
||||||
|
if g:astro_indent != 'enable'
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:html_indent_script1 = 'inc'
|
||||||
|
let b:html_indent_style1 = 'inc'
|
||||||
|
|
||||||
|
" Embedded HTML indent.
|
||||||
|
runtime! indent/html.vim
|
||||||
|
let s:html_indent = &l:indentexpr
|
||||||
|
unlet b:did_indent
|
||||||
|
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
setlocal indentexpr=GetAstroIndent()
|
||||||
|
setlocal indentkeys=<>>,/,0{,{,},0},0),0],0\,<<>,,!^F,*<Return>,o,O,e,;
|
||||||
|
|
||||||
|
" Only define the function once.
|
||||||
|
if exists('*GetAstroIndent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:cpoptions_save = &cpoptions
|
||||||
|
set cpoptions&vim
|
||||||
|
|
||||||
|
function! GetAstroIndent()
|
||||||
|
let l:current_line_number = v:lnum
|
||||||
|
|
||||||
|
if l:current_line_number == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:current_line = getline(l:current_line_number)
|
||||||
|
|
||||||
|
if l:current_line =~ '^\s*</\?\(script\|style\)'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:previous_line_number = prevnonblank(l:current_line_number - 1)
|
||||||
|
let l:previous_line = getline(l:previous_line_number)
|
||||||
|
let l:previous_line_indent = indent(l:previous_line_number)
|
||||||
|
|
||||||
|
if l:previous_line =~ '^\s*</\?\(script\|style\)'
|
||||||
|
return l:previous_line_indent + shiftwidth()
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute 'let g:indent = ' . s:html_indent
|
||||||
|
|
||||||
|
if searchpair('<style>', '', '</style>', 'bW') &&
|
||||||
|
\ l:previous_line =~ ';$' && l:current_line !~ '}'
|
||||||
|
return l:previous_line_indent
|
||||||
|
endif
|
||||||
|
|
||||||
|
if synID(l:previous_line_number, match(
|
||||||
|
\ l:previous_line, '\S'
|
||||||
|
\ ) + 1, 0) == hlID('htmlTag') && synID(l:current_line_number, match(
|
||||||
|
\ l:current_line, '\S'
|
||||||
|
\ ) + 1, 0) != hlID('htmlEndTag')
|
||||||
|
let l:indents_match = g:indent == l:previous_line_indent
|
||||||
|
let l:previous_closes = l:previous_line =~ '/>$'
|
||||||
|
|
||||||
|
if l:indents_match &&
|
||||||
|
\ !l:previous_closes && l:previous_line =~ '<\(\u\|\l\+:\l\+\)'
|
||||||
|
return l:previous_line_indent + shiftwidth()
|
||||||
|
elseif !l:indents_match && l:previous_closes
|
||||||
|
return l:previous_line_indent
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
return g:indent
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpoptions = s:cpoptions_save
|
||||||
|
unlet s:cpoptions_save
|
||||||
|
" vim: ts=8
|
||||||
176
syntax/astro.vim
Normal file
176
syntax/astro.vim
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
" Vim syntax file.
|
||||||
|
" Language: Astro
|
||||||
|
" Author: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" Maintainer: Wuelner Martínez <wuelner.martinez@outlook.com>
|
||||||
|
" URL: https://github.com/wuelnerdotexe/vim-astro
|
||||||
|
" Last Change: 2022 Aug 05
|
||||||
|
" Based On: Evan Lecklider's vim-svelte
|
||||||
|
" Changes: See https://github.com/evanleck/vim-svelte
|
||||||
|
" Credits: See vim-svelte on github
|
||||||
|
|
||||||
|
" Quit when a (custom) syntax file was already loaded.
|
||||||
|
if !exists('main_syntax')
|
||||||
|
if exists('b:current_syntax')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let main_syntax = 'astro'
|
||||||
|
elseif exists('b:current_syntax') && b:current_syntax == 'astro'
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Astro syntax variables are initialized.
|
||||||
|
let g:astro_typescript = get(g:, 'astro_typescript', 'disable')
|
||||||
|
|
||||||
|
let s:cpoptions_save = &cpoptions
|
||||||
|
set cpoptions&vim
|
||||||
|
|
||||||
|
" Embedded HTML syntax.
|
||||||
|
runtime! syntax/html.vim
|
||||||
|
|
||||||
|
" htmlTagName: expand HTML tag names to include mixed case, periods, and colons.
|
||||||
|
syntax match htmlTagName contained '\<[a-zA-Z:\.]*\>'
|
||||||
|
|
||||||
|
" astroDirectives: add Astro Directives to HTML arguments.
|
||||||
|
syntax match astroDirectives contained '\<[a-z]\+:[a-z|]\+=' containedin=htmlTag
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
if g:astro_typescript == 'enable'
|
||||||
|
" Embedded TypeScript syntax.
|
||||||
|
syntax include @astroJavaScript syntax/typescript.vim
|
||||||
|
|
||||||
|
" javaScriptExpression: a javascript expression is used as an arg value.
|
||||||
|
syntax clear javaScriptExpression
|
||||||
|
syntax region javaScriptExpression
|
||||||
|
\ contained start=+&{+
|
||||||
|
\ keepend end=+};+
|
||||||
|
\ contains=@astroJavaScript,@htmlPreproc
|
||||||
|
|
||||||
|
" javaScript: add TypeScript support to HTML script tag.
|
||||||
|
syntax clear javaScript
|
||||||
|
syntax region javaScript
|
||||||
|
\ start=+<script\_[^>]*>+
|
||||||
|
\ keepend
|
||||||
|
\ end=+</script\_[^>]*>+me=s-1
|
||||||
|
\ contains=htmlScriptTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment
|
||||||
|
else
|
||||||
|
" Embedded JavaScript syntax.
|
||||||
|
syntax include @astroJavaScript syntax/javascript.vim
|
||||||
|
endif
|
||||||
|
|
||||||
|
" javaScript: add TypeScript support to Astro code fence.
|
||||||
|
syntax region javaScript
|
||||||
|
\ start=+---+
|
||||||
|
\ keepend
|
||||||
|
\ end=+---+
|
||||||
|
\ contains=htmlTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment,htmlEndTag
|
||||||
|
\ matchgroup=astroFence
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
if g:astro_typescript == 'enable'
|
||||||
|
" Embedded TypeScript React (TSX) syntax.
|
||||||
|
syntax include @astroJavaScriptReact syntax/typescriptreact.vim
|
||||||
|
else
|
||||||
|
" Embedded JavaScript React (JSX) syntax.
|
||||||
|
syntax include @astroJavaScriptReact syntax/javascriptreact.vim
|
||||||
|
endif
|
||||||
|
|
||||||
|
" javaScriptExpression: add {JSX or TSX} support to Astro `{}` expresions.
|
||||||
|
execute 'syntax region javaScriptExpression start=+{+ keepend end=+}+ ' .
|
||||||
|
\ 'contains=@astroJavaScriptReact, @htmlPreproc containedin=' . join([
|
||||||
|
\ 'htmlArg', 'htmlBold', 'htmlBoldItalic', 'htmlBoldItalicUnderline',
|
||||||
|
\ 'htmlBoldUnderline', 'htmlBoldUnderlineItalic', 'htmlH1', 'htmlH2',
|
||||||
|
\ 'htmlH3', 'htmlH4', 'htmlH5', 'htmlH6', 'htmlHead', 'htmlItalic',
|
||||||
|
\ 'htmlItalicBold', 'htmlItalicBoldUnderline', 'htmlItalicUnderline',
|
||||||
|
\ 'htmlItalicUnderlineBold', 'htmlLeadingSpace', 'htmlLink',
|
||||||
|
\ 'htmlStrike', 'htmlString', 'htmlTag', 'htmlTitle', 'htmlUnderline',
|
||||||
|
\ 'htmlUnderlineBold', 'htmlUnderlineBoldItalic',
|
||||||
|
\ 'htmlUnderlineItalic', 'htmlUnderlineItalicBold', 'htmlValue'
|
||||||
|
\ ], ',')
|
||||||
|
|
||||||
|
" cssStyle: add CSS style tags support in TypeScript React.
|
||||||
|
syntax region cssStyle
|
||||||
|
\ start=+<style\_[^>]*>+
|
||||||
|
\ keepend
|
||||||
|
\ end=+</style\_[^>]*>+me=s-1
|
||||||
|
\ contains=htmlTag,@htmlCss,htmlCssStyleComment,@htmlPreproc,htmlEndTag
|
||||||
|
\ containedin=@astroJavaScriptReact
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
" Embedded SCSS syntax.
|
||||||
|
syntax include @astroScss syntax/scss.vim
|
||||||
|
|
||||||
|
" cssStyle: add SCSS style tags support in Astro.
|
||||||
|
syntax region scssStyle
|
||||||
|
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*scss[^\2]*\2\_[^>]*>/
|
||||||
|
\ keepend
|
||||||
|
\ end="</style>"me=s-1
|
||||||
|
\ contains=@astroScss,astroSurroundingTag
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
" Embedded SASS syntax.
|
||||||
|
syntax include @astroSass syntax/sass.vim
|
||||||
|
|
||||||
|
" cssStyle: add SASS style tags support in Astro.
|
||||||
|
syntax region sassStyle
|
||||||
|
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*sass[^\2]*\2\_[^>]*>/
|
||||||
|
\ keepend
|
||||||
|
\ end="</style>"me=s-1
|
||||||
|
\ contains=@astroSass,astroSurroundingTag
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
" Embedded LESS syntax.
|
||||||
|
syntax include @astroLess syntax/less.vim
|
||||||
|
|
||||||
|
" cssStyle: add LESS style tags support in Astro.
|
||||||
|
syntax region lessStyle
|
||||||
|
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*less[^\2]*\2\_[^>]*>/
|
||||||
|
\ keepend
|
||||||
|
\ end="</style>"me=s-1
|
||||||
|
\ contains=@astroLess,astroSurroundingTag
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
" Embedded Stylus syntax.
|
||||||
|
" NOTE: Vim does not provide stylus support by default, but you can install
|
||||||
|
" this plugin to support it: https://github.com/wavded/vim-stylus
|
||||||
|
syntax include @astroStylus syntax/stylus.vim
|
||||||
|
|
||||||
|
" stylusStyle: add Stylus style tags support in Astro.
|
||||||
|
syntax region stylusStyle
|
||||||
|
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*stylus[^\2]*\2\_[^>]*>/
|
||||||
|
\ keepend
|
||||||
|
\ end="</style>"me=s-1
|
||||||
|
\ contains=@astroStylus,astroSurroundingTag
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
unlet b:current_syntax
|
||||||
|
|
||||||
|
" astroSurroundingTag: add surround HTML tag to script and style.
|
||||||
|
syntax region astroSurroundingTag
|
||||||
|
\ start=+<\(script\|style\)+
|
||||||
|
\ end=+>+
|
||||||
|
\ contains=htmlTagError,htmlTagN,htmlArg,htmlValue,htmlEvent,htmlString
|
||||||
|
\ contained
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
" Define the default highlighting.
|
||||||
|
" Only used when an item doesn't have highlighting yet.
|
||||||
|
highlight default link astroDirectives Special
|
||||||
|
highlight default link astroFence Comment
|
||||||
|
|
||||||
|
let b:current_syntax = 'astro'
|
||||||
|
if main_syntax == 'astro'
|
||||||
|
unlet main_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
let &cpoptions = s:cpoptions_save
|
||||||
|
unlet s:cpoptions_save
|
||||||
|
" vim: ts=8
|
||||||
Reference in New Issue
Block a user