Skip to content

Commit 3743931

Browse files
bouncemebounceme
authored and
bounceme
committed
Template string indentation as per #
1 parent 5fea23e commit 3743931

File tree

2 files changed

+39
-13
lines changed

2 files changed

+39
-13
lines changed

indent/javascript.vim

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ endif
4343
let s:js_keywords = '^\s*\(break\|catch\|const\|continue\|debugger\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|let\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)'
4444
let s:expr_case = '^\s*\(case\s\+[^\:]*\|default\)\s*:\s*'
4545
" Regex of syntax group names that are or delimit string or are comments.
46-
let s:syng_strcom = 'string\|regex\|comment\c'
46+
let s:syng_strcom = '\%(\%(template\)\@<!string\|regex\|comment\)\c'
47+
48+
" Regex of syntax group names that are or delimit template strings
49+
let s:syng_template = 'template\c'
4750

4851
" Regex of syntax group names that are strings.
4952
let s:syng_string = 'regex\c'
@@ -102,6 +105,11 @@ function s:IsInString(lnum, col)
102105
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
103106
endfunction
104107

108+
" Check if the character at lnum:col is inside a template string.
109+
function s:IsInTempl(lnum, col)
110+
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_template
111+
endfunction
112+
105113
" Check if the character at lnum:col is inside a multi-line comment.
106114
function s:IsInMultilineComment(lnum, col)
107115
return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline
@@ -386,6 +394,14 @@ function GetJavascriptIndent()
386394
endif
387395
endif
388396

397+
if getline(prevline) =~ '^\s*`$' && s:IsInTempl(v:lnum, 1)
398+
if line !~ '^\s*`$'
399+
return indent(prevline) + s:sw()
400+
endif
401+
elseif line =~ '^\s*`$' && s:IsInTempl(prevline, 1)
402+
return indent(prevline) - s:sw()
403+
endif
404+
389405
" If we are in a multi-line comment, cindent does the right thing.
390406
if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1)
391407
return cindent(v:lnum)

syntax/javascript.vim

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ syntax region jsExportContainer start="^\s\?export \?" end="$" contains=jsM
4646

4747
"" JavaScript comments
4848
syntax keyword jsCommentTodo TODO FIXME XXX TBD contained
49-
syntax region jsLineComment start=+\/\/+ end=+$+ keepend contains=jsCommentTodo,@Spell
49+
syntax region jsLineComment start=+\/\/+ end=+$+ keepend contains=jsCommentTodo,@Spell extend
5050
syntax region jsEnvComment start="\%^#!" end="$" display
5151
syntax region jsLineComment start=+^\s*\/\/+ skip=+\n\s*\/\/+ end=+$+ keepend contains=jsCommentTodo,@Spell fold
5252
syntax region jsCvsTag start="\$\cid:" end="\$" oneline contained
53-
syntax region jsComment start="/\*" end="\*/" contains=jsCommentTodo,jsCvsTag,@Spell fold
53+
syntax region jsComment start="/\*" end="\*/" contains=jsCommentTodo,jsCvsTag,@Spell fold extend
5454

5555
"" JSDoc / JSDoc Toolkit
5656
if !exists("javascript_ignore_javaScriptdoc")
@@ -88,7 +88,7 @@ syntax case match
8888
"" Syntax in the JavaScript code
8989
syntax match jsFuncCall /\k\+\%(\s*(\)\@=/
9090
syntax match jsSpecial "\v\\%(0|\\x\x\{2\}\|\\u\x\{4\}\|\c[A-Z]|.)" contained
91-
syntax region jsTemplateVar matchgroup=jsBraces start=+${+ end=+}+ contained contains=@jsExpression
91+
syntax region jsTemplateVar matchgroup=jsTemplateBraces start=+${+ end=+}+ contained contains=@jsExpression
9292
syntax region jsStringD start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contains=jsSpecial,@htmlPreproc,@Spell
9393
syntax region jsStringS start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contains=jsSpecial,@htmlPreproc,@Spell
9494
syntax region jsTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=jsTemplateVar,jsSpecial,@htmlPreproc
@@ -192,13 +192,13 @@ endif "DOM/HTML/CSS
192192
"" end DOM/HTML/CSS specified things
193193

194194
"" Code blocks
195-
syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTaggedTemplate,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsStatic,jsSuper,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsBlock,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsCommonJS,jsAssignmentExpr,jsImportContainer,jsExportContainer,jsArgsObj,jsDecorator,jsAsyncKeyword,jsClassDefinition
195+
syntax cluster jsExpression contains=jsComment,jsLineComment,jsBlockComment,jsTaggedTemplate,jsTemplateString,jsStringD,jsStringS,jsRegexpString,jsNumber,jsFloat,jsThis,jsStatic,jsSuper,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsDotNotation,jsBracket,jsParen,jsBlock,jsFuncCall,jsUndefined,jsNan,jsKeyword,jsStorageClass,jsPrototype,jsBuiltins,jsNoise,jsCommonJS,jsAssignmentExpr,jsImportContainer,jsExportContainer,jsArgsObj,jsDecorator,jsAsyncKeyword,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs
196196
syntax cluster jsAll contains=@jsExpression,jsLabel,jsConditional,jsRepeat,jsReturn,jsStatement,jsTernaryIf,jsException
197197
syntax region jsBracket matchgroup=jsBrackets start="\[" end="\]" contains=@jsAll,jsParensErrB,jsParensErrC,jsBracket,jsParen,jsBlock,@htmlPreproc fold
198198
syntax region jsParen matchgroup=jsParens start="(" end=")" contains=@jsAll,jsOf,jsParensErrA,jsParensErrC,jsParen,jsBracket,jsBlock,@htmlPreproc fold
199-
syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold
200199
syntax region jsClassBlock matchgroup=jsClassBraces start="{" end="}" contains=jsFuncName,jsClassMethodDefinitions contained fold
201-
syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition contained fold
200+
syntax region jsFuncBlock matchgroup=jsFuncBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,@htmlPreproc,jsClassDefinition fold
201+
syntax region jsBlock matchgroup=jsBraces start="{" end="}" contains=@jsAll,jsParensErrA,jsParensErrB,jsParen,jsBracket,jsBlock,jsObjectKey,@htmlPreproc,jsClassDefinition fold
202202
syntax region jsTernaryIf matchgroup=jsTernaryIfOperator start=+?+ end=+:+ contains=@jsExpression,jsTernaryIf
203203

204204
"" catch errors caused by wrong parenthesis
@@ -214,14 +214,20 @@ if main_syntax == "javascript"
214214
endif
215215

216216
exe 'syntax match jsFunction /\<function\>/ nextgroup=jsGenerator,jsFuncName,jsFuncArgs skipwhite '.(exists('g:javascript_conceal_function') ? 'conceal cchar='.g:javascript_conceal_function : '')
217+
exe 'syntax match jsArrowFunction /=>/ skipwhite nextgroup=jsFuncBlock contains=jsFuncBraces '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '')
217218

218-
syntax match jsGenerator contained '\*' nextgroup=jsFuncName skipwhite
219-
syntax match jsFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=jsFuncArgs skipwhite
220-
syntax region jsFuncArgs contained matchgroup=jsFuncParens start='(' end=')' contains=jsFuncArgCommas,jsFuncArgRest,jsAssignmentExpr,jsComment,jsLineComment nextgroup=jsFuncBlock keepend skipwhite skipempty
221-
syntax match jsFuncArgCommas contained ','
222-
syntax match jsFuncArgRest contained /\%(\.\.\.[a-zA-Z_$][0-9a-zA-Z_$]*\))/
219+
syntax match jsGenerator contained '\*' nextgroup=jsFuncName,jsFuncArgs skipwhite
220+
syntax match jsFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=jsFuncArgs skipwhite
221+
syntax region jsFuncArgs contained matchgroup=jsFuncParens start='(' end=')' contains=jsFuncArgCommas,jsFuncArgRest,jsComment,jsLineComment,jsStringS,jsStringD,jsNumber,jsFuncArgDestructuring nextgroup=jsFuncBlock keepend skipwhite skipempty
222+
syntax match jsFuncArgCommas contained ','
223+
syntax match jsFuncArgRest contained /\%(\.\.\.[a-zA-Z_$][0-9a-zA-Z_$]*\))/ contains=jsFuncArgRestDots
224+
syntax match jsFuncArgRestDots contained /\.\.\./
225+
syntax match jsFuncArgDestructuring contained /\({\|}\|=\|:\|(\|)\)/ extend
223226

224-
exe 'syntax match jsArrowFunction /=>/ '.(exists('g:javascript_conceal_arrow_function') ? 'conceal cchar='.g:javascript_conceal_arrow_function : '')
227+
" Matches a single keyword argument with no parens
228+
syntax match jsArrowFuncArgs /\(\k\)\+\s*\(=>\)\@=/ skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction
229+
" Matches a series of arguments surrounded in parens
230+
syntax match jsArrowFuncArgs /(\%(.\)*)\s*\(=>\)\@=/ skipempty skipwhite contains=jsFuncArgs nextgroup=jsArrowFunction
225231

226232
syntax keyword jsClassKeywords extends class contained
227233
syntax match jsClassNoise /\./ contained
@@ -277,6 +283,7 @@ if version >= 508 || !exists("did_javascript_syn_inits")
277283
HiLink jsArrowFunction Type
278284
HiLink jsFunction Type
279285
HiLink jsGenerator jsFunction
286+
HiLink jsArrowFuncArgs jsFuncArgs
280287
HiLink jsFuncName Function
281288
HiLink jsArgsObj Special
282289
HiLink jsError Error
@@ -308,13 +315,16 @@ if version >= 508 || !exists("did_javascript_syn_inits")
308315
HiLink jsClassNoise Noise
309316
HiLink jsSpecial Special
310317
HiLink jsTemplateVar Special
318+
HiLink jsTemplateBraces jsBraces
311319
HiLink jsGlobalObjects Special
312320
HiLink jsExceptions Special
313321
HiLink jsFutureKeys Special
314322
HiLink jsBuiltins Special
315323
HiLink jsModules Include
316324
HiLink jsModuleWords Include
317325
HiLink jsDecorator Special
326+
HiLink jsFuncArgRestDots Noise
327+
HiLink jsFuncArgDestructuring Noise
318328

319329
HiLink jsDomErrNo Constant
320330
HiLink jsDomNodeConsts Constant

0 commit comments

Comments
 (0)