Vim syntax and indent plugin for .vue
files. Mainly inspired by mxw/vim-jsx.
Installation
How to install
-
Plugin 'leafOfTree/vim-vue-plugin'
-
cd ~/.vim/bundle && \ git clone https://github.com/leafOfTree/vim-vue-plugin --depth 1
-
Plug 'leafOfTree/vim-vue-plugin' :PlugInstall
-
Or manually, clone this plugin to
path/to/this_plugin
, and add it tortp
in vimrcset rtp+=path/to/this_plugin
This plugin works if filetype
is set to vue
. Please stay up to date. Feel free to open an issue or pull request.
How it works
Since .vue
is a combination of CSS, HTML and JavaScript, so is vim-vue-plugin
. (Like XML and JavaScript for .jsx
).
Supports
- Vue directives.
- Less/Sass/Scss, Pug with vim-pug, Coffee with vim-coffee-script, TypeScript with typescript-vim or yats.vim, Stylus with vim-stylus.^
- A builtin
foldexpr
foldmethod.^ - emmet-vim HTML/CSS/JavaScript filetype detection.
.wpy
files from WePY.
^: see Configuration for details. Relative plugins need to be installed.
Configuration
Set global variable to 1
to enable or 0
to disable. Ex:
let g:vim_vue_plugin_load_full_syntax = 1
variable | description | default |
---|---|---|
g:vim_vue_plugin_load_full_syntax * |
Enable: load all syntax files in runtimepath to enable related syntax plugins.Disable: only in $VIMRUNTIME/syntax , ~/.vim/syntax and $VIM/vimfiles/syntax . |
0 |
g:vim_vue_plugin_use_pug * |
Enable pug syntax for <template lang="pug"> . |
0 |
g:vim_vue_plugin_use_coffee |
Enable coffee syntax for <script lang="coffee"> . |
0 |
g:vim_vue_plugin_use_typescript |
Enable typescript syntax for <script lang="ts"> . |
0 |
g:vim_vue_plugin_use_less |
Enable less syntax for <style lang="less"> . |
0 |
g:vim_vue_plugin_use_sass |
Enable sass syntax for <style lang="scss|sass"> . |
0 |
g:vim_vue_plugin_use_scss |
Enable scss syntax for <style lang="scss"> . |
0 |
g:vim_vue_plugin_use_stylus |
Enable stylus syntax for <style lang="stylus"> . |
0 |
g:vim_vue_plugin_has_init_indent |
Initially indent one tab inside style/script tags. |
0+ |
g:vim_vue_plugin_highlight_vue_attr |
Highlight vue attribute value as expression instead of string. | 0 |
g:vim_vue_plugin_highlight_vue_keyword |
Highlight vue keyword like data , methods , ... |
0 |
g:vim_vue_plugin_use_foldexpr |
Enable builtin foldexpr foldmethod. |
0 |
g:vim_vue_plugin_debug |
Echo debug messages in messages list. Useful to debug if unexpected indents occur. |
0 |
*: Vim may be slow if the feature is enabled. Find a balance between syntax highlight and speed. By the way, custom syntax can be added in ~/.vim/syntax
or $VIM/vimfiles/syntax
.
+: 0 for .vue
and 1 for .wpy
Note
g:vim_vue_plugin_load_full_syntax
applies to otherHTML/Sass/Less
plugins.filetype
is set tovue
so autocmds and other settings forjavascript
have to be manually enabled forvue
.
Context based behavior
As there are more than one language in .vue
file, the different behaviors like mapping or completion and local options, may be required under different tags or subtypes(current language type).
This plugin provides functions to get the tag/subtype where the cursor is in.
-
GetVueTag() => String
Return value is'template'
,'script'
or'style'
." Example autocmd FileType vue inoremap <buffer><expr> : InsertColon() function! InsertColon() let tag = GetVueTag() return tag == 'template' ? ':' : ': ' endfunction
-
GetVueSubtype() => String
Return value is one of'html', 'javascript', 'css', 'scss', ...
You can also define an event listener function OnChangeVueSubtype(subtype)
in your vimrc
to get the subtype and set its local options whenever it changes.
" Set local options based on subtype
function! OnChangeVueSubtype(subtype)
" echom 'subtype is '.a:subtype
if a:subtype == 'html'
setlocal commentstring=<!--%s-->
setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
elseif a:subtype =~ 'css'
setlocal comments=s1:/*,mb:*,ex:*/ commentstring&
else
setlocal commentstring=//%s
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
endif
endfunction
emmet-vim
Currently emmet-vim works regarding your HTML/CSS/JavaScript emmet settings, but it depends on how emmet-vim gets filetype
and may change in the future. Feel free to report an issue if any problem appears.
Avoid overload
Since there are many sub languages included, most delays come from syntax files overload. A variable named b:current_loading_main_syntax
is set to vue
which can be used as loading condition if you'd like to manually find and modify the syntax files causing overload.
For example, the builtin syntax sass.vim
and less.vim
in vim8.1 runtime and pug.vim
in vim-pug/syntax always load css.vim
which this plugin already loads. It can be optimized like
- runtime! syntax/css.vim
+ if !exists("b:current_loading_main_syntax")
+ runtime! syntax/css.vim
+ endif
Acknowledgments & Refs
See also
-
Svelte is a compilation web framework which shares a similar syntax to Vue.
License
This plugin is under The Unlicense. Other than this, lib/indent/*
files are extracted from vim runtime.