# HG changeset patch # User Christian Brabandt # Date 1484052305 -3600 # Node ID 74effdaa369ef45e839930aa57c7b383d2af8474 # Parent b1438ad6d6e8b0eeffeca4a72ac8d087dd5e0afd Updated runtime files. commit https://github.com/vim/vim/commit/68563937f58ea2dc31b58739336c383d2fd7e6cf Author: Bram Moolenaar Date: Tue Jan 10 13:31:15 2017 +0100 Updated runtime files. diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt --- a/runtime/doc/develop.txt +++ b/runtime/doc/develop.txt @@ -1,4 +1,4 @@ -*develop.txt* For Vim version 8.0. Last change: 2016 Jan 31 +*develop.txt* For Vim version 8.0. Last change: 2017 Jan 05 VIM REFERENCE MANUAL by Bram Moolenaar @@ -177,7 +177,7 @@ 4. Check ../doc/todo.txt if the change a 5. Make a patch with "git diff". You can also create a pull request on github, but it's the diff that matters. 6. Make a note about what changed, preferably mentioning the problem and the - solution. Send an email to the vim-dev maillist with an explanation and + solution. Send an email to the |vim-dev| maillist with an explanation and include the diff. Or create a pull request on github. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.0. Last change: 2016 Nov 29 +*eval.txt* For Vim version 8.0. Last change: 2017 Jan 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7615,7 +7615,8 @@ systemlist({expr} [, {input}]) *syste Same as |system()|, but returns a |List| with lines (parts of output separated by NL) with NULs transformed into NLs. Output is the same as |readfile()| will output with {binary} argument - set to "b". + set to "b". Note that on MS-Windows you may get trailing CR + characters. Returns an empty string on error. diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt --- a/runtime/doc/filetype.txt +++ b/runtime/doc/filetype.txt @@ -1,4 +1,4 @@ -*filetype.txt* For Vim version 8.0. Last change: 2016 Sep 09 +*filetype.txt* For Vim version 8.0. Last change: 2017 Jan 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -573,6 +573,8 @@ Man {number} {name} Global mapping: K Displays the manual page for the word under the cursor. +ManPreGetPage idem, allows for using a mapping: > + nmap ManPreGetPage Local mappings: CTRL-] Jump to the manual page for the word under the cursor. diff --git a/runtime/doc/intro.txt b/runtime/doc/intro.txt --- a/runtime/doc/intro.txt +++ b/runtime/doc/intro.txt @@ -96,21 +96,18 @@ mention that. *mail-list* *maillist* There are several mailing lists for Vim: - + *vim-use* *vim_use* For discussions about using existing versions of Vim: Useful mappings, questions, answers, where to get a specific version, etc. There are quite a few people watching this list and answering questions, also for beginners. Don't hesitate to ask your question here. - *vim-dev* *vimdev* + *vim-dev* *vim_dev* *vimdev* For discussions about changing Vim: New features, porting, patches, beta-test versions, etc. - *vim-announce* + *vim-announce* *vim_announce* Announcements about new versions of Vim; also for beta-test versions and ports to different systems. This is a read-only list. - *vim-multibyte* - For discussions about using and improving the multi-byte aspects of - Vim. - *vim-mac* + *vim-mac* *vim_mac* For discussions about using and improving the Macintosh version of Vim. diff --git a/runtime/doc/tags b/runtime/doc/tags --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -9124,15 +9124,19 @@ vim-dev intro.txt /*vim-dev* vim-mac intro.txt /*vim-mac* vim-modes intro.txt /*vim-modes* vim-modes-intro intro.txt /*vim-modes-intro* -vim-multibyte intro.txt /*vim-multibyte* vim-script-intro usr_41.txt /*vim-script-intro* +vim-use intro.txt /*vim-use* vim-variable eval.txt /*vim-variable* vim.vim syntax.txt /*vim.vim* vim7 version7.txt /*vim7* vim8 version8.txt /*vim8* vim: options.txt /*vim:* +vim_announce intro.txt /*vim_announce* +vim_dev intro.txt /*vim_dev* vim_did_enter-variable eval.txt /*vim_did_enter-variable* +vim_mac intro.txt /*vim_mac* vim_starting eval.txt /*vim_starting* +vim_use intro.txt /*vim_use* vimball pi_vimball.txt /*vimball* vimball-contents pi_vimball.txt /*vimball-contents* vimball-extract pi_vimball.txt /*vimball-extract* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 8.0. Last change: 2017 Jan 02 +*todo.txt* For Vim version 8.0. Last change: 2017 Jan 09 VIM REFERENCE MANUAL by Bram Moolenaar @@ -29,8 +29,8 @@ be worked on, but only if you sponsor Vi Issues can also be entered online: https://github.com/vim/vim/issues Only use this for bug reports, not for questions! Those belong on the -maillist. Updates will be forwarded to the vim_dev maillist. Issues entered -there will not be repeated below, unless there is extra information. +maillist. Updates will be forwarded to the |vim_dev| maillist. Issues +entered there will not be repeated below, unless there is extra information. *known-bugs* -------------------- Known bugs and current work ----------------------- @@ -109,11 +109,6 @@ Regexp problems: Make html indent file use javascript indent, now that it's not just cindent. #1220 -Patch to fix completion of :filter command. (Ichizok, 2016 Dec 3, #1299) - -Patch to use buffer id for system() and systemlist() (LemonBoy, 2016 Nov 7, -#1240) - Concatenation with null string causes an error: 'a'[1:0] .. 'b' Might as well handle it like an empty string. @@ -123,27 +118,12 @@ position in 'runtimepath'. (Dugan Chen, json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23) What if there is an invalid character? -Putting "k" early in 'complete' does not use dictionary first? -(RubenGZ, 2016 Dec 10, #1316) -patch proposed by Hirohito Higashi, 2016 Dec 11. - -Patch to fix NULL pointer when sorting zero elements. (Dominique, 2016 Dec 15) - -Patch to test float functions. (Dominique, 2016 Dec 16) - -Patch to improve completion of :syntax command. (Dominique, 2016 Dec 12) - -Patch to use IEMSG() in more places. (Dominique, 2016 Dec 27) +Include rust files. (Klabnik, #1356) + +More float tests. (Dominique, #1364) Patch to avoid ubsan warning for integer overflow. (Dominique, 2016 Dec 26) -Bug: ":earlier 100d" doesn't work after using undo file. -(Pavol Juhas, 2016 Nov 15, #1254) -Fix by Christian, but lacks a test. -Test in testdir/test_undo.vim doesn't catch the problem. -Test by Pavol Juhas, Nov 22. -Patch with test (Pavol Juhas,, 2016 Dec 3, #1300) - Bug: Json with same key should not give internal error. (Lcd, 2016 Oct 26) Make dict_add give a duplicate key error. @@ -166,11 +146,16 @@ Patch to deal with changed configure eve 2016 Oct 23 #1193) Remarks from nuko8, 2016 Nov 2. +Multi-byte bug: dv} splits char. (Urtica Dioica, 2017 Jan 9) + Patch to change order of compiler flags. (Yousong Zhou, 2016 Sep 19, #1100) Patch to add command line completion for :cexpr commands. (Yegappan Lakshmanan, 2016 Dec 13) +Patch for :pyx, run python commands depending on the supported version. +(Marc Weber, update from Ken Takata, 2016 Sep 19, 2017 Jan 6) + Patch to avoid warnings for overflow. (Mike Williams, 2016 Dec 16) Update Dec 19. @@ -195,6 +180,9 @@ https://github.com/neovim/neovim/pull/57 Patch for better explanation of 'compatible' side effects. https://github.com/vim/vim/pull/1161/files +Patch to add 'makeencoding', useful when the system encoding differs from +Vim's 'encoding' setting. (Ken Takata, 2017 Jan 6) + Patch to adjust marks when adding a new line to the end of buffer in diff mode. (James McCoy, 2016 Dec 14, #1329) @@ -240,6 +228,9 @@ Add tests for using number larger than n Patch to make v:shell_error writable. (Christian Brabandt, 2016 Sep 27) Useful to restore it. Is there another solution? +"ci[" does not look for next [ like ci" does look for next ". +(J.F. 2017 Jan 7) + On MS-Windows with 'clipboard' set to "unnamed" this doesn't work to double lines: :g/^/normal yyp On Unix it works OK. (Bryce Orgill, 2016 Nov 5) @@ -248,6 +239,10 @@ Patch for wrong cursor position on wrapp Patch for 'cursorlinenr' option. (Ozaki Kiichi, 2016 Nov 30) +When adding an item to a new quickfix list make ":cnext" jump to that item. +Make a difference being at the first item and not having used :cnext at all. +(Afanasiy Fet, 2017 Jan 3) + Invalid behavior with NULL list. (Nikolai Pavlov, #768) E.g. deepcopy(test_null_list()) @@ -280,6 +275,9 @@ 4#1038) Patch to add "cmdline" completion to getcompletion(). (Shougo, Oct 1, #1140) +Feature request: Complete members of a dictionary. (Luc Hermitte, 2017 Jan 4, +#1350) + Patch for systemlist(), add empty item. (thinca, Sep 30, #1135) Add an argument to choose binary or non-binary (like readfile()), when omitted use the current behavior. @@ -307,9 +305,6 @@ Patch to order results from taglist(). ( patch for 'spellcamelcase' option: spellcheck each CamelCased word. (Ben Tucker, 2016 Dec 2) -Patch for :pyx, run python commands depending on the supported version. -(Marc Weber, update from Ken Takata, 2016 Sep 19) - When using ":diffput" through a mapping, undo in the target buffer isn't synced. (Ryan Carney, 2016 Sep 14) @@ -333,6 +328,19 @@ Jul 25, #948) Patch to fix wrong encoding of error message on Cygwin/MSYS terminal. (Ken Takata, 2016 Oct 4) +Patch to introduce 'cmdencoding'. (Ken Takata, Aug 18?) +Better help Aug 19. +Problem: applies to too many commands, such as :cbuffer. +Updated patch with three options, 2016 Sep 8. + Win32: When running ":make" and 'encoding' differs from the system locale, + the output should be converted. Esp. when 'encoding' is "utf-8". (Yongwei + Wu) Should we use 'termencoding' for this? + +Patch to add 'systemencoding', convert between 'encoding' and this for file +names, shell commands and the like. (Kikuchan, 2010 Oct 14) +Assume the system converts between the actual encoding of the filesystem to +the system encoding (usually utf-8). + 'hlsearch' interferes with a Conceal match. (Rom Grk, 2016 Aug 9) Patch to add context information to quickfix/location list. (Yegappan @@ -467,14 +475,6 @@ Should use /usr/local/share/applications Or use $XDG_DATA_DIRS. Also need to run update-desktop-database (Kuriyama Kazunobu, 2015 Nov 4) -Patch to introduce 'cmdencoding'. (Ken Takata, Aug 18?) -Better help Aug 19. -Problem: applies to too many commands, such as :cbuffer. -Updated patch with three options, 2016 Sep 8. - Win32: When running ":make" and 'encoding' differs from the system locale, - the output should be converted. Esp. when 'encoding' is "utf-8". (Yongwei - Wu) Should we use 'termencoding' for this? - Patch to have text objects defined by arbitrary single characters. (Daniel Thau, 2013 Nov 20, 2014 Jan 29, 2014 Jan 31) Added tests (James McCoy, 2016 Aug 3). Still needs more work. @@ -488,6 +488,9 @@ Access to uninitialized memory in match_ ":cd C:\Windows\System32\drivers\etc*" does not work, even though the directory exists. (Sergio Gallelli, 2013 Dec 29) +In debug mode one can inspect variables, but not the function parameters +(starting with a:). (Luc Hermitte, 2017 Jan 4, #1352) + 7 Add a watchpoint in the debug mode: An expression that breaks execution when evaluating to non-zero. Add the "watchadd expr" command, stop when the value of the expression changes. ":watchdel" deletes an item, @@ -1355,11 +1358,6 @@ Regexp engine performance: 7.2.274. (Christian Brabandt, 2010 May 27) Generally, folding with 'foldmethod' set to "syntax" is slow. Do profiling to find out why. -Patch to add 'systemencoding', convert between 'encoding' and this for file -names, shell commands and the like. (Kikuchan, 2010 Oct 14) -Assume the system converts between the actual encoding of the filesystem to -the system encoding (usually utf-8). - Problem producing tags file when hebrew.frx is present. It has a BOM. Results in E670. (Tony Mechelynck, 2010 May 2) diff --git a/runtime/filetype.vim b/runtime/filetype.vim --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: Bram Moolenaar -" Last Change: 2016 Oct 31 +" Last Change: 2017 Jan 06 " Listen very carefully, I will say this only once if exists("did_load_filetypes") @@ -309,7 +309,10 @@ au BufNewFile,BufRead *.bl setf blank au BufNewFile,BufRead */etc/blkid.tab,*/etc/blkid.tab.old setf xml " Bazel (http://bazel.io) -autocmd BufRead,BufNewFile *.bzl,BUILD,WORKSPACE setfiletype bzl +autocmd BufRead,BufNewFile *.bzl,WORKSPACE setfiletype bzl +if has("fname_case") + autocmd BufRead,BufNewFile BUILD setfiletype bzl +endif " C or lpc au BufNewFile,BufRead *.c call s:FTlpc() diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim --- a/runtime/ftplugin/man.vim +++ b/runtime/ftplugin/man.vim @@ -1,7 +1,7 @@ " Vim filetype plugin file " Language: man " Maintainer: SungHyun Nam -" Last Change: 2016 Jun 20 +" Last Change: 2017 Jan 04 " To make the ":Man" command available before editing a manual page, source " this script from your startup vimrc file. @@ -47,6 +47,7 @@ endif if exists(":Man") != 2 com -nargs=+ Man call s:GetPage() nmap K :call PreGetPage(0) + nmap ManPreGetPage :call PreGetPage(0) endif " Define functions only once. diff --git a/runtime/indent/javascript.vim b/runtime/indent/javascript.vim --- a/runtime/indent/javascript.vim +++ b/runtime/indent/javascript.vim @@ -2,7 +2,7 @@ " Language: Javascript " Maintainer: Chris Paul ( https://github.com/bounceme ) " URL: https://github.com/pangloss/vim-javascript -" Last Change: August 25, 2016 +" Last Change: December 31, 2016 " Only load this indent file when no other was loaded. if exists('b:did_indent') @@ -12,11 +12,10 @@ let b:did_indent = 1 " Now, set up our indentation expression and keys that trigger it. setlocal indentexpr=GetJavascriptIndent() -setlocal nolisp noautoindent nosmartindent -setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e -setlocal cinoptions+=j1,J1 +setlocal autoindent nolisp nosmartindent +setlocal indentkeys+=0],0) -let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys< cinoptions<' +let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<' " Only define the function once. if exists('*GetJavascriptIndent') @@ -37,158 +36,329 @@ else endfunction endif -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 = '\%(s\%(tring\|pecial\)\|comment\|regex\|doc\|template\)' - -" Regex of syntax group names that are strings or documentation. -let s:syng_comment = '\%(comment\|doc\)' - -" Expression used to check whether we should skip a match with searchpair(). -let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'" - +" searchpair() wrapper 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) + function s:GetPair(start,end,flags,skip,time,...) + return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),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])) + function s:GetPair(start,end,flags,skip,...) + return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 1000,get(a:000,1)])) endfunction endif -let s:line_term = '\s*\%(\%(\/\%(\%(\*.\{-}\*\/\)\|\%(\*\+\)\)\)\s*\)\=$' +" Regex of syntax group names that are or delimit string or are comments. +let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template' +let s:syng_str = 'string\|template' +let s:syng_com = 'comment\|doc' +" Expression used to check whether we should skip a match with searchpair(). +let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'" + +function s:skip_func() + if !s:free || search('\m`\|\*\/','nW',s:looksyn) + let s:free = !eval(s:skip_expr) + let s:looksyn = s:free ? line('.') : s:looksyn + return !s:free + endif + let s:looksyn = line('.') + return (search('\m\/','nbW',s:looksyn) || search('\m[''"]\|\\$','nW',s:looksyn)) && eval(s:skip_expr) +endfunction + +function s:alternatePair(stop) + let pos = getpos('.')[1:2] + while search('\m[][(){}]','bW',a:stop) + if !s:skip_func() + let idx = stridx('])}',s:looking_at()) + if idx + 1 + if !s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,a:stop) + break + endif + else + return + endif + endif + endwhile + call call('cursor',pos) +endfunction + +function s:save_pos(f,...) + let l:pos = getpos('.')[1:2] + let ret = call(a:f,a:000) + call call('cursor',l:pos) + return ret +endfunction + +function s:syn_at(l,c) + return synIDattr(synID(a:l,a:c,0),'name') +endfunction + +function s:looking_at() + return getline('.')[col('.')-1] +endfunction + +function s:token() + return s:looking_at() =~ '\k' ? expand('') : s:looking_at() +endfunction + +function s:b_token() + if s:looking_at() =~ '\k' + call search('\m\<','cbW') + endif + return search('\m\S','bW') +endfunction + +function s:previous_token() + let l:n = line('.') + while s:b_token() + if (s:looking_at() == '/' || line('.') != l:n && search('\m\/\/','nbW', + \ line('.'))) && s:syn_at(line('.'),col('.')) =~? s:syng_com + call search('\m\_[^/]\zs\/[/*]','bW') + else + return s:token() + endif + endwhile + return '' +endfunction + +function s:others(p) + return "((line2byte(line('.')) + col('.')) <= ".(line2byte(a:p[0]) + a:p[1]).") || ".s:skip_expr +endfunction + +function s:tern_skip(p) + return s:GetPair('{','}','nbW',s:others(a:p),200,a:p[0]) > 0 +endfunction + +function s:tern_col(p) + return s:GetPair('?',':\@ 0 +endfunction + +function s:label_col() + let pos = getpos('.')[1:2] + let [s:looksyn,s:free] = pos + call s:alternatePair(0) + if s:save_pos('s:IsBlock') + let poss = getpos('.')[1:2] + return call('cursor',pos) || !s:tern_col(poss) + elseif s:looking_at() == ':' + return !s:tern_col([0,0]) + endif +endfunction " configurable regexes that define continuation lines, not including (, {, or [. -if !exists('g:javascript_opfirst') - let g:javascript_opfirst = '\%([<>,:?^%|*&]\|\/[^/*]\|\([-.+]\)\1\@!\|=>\@!\|in\%(stanceof\)\=\>\)' -endif -if !exists('g:javascript_continuation') - let g:javascript_continuation = '\%([<=,.?/*:^%|&]\|+\@\|\=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)') +let s:continuation = get(g:,'javascript_continuation', + \ '\%([<=,.~!?/*^%|&:]\|+\@\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$' -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 =~# '\%(\\)' . 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('') !=# 'while' || !s:GetPair('\C\', '\C\','nbW',100)) && - \ (expand('') !=# 'each' || search('\C\') : '' +function s:continues(ln,con) + return !cursor(a:ln, match(' '.a:con,s:continuation)) && + \ eval((['s:syn_at(line("."),col(".")) !~? "regex"'] + + \ repeat(['s:previous_token() != "."'],5) + [1])[ + \ index(split('/ typeof in instanceof void delete'),s:token())]) endfunction -" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader -function s:IsBlock() - return getline(line('.'))[col('.')-1] == '{' && !search( - \ '\C\%(\\|\*\@ 0 || getline(l:n-1)[-1:] == '\') && + \ s:syn_at(l:n,1) =~? s:syng_str + return l:n + endif + let l:n = prevnonblank(l:n-1) + elseif s:syn_at(l:n,1) =~? s:syng_com + let l:n = s:save_pos('eval', + \ 'cursor('.l:n.',1) + search(''\m\/\*'',"bW")') + else + return l:n endif - let l:lnum = prevnonblank(l:lnum - 1) endwhile endfunction " 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:open = 0 let l:line = getline(a:lnum) let pos = match(l:line, '[][(){}]', 0) while pos != -1 - 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 - else - let open_{idx - 1} = open_{idx - 1} - 1 + if s:syn_at(a:lnum,pos + 1) !~? s:syng_strcom + let l:open += match(' ' . l:line[pos],'[[({]') + if l:open < 0 + return endif endif let pos = match(l:line, '[][(){}]', pos + 1) endwhile - return (!open_4 + !open_2 + !open_0) - 2 + return !l:open +endfunction + +function s:OneScope(lnum) + let pline = s:Trim(a:lnum) + let kw = 'else do' + if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 + call s:previous_token() + let kw = 'for if let while with' + if index(split('await each'),s:token()) + 1 + call s:previous_token() + let kw = 'for' + endif + endif + return pline[-2:] == '=>' || index(split(kw),s:token()) + 1 && + \ s:save_pos('s:previous_token') != '.' endfunction -" }}} + +" returns braceless levels started by 'i' and above lines * &sw. 'num' is the +" lineNr which encloses the entire context, 'cont' if whether line 'i' + 1 is +" a continued expression, which could have started in a braceless context +function s:iscontOne(i,num,cont) + let [l:i, l:num, bL] = [a:i, a:num + !a:num, 0] + let pind = a:num ? indent(l:num) + s:W : 0 + let ind = indent(l:i) + (a:cont ? 0 : s:W) + while l:i >= l:num && (ind > pind || l:i == l:num) + if indent(l:i) < ind && s:OneScope(l:i) + let bL += s:W + let l:i = line('.') + elseif !a:cont || bL || ind < indent(a:i) + break + endif + let ind = min([ind, indent(l:i)]) + let l:i = s:PrevCodeLine(l:i - 1) + endwhile + return bL +endfunction + +" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader +function s:IsBlock() + if s:looking_at() == '{' + let l:n = line('.') + let char = s:previous_token() + let syn = char =~ '[{>/]' ? s:syn_at(line('.'),col('.')-(char == '{')) : '' + if syn =~? 'xml\|jsx' + return char != '{' + elseif char =~ '\k' + return index(split('return const let import export yield default delete var await void typeof throw case new in instanceof') + \ ,char) < (line('.') != l:n) || s:previous_token() == '.' + elseif char == '>' + return getline('.')[col('.')-2] == '=' || syn =~? '^jsflow' + elseif char == ':' + return getline('.')[col('.')-2] != ':' && s:label_col() + endif + return syn =~? 'regex' || char !~ '[-=~!<*+,/?^%|&([]' + endif +endfunction function GetJavascriptIndent() - if !exists('b:js_cache') - let b:js_cache = [0,0,0] - endif + let b:js_cache = get(b:,'js_cache',[0,0,0]) " Get the current line. - let l:line = getline(v:lnum) - let syns = synIDattr(synID(v:lnum, 1, 0), 'name') + call cursor(v:lnum,1) + let l:line = getline('.') + let syns = s:syn_at(v:lnum, 1) - " start with strings,comments,etc.{{{2 - if (l:line !~ '^[''"`]' && syns =~? '\%(string\|template\)') || - \ (l:line !~ '^\s*[/*]' && syns =~? s:syng_comment) + " start with strings,comments,etc. + if syns =~? s:syng_com + if l:line =~ '^\s*\*' + return cindent(v:lnum) + elseif l:line !~ '^\s*\/[/*]' + return -1 + endif + elseif syns =~? s:syng_str && l:line !~ '^[''"]' + if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1) + let b:js_cache[0] = v:lnum + endif return -1 endif - 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 + if !l:lnum + return endif - if (l:line =~# s:expr_case) - let cpo_switch = &cpo - set cpo+=% - let ind = cindent(v:lnum) - let &cpo = cpo_switch - return ind + let l:line = substitute(l:line,'^\s*','','') + if l:line[:1] == '/*' + let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','') endif - "}}} + if l:line =~ '^\/[/*]' + let l:line = '' + endif - " 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) + " the containing paren, bracket, or curly. Many hacks for performance + let idx = strlen(l:line) ? stridx('])}',l:line[0]) : -1 + if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum && + \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum)) + call call('cursor',b:js_cache[1:]) else - let num = s:GetPair('[({[]','[])}]','bW',2000) + let [s:looksyn, s:free, top] = [v:lnum - 1, 1, (!indent(l:lnum) && + \ s:syn_at(l:lnum,1) !~? s:syng_str) * l:lnum] + if idx + 1 + call s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,top) + elseif indent(v:lnum) && syns =~? 'block' + call s:GetPair('{','}','bW','s:skip_func()',2000,top) + else + call s:alternatePair(top) + endif endif - let b:js_cache = [v:lnum,num,line('.') == v:lnum ? b:js_cache[2] : col('.')] - if l:line =~ s:line_pre . '[])}]' - return indent(num) + if idx + 1 || l:line[:1] == '|}' + if idx == 2 && search('\m\S','bW',line('.')) && s:looking_at() == ')' + call s:GetPair('(',')','bW',s:skip_expr,200) + endif + return indent('.') endif - call cursor(b:js_cache[1],b:js_cache[2]) + let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2]) + let num = b:js_cache[1] - let swcase = getline(l:lnum) =~# s:expr_case - let pline = swcase ? getline(l:lnum) : substitute(getline(l:lnum), '\%(:\@' && - \ 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 + let [s:W, isOp, bL, switch_offset] = [s:sw(),0,0,0] + if !num || s:IsBlock() + let pline = s:save_pos('s:Trim',l:lnum) + if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0 + let num = line('.') + if s:previous_token() ==# 'switch' && s:previous_token() != '.' + if &cino !~ ':' || !has('float') + let switch_offset = s:W + else + let cinc = matchlist(&cino,'.*:\(-\)\=\([0-9.]*\)\(s\)\=\C') + let switch_offset = float2nr(str2float(cinc[1].(strlen(cinc[2]) ? cinc[2] : strlen(cinc[3]))) + \ * (strlen(cinc[3]) ? s:W : 1)) + endif + if pline[-1:] != '.' && l:line =~# '^\%(default\|case\)\>' + return indent(num) + switch_offset + endif + endif + endif + if pline[-1:] !~ '[{;]' + if pline =~# ':\@ " Previous Maintainer: Claudio Fleiner -" Last Change: 2016 Dec 29 +" Repository: https://notabug.org/jorgesumle/vim-html-syntax +" Last Change: 2017 Jan 04 " included patch from Jorge Maldonado Ventura " Please check :help html.vim for some comments and a description of the options @@ -95,6 +96,10 @@ syn keyword htmlArg contained multiple n syn keyword htmlArg contained rules scheme scope span standby style syn keyword htmlArg contained summary tabindex valuetype version +" html 5 arg names +syn keyword htmlArg contained contenteditable contextmenu draggable dropzone +syn keyword htmlArg contained hidden spellcheck title translate + " special characters syn match htmlSpecialChar "&#\=[0-9A-Za-z]\{1,8};"