]> granicus.if.org Git - vim/commitdiff
Updated runtime files.
authorBram Moolenaar <Bram@vim.org>
Tue, 10 Jan 2017 12:31:15 +0000 (13:31 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 Jan 2017 12:31:15 +0000 (13:31 +0100)
runtime/doc/develop.txt
runtime/doc/eval.txt
runtime/doc/filetype.txt
runtime/doc/intro.txt
runtime/doc/tags
runtime/doc/todo.txt
runtime/filetype.vim
runtime/ftplugin/man.vim
runtime/indent/javascript.vim
runtime/syntax/html.vim

index a2477f024f54b277bf40b4c2c529a5e6bde3ba38..dc49c0992bd2331db39be854a273c009064badf9 100644 (file)
@@ -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 @@ The basic steps to make changes to the code:
 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.
 
 
index f5ea0780a9038b735b29089701d193b297e99fb7..b3c73235fef3248e1f848f742b3c29fc8ace2e84 100644 (file)
@@ -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}])                            *systemlist()*
                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.
 
index 4c9b2b0568cc2ee42a8207a0ab26a47df69e922c..4b0a185da2d58a5f6aff4117c5f6e86497758c67 100644 (file)
@@ -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:
 <Leader>K      Displays the manual page for the word under the cursor.
+<Plug>ManPreGetPage  idem, allows for using a mapping: >
+                       nmap <F1> <Plug>ManPreGetPage<CR>
 
 Local mappings:
 CTRL-]         Jump to the manual page for the word under the cursor.
index 58459057d3e39840160439c29e4a7dda1a2e5691..d6664ff45d84d105682e8a1cc86fba8dd25c6b81 100644 (file)
@@ -96,21 +96,18 @@ mention that.
 
                                                *mail-list* *maillist*
 There are several mailing lists for Vim:
-<vim@vim.org>
+<vim@vim.org>                                  *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@vim.org>                              *vim-dev* *vimdev*
+<vim-dev@vim.org>                              *vim-dev* *vim_dev* *vimdev*
        For discussions about changing Vim: New features, porting, patches,
        beta-test versions, etc.
-<vim-announce@vim.org>                         *vim-announce*
+<vim-announce@vim.org>                         *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@vim.org>                                *vim-multibyte*
-       For discussions about using and improving the multi-byte aspects of
-       Vim.
-<vim-mac@vim.org>                              *vim-mac*
+<vim-mac@vim.org>                              *vim-mac* *vim_mac*
        For discussions about using and improving the Macintosh version of
        Vim.
 
index dd12f1073d8f68111e3ce24cf8cf228ad1667f49..0031975068e9d48d5df6111ea48728ae8a9b4f98 100644 (file)
@@ -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*
index c83eb5e62e76d0a9d10b7955adebeda67d3247c4..772d107f7c9443825e3e2405df6eda5c2f4a52ea 100644 (file)
@@ -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 Vim development.  See |sponsor|.
 
 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, 2016 Nov 18)
 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)
+Include rust files. (Klabnik, #1356)
 
-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)
+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 events in GTK 3. (Jan Alexander Steffens,
 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/5737#issuecomment-266055165
 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 number of lines in buffer.
 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 wrapped line, involving breakindent.
 
 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 @@ sort() is not stable when using numeric/float sort (Nikolay Pavlov, 2016 Sep
 
 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(). (Duncan McDougall, 2016 Oct 25)
 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 /usr/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_backref() regexp_nda.c:4882
 ":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)
 
index df8f7fdd99e19432b7ef5d41aec5ffedbf16062d..9c9c808b47818f8857de6f6484a7ca1b7a245be6 100644 (file)
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:  Bram Moolenaar <Bram@vim.org>
-" 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()
index 69394930e83be62c697878ff92c8d6c5809f6f13..47be88b4770deeb87f184725319db151e057131f 100644 (file)
@@ -1,7 +1,7 @@
 " Vim filetype plugin file
 " Language:    man
 " Maintainer:  SungHyun Nam <goweol@gmail.com>
-" 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(<f-args>)
   nmap <Leader>K :call <SID>PreGetPage(0)<CR>
+  nmap <Plug>ManPreGetPage :call <SID>PreGetPage(0)<CR>
 endif
 
 " Define functions only once.
index 0d6c11d151a1452a9d562e2f8b8ec534d4081211..a6f1e1a8f821a50f92fea2f82df87ede1a87d87d 100644 (file)
@@ -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."'"
 
-" 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 = '\%([<=,.?/*:^%|&]\|+\@<!+\|-\@<!-\|=\@<!>\|\<in\%(stanceof\)\=\)'
-endif
+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
 
-let g:javascript_opfirst = s:line_pre . g:javascript_opfirst
-let g:javascript_continuation .= s:line_term
+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: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>') : ''
+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
 
-" 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\|import\|export\%(\_s\+default\)\=\|yield\|delete\|void\|t\%(ypeof\|hrow\)\|new\|in\%(stanceof\)\=\)\)\_s*\)\%#','bnW') &&
-        \ (!search(':\_s*\%#','bW') || (!s:GetPair('[({[]','[])}]','bW',200) || s:IsBlock()))
+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('<cword>') : 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('?',':\@<!::\@!','nbW',s:others(a:p)
+        \ .' || s:tern_skip('.string(a:p).')',200,a:p[0]) > 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 [.
+let s:opfirst = '^' . get(g:,'javascript_opfirst',
+      \ '\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)')
+let s:continuation = get(g:,'javascript_continuation',
+      \ '\%([<=,.~!?/*^%|&:]\|+\@<!+\|-\@<!-\|=\@<!>\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$'
+
+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
 
-" Auxiliary Functions {{{2
+" get the line of code stripped of comments and move cursor to the last
+" non-comment char.
+function s:Trim(ln)
+  let pline = substitute(getline(a:ln),'\s*$','','')
+  let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0])
+  while l:max && s:syn_at(a:ln, strlen(pline)) =~? s:syng_com
+    let pline = substitute(strpart(pline, 0, l:max),'\s*$','','')
+    let l:max = max([match(pline,'.*[^/]\zs\/[/*]'),0])
+  endwhile
+  return cursor(a:ln,strlen(pline)) ? pline : pline
+endfunction
 
-" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+" Find line above 'lnum' that isn't empty or in a comment
 function s:PrevCodeLine(lnum)
-  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
+  let l:n = prevnonblank(a:lnum)
+  while l:n
+    if getline(l:n) =~ '^\s*\/[/*]'
+      if (stridx(getline(l:n),'`') > 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 GetJavascriptIndent()
-  if !exists('b:js_cache')
-    let b:js_cache = [0,0,0]
+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()
+  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 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
+  let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2])
+  let num = b:js_cache[1]
+
+  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 =~# ':\@<!:$'
+        call cursor(l:lnum,strlen(pline))
+        let isOp = s:tern_col(b:js_cache[1:2])
+      else
+        let isOp = l:line =~# s:opfirst || s:continues(l:lnum,pline)
+      endif
+      let bL = s:iscontOne(l:lnum,num,isOp)
+      let bL -= (bL && l:line[0] == '{') * s:W
+    endif
   endif
 
+  " main return
+  if isOp
+    return (num ? indent(num) : -s:W) + (s:W * 2) + switch_offset + bL
+  elseif num
+    return indent(num) + s:W + switch_offset + bL
+  endif
+  return bL
 endfunction
 
-
 let &cpo = s:cpo_save
 unlet s:cpo_save
index 7408f66476f7f879b83aa7a85bacf42135abb943..b168750db41a96d7d36b213bc5b6f108574ab768 100644 (file)
@@ -2,7 +2,8 @@
 " Language:             HTML
 " Maintainer:           Jorge Maldonado Ventura <jorgesumle@freakspot.net>
 " Previous Maintainer:  Claudio Fleiner <claudio@fleiner.com>
-" 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 nohref nowrap object profile readonly
 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};"