mirror of
https://github.com/neovim/neovim.git
synced 2026-03-28 19:32:01 +00:00
The runtime had support to detect handlebars (*.hbs) files as filetype
handlebars but was lacking any indent or syntax highlighting for that
filetype.
The handlebars syntax file is also a prerequisite for the glimmer
syntax.
Permission was granted by the original author to retrofit these into the
Vim runtime. Original License (MIT) maintained in code comments.
related: vim/vim#19569
99ea2b5b06
Co-authored-by: Devin Weaver <suki@tritarget.org>
129 lines
3.9 KiB
VimL
129 lines
3.9 KiB
VimL
" Vim indent file
|
|
" Language: Handlebars
|
|
" Maintainer: Devin Weaver
|
|
" Last Change: 2026 Feb 20
|
|
" Origin: https://github.com/joukevandermaas/vim-ember-hbs
|
|
" Credits: Jouke van der Maas
|
|
" Acknowledgement: Based on eruby.vim indentation by TPope
|
|
" License: MIT
|
|
" The MIT License (MIT)
|
|
"
|
|
" Copyright (c) 2026 Devin Weaver
|
|
" Copyright (c) 2015 Jouke van der Maas
|
|
"
|
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
" of this software and associated documentation files (the "Software"), to deal
|
|
" in the Software without restriction, including without limitation the rights
|
|
" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
" copies of the Software, and to permit persons to whom the Software is
|
|
" furnished to do so, subject to the following conditions:
|
|
"
|
|
" The above copyright notice and this permission notice shall be included in all
|
|
" copies or substantial portions of the Software.
|
|
"
|
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
" SOFTWARE.
|
|
|
|
if exists("b:did_indent")
|
|
finish
|
|
endif
|
|
|
|
runtime! indent/html.vim
|
|
unlet! b:did_indent
|
|
|
|
" Force HTML indent to not keep state.
|
|
let b:html_indent_usestate = 0
|
|
let b:handlebars_current_indent = 0
|
|
|
|
if &l:indentexpr == ''
|
|
if &l:cindent
|
|
let &l:indentexpr = 'cindent(v:lnum)'
|
|
else
|
|
let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
|
|
endif
|
|
endif
|
|
let b:handlebars_subtype_indentexpr = &l:indentexpr
|
|
|
|
let b:did_indent = 1
|
|
|
|
setlocal indentexpr=GetHandlebarsIndent()
|
|
setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=else,={{#,={{/
|
|
|
|
" Only define the function once.
|
|
if exists("*GetHandlebarsIndent")
|
|
finish
|
|
endif
|
|
|
|
function! GetHandlebarsIndent(...)
|
|
" The value of a single shift-width
|
|
let sw = shiftwidth()
|
|
|
|
if a:0 && a:1 == '.'
|
|
let v:lnum = line('.')
|
|
elseif a:0 && a:1 =~ '^\d'
|
|
let v:lnum = a:1
|
|
endif
|
|
let vcol = col('.')
|
|
call cursor(v:lnum,1)
|
|
call cursor(v:lnum,vcol)
|
|
exe "let ind = ".b:handlebars_subtype_indentexpr
|
|
|
|
" Workaround for Andy Wokula's HTML indent. This should be removed after
|
|
" some time, since the newest version is fixed in a different way. Credit
|
|
" to eruby.vim indent by tpope
|
|
if b:handlebars_subtype_indentexpr =~# '^HtmlIndent('
|
|
\ && exists('b:indent')
|
|
\ && type(b:indent) == type({})
|
|
\ && has_key(b:indent, 'lnum')
|
|
" Force HTML indent to not keep state
|
|
let b:indent.lnum = -1
|
|
endif
|
|
|
|
let lnum = prevnonblank(v:lnum-1)
|
|
let prevLine = getline(lnum)
|
|
let currentLine = getline(v:lnum)
|
|
|
|
" all indent rules only apply if the block opening/closing
|
|
" tag is on a separate line
|
|
|
|
" indent after block {{#block
|
|
if prevLine =~# '\v\s*\{\{\#'
|
|
let ind = ind + sw
|
|
endif
|
|
" but not if the block ends on the same line
|
|
if prevLine =~# '\v\s*\{\{\#(.+)(\s+|\}\}).+\{\{\/\1'
|
|
let ind = ind - sw
|
|
endif
|
|
" unindent after block close {{/block}}
|
|
if currentLine =~# '\v^\s*\{\{\/'
|
|
let ind = ind - sw
|
|
endif
|
|
" indent after component block {{a-component
|
|
if prevLine =~# '\v\s*\{\{\w'
|
|
let ind = ind + sw
|
|
endif
|
|
" but not if the component block ends on the same line
|
|
if prevLine =~# '\v\s*\{\{\w(.+)\}\}'
|
|
let ind = ind - sw
|
|
endif
|
|
" unindent }} lines
|
|
if currentLine =~# '\v^\s*\}\}\s*$' || (currentLine !~# '\v^\s*\{\{\/' && prevLine =~# '\v^\s*[^\{\}]+\}\}\s*$')
|
|
let ind = ind - sw
|
|
endif
|
|
" unindent {{else}}
|
|
if currentLine =~# '\v^\s*\{\{else'
|
|
let ind = ind - sw
|
|
endif
|
|
" indent again after {{else}}
|
|
if prevLine =~# '\v^\s*\{\{else'
|
|
let ind = ind + sw
|
|
endif
|
|
|
|
return ind
|
|
endfunction
|