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

Develop -> Master #604

Merged
merged 52 commits into from
Aug 21, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
924a645
misc fixes (#578)
bounceme Jul 29, 2016
ee3183e
fix ftplugin var and clean indent (#580)
bounceme Jul 30, 2016
5923f80
comment on performance, angle brackets
bounceme Jul 30, 2016
e8bb2ba
remove line comment appended to code (#581)
bounceme Jul 31, 2016
bc6422b
had a problem with some of the changes
bounceme Jul 31, 2016
60eaba7
Update javascript.vim
bounceme Jul 31, 2016
6706a24
few remaining touches
bounceme Jul 31, 2016
a328e81
add label support (#582)
bounceme Jul 31, 2016
5ba6eab
case-sensitivity (#583)
bounceme Jul 31, 2016
8641372
Don't join strings in multiple lines
bounceme Jul 31, 2016
c003d8b
join lines
bounceme Jul 31, 2016
58095d8
regex char classes
bounceme Aug 1, 2016
bd4c527
limit regex lookbehind
bounceme Aug 1, 2016
4278caa
unicode identifiers
bounceme Aug 2, 2016
6de8f62
more regex
bounceme Aug 2, 2016
27a37b4
for 585 (#586)
bounceme Aug 3, 2016
b65cd14
update comments
bounceme Aug 3, 2016
97e5fca
last commit extended to blocks
bounceme Aug 3, 2016
23b4639
accuracy and speed increase for line_term regex
bounceme Aug 3, 2016
73c85a3
awful off-by-one bug
bounceme Aug 3, 2016
b8762e8
remove buggy linehasopeningbracket trick
bounceme Aug 3, 2016
6a3fac4
cleaning
bounceme Aug 3, 2016
336d435
more cleaning
bounceme Aug 5, 2016
fc43554
case-sensitivity
bounceme Aug 5, 2016
5632438
simplify regex
bounceme Aug 5, 2016
2a85b3c
ind updates (#593)
bounceme Aug 6, 2016
4a126ee
negatives are truthy in vimscript
bounceme Aug 6, 2016
29519c6
case sensitive
bounceme Aug 7, 2016
0a7432f
remove transparent syntax check
bounceme Aug 7, 2016
a7e60bb
remove repeated syn checking
bounceme Aug 7, 2016
b59dfbc
Update javascript.vim
bounceme Aug 7, 2016
9703a61
cleaning, minor performance improvements
bounceme Aug 9, 2016
6f31d72
fix regex
bounceme Aug 12, 2016
898a536
disambiguate vars
bounceme Aug 12, 2016
debb9bf
Readme Updates (#599)
bounceme Aug 14, 2016
0cab456
regex improvements
bounceme Aug 14, 2016
28b5a87
block statement (#596)
bounceme Aug 16, 2016
3a20412
cleaning (#601)
bounceme Aug 17, 2016
cef306f
settings (#603)
bounceme Aug 17, 2016
aadf36b
cache can be invalid for he current line
bounceme Aug 18, 2016
f16fe69
Change function names
bounceme Aug 18, 2016
ba6dce3
Rename function
bounceme Aug 18, 2016
67f2990
regex improvements (#607)
bounceme Aug 19, 2016
d0a4aa4
more regex (#608)
bounceme Aug 19, 2016
0a955ee
function removed,cleaning
bounceme Aug 19, 2016
8eea632
fix foreach method calls
bounceme Aug 20, 2016
efab7db
date
bounceme Aug 20, 2016
055ce0c
switch stuff
bounceme Aug 20, 2016
9516192
case statements update
bounceme Aug 20, 2016
34a070c
minor style changes
bounceme Aug 20, 2016
6787729
remove ugly function call
bounceme Aug 21, 2016
5900fce
last commit revert
bounceme Aug 21, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ variables:
let g:javascript_conceal_super = "Ω"
let g:javascript_conceal_arrow_function = "⇒"

## Indentation Specific

* `:h cino-:`
* End-of-line continuations : `g:javascript_continuation` ( slightly complicated, look at the source code )
* Start-of-line continuations : `g:javascript_opfirst` ( same as above )

## Contributing

Expand Down
6 changes: 5 additions & 1 deletion after/ftplugin/javascript.vim
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@

setlocal iskeyword+=$ suffixesadd+=.js

let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<'
if exists('b:undo_ftplugin')
let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<'
else
let b:undo_ftplugin = 'setlocal iskeyword< suffixesadd<'
endif
200 changes: 98 additions & 102 deletions indent/javascript.vim
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
" Vim indent file
" Language: Javascript
" Maintainer: vim-javascript community
" URL: https://github.com/pangloss/vim-javascript
" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org
" Maintainer: vim-javascript community
" URL: https://github.com/pangloss/vim-javascript
" Last Change: August 20, 2016

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
if exists('b:did_indent')
finish
endif
let b:did_indent = 1

" Now, set up our indentation expression and keys that trigger it.
setlocal indentexpr=GetJavascriptIndent()
setlocal nolisp
setlocal nolisp noautoindent nosmartindent
setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e
setlocal cinoptions+=j1,J1

let b:undo_indent = 'setlocal indentexpr< indentkeys< cinoptions<'
let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys< cinoptions<'

" Only define the function once.
if exists("*GetJavascriptIndent")
if exists('*GetJavascriptIndent')
finish
endif

Expand All @@ -28,125 +28,120 @@ set cpo&vim

" Get shiftwidth value
if exists('*shiftwidth')
func s:sw()
function s:sw()
return shiftwidth()
endfunc
endfunction
else
func s:sw()
function s:sw()
return &sw
endfunc
endfunction
endif

let s:line_pre = '^\s*\%(\/\*.*\*\/\s*\)*'
let s:expr_case = s:line_pre . '\%(\%(case\>.*\)\|default\)\s*:\C'
let s:line_pre = '^\s*\%(\%(\%(\/\*.\{-}\)\=\*\+\/\s*\)\=\)\@>'
let s:expr_case = s:line_pre . '\%(\%(case\>.\+\)\|default\)\s*:'
" Regex of syntax group names that are or delimit string or are comments.
let s:syng_strcom = '\%(string\|regex\|special\|doc\|comment\|template\)\c'
let s:syng_strcom = '\%(s\%(tring\|pecial\)\|comment\|regex\|doc\|template\)'

" Regex of syntax group names that are strings or documentation.
let s:syng_comment = '\%(comment\|doc\)\c'
let s:syng_comment = '\%(comment\|doc\)'

" Expression used to check whether we should skip a match with searchpair().
let s:skip_expr = "line('.') < (prevnonblank(v:lnum) - 2000) ? dummy : s:IsSyn(line('.'),col('.'),'')"
let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'"

func s:lookForParens(start,end,flags,time)
try
return searchpair(a:start,'',a:end,a:flags,s:skip_expr,0,a:time)
catch /E118/
return searchpair(a:start,'',a:end,a:flags,0,0)
endtry
endfunc
if has('reltime')
function s:GetPair(start,end,flags,time)
return searchpair(a:start,'',a:end,a:flags,s:skip_expr,max([prevnonblank(v:lnum) - 2000,0]),a:time)
endfunction
else
function s:GetPair(start,end,flags,n)
return searchpair(a:start,'',a:end,a:flags,0,max([prevnonblank(v:lnum) - 2000,0]))
endfunction
endif

let s:line_term = '\s*\%(\%(:\@<!\/\/.*\)\=\|\%(\/\*.*\*\/\s*\)*\)$'
let s:line_term = '\s*\%(\%(\/\%(\%(\*.\{-}\*\/\)\|\%(\*\+\)\)\)\s*\)\=$'

" configurable regexes that define continuation lines, not including (, {, or [.
if !exists('g:javascript_opfirst')
let g:javascript_opfirst = '\%([,:?^%]\|\([-/.+]\)\%(\1\|\*\|\/\)\@!\|\*\/\@!\|=>\@!\||\|&\|in\%(stanceof\)\=\>\)\C'
let g:javascript_opfirst = '\%([<>,:?^%|*&]\|\([-/.+]\)\1\@!\|=>\@!\|in\%(stanceof\)\=\>\)'
endif
let g:javascript_opfirst = s:line_pre . g:javascript_opfirst

if !exists('g:javascript_continuation')
let g:javascript_continuation = '\%([*,.?:^%]\|+\@<!+\|-\@<!-\|\*\@<!\/\|=\||\|&\|\<in\%(stanceof\)\=\)\C'
let g:javascript_continuation = '\%([<=,.?/*:^%|&]\|+\@<!+\|-\@<!-\|=\@<!>\|\<in\%(stanceof\)\=\)'
endif

let g:javascript_opfirst = s:line_pre . g:javascript_opfirst
let g:javascript_continuation .= s:line_term

function s:Onescope(lnum,text,add)
return a:text =~ '\%(\<else\|\<do\|=>' . (a:add ? '\|\<try\|\<finally' : '' ) . '\)\C' . s:line_term ||
\ (a:add && a:text =~ s:line_pre . s:line_term && getline(s:PrevCodeLine(a:lnum - 1)) =~ ')' . s:line_term) ||
\ (cursor(a:lnum, match(a:text, ')' . s:line_term)) > -1 &&
\ s:lookForParens('(', ')', 'cbW', 100) > 0 &&
\ search((a:add ? '\%(function\*\|[A-Za-z_$][0-9A-Za-z_$]*\)\C' :
\ '\<\%(for\%(\s+each\)\=\|if\|let\|switch\|while\|with\)\C') . '\_s*\%#','bW')) &&
\ (a:add || (expand("<cword>") == 'while' ? !s:lookForParens('\<do\>\C', '\<while\>\C','bW',100) : 1))
function s:OneScope(lnum,text,add)
return a:text =~# '\%(\<else\|\<do\|=>\)' . s:line_term ? 'no b' :
\ ((a:add && a:text =~ s:line_pre . '$' && search('\%' . s:PrevCodeLine(a:lnum - 1) . 'l.)' . s:line_term)) ||
\ cursor(a:lnum, match(a:text, ')' . s:line_term)) > -1) &&
\ s:GetPair('(', ')', 'cbW', 100) > 0 && search('\C\l\+\_s*\%#','bW') &&
\ (a:add || ((expand('<cword>') !=# 'while' || !s:GetPair('\C\<do\>', '\C\<while\>','nbW',100)) &&
\ expand('cword') !=# 'each' || search('\C\<for\_s\+\%#','nbW'))) ? expand('<cword>') : ''
endfunction

" Auxiliary Functions {{{2

" Check if the character at lnum:col is inside a string, comment, or is ascii.
function s:IsSyn(lnum, col, reg)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~? (a:reg != '' ? a:reg : s:syng_strcom)
" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
function s:IsBlock()
return getline(line('.'))[col('.')-1] == '{' && !search(
\ '\C\%(\<return\s*\|\%([-=~!<*+,.?^%|&\[(]\|=\@<!>\|\*\@<!\/\|\<\%(var\|const\|let\|yield\|delete\|void\|t\%(ypeof\|hrow\)\|new\|\<in\%(stanceof\)\=\)\)\_s*\)\%#','bnW') &&
\ (!search(':\_s*\%#','bW') || (!s:GetPair('[({[]','[])}]','bW',200) || s:IsBlock()))
endfunction

" Auxiliary Functions {{{2

" Find line above 'lnum' that isn't empty, in a comment, or in a string.
function s:PrevCodeLine(lnum)
let lnum = prevnonblank(a:lnum)
while lnum > 0
if !s:IsSyn(lnum, matchend(getline(lnum), '^\s*[^''"]'),'')
break
let l:lnum = prevnonblank(a:lnum)
while l:lnum
if synIDattr(synID(l:lnum,matchend(getline(l:lnum), '^\s*[^''"]'),0),'name') !~? s:syng_strcom
return l:lnum
endif
let lnum = prevnonblank(lnum - 1)
let l:lnum = prevnonblank(l:lnum - 1)
endwhile
return lnum
endfunction

" Check if line 'lnum' has more opening brackets than closing ones.
function s:LineHasOpeningBrackets(lnum)
let open_0 = 0
let open_2 = 0
let open_4 = 0
let line = getline(a:lnum)
let pos = match(line, '[][(){}]', 0)
let last = 0
" Check if line 'lnum' has a balanced amount of parentheses.
function s:Balanced(lnum)
let [open_0,open_2,open_4] = [0,0,0]
let l:line = getline(a:lnum)
let pos = match(l:line, '[][(){}]', 0)
while pos != -1
if !s:IsSyn(a:lnum, pos + 1, '')
let idx = stridx('(){}[]', line[pos])
if synIDattr(synID(a:lnum,pos + 1,0),'name') !~? s:syng_strcom
let idx = stridx('(){}[]', l:line[pos])
if idx % 2 == 0
let open_{idx} = open_{idx} + 1
let last = pos
else
let open_{idx - 1} = open_{idx - 1} - 1
endif
endif
let pos = match(line, '[][(){}]', pos + 1)
let pos = match(l:line, '[][(){}]', pos + 1)
endwhile
return [(open_0 > 0 ? 1 : (open_0 == 0 ? 0 : 2)) . (open_2 > 0 ? 1 : (open_2 == 0 ? 0 : 2)) .
\ (open_4 > 0 ? 1 : (open_4 == 0 ? 0 : 2)), last]
return (!open_4 + !open_2 + !open_0) - 2
endfunction
" }}}

function GetJavascriptIndent()
if !exists('b:js_cache')
let b:js_cache = [0,0,0]
end
" Get the current line.
let line = getline(v:lnum)
" previous nonblank line number
let prevline = prevnonblank(v:lnum - 1)
" previous line of code
let lnum = s:PrevCodeLine(v:lnum - 1)
if lnum == 0
return 0
endif
" Get the current line.
let l:line = getline(v:lnum)
let syns = synIDattr(synID(v:lnum, 1, 0), 'name')

" start with strings,comments,etc.{{{2
if (line !~ '^[''"`]' && s:IsSyn(v:lnum,1,'string\|template')) ||
\ (line !~ '^\s*[/*]' && s:IsSyn(v:lnum,1,s:syng_comment))
if (l:line !~ '^[''"`]' && syns =~? '\%(string\|template\)') ||
\ (l:line !~ '^\s*[/*]' && syns =~? s:syng_comment)
return -1
endif
if line !~ '^\%(\/\*\|\s*\/\/\)' && s:IsSyn(v:lnum,1,s:syng_comment)
if l:line !~ '^\%(\/\*\|\s*\/\/\)' && syns =~? s:syng_comment
return cindent(v:lnum)
endif
let l:lnum = s:PrevCodeLine(v:lnum - 1)
if l:lnum == 0
return 0
endif

if (line =~ s:expr_case)
if (l:line =~# s:expr_case)
let cpo_switch = &cpo
set cpo+=%
let ind = cindent(v:lnum)
Expand All @@ -155,41 +150,42 @@ function GetJavascriptIndent()
endif
"}}}

" the containing paren, bracket, curly
let pcounts = [0]
if b:js_cache[0] >= lnum && b:js_cache[0] <= v:lnum && b:js_cache[0] &&
\ (b:js_cache[0] > lnum || map(pcounts,'s:LineHasOpeningBrackets(lnum)')[0][0] !~ '2')
let num = pcounts[0][0] =~ '1' ? lnum : b:js_cache[1]
if pcounts[0][0] =~'1'
call cursor(lnum,pcounts[0][1])
end
" the containing paren, bracket, curly. Memoize, last lineNr either has the
" same scope or starts a new one, unless if it closed a scope.
call cursor(v:lnum,1)
if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum && b:js_cache[0] &&
\ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum) > 0)
let num = b:js_cache[1]
elseif syns != '' && l:line[0] =~ '\s'
let pattern = syns =~? 'block' ? ['{','}'] : syns =~? 'jsparen' ? ['(',')'] :
\ syns =~? 'jsbracket'? ['\[','\]'] : ['[({[]','[])}]']
let num = s:GetPair(pattern[0],pattern[1],'bW',2000)
else
call cursor(v:lnum,1)
let syns = synIDattr(synID(v:lnum, 1, 1), 'name')
if line[0] =~ '\s' && syns != ''
let pattern = syns =~? 'funcblock' ? ['{','}'] : syns =~? 'jsparen' ? ['(',')'] : syns =~? 'jsbracket'? ['\[','\]'] :
\ ['(\|{\|\[',')\|}\|\]']
let num = s:lookForParens(pattern[0],pattern[1],'bW',2000)
else
let num = s:lookForParens('(\|{\|\[',')\|}\|\]','bW',2000)
end
end
let num = s:GetPair('[({[]','[])}]','bW',2000)
endif
let b:js_cache = [v:lnum,num,line('.') == v:lnum ? b:js_cache[2] : col('.')]

" most significant part
if line =~ s:line_pre . '[])}]'
if l:line =~ s:line_pre . '[])}]'
return indent(num)
end
let inb = num == 0 ? 1 : s:Onescope(num, strpart(getline(num),0,b:js_cache[2] - 1),1)
let switch_offset = (!inb || num == 0) || expand("<cword>") != 'switch' ? 0 : &cino !~ ':' || !has('float') ? s:sw() :
\ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (match(&cino,'.*:\zs[^,]*s') ? s:sw() : 1))
if ((line =~ g:javascript_opfirst ||
\ (getline(lnum) =~ g:javascript_continuation && getline(lnum) !~ s:expr_case)) &&
\ inb) || (s:Onescope(lnum,getline(lnum),0) && line !~ s:line_pre . '{')
endif

call cursor(b:js_cache[1],b:js_cache[2])

let swcase = getline(l:lnum) =~# s:expr_case
let pline = swcase ? getline(l:lnum) : substitute(getline(l:lnum), '\%(:\@<!\/\/.*\)$', '','')
let inb = num == 0 || num < l:lnum && ((l:line !~ s:line_pre . ',' && pline !~ ',' . s:line_term) || s:IsBlock())
let switch_offset = num == 0 || s:OneScope(num, strpart(getline(num),0,b:js_cache[2] - 1),1) !=# 'switch' ? 0 :
\ &cino !~ ':' || !has('float') ? s:sw() :
\ float2nr(str2float(matchstr(&cino,'.*:\zs[-0-9.]*')) * (&cino =~# '.*:[^,]*s' ? s:sw() : 1))

" most significant, find the indent amount
if inb && !swcase && ((l:line =~# g:javascript_opfirst || pline =~# g:javascript_continuation) ||
\ num < l:lnum && s:OneScope(l:lnum,pline,0) =~# '\<\%(for\|each\|if\|let\|no\sb\|w\%(hile\|ith\)\)\>' &&
\ l:line !~ s:line_pre . '{')
return (num > 0 ? indent(num) : -s:sw()) + (s:sw() * 2) + switch_offset
elseif num > 0
return indent(num) + s:sw() + switch_offset
end
endif

endfunction

Expand Down