mirror of
https://github.com/vim/vim
synced 2025-07-20 03:02:30 +00:00
Compare commits
19 Commits
Author | SHA1 | Date | |
---|---|---|---|
132f75255e | |||
a0ca7d002d | |||
4af031dbc8 | |||
b254af312d | |||
c9e649ae81 | |||
606d45ccd8 | |||
4fb921e388 | |||
9bca805ec4 | |||
cb89c98c26 | |||
f0b03c4e98 | |||
8ee2d36e21 | |||
ee219b0e9f | |||
9e1d399e63 | |||
890dd05492 | |||
a1d5c154db | |||
200d0e36bc | |||
7e1652c63c | |||
6621605eb9 | |||
8b42328cef |
1
Filelist
1
Filelist
@ -666,6 +666,7 @@ RT_SCRIPTS = \
|
|||||||
runtime/autoload/xml/*.vim \
|
runtime/autoload/xml/*.vim \
|
||||||
runtime/colors/*.vim \
|
runtime/colors/*.vim \
|
||||||
runtime/colors/README.txt \
|
runtime/colors/README.txt \
|
||||||
|
runtime/colors/tools/*.vim \
|
||||||
runtime/compiler/*.vim \
|
runtime/compiler/*.vim \
|
||||||
runtime/compiler/README.txt \
|
runtime/compiler/README.txt \
|
||||||
runtime/indent/*.vim \
|
runtime/indent/*.vim \
|
||||||
|
8
runtime/autoload/dist/ft.vim
vendored
8
runtime/autoload/dist/ft.vim
vendored
@ -1,7 +1,7 @@
|
|||||||
" Vim functions for file type detection
|
" Vim functions for file type detection
|
||||||
"
|
"
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2017 Nov 11
|
" Last Change: 2017 Dec 05
|
||||||
|
|
||||||
" These functions are moved here from runtime/filetype.vim to make startup
|
" These functions are moved here from runtime/filetype.vim to make startup
|
||||||
" faster.
|
" faster.
|
||||||
@ -618,7 +618,11 @@ func dist#ft#FTperl()
|
|||||||
setf perl
|
setf perl
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
if search('^use\s\s*\k', 'nc', 30)
|
let save_cursor = getpos('.')
|
||||||
|
call cursor(1,1)
|
||||||
|
let has_use = search('^use\s\s*\k', 'c', 30)
|
||||||
|
call setpos('.', save_cursor)
|
||||||
|
if has_use
|
||||||
setf perl
|
setf perl
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
|
@ -64,6 +64,7 @@ Search for "highlight_init".
|
|||||||
If you think you have a color scheme that is good enough to be used by others,
|
If you think you have a color scheme that is good enough to be used by others,
|
||||||
please check the following items:
|
please check the following items:
|
||||||
|
|
||||||
|
- Source the tools/check_colors.vim script to check for common mistakes.
|
||||||
- Does it work in a color terminal as well as in the GUI?
|
- Does it work in a color terminal as well as in the GUI?
|
||||||
- Is "g:colors_name" set to a meaningful value? In case of doubt you can do
|
- Is "g:colors_name" set to a meaningful value? In case of doubt you can do
|
||||||
it this way:
|
it this way:
|
||||||
|
136
runtime/colors/tools/check_colors.vim
Normal file
136
runtime/colors/tools/check_colors.vim
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
" This script tests a color scheme for some errors. Load the scheme and source
|
||||||
|
" this script. e.g. :e colors/desert.vim | :so test_colors.vim
|
||||||
|
" Will output possible errors.
|
||||||
|
|
||||||
|
let s:save_cpo= &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
func! Test_check_colors()
|
||||||
|
call cursor(1,1)
|
||||||
|
let err={}
|
||||||
|
|
||||||
|
" 1) Check g:colors_name is existing
|
||||||
|
if !search('\<\%(g:\)\?colors_name\>', 'cnW')
|
||||||
|
let err['colors_name'] = 'g:colors_name not set'
|
||||||
|
else
|
||||||
|
let err['colors_name'] = 'OK'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 2) Check for some well-defined highlighting groups
|
||||||
|
" Some items, check several groups, e.g. Diff, Spell
|
||||||
|
let hi_groups = ['ColorColumn', 'Diff', 'ErrorMsg', 'Folded',
|
||||||
|
\ 'FoldColumn', 'IncSearch', 'LineNr', 'ModeMsg', 'MoreMsg', 'NonText',
|
||||||
|
\ 'Normal', 'Pmenu', 'Todo', 'Search', 'Spell', 'StatusLine', 'TabLine',
|
||||||
|
\ 'Title', 'Visual', 'WarningMsg', 'WildMenu']
|
||||||
|
let groups={}
|
||||||
|
for group in hi_groups
|
||||||
|
if search('\c@suppress\s\+'.group, 'cnW')
|
||||||
|
" skip check, if the script contains a line like
|
||||||
|
" @suppress Visual:
|
||||||
|
let groups[group] = 'Ignoring '.group
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if !search('hi\%[ghlight] \+'.group, 'cnW')
|
||||||
|
let groups[group] = 'No highlight definition for '.group
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if !search('hi\%[ghlight] \+'.group. '.*fg=', 'cnW')
|
||||||
|
let groups[group] = 'Missing foreground color for '.group
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if search('hi\%[ghlight] \+'.group. '.*guibg=', 'cnW') &&
|
||||||
|
\ !search('hi\%[ghlight] \+'.group. '.*ctermbg=', 'cnW')
|
||||||
|
let groups[group] = 'Missing bg terminal color for '.group
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
call search('hi\%[ghlight] \+'.group, 'cW')
|
||||||
|
" only check in the current line
|
||||||
|
if !search('guifg', 'cnW', line('.')) || !search('ctermfg', 'cnW', line('.'))
|
||||||
|
" do not check for background colors, they could be intentionally left out
|
||||||
|
let groups[group] = 'Missing fg definition for '.group
|
||||||
|
endif
|
||||||
|
call cursor(1,1)
|
||||||
|
endfor
|
||||||
|
let err['highlight'] = groups
|
||||||
|
|
||||||
|
" 3) Check, that it does not set background highlighting
|
||||||
|
" Doesn't ':hi Normal ctermfg=253 ctermfg=233' also set the background sometimes?
|
||||||
|
let bg_set='\(set\?\|setl\(ocal\)\?\) .*\(background\|bg\)=\(dark\|light\)'
|
||||||
|
let bg_let='let \%([&]\%([lg]:\)\?\)\%(background\|bg\)\s*=\s*\([''"]\?\)\w\+\1'
|
||||||
|
let bg_pat='\%('.bg_set. '\|'.bg_let.'\)'
|
||||||
|
let line=search(bg_pat, 'cnW')
|
||||||
|
if search(bg_pat, 'cnW')
|
||||||
|
exe line
|
||||||
|
if search('hi \U\w\+\s\+\S', 'cbnW')
|
||||||
|
let err['background'] = 'Should not set background option after :hi statement'
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let err['background'] = 'OK'
|
||||||
|
endif
|
||||||
|
call cursor(1,1)
|
||||||
|
|
||||||
|
" 4) Check, that t_Co is checked
|
||||||
|
let pat = '[&]t_Co\s*[<>=]=\?\s*\d\+'
|
||||||
|
if !search(pat, 'ncW')
|
||||||
|
let err['t_Co'] = 'Does not check terminal for capable colors'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 5) Initializes correctly, e.g. should have a section like
|
||||||
|
" hi clear
|
||||||
|
" if exists("syntax_on")
|
||||||
|
" syntax reset
|
||||||
|
" endif
|
||||||
|
let pat='hi\%[ghlight]\s*clear\n\s*if\s*exists(\([''"]\)syntax_on\1)\n\s*syn\%[tax]\s*reset\n\s*endif'
|
||||||
|
if !search(pat, 'cnW')
|
||||||
|
let err['init'] = 'No initialization'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 6) Does not use :syn on
|
||||||
|
if search('syn\%[tax]\s\+on', 'cnW')
|
||||||
|
let err['background'] = 'Should not issue :syn on'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 7) Does not define filetype specfic groups like vimCommand, htmlTag,
|
||||||
|
let hi_groups = ['vim', 'html', 'python', 'sh', 'ruby']
|
||||||
|
for group in hi_groups
|
||||||
|
let pat='\Chi\%[ghlight]\s*\zs'.group.'\w\+\>'
|
||||||
|
if search(pat, 'cnW')
|
||||||
|
let line = search(pat, 'cW')
|
||||||
|
let err['filetype'] = get(err, 'filetype', 'Should not define: ') . matchstr(getline('.'), pat). ' '
|
||||||
|
endif
|
||||||
|
call cursor(1,1)
|
||||||
|
endfor
|
||||||
|
let g:err = err
|
||||||
|
|
||||||
|
" print Result
|
||||||
|
call Result(err)
|
||||||
|
endfu
|
||||||
|
|
||||||
|
fu! Result(err)
|
||||||
|
let do_roups = 0
|
||||||
|
echohl Title|echomsg "---------------"|echohl Normal
|
||||||
|
for key in sort(keys(a:err))
|
||||||
|
if key is# 'highlight'
|
||||||
|
let do_groups = 1
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
if a:err[key] !~ 'OK'
|
||||||
|
echohl Title
|
||||||
|
endif
|
||||||
|
echomsg printf("%15s: %s", key, a:err[key])
|
||||||
|
echohl Normal
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
echohl Title|echomsg "---------------"|echohl Normal
|
||||||
|
if do_groups
|
||||||
|
echohl Title | echomsg "Groups" | echohl Normal
|
||||||
|
for v1 in sort(keys(a:err['highlight']))
|
||||||
|
echomsg printf("%25s: %s", v1, a:err['highlight'][v1])
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
endfu
|
||||||
|
|
||||||
|
call Test_check_colors()
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
@ -1,4 +1,4 @@
|
|||||||
*autocmd.txt* For Vim version 8.0. Last change: 2017 Nov 05
|
*autocmd.txt* For Vim version 8.0. Last change: 2017 Dec 17
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -330,6 +330,7 @@ Name triggered by ~
|
|||||||
|
|
||||||
|TextChanged| after a change was made to the text in Normal mode
|
|TextChanged| after a change was made to the text in Normal mode
|
||||||
|TextChangedI| after a change was made to the text in Insert mode
|
|TextChangedI| after a change was made to the text in Insert mode
|
||||||
|
|TextYankPost| after text is yanked or deleted
|
||||||
|
|
||||||
|ColorScheme| after loading a color scheme
|
|ColorScheme| after loading a color scheme
|
||||||
|
|
||||||
@ -956,6 +957,25 @@ TextChangedI After a change was made to the text in the
|
|||||||
current buffer in Insert mode.
|
current buffer in Insert mode.
|
||||||
Not triggered when the popup menu is visible.
|
Not triggered when the popup menu is visible.
|
||||||
Otherwise the same as TextChanged.
|
Otherwise the same as TextChanged.
|
||||||
|
*TextYankPost*
|
||||||
|
TextYankPost After text has been yanked or deleted in the
|
||||||
|
current buffer. The following values of
|
||||||
|
|v:event| can be used to determine the operation
|
||||||
|
that triggered this autocmd:
|
||||||
|
operator The operation performed.
|
||||||
|
regcontents Text that was stored in the
|
||||||
|
register, as a list of lines,
|
||||||
|
like with: >
|
||||||
|
getreg(r, 1, 1)
|
||||||
|
< regname Name of the |register| or
|
||||||
|
empty string for the unnamed
|
||||||
|
register.
|
||||||
|
regtype Type of the register, see
|
||||||
|
|getregtype()|.
|
||||||
|
Not triggered when |quote_| is used nor when
|
||||||
|
called recursively.
|
||||||
|
It is not allowed to change the buffer text,
|
||||||
|
see |textlock|.
|
||||||
*User*
|
*User*
|
||||||
User Never executed automatically. To be used for
|
User Never executed automatically. To be used for
|
||||||
autocommands that are only executed with
|
autocommands that are only executed with
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*eval.txt* For Vim version 8.0. Last change: 2017 Dec 09
|
*eval.txt* For Vim version 8.0. Last change: 2017 Dec 16
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -1554,6 +1554,12 @@ v:errors Errors found by assert functions, such as |assert_true()|.
|
|||||||
< If v:errors is set to anything but a list it is made an empty
|
< If v:errors is set to anything but a list it is made an empty
|
||||||
list by the assert function.
|
list by the assert function.
|
||||||
|
|
||||||
|
*v:event* *event-variable*
|
||||||
|
v:event Dictionary containing information about the current
|
||||||
|
|autocommand|. The dictionary is emptied when the |autocommand|
|
||||||
|
finishes, please refer to |dict-identity| for how to get an
|
||||||
|
independent copy of it.
|
||||||
|
|
||||||
*v:exception* *exception-variable*
|
*v:exception* *exception-variable*
|
||||||
v:exception The value of the exception most recently caught and not
|
v:exception The value of the exception most recently caught and not
|
||||||
finished. See also |v:throwpoint| and |throw-variables|.
|
finished. See also |v:throwpoint| and |throw-variables|.
|
||||||
@ -2270,6 +2276,8 @@ mode([expr]) String current editing mode
|
|||||||
mzeval({expr}) any evaluate |MzScheme| expression
|
mzeval({expr}) any evaluate |MzScheme| expression
|
||||||
nextnonblank({lnum}) Number line nr of non-blank line >= {lnum}
|
nextnonblank({lnum}) Number line nr of non-blank line >= {lnum}
|
||||||
nr2char({expr} [, {utf8}]) String single char with ASCII/UTF8 value {expr}
|
nr2char({expr} [, {utf8}]) String single char with ASCII/UTF8 value {expr}
|
||||||
|
option_restore({list}) none restore options saved by option_save()
|
||||||
|
option_save({list}) List save options values
|
||||||
or({expr}, {expr}) Number bitwise OR
|
or({expr}, {expr}) Number bitwise OR
|
||||||
pathshorten({expr}) String shorten directory names in a path
|
pathshorten({expr}) String shorten directory names in a path
|
||||||
perleval({expr}) any evaluate |Perl| expression
|
perleval({expr}) any evaluate |Perl| expression
|
||||||
@ -4666,6 +4674,8 @@ getqflist([{what}]) *getqflist()*
|
|||||||
If the optional {what} dictionary argument is supplied, then
|
If the optional {what} dictionary argument is supplied, then
|
||||||
returns only the items listed in {what} as a dictionary. The
|
returns only the items listed in {what} as a dictionary. The
|
||||||
following string items are supported in {what}:
|
following string items are supported in {what}:
|
||||||
|
changedtick get the total number of changes made
|
||||||
|
to the list
|
||||||
context get the context stored with |setqflist()|
|
context get the context stored with |setqflist()|
|
||||||
efm errorformat to use when parsing "lines". If
|
efm errorformat to use when parsing "lines". If
|
||||||
not present, then the 'errorformat' option
|
not present, then the 'errorformat' option
|
||||||
@ -4699,6 +4709,8 @@ getqflist([{what}]) *getqflist()*
|
|||||||
"items" with the list of entries.
|
"items" with the list of entries.
|
||||||
|
|
||||||
The returned dictionary contains the following entries:
|
The returned dictionary contains the following entries:
|
||||||
|
changedtick total number of changes made to the
|
||||||
|
list |quickfix-changedtick|
|
||||||
context context information stored with |setqflist()|.
|
context context information stored with |setqflist()|.
|
||||||
If not present, set to "".
|
If not present, set to "".
|
||||||
id quickfix list ID |quickfix-ID|. If not
|
id quickfix list ID |quickfix-ID|. If not
|
||||||
@ -6108,6 +6120,31 @@ nr2char({expr} [, {utf8}]) *nr2char()*
|
|||||||
characters. nr2char(0) is a real NUL and terminates the
|
characters. nr2char(0) is a real NUL and terminates the
|
||||||
string, thus results in an empty string.
|
string, thus results in an empty string.
|
||||||
|
|
||||||
|
option_restore({list}) *option_restore()*
|
||||||
|
Restore options previously saved by option_save().
|
||||||
|
When buffer-local options have been saved, this function must
|
||||||
|
be called when the same buffer is the current buffer.
|
||||||
|
When window-local options have been saved, this function must
|
||||||
|
be called when the same window is the current window.
|
||||||
|
When in the wrong buffer and/or window an error is given and
|
||||||
|
the local options won't be restored.
|
||||||
|
NOT IMPLEMENTED YET!
|
||||||
|
|
||||||
|
option_save({list}) *option_save()*
|
||||||
|
Saves the options named in {list}. The returned value can be
|
||||||
|
passed to option_restore(). Example: >
|
||||||
|
let s:saved_options = option_save([
|
||||||
|
\ 'ignorecase',
|
||||||
|
\ 'iskeyword',
|
||||||
|
\ ])
|
||||||
|
au <buffer> BufLeave *
|
||||||
|
\ call option_restore(s:saved_options)
|
||||||
|
< The advantage over using `:let` is that global and local
|
||||||
|
values are handled and the script ID is restored, so that
|
||||||
|
`:verbose set` will show where the option was originally set,
|
||||||
|
not where it was restored.
|
||||||
|
NOT IMPLEMENTED YET!
|
||||||
|
|
||||||
or({expr}, {expr}) *or()*
|
or({expr}, {expr}) *or()*
|
||||||
Bitwise OR on the two arguments. The arguments are converted
|
Bitwise OR on the two arguments. The arguments are converted
|
||||||
to a number. A List, Dict or Float argument causes an error.
|
to a number. A List, Dict or Float argument causes an error.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*filetype.txt* For Vim version 8.0. Last change: 2017 Oct 10
|
*filetype.txt* For Vim version 8.0. Last change: 2017 Dec 05
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -706,4 +706,23 @@ You can change the default by defining the variable g:tex_flavor to the format
|
|||||||
Currently no other formats are recognized.
|
Currently no other formats are recognized.
|
||||||
|
|
||||||
|
|
||||||
|
VIM *ft-vim-plugin*
|
||||||
|
|
||||||
|
The Vim filetype plugin defines mappings to move to the start and end of
|
||||||
|
functions with [[ and ]]. Move around comments with ]" and [".
|
||||||
|
|
||||||
|
The mappings can be disabled with: >
|
||||||
|
let g:no_vim_maps = 1
|
||||||
|
|
||||||
|
|
||||||
|
ZIMBU *ft-zimbu-plugin*
|
||||||
|
|
||||||
|
The Zimbu filetype plugin defines mappings to move to the start and end of
|
||||||
|
functions with [[ and ]].
|
||||||
|
|
||||||
|
The mappings can be disabled with: >
|
||||||
|
let g:no_zimbu_maps = 1
|
||||||
|
<
|
||||||
|
|
||||||
|
|
||||||
vim:tw=78:ts=8:ft=help:norl:
|
vim:tw=78:ts=8:ft=help:norl:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*options.txt* For Vim version 8.0. Last change: 2017 Nov 26
|
*options.txt* For Vim version 8.0. Last change: 2017 Dec 01
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*quickfix.txt* For Vim version 8.0. Last change: 2017 Sep 13
|
*quickfix.txt* For Vim version 8.0. Last change: 2017 Dec 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -64,6 +64,14 @@ When a window with a location list is split, the new window gets a copy of the
|
|||||||
location list. When there are no longer any references to a location list,
|
location list. When there are no longer any references to a location list,
|
||||||
the location list is destroyed.
|
the location list is destroyed.
|
||||||
|
|
||||||
|
*quickfix-changedtick*
|
||||||
|
Every quickfix and location list has a read-only changedtick variable that
|
||||||
|
tracks the total number of changes made to the list. Every time the quickfix
|
||||||
|
list is modified, this count is incremented. This can be used to perform an
|
||||||
|
action only when the list has changed. The getqflist() and getloclist()
|
||||||
|
functions can be used to query the current value of changedtick. You cannot
|
||||||
|
change the changedtick variable.
|
||||||
|
|
||||||
The following quickfix commands can be used. The location list commands are
|
The following quickfix commands can be used. The location list commands are
|
||||||
similar to the quickfix commands, replacing the 'c' prefix in the quickfix
|
similar to the quickfix commands, replacing the 'c' prefix in the quickfix
|
||||||
command with 'l'.
|
command with 'l'.
|
||||||
@ -363,7 +371,7 @@ Any Vim type can be associated as a context with a quickfix or location list.
|
|||||||
The |setqflist()| and the |setloclist()| functions can be used to associate a
|
The |setqflist()| and the |setloclist()| functions can be used to associate a
|
||||||
context with a quickfix and a location list respectively. The |getqflist()|
|
context with a quickfix and a location list respectively. The |getqflist()|
|
||||||
and the |getloclist()| functions can be used to retrieve the context of a
|
and the |getloclist()| functions can be used to retrieve the context of a
|
||||||
quickifx and a location list respectively. This is useful for a Vim plugin
|
quickfix and a location list respectively. This is useful for a Vim plugin
|
||||||
dealing with multiple quickfix/location lists.
|
dealing with multiple quickfix/location lists.
|
||||||
Examples: >
|
Examples: >
|
||||||
|
|
||||||
@ -376,13 +384,13 @@ Examples: >
|
|||||||
echo getloclist(2, {'id' : qfid, 'context' : 1})
|
echo getloclist(2, {'id' : qfid, 'context' : 1})
|
||||||
<
|
<
|
||||||
*quickfix-parse*
|
*quickfix-parse*
|
||||||
You can parse a list of lines using 'erroformat' without creating or modifying
|
You can parse a list of lines using 'errorformat' without creating or
|
||||||
a quickfix list using the |getqflist()| function. Examples: >
|
modifying a quickfix list using the |getqflist()| function. Examples: >
|
||||||
echo getqflist({'lines' : ["F1:10:Line10", "F2:20:Line20"]})
|
echo getqflist({'lines' : ["F1:10:Line10", "F2:20:Line20"]})
|
||||||
echo getqflist({'lines' : systemlist('grep -Hn quickfix *')})
|
echo getqflist({'lines' : systemlist('grep -Hn quickfix *')})
|
||||||
This returns a dictionary where the 'items' key contains the list of quickfix
|
This returns a dictionary where the 'items' key contains the list of quickfix
|
||||||
entries parsed from lines. The following shows how to use a custom
|
entries parsed from lines. The following shows how to use a custom
|
||||||
'errorformat' to parse the lines without modifying the 'erroformat' option: >
|
'errorformat' to parse the lines without modifying the 'errorformat' option: >
|
||||||
echo getqflist({'efm' : '%f#%l#%m', 'lines' : ['F1#10#Line']})
|
echo getqflist({'efm' : '%f#%l#%m', 'lines' : ['F1#10#Line']})
|
||||||
<
|
<
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*repeat.txt* For Vim version 8.0. Last change: 2017 Jun 10
|
*repeat.txt* For Vim version 8.0. Last change: 2017 Dec 17
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -242,6 +242,10 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
|
|||||||
If the directory pack/*/opt/{name}/after exists it is
|
If the directory pack/*/opt/{name}/after exists it is
|
||||||
added at the end of 'runtimepath'.
|
added at the end of 'runtimepath'.
|
||||||
|
|
||||||
|
If loading packages from "pack/*/start" was skipped,
|
||||||
|
then this directory is searched first:
|
||||||
|
pack/*/start/{name} ~
|
||||||
|
|
||||||
Note that {name} is the directory name, not the name
|
Note that {name} is the directory name, not the name
|
||||||
of the .vim file. All the files matching the pattern
|
of the .vim file. All the files matching the pattern
|
||||||
pack/*/opt/{name}/plugin/**/*.vim ~
|
pack/*/opt/{name}/plugin/**/*.vim ~
|
||||||
|
@ -4820,6 +4820,7 @@ TermResponse autocmd.txt /*TermResponse*
|
|||||||
Terminal-mode terminal.txt /*Terminal-mode*
|
Terminal-mode terminal.txt /*Terminal-mode*
|
||||||
TextChanged autocmd.txt /*TextChanged*
|
TextChanged autocmd.txt /*TextChanged*
|
||||||
TextChangedI autocmd.txt /*TextChangedI*
|
TextChangedI autocmd.txt /*TextChangedI*
|
||||||
|
TextYankPost autocmd.txt /*TextYankPost*
|
||||||
Transact-SQL ft_sql.txt /*Transact-SQL*
|
Transact-SQL ft_sql.txt /*Transact-SQL*
|
||||||
U undo.txt /*U*
|
U undo.txt /*U*
|
||||||
UTF-8 mbyte.txt /*UTF-8*
|
UTF-8 mbyte.txt /*UTF-8*
|
||||||
@ -5869,6 +5870,7 @@ eval() eval.txt /*eval()*
|
|||||||
eval-examples eval.txt /*eval-examples*
|
eval-examples eval.txt /*eval-examples*
|
||||||
eval-sandbox eval.txt /*eval-sandbox*
|
eval-sandbox eval.txt /*eval-sandbox*
|
||||||
eval.txt eval.txt /*eval.txt*
|
eval.txt eval.txt /*eval.txt*
|
||||||
|
event-variable eval.txt /*event-variable*
|
||||||
eventhandler() eval.txt /*eventhandler()*
|
eventhandler() eval.txt /*eventhandler()*
|
||||||
eview starting.txt /*eview*
|
eview starting.txt /*eview*
|
||||||
evim starting.txt /*evim*
|
evim starting.txt /*evim*
|
||||||
@ -6230,6 +6232,7 @@ ft-vb-syntax syntax.txt /*ft-vb-syntax*
|
|||||||
ft-verilog-indent indent.txt /*ft-verilog-indent*
|
ft-verilog-indent indent.txt /*ft-verilog-indent*
|
||||||
ft-vhdl-indent indent.txt /*ft-vhdl-indent*
|
ft-vhdl-indent indent.txt /*ft-vhdl-indent*
|
||||||
ft-vim-indent indent.txt /*ft-vim-indent*
|
ft-vim-indent indent.txt /*ft-vim-indent*
|
||||||
|
ft-vim-plugin filetype.txt /*ft-vim-plugin*
|
||||||
ft-vim-syntax syntax.txt /*ft-vim-syntax*
|
ft-vim-syntax syntax.txt /*ft-vim-syntax*
|
||||||
ft-xf86conf-syntax syntax.txt /*ft-xf86conf-syntax*
|
ft-xf86conf-syntax syntax.txt /*ft-xf86conf-syntax*
|
||||||
ft-xhtml-omni insert.txt /*ft-xhtml-omni*
|
ft-xhtml-omni insert.txt /*ft-xhtml-omni*
|
||||||
@ -6237,6 +6240,7 @@ ft-xml-omni insert.txt /*ft-xml-omni*
|
|||||||
ft-xml-syntax syntax.txt /*ft-xml-syntax*
|
ft-xml-syntax syntax.txt /*ft-xml-syntax*
|
||||||
ft-xpm-syntax syntax.txt /*ft-xpm-syntax*
|
ft-xpm-syntax syntax.txt /*ft-xpm-syntax*
|
||||||
ft-yaml-syntax syntax.txt /*ft-yaml-syntax*
|
ft-yaml-syntax syntax.txt /*ft-yaml-syntax*
|
||||||
|
ft-zimbu-plugin filetype.txt /*ft-zimbu-plugin*
|
||||||
ft-zsh-syntax syntax.txt /*ft-zsh-syntax*
|
ft-zsh-syntax syntax.txt /*ft-zsh-syntax*
|
||||||
ft_ada.txt ft_ada.txt /*ft_ada.txt*
|
ft_ada.txt ft_ada.txt /*ft_ada.txt*
|
||||||
ft_rust.txt ft_rust.txt /*ft_rust.txt*
|
ft_rust.txt ft_rust.txt /*ft_rust.txt*
|
||||||
@ -7826,6 +7830,8 @@ option-backslash options.txt /*option-backslash*
|
|||||||
option-list quickref.txt /*option-list*
|
option-list quickref.txt /*option-list*
|
||||||
option-summary options.txt /*option-summary*
|
option-summary options.txt /*option-summary*
|
||||||
option-window options.txt /*option-window*
|
option-window options.txt /*option-window*
|
||||||
|
option_restore() eval.txt /*option_restore()*
|
||||||
|
option_save() eval.txt /*option_save()*
|
||||||
options options.txt /*options*
|
options options.txt /*options*
|
||||||
options-changed version5.txt /*options-changed*
|
options-changed version5.txt /*options-changed*
|
||||||
options-in-terminal terminal.txt /*options-in-terminal*
|
options-in-terminal terminal.txt /*options-in-terminal*
|
||||||
@ -8058,14 +8064,19 @@ quake.vim syntax.txt /*quake.vim*
|
|||||||
quickfix quickfix.txt /*quickfix*
|
quickfix quickfix.txt /*quickfix*
|
||||||
quickfix-6 version6.txt /*quickfix-6*
|
quickfix-6 version6.txt /*quickfix-6*
|
||||||
quickfix-ID quickfix.txt /*quickfix-ID*
|
quickfix-ID quickfix.txt /*quickfix-ID*
|
||||||
|
quickfix-context quickfix.txt /*quickfix-context*
|
||||||
quickfix-directory-stack quickfix.txt /*quickfix-directory-stack*
|
quickfix-directory-stack quickfix.txt /*quickfix-directory-stack*
|
||||||
quickfix-error-lists quickfix.txt /*quickfix-error-lists*
|
quickfix-error-lists quickfix.txt /*quickfix-error-lists*
|
||||||
quickfix-functions usr_41.txt /*quickfix-functions*
|
quickfix-functions usr_41.txt /*quickfix-functions*
|
||||||
quickfix-gcc quickfix.txt /*quickfix-gcc*
|
quickfix-gcc quickfix.txt /*quickfix-gcc*
|
||||||
quickfix-manx quickfix.txt /*quickfix-manx*
|
quickfix-manx quickfix.txt /*quickfix-manx*
|
||||||
|
quickfix-parse quickfix.txt /*quickfix-parse*
|
||||||
quickfix-perl quickfix.txt /*quickfix-perl*
|
quickfix-perl quickfix.txt /*quickfix-perl*
|
||||||
|
quickfix-size quickfix.txt /*quickfix-size*
|
||||||
|
quickfix-title quickfix.txt /*quickfix-title*
|
||||||
quickfix-valid quickfix.txt /*quickfix-valid*
|
quickfix-valid quickfix.txt /*quickfix-valid*
|
||||||
quickfix-window quickfix.txt /*quickfix-window*
|
quickfix-window quickfix.txt /*quickfix-window*
|
||||||
|
quickfix-window-ID quickfix.txt /*quickfix-window-ID*
|
||||||
quickfix.txt quickfix.txt /*quickfix.txt*
|
quickfix.txt quickfix.txt /*quickfix.txt*
|
||||||
quickref quickref.txt /*quickref*
|
quickref quickref.txt /*quickref*
|
||||||
quickref.txt quickref.txt /*quickref.txt*
|
quickref.txt quickref.txt /*quickref.txt*
|
||||||
@ -9104,6 +9115,7 @@ v:ctype eval.txt /*v:ctype*
|
|||||||
v:dying eval.txt /*v:dying*
|
v:dying eval.txt /*v:dying*
|
||||||
v:errmsg eval.txt /*v:errmsg*
|
v:errmsg eval.txt /*v:errmsg*
|
||||||
v:errors eval.txt /*v:errors*
|
v:errors eval.txt /*v:errors*
|
||||||
|
v:event eval.txt /*v:event*
|
||||||
v:exception eval.txt /*v:exception*
|
v:exception eval.txt /*v:exception*
|
||||||
v:false eval.txt /*v:false*
|
v:false eval.txt /*v:false*
|
||||||
v:fcs_choice eval.txt /*v:fcs_choice*
|
v:fcs_choice eval.txt /*v:fcs_choice*
|
||||||
@ -9471,6 +9483,7 @@ win_getid() eval.txt /*win_getid()*
|
|||||||
win_gotoid() eval.txt /*win_gotoid()*
|
win_gotoid() eval.txt /*win_gotoid()*
|
||||||
win_id2tabwin() eval.txt /*win_id2tabwin()*
|
win_id2tabwin() eval.txt /*win_id2tabwin()*
|
||||||
win_id2win() eval.txt /*win_id2win()*
|
win_id2win() eval.txt /*win_id2win()*
|
||||||
|
win_screenpos() eval.txt /*win_screenpos()*
|
||||||
winbufnr() eval.txt /*winbufnr()*
|
winbufnr() eval.txt /*winbufnr()*
|
||||||
wincol() eval.txt /*wincol()*
|
wincol() eval.txt /*wincol()*
|
||||||
window windows.txt /*window*
|
window windows.txt /*window*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*terminal.txt* For Vim version 8.0. Last change: 2017 Nov 17
|
*terminal.txt* For Vim version 8.0. Last change: 2017 Dec 17
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -370,12 +370,14 @@ Starting ~
|
|||||||
Load the plugin with this command: >
|
Load the plugin with this command: >
|
||||||
packadd termdebug
|
packadd termdebug
|
||||||
< *:Termdebug*
|
< *:Termdebug*
|
||||||
To start debugging use `:TermDebug` folowed by the command name, for example: >
|
To start debugging use `:Termdebug` followed by the command name, for example: >
|
||||||
:Termdebug vim
|
:Termdebug vim
|
||||||
|
|
||||||
This opens two windows:
|
This opens two windows:
|
||||||
|
|
||||||
gdb window A terminal window in which "gdb vim" is executed. Here you
|
gdb window A terminal window in which "gdb vim" is executed. Here you
|
||||||
can directly interact with gdb. The buffer name is "!gdb".
|
can directly interact with gdb. The buffer name is "!gdb".
|
||||||
|
|
||||||
program window A terminal window for the executed program. When "run" is
|
program window A terminal window for the executed program. When "run" is
|
||||||
used in gdb the program I/O will happen in this window, so
|
used in gdb the program I/O will happen in this window, so
|
||||||
that it does not interfere with controlling gdb. The buffer
|
that it does not interfere with controlling gdb. The buffer
|
||||||
@ -476,14 +478,15 @@ In the window showing the source code these commands can used to control gdb:
|
|||||||
:Continue execute the gdb "continue" command
|
:Continue execute the gdb "continue" command
|
||||||
:Stop interrupt the program
|
:Stop interrupt the program
|
||||||
|
|
||||||
The plugin adds a window toolbar with these entries:
|
If 'mouse' is set the plugin adds a window toolbar with these entries:
|
||||||
Step :Step
|
Step :Step
|
||||||
Next :Over
|
Next :Over
|
||||||
Finish :Finish
|
Finish :Finish
|
||||||
Cont :Continue
|
Cont :Continue
|
||||||
Stop :Stop
|
Stop :Stop
|
||||||
Eval :Evaluate
|
Eval :Evaluate
|
||||||
This way you can use the mouse to perform the most common commands.
|
This way you can use the mouse to perform the most common commands. You need
|
||||||
|
to have the 'mouse' option set to enable mouse clicks.
|
||||||
|
|
||||||
|
|
||||||
Inspecting variables ~
|
Inspecting variables ~
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*todo.txt* For Vim version 8.0. Last change: 2017 Nov 29
|
*todo.txt* For Vim version 8.0. Last change: 2017 Dec 17
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -35,13 +35,6 @@ entered there will not be repeated below, unless there is extra information.
|
|||||||
*known-bugs*
|
*known-bugs*
|
||||||
-------------------- Known bugs and current work -----------------------
|
-------------------- Known bugs and current work -----------------------
|
||||||
|
|
||||||
Motif testgui:
|
|
||||||
From test_options.vim:
|
|
||||||
Found errors in Test_set_values():
|
|
||||||
Caught exception in Test_set_values(): Vim(set):E596: Invalid font(s): guifont=fixedsys @ /home/mool/vim/vim80/src/testdir/opt_test.vim, line 1153
|
|
||||||
|
|
||||||
WinBar: balloon shows up for next line
|
|
||||||
|
|
||||||
No maintainer for Vietnamese translations.
|
No maintainer for Vietnamese translations.
|
||||||
No maintainer for Simplified Chinese translations.
|
No maintainer for Simplified Chinese translations.
|
||||||
|
|
||||||
@ -147,9 +140,14 @@ Suggested by Hiroki Kokubun:
|
|||||||
- [Iceberg](https://github.com/cocopon/iceberg.vim) (my one)
|
- [Iceberg](https://github.com/cocopon/iceberg.vim) (my one)
|
||||||
- [hybrid](https://github.com/w0ng/vim-hybrid)
|
- [hybrid](https://github.com/w0ng/vim-hybrid)
|
||||||
Include solarized color scheme?, it does not support termguicolors.
|
Include solarized color scheme?, it does not support termguicolors.
|
||||||
-> Make check for colorscheme that it's sane.
|
|
||||||
- Sanitized version of pablo (Lifepillar, 2017 Nov 21)
|
- Sanitized version of pablo (Lifepillar, 2017 Nov 21)
|
||||||
|
|
||||||
|
heap use after free. (gy741, #2447)
|
||||||
|
heap use after free in set_bufref (gy741, #2448)
|
||||||
|
reproduces with valgrind (Dominique)
|
||||||
|
heap use after free in getout. (gy741, #2449)
|
||||||
|
reproduces with valgrind (Dominique)
|
||||||
|
|
||||||
Compiler warnings (geeknik, 2017 Oct 26):
|
Compiler warnings (geeknik, 2017 Oct 26):
|
||||||
- signed integer overflow in do_sub() (#2249)
|
- signed integer overflow in do_sub() (#2249)
|
||||||
- signed integer overflow in get_address() (#2248)
|
- signed integer overflow in get_address() (#2248)
|
||||||
@ -157,21 +155,10 @@ Compiler warnings (geeknik, 2017 Oct 26):
|
|||||||
- signed integer overflow in nfa_regatom() (#2251)
|
- signed integer overflow in nfa_regatom() (#2251)
|
||||||
- undefined left shift in get_string_tv() (#2250)
|
- undefined left shift in get_string_tv() (#2250)
|
||||||
|
|
||||||
patch for: fix SHIFT-Insert on Windows command prompt (Yasuhiro Matsumoto,
|
Triggering CursorHoldI happens too often in the GUI. (#2451).
|
||||||
#2381)
|
Should move code from os_unix.c mch_inchar() up into common use, it's not
|
||||||
|
really machine specific. Also the part of WaitForChar(), it deals with timers
|
||||||
Patch for profile log truncating halfway a character. (ichizok, 2017 Nov 28,
|
and is also for all machines.
|
||||||
#2385)
|
|
||||||
|
|
||||||
WinBar: Maximizing window causes window size to be wrong. (Lifepillar, 2017
|
|
||||||
Nov 29, #2356)
|
|
||||||
|
|
||||||
CTRL-A does not work with empty line. (Alex, #2387)
|
|
||||||
Patch by Hirohito Higashi, 2017 Nov 29.
|
|
||||||
|
|
||||||
'hlsearch' shows empty matches, which means highlighting everything.
|
|
||||||
Don't do that. For "foo\|" or "\v"
|
|
||||||
Patch from Christian, 2017 Nov 14. Should still display "$" matches.
|
|
||||||
|
|
||||||
When starting with --clean packages under "start" are not loaded. Make this
|
When starting with --clean packages under "start" are not loaded. Make this
|
||||||
work: :packadd START {name} similar to :runtime START name
|
work: :packadd START {name} similar to :runtime START name
|
||||||
@ -179,6 +166,18 @@ work: :packadd START {name} similar to :runtime START name
|
|||||||
When using :packadd files under "later" are not used, which is inconsistent
|
When using :packadd files under "later" are not used, which is inconsistent
|
||||||
with packages under "start". (xtal8, #1994)
|
with packages under "start". (xtal8, #1994)
|
||||||
|
|
||||||
|
Patch to add changedtick var to quickfix list. (Yegappan Lakshmanan, 2017 Nov
|
||||||
|
18, #2391)
|
||||||
|
|
||||||
|
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,
|
||||||
|
":watchlist" lists the items. (Charles Campbell)
|
||||||
|
Patch by Christian Brabandt, 2016 Jun 10, #859
|
||||||
|
|
||||||
|
7 Make "ga" show the digraph for a character, if it exists.
|
||||||
|
Patch from Christian Brabandt, 2011 Aug 19.
|
||||||
|
|
||||||
Fold at end of the buffer behaves inconsistently. (James McCoy, 2017 Oct 9)
|
Fold at end of the buffer behaves inconsistently. (James McCoy, 2017 Oct 9)
|
||||||
|
|
||||||
With foldmethod=syntax and nofoldenable comment highlighting isn't removed.
|
With foldmethod=syntax and nofoldenable comment highlighting isn't removed.
|
||||||
@ -191,12 +190,18 @@ Using 'wildignore' also applies to literally entered file name. Also with
|
|||||||
directory (Paulo Marcel Coelho Arabic, 2017 Oct 30, #2266)
|
directory (Paulo Marcel Coelho Arabic, 2017 Oct 30, #2266)
|
||||||
Also see #1689.
|
Also see #1689.
|
||||||
|
|
||||||
|
Patch for 24 bit color support in MS-Windows console, using vcon. (Nobuhiro
|
||||||
|
Takasaki, Ken Takata, 2017 Oct 1, #2060).
|
||||||
|
|
||||||
ml_get error when using a Python. (Yggdroot, 2017 Jun 1, #1737)
|
ml_get error when using a Python. (Yggdroot, 2017 Jun 1, #1737)
|
||||||
Lemonboy can reproduce (2017 Jun 5)
|
Lemonboy can reproduce (2017 Jun 5)
|
||||||
|
|
||||||
Patch to fix E806. (Dominique, 2017 Nov 22, #2368)
|
Patch to fix E806. (Dominique, 2017 Nov 22, #2368)
|
||||||
Kazunobu Kuriyama: caused by XtSetLanguageProc().
|
Kazunobu Kuriyama: caused by XtSetLanguageProc().
|
||||||
|
|
||||||
|
Patch to fix GUI find/replace dialog. (kiloliter, 2017 Dec 11, report in
|
||||||
|
#2418, fix in #2435)
|
||||||
|
|
||||||
Invalid range error when using BufWinLeave for closing terminal.
|
Invalid range error when using BufWinLeave for closing terminal.
|
||||||
(Gabriel Barta, 2017 Nov 15, #2339)
|
(Gabriel Barta, 2017 Nov 15, #2339)
|
||||||
|
|
||||||
@ -219,9 +224,8 @@ Koichi Iwamoto, #2126
|
|||||||
Patch to fix cmdline abbreviation after '<,'>. (Christian Brabandt, 2017 Nov
|
Patch to fix cmdline abbreviation after '<,'>. (Christian Brabandt, 2017 Nov
|
||||||
13, on issue #2320)
|
13, on issue #2320)
|
||||||
|
|
||||||
Patch to add TextDeletePost and TextYankPost events. (Philippe Vaucher, 2011
|
Patch for Neovim concerning restoring when closing help window. (glacambre
|
||||||
May 24) Update May 26.
|
neovim #7431)
|
||||||
Now in patch by Lemonboy, #2333
|
|
||||||
|
|
||||||
Default install on MS-Windows should source defaults.vim.
|
Default install on MS-Windows should source defaults.vim.
|
||||||
Ask whether to use Windows or Vim key behavior?
|
Ask whether to use Windows or Vim key behavior?
|
||||||
@ -238,7 +242,7 @@ matchit hasn't been maintained for a long time. #955.
|
|||||||
|
|
||||||
Problem with 'delcombine'. (agguser, 2017 Nov 10, #2313)
|
Problem with 'delcombine'. (agguser, 2017 Nov 10, #2313)
|
||||||
|
|
||||||
MS-Windows: buffer completetion doesn't work when using backslash (or slash)
|
MS-Windows: buffer completion doesn't work when using backslash (or slash)
|
||||||
for a path separator. (xtal8, #2201)
|
for a path separator. (xtal8, #2201)
|
||||||
|
|
||||||
Patch to adjust to DPI setting for GTK. (Roel van de Kraats, 2017 Nov 20,
|
Patch to adjust to DPI setting for GTK. (Roel van de Kraats, 2017 Nov 20,
|
||||||
@ -264,9 +268,6 @@ line breaks. (Ken Takata, 2017 Aug 22)
|
|||||||
|
|
||||||
The ":move" command does not honor closed folds. (Ryan Lue, #2351)
|
The ":move" command does not honor closed folds. (Ryan Lue, #2351)
|
||||||
|
|
||||||
Patch for 24 bit color support in MS-Windows console, using vcon. (Nobuhiro
|
|
||||||
Takasaki, Ken Takata, 2017 Oct 1, #2060).
|
|
||||||
|
|
||||||
Memory leaks in test_channel? (or is it because of fork())
|
Memory leaks in test_channel? (or is it because of fork())
|
||||||
Memory leak in test_arabic.
|
Memory leak in test_arabic.
|
||||||
Using uninitialized value in test_crypt.
|
Using uninitialized value in test_crypt.
|
||||||
@ -304,6 +305,9 @@ Alternatives for ~:
|
|||||||
|
|
||||||
The ++ options for the :edit command are also useful on the Vim command line.
|
The ++ options for the :edit command are also useful on the Vim command line.
|
||||||
|
|
||||||
|
When recovering a file, put the swap file name in b:recovered_swapfile. Then
|
||||||
|
a command can delete it.
|
||||||
|
|
||||||
Overlong utf-8 sequence is displayed wrong. (Harm te Hennepe, 2017 Sep 14,
|
Overlong utf-8 sequence is displayed wrong. (Harm te Hennepe, 2017 Sep 14,
|
||||||
#2089) Patch with possible solution by Björn Linse.
|
#2089) Patch with possible solution by Björn Linse.
|
||||||
|
|
||||||
@ -641,7 +645,7 @@ Probably list of keystrokes, with some annotations for mode changes.
|
|||||||
Could store in logfile to be able to analyse it with an external command.
|
Could store in logfile to be able to analyse it with an external command.
|
||||||
E.g. to see when's the last time a plugin command was used.
|
E.g. to see when's the last time a plugin command was used.
|
||||||
|
|
||||||
execute() cannot be used with command completeion. (Daniel Hahler, 2016 Oct 1,
|
execute() cannot be used with command completion. (Daniel Hahler, 2016 Oct 1,
|
||||||
#1141)
|
#1141)
|
||||||
|
|
||||||
cmap using execute() has side effects. (Killthemule, 2016 Aug 17, #983)
|
cmap using execute() has side effects. (Killthemule, 2016 Aug 17, #983)
|
||||||
@ -812,12 +816,6 @@ directory exists. (Sergio Gallelli, 2013 Dec 29)
|
|||||||
In debug mode one can inspect variables, but not the function parameters
|
In debug mode one can inspect variables, but not the function parameters
|
||||||
(starting with a:). (Luc Hermitte, 2017 Jan 4, #1352)
|
(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,
|
|
||||||
":watchlist" lists the items. (Charles Campbell)
|
|
||||||
Patch by Christian Brabandt, 2016 Jun 10, #859
|
|
||||||
|
|
||||||
If ":bd" also closes a Tab page then the " mark is not set. (Harm te Hennepe,
|
If ":bd" also closes a Tab page then the " mark is not set. (Harm te Hennepe,
|
||||||
2016 Apr 25, #780)
|
2016 Apr 25, #780)
|
||||||
|
|
||||||
@ -1248,13 +1246,6 @@ Patch to allow more types in remote_expr(). (Lech Lorens, 2014 Jan 5)
|
|||||||
Doesn't work for string in list. Other way to pass all types of variables
|
Doesn't work for string in list. Other way to pass all types of variables
|
||||||
reliably?
|
reliably?
|
||||||
|
|
||||||
Using ":call foo#d.f()" doesn't autoload the "foo.vim" file.
|
|
||||||
That is, calling a dictionary function on an autoloaded dict.
|
|
||||||
Works OK for echo, just not for ":call" and ":call call()". (Ted, 2011 Mar
|
|
||||||
17)
|
|
||||||
Patch by Christian Brabandt, 2013 Mar 23.
|
|
||||||
Not 100% sure this is the right solution.
|
|
||||||
|
|
||||||
Patch to add {lhs} to :mapclear: clear all maps starting with {lhs}.
|
Patch to add {lhs} to :mapclear: clear all maps starting with {lhs}.
|
||||||
(Christian Brabandt, 2013 Dec 9)
|
(Christian Brabandt, 2013 Dec 9)
|
||||||
|
|
||||||
@ -1523,9 +1514,6 @@ doesn't jump to the correct line with :cfirst. (ZyX, 2011 Sep 18)
|
|||||||
|
|
||||||
Behavior of i" and a" text objects isn't logical. (Ben Fritz, 2013 Nov 19)
|
Behavior of i" and a" text objects isn't logical. (Ben Fritz, 2013 Nov 19)
|
||||||
|
|
||||||
7 Make "ga" show the digraph for a character, if it exists.
|
|
||||||
Patch from Christian Brabandt, 2011 Aug 19.
|
|
||||||
|
|
||||||
maparg() does not show the <script> flag. When temporarily changing a
|
maparg() does not show the <script> flag. When temporarily changing a
|
||||||
mapping, how to restore the script ID?
|
mapping, how to restore the script ID?
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*usr_41.txt* For Vim version 8.0. Last change: 2017 Nov 19
|
*usr_41.txt* For Vim version 8.0. Last change: 2017 Dec 02
|
||||||
|
|
||||||
VIM USER MANUAL - by Bram Moolenaar
|
VIM USER MANUAL - by Bram Moolenaar
|
||||||
|
|
||||||
@ -902,6 +902,7 @@ Vim server: *server-functions*
|
|||||||
Window size and position: *window-size-functions*
|
Window size and position: *window-size-functions*
|
||||||
winheight() get height of a specific window
|
winheight() get height of a specific window
|
||||||
winwidth() get width of a specific window
|
winwidth() get width of a specific window
|
||||||
|
win_screenpos() get screen position of a window
|
||||||
winrestcmd() return command to restore window sizes
|
winrestcmd() return command to restore window sizes
|
||||||
winsaveview() get view of current window
|
winsaveview() get view of current window
|
||||||
winrestview() restore saved view of current window
|
winrestview() restore saved view of current window
|
||||||
|
@ -1925,6 +1925,9 @@ au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
|
|||||||
" Most of these should call s:StarSetf() to avoid names ending in .gz and the
|
" Most of these should call s:StarSetf() to avoid names ending in .gz and the
|
||||||
" like are used.
|
" like are used.
|
||||||
|
|
||||||
|
" More Apache style config files
|
||||||
|
au BufNewFile,BufRead */etc/proftpd/*.conf*,*/etc/proftpd/conf.*/* call s:StarSetf('apachestyle')
|
||||||
|
|
||||||
" More Apache config files
|
" More Apache config files
|
||||||
au BufNewFile,BufRead access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf* call s:StarSetf('apache')
|
au BufNewFile,BufRead access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf* call s:StarSetf('apache')
|
||||||
au BufNewFile,BufRead */etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf* call s:StarSetf('apache')
|
au BufNewFile,BufRead */etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf* call s:StarSetf('apache')
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: Vim
|
" Language: Vim
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2017 Nov 06
|
" Last Change: 2017 Dec 05
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
@ -39,21 +39,23 @@ endif
|
|||||||
" Comments start with a double quote
|
" Comments start with a double quote
|
||||||
setlocal commentstring=\"%s
|
setlocal commentstring=\"%s
|
||||||
|
|
||||||
" Move around functions.
|
if !exists("no_plugin_maps") && !exists("no_vim_maps")
|
||||||
nnoremap <silent><buffer> [[ m':call search('^\s*fu\%[nction]\>', "bW")<CR>
|
" Move around functions.
|
||||||
vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "bW")<CR>
|
nnoremap <silent><buffer> [[ m':call search('^\s*fu\%[nction]\>', "bW")<CR>
|
||||||
nnoremap <silent><buffer> ]] m':call search('^\s*fu\%[nction]\>', "W")<CR>
|
vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "bW")<CR>
|
||||||
vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "W")<CR>
|
nnoremap <silent><buffer> ]] m':call search('^\s*fu\%[nction]\>', "W")<CR>
|
||||||
nnoremap <silent><buffer> [] m':call search('^\s*endf*\%[unction]\>', "bW")<CR>
|
vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "W")<CR>
|
||||||
vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "bW")<CR>
|
nnoremap <silent><buffer> [] m':call search('^\s*endf*\%[unction]\>', "bW")<CR>
|
||||||
nnoremap <silent><buffer> ][ m':call search('^\s*endf*\%[unction]\>', "W")<CR>
|
vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "bW")<CR>
|
||||||
vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "W")<CR>
|
nnoremap <silent><buffer> ][ m':call search('^\s*endf*\%[unction]\>', "W")<CR>
|
||||||
|
vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "W")<CR>
|
||||||
|
|
||||||
" Move around comments
|
" Move around comments
|
||||||
nnoremap <silent><buffer> ]" :call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
|
nnoremap <silent><buffer> ]" :call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
|
||||||
vnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
|
vnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
|
||||||
nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
|
nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
|
||||||
vnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
|
vnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
|
||||||
|
endif
|
||||||
|
|
||||||
" Let the matchit plugin know what items can be matched.
|
" Let the matchit plugin know what items can be matched.
|
||||||
if exists("loaded_matchit")
|
if exists("loaded_matchit")
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Vim filetype plugin file
|
" Vim filetype plugin file
|
||||||
" Language: Zimbu
|
" Language: Zimbu
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2012 Sep 08
|
" Last Change: 2017 Dec 05
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
@ -135,8 +135,10 @@ iabbr <buffer> <expr> until GCUpperSpace("until")
|
|||||||
iabbr <buffer> <expr> while GCUpperSpace("while")
|
iabbr <buffer> <expr> while GCUpperSpace("while")
|
||||||
iabbr <buffer> <expr> repeat GCUpper("repeat")
|
iabbr <buffer> <expr> repeat GCUpper("repeat")
|
||||||
|
|
||||||
nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
|
if !exists("no_plugin_maps") && !exists("no_zimbu_maps")
|
||||||
nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
|
nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
|
||||||
|
nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
|
||||||
|
endif
|
||||||
|
|
||||||
" Using a function makes sure the search pattern is restored
|
" Using a function makes sure the search pattern is restored
|
||||||
func! ZimbuGoStartBlock()
|
func! ZimbuGoStartBlock()
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
" Language: Javascript
|
" Language: Javascript
|
||||||
" Maintainer: Chris Paul ( https://github.com/bounceme )
|
" Maintainer: Chris Paul ( https://github.com/bounceme )
|
||||||
" URL: https://github.com/pangloss/vim-javascript
|
" URL: https://github.com/pangloss/vim-javascript
|
||||||
" Last Change: September 18, 2017
|
" Last Change: December 4, 2017
|
||||||
|
|
||||||
" Only load this indent file when no other was loaded.
|
" Only load this indent file when no other was loaded.
|
||||||
if exists('b:did_indent')
|
if exists('b:did_indent')
|
||||||
@ -10,10 +10,6 @@ if exists('b:did_indent')
|
|||||||
endif
|
endif
|
||||||
let b:did_indent = 1
|
let b:did_indent = 1
|
||||||
|
|
||||||
" indent correctly if inside <script>
|
|
||||||
" vim/vim@690afe1 for the switch from cindent
|
|
||||||
let b:html_indent_script1 = 'inc'
|
|
||||||
|
|
||||||
" Now, set up our indentation expression and keys that trigger it.
|
" Now, set up our indentation expression and keys that trigger it.
|
||||||
setlocal indentexpr=GetJavascriptIndent()
|
setlocal indentexpr=GetJavascriptIndent()
|
||||||
setlocal autoindent nolisp nosmartindent
|
setlocal autoindent nolisp nosmartindent
|
||||||
@ -25,13 +21,6 @@ setlocal indentkeys+=0],0)
|
|||||||
|
|
||||||
let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<'
|
let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<'
|
||||||
|
|
||||||
" Regex of syntax group names that are or delimit string or are comments.
|
|
||||||
let b:syng_strcom = get(b:,'syng_strcom','string\|comment\|regex\|special\|doc\|template\%(braces\)\@!')
|
|
||||||
let b:syng_str = get(b:,'syng_str','string\|template\|special')
|
|
||||||
" template strings may want to be excluded when editing graphql:
|
|
||||||
" au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special'
|
|
||||||
" au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
|
|
||||||
|
|
||||||
" Only define the function once.
|
" Only define the function once.
|
||||||
if exists('*GetJavascriptIndent')
|
if exists('*GetJavascriptIndent')
|
||||||
finish
|
finish
|
||||||
@ -40,6 +29,23 @@ endif
|
|||||||
let s:cpo_save = &cpo
|
let s:cpo_save = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
|
" indent correctly if inside <script>
|
||||||
|
" vim/vim@690afe1 for the switch from cindent
|
||||||
|
" overridden with b:html_indent_script1
|
||||||
|
call extend(g:,{'html_indent_script1': 'inc'},'keep')
|
||||||
|
|
||||||
|
" Regex of syntax group names that are or delimit string or are comments.
|
||||||
|
let s:bvars = {
|
||||||
|
\ 'syng_strcom': 'string\|comment\|regex\|special\|doc\|template\%(braces\)\@!',
|
||||||
|
\ 'syng_str': 'string\|template\|special' }
|
||||||
|
" template strings may want to be excluded when editing graphql:
|
||||||
|
" au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special'
|
||||||
|
" au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
|
||||||
|
|
||||||
|
function s:GetVars()
|
||||||
|
call extend(b:,extend(s:bvars,{'js_cache': [0,0,0]}),'keep')
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Get shiftwidth value
|
" Get shiftwidth value
|
||||||
if exists('*shiftwidth')
|
if exists('*shiftwidth')
|
||||||
function s:sw()
|
function s:sw()
|
||||||
@ -104,21 +110,22 @@ endfunction
|
|||||||
function s:SkipFunc()
|
function s:SkipFunc()
|
||||||
if s:top_col == 1
|
if s:top_col == 1
|
||||||
throw 'out of bounds'
|
throw 'out of bounds'
|
||||||
endif
|
elseif s:check_in
|
||||||
let s:top_col = 0
|
|
||||||
if s:check_in
|
|
||||||
if eval(s:skip_expr)
|
if eval(s:skip_expr)
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
let s:check_in = 0
|
let s:check_in = 0
|
||||||
elseif getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$'
|
elseif getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$'
|
||||||
if eval(s:skip_expr)
|
if eval(s:skip_expr)
|
||||||
let s:looksyn = a:firstline
|
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn) && eval(s:skip_expr)
|
elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn)
|
||||||
let s:check_in = 1
|
if eval(s:skip_expr)
|
||||||
return 1
|
let s:check_in = 1
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let s:synid_cache[:] += [[line2byte('.') + col('.') - 1], ['']]
|
||||||
endif
|
endif
|
||||||
let [s:looksyn, s:top_col] = getpos('.')[1:2]
|
let [s:looksyn, s:top_col] = getpos('.')[1:2]
|
||||||
endfunction
|
endfunction
|
||||||
@ -159,19 +166,29 @@ function s:Token()
|
|||||||
return s:LookingAt() =~ '\k' ? expand('<cword>') : s:LookingAt()
|
return s:LookingAt() =~ '\k' ? expand('<cword>') : s:LookingAt()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function s:PreviousToken()
|
function s:PreviousToken(...)
|
||||||
let l:col = col('.')
|
let [l:pos, tok] = [getpos('.'), '']
|
||||||
if search('\m\k\{1,}\|\S','ebW')
|
if search('\m\k\{1,}\|\S','ebW')
|
||||||
if search('\m\*\%#\/\|\/\/\%<'.a:firstline.'l','nbW',line('.')) && eval(s:in_comm)
|
if getline('.')[col('.')-2:col('.')-1] == '*/'
|
||||||
if s:SearchLoop('\S\ze\_s*\/[/*]','bW',s:in_comm)
|
if eval(s:in_comm) && !s:SearchLoop('\S\ze\_s*\/[/*]','bW',s:in_comm)
|
||||||
return s:Token()
|
call setpos('.',l:pos)
|
||||||
|
else
|
||||||
|
let tok = s:Token()
|
||||||
endif
|
endif
|
||||||
call cursor(a:firstline, l:col)
|
|
||||||
else
|
else
|
||||||
return s:Token()
|
let two = a:0 || line('.') != l:pos[1] ? strridx(getline('.')[:col('.')],'//') + 1 : 0
|
||||||
|
if two && eval(s:in_comm)
|
||||||
|
call cursor(0,two)
|
||||||
|
let tok = s:PreviousToken(1)
|
||||||
|
if tok is ''
|
||||||
|
call setpos('.',l:pos)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let tok = s:Token()
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
return ''
|
return tok
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function s:Pure(f,...)
|
function s:Pure(f,...)
|
||||||
@ -183,23 +200,30 @@ function s:SearchLoop(pat,flags,expr)
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function s:ExprCol()
|
function s:ExprCol()
|
||||||
|
if getline('.')[col('.')-2] == ':'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
let bal = 0
|
let bal = 0
|
||||||
while s:SearchLoop('[{}?]\|\_[^:]\zs::\@!','bW',s:skip_expr)
|
while s:SearchLoop('[{}?:]','bW',s:skip_expr)
|
||||||
if s:LookingAt() == ':'
|
if s:LookingAt() == ':'
|
||||||
|
if getline('.')[col('.')-2] == ':'
|
||||||
|
call cursor(0,col('.')-1)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
let bal -= 1
|
let bal -= 1
|
||||||
elseif s:LookingAt() == '?'
|
elseif s:LookingAt() == '?'
|
||||||
let bal += 1
|
if getline('.')[col('.'):col('.')+1] =~ '^\.\d\@!'
|
||||||
if bal == 1
|
continue
|
||||||
break
|
elseif !bal
|
||||||
|
return 1
|
||||||
endif
|
endif
|
||||||
|
let bal += 1
|
||||||
elseif s:LookingAt() == '{'
|
elseif s:LookingAt() == '{'
|
||||||
let bal = !s:IsBlock()
|
return !s:IsBlock()
|
||||||
break
|
|
||||||
elseif !s:GetPair('{','}','bW',s:skip_expr)
|
elseif !s:GetPair('{','}','bW',s:skip_expr)
|
||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
endwhile
|
endwhile
|
||||||
return s:Nat(bal)
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" configurable regexes that define continuation lines, not including (, {, or [.
|
" configurable regexes that define continuation lines, not including (, {, or [.
|
||||||
@ -208,30 +232,29 @@ let s:opfirst = '^' . get(g:,'javascript_opfirst',
|
|||||||
let s:continuation = get(g:,'javascript_continuation',
|
let s:continuation = get(g:,'javascript_continuation',
|
||||||
\ '\C\%([<=,.~!?/*^%|&:]\|+\@<!+\|-\@<!-\|=\@<!>\|\<\%(typeof\|new\|delete\|void\|in\|instanceof\|await\)\)') . '$'
|
\ '\C\%([<=,.~!?/*^%|&:]\|+\@<!+\|-\@<!-\|=\@<!>\|\<\%(typeof\|new\|delete\|void\|in\|instanceof\|await\)\)') . '$'
|
||||||
|
|
||||||
function s:Continues(ln,con)
|
function s:Continues()
|
||||||
let tok = matchstr(a:con[-15:],s:continuation)
|
let tok = matchstr(strpart(getline('.'),col('.')-15,15),s:continuation)
|
||||||
if tok =~ '[a-z:]'
|
if tok =~ '[a-z:]'
|
||||||
call cursor(a:ln, len(a:con))
|
|
||||||
return tok == ':' ? s:ExprCol() : s:PreviousToken() != '.'
|
return tok == ':' ? s:ExprCol() : s:PreviousToken() != '.'
|
||||||
elseif tok !~ '[/>]'
|
elseif tok !~ '[/>]'
|
||||||
return tok isnot ''
|
return tok isnot ''
|
||||||
endif
|
endif
|
||||||
return s:SynAt(a:ln, len(a:con)) !~? (tok == '>' ? 'jsflow\|^html' : 'regex')
|
return s:SynAt(line('.'),col('.')) !~? (tok == '>' ? 'jsflow\|^html' : 'regex')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Check if line 'lnum' has a balanced amount of parentheses.
|
" Check if line 'lnum' has a balanced amount of parentheses.
|
||||||
function s:Balanced(lnum)
|
function s:Balanced(lnum,line)
|
||||||
let [l:open, l:line] = [0, getline(a:lnum)]
|
let l:open = 0
|
||||||
let pos = match(l:line, '[][(){}]')
|
let pos = match(a:line, '[][(){}]')
|
||||||
while pos != -1
|
while pos != -1
|
||||||
if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom
|
if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom
|
||||||
let l:open += match(' ' . l:line[pos],'[[({]')
|
let l:open += match(' ' . a:line[pos],'[[({]')
|
||||||
if l:open < 0
|
if l:open < 0
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
let pos = match(l:line, !l:open ? '[][(){}]' : '()' =~ l:line[pos] ?
|
let pos = match(a:line, !l:open ? '[][(){}]' : '()' =~ a:line[pos] ?
|
||||||
\ '[()]' : '{}' =~ l:line[pos] ? '[{}]' : '[][]', pos + 1)
|
\ '[()]' : '{}' =~ a:line[pos] ? '[{}]' : '[][]', pos + 1)
|
||||||
endwhile
|
endwhile
|
||||||
return !l:open
|
return !l:open
|
||||||
endfunction
|
endfunction
|
||||||
@ -244,27 +267,38 @@ function s:OneScope()
|
|||||||
\ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile())
|
\ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile())
|
||||||
elseif s:Token() =~# '^else$\|^do$'
|
elseif s:Token() =~# '^else$\|^do$'
|
||||||
return s:Pure('s:PreviousToken') != '.'
|
return s:Pure('s:PreviousToken') != '.'
|
||||||
|
elseif strpart(getline('.'),col('.')-2,2) == '=>'
|
||||||
|
call cursor(0,col('.')-1)
|
||||||
|
if s:PreviousToken() == ')'
|
||||||
|
return s:GetPair('(', ')', 'bW', s:skip_expr)
|
||||||
|
endif
|
||||||
|
return 1
|
||||||
endif
|
endif
|
||||||
return strpart(getline('.'),col('.')-2,2) == '=>'
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function s:DoWhile()
|
function s:DoWhile()
|
||||||
let cpos = searchpos('\m\<','cbW')
|
let cpos = searchpos('\m\<','cbW')
|
||||||
if s:SearchLoop('\C[{}]\|\<\%(do\|while\)\>','bW',s:skip_expr)
|
while s:SearchLoop('\C[{}]\|\<\%(do\|while\)\>','bW',s:skip_expr)
|
||||||
if s:{s:LookingAt() == '}' && s:GetPair('{','}','bW',s:skip_expr) ?
|
if s:LookingAt() =~ '\a'
|
||||||
\ 'Previous' : ''}Token() ==# 'do' && s:IsBlock()
|
if s:Pure('s:IsBlock')
|
||||||
return 1
|
if s:LookingAt() ==# 'd'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
elseif s:LookingAt() != '}' || !s:GetPair('{','}','bW',s:skip_expr)
|
||||||
|
break
|
||||||
endif
|
endif
|
||||||
call call('cursor',cpos)
|
endwhile
|
||||||
endif
|
call call('cursor',cpos)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" returns total offset from braceless contexts. 'num' is the lineNr which
|
" returns total offset from braceless contexts. 'num' is the lineNr which
|
||||||
" encloses the entire context, 'cont' if whether a:firstline is a continued
|
" encloses the entire context, 'cont' if whether a:firstline is a continued
|
||||||
" expression, which could have started in a braceless context
|
" expression, which could have started in a braceless context
|
||||||
function s:IsContOne(num,cont)
|
function s:IsContOne(cont)
|
||||||
let [l:num, b_l] = [a:num + !a:num, 0]
|
let [l:num, b_l] = [b:js_cache[1] + !b:js_cache[1], 0]
|
||||||
let pind = a:num ? indent(a:num) + s:sw() : 0
|
let pind = b:js_cache[1] ? indent(b:js_cache[1]) + s:sw() : 0
|
||||||
let ind = indent('.') + !a:cont
|
let ind = indent('.') + !a:cont
|
||||||
while line('.') > l:num && ind > pind || line('.') == l:num
|
while line('.') > l:num && ind > pind || line('.') == l:num
|
||||||
if indent('.') < ind && s:OneScope()
|
if indent('.') < ind && s:OneScope()
|
||||||
@ -282,20 +316,16 @@ function s:IsContOne(num,cont)
|
|||||||
return b_l
|
return b_l
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function s:Class()
|
|
||||||
return (s:Token() ==# 'class' || s:PreviousToken() =~# '^class$\|^extends$') &&
|
|
||||||
\ s:PreviousToken() != '.'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function s:IsSwitch()
|
function s:IsSwitch()
|
||||||
return s:PreviousToken() !~ '[.*]' &&
|
call call('cursor',b:js_cache[1:])
|
||||||
\ (!s:GetPair('{','}','cbW',s:skip_expr) || s:IsBlock() && !s:Class())
|
return search('\m\C\%#.\_s*\%(\%(\/\/.*\_$\|\/\*\_.\{-}\*\/\)\@>\_s*\)*\%(case\|default\)\>','nWc'.s:z)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
|
" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
|
||||||
function s:IsBlock()
|
function s:IsBlock()
|
||||||
let tok = s:PreviousToken()
|
let tok = s:PreviousToken()
|
||||||
if join(s:stack) =~? 'xml\|jsx' && s:SynAt(line('.'),col('.')-1) =~? 'xml\|jsx'
|
if join(s:stack) =~? 'xml\|jsx' && s:SynAt(line('.'),col('.')-1) =~? 'xml\|jsx'
|
||||||
|
let s:in_jsx = 1
|
||||||
return tok != '{'
|
return tok != '{'
|
||||||
elseif tok =~ '\k'
|
elseif tok =~ '\k'
|
||||||
if tok ==# 'type'
|
if tok ==# 'type'
|
||||||
@ -320,7 +350,7 @@ function s:IsBlock()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function GetJavascriptIndent()
|
function GetJavascriptIndent()
|
||||||
let b:js_cache = get(b:,'js_cache',[0,0,0])
|
call s:GetVars()
|
||||||
let s:synid_cache = [[],[]]
|
let s:synid_cache = [[],[]]
|
||||||
let l:line = getline(v:lnum)
|
let l:line = getline(v:lnum)
|
||||||
" use synstack as it validates syn state and works in an empty line
|
" use synstack as it validates syn state and works in an empty line
|
||||||
@ -334,7 +364,7 @@ function GetJavascriptIndent()
|
|||||||
return -1
|
return -1
|
||||||
endif
|
endif
|
||||||
elseif s:stack[-1] =~? b:syng_str
|
elseif s:stack[-1] =~? b:syng_str
|
||||||
if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1)
|
if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1,getline(v:lnum-1))
|
||||||
let b:js_cache[0] = v:lnum
|
let b:js_cache[0] = v:lnum
|
||||||
endif
|
endif
|
||||||
return -1
|
return -1
|
||||||
@ -361,7 +391,7 @@ function GetJavascriptIndent()
|
|||||||
call cursor(v:lnum,1)
|
call cursor(v:lnum,1)
|
||||||
let idx = index([']',')','}'],l:line[0])
|
let idx = index([']',')','}'],l:line[0])
|
||||||
if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum ||
|
if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum ||
|
||||||
\ b:js_cache[0] == l:lnum && s:Balanced(l:lnum)
|
\ b:js_cache[0] == l:lnum && s:Balanced(l:lnum,pline)
|
||||||
call call('cursor',b:js_cache[1:])
|
call call('cursor',b:js_cache[1:])
|
||||||
else
|
else
|
||||||
let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0,
|
let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0,
|
||||||
@ -382,10 +412,10 @@ function GetJavascriptIndent()
|
|||||||
|
|
||||||
let [b:js_cache[0], num] = [v:lnum, b:js_cache[1]]
|
let [b:js_cache[0], num] = [v:lnum, b:js_cache[1]]
|
||||||
|
|
||||||
let [num_ind, is_op, b_l, l:switch_offset] = [s:Nat(indent(num)),0,0,0]
|
let [num_ind, is_op, b_l, l:switch_offset, s:in_jsx] = [s:Nat(indent(num)),0,0,0,0]
|
||||||
if !num || s:LookingAt() == '{' && s:IsBlock()
|
if !num || s:LookingAt() == '{' && s:IsBlock()
|
||||||
let ilnum = line('.')
|
let ilnum = line('.')
|
||||||
if num && s:LookingAt() == ')' && s:GetPair('(',')','bW',s:skip_expr)
|
if num && !s:in_jsx && s:LookingAt() == ')' && s:GetPair('(',')','bW',s:skip_expr)
|
||||||
if ilnum == num
|
if ilnum == num
|
||||||
let [num, num_ind] = [line('.'), indent('.')]
|
let [num, num_ind] = [line('.'), indent('.')]
|
||||||
endif
|
endif
|
||||||
@ -399,23 +429,24 @@ function GetJavascriptIndent()
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
if idx == -1 && pline[-1:] !~ '[{;]'
|
if idx == -1 && pline[-1:] !~ '[{;]'
|
||||||
|
call cursor(l:lnum, len(pline))
|
||||||
let sol = matchstr(l:line,s:opfirst)
|
let sol = matchstr(l:line,s:opfirst)
|
||||||
if sol is '' || sol == '/' && s:SynAt(v:lnum,
|
if sol is '' || sol == '/' && s:SynAt(v:lnum,
|
||||||
\ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex'
|
\ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex'
|
||||||
if s:Continues(l:lnum,pline)
|
if s:Continues()
|
||||||
let is_op = s:sw()
|
let is_op = s:sw()
|
||||||
endif
|
endif
|
||||||
elseif num && sol =~# '^\%(in\%(stanceof\)\=\|\*\)$'
|
elseif num && sol =~# '^\%(in\%(stanceof\)\=\|\*\)$' &&
|
||||||
call call('cursor',b:js_cache[1:])
|
\ s:LookingAt() == '}' && s:GetPair('{','}','bW',s:skip_expr) &&
|
||||||
if s:PreviousToken() =~ '\k' && s:Class()
|
\ s:PreviousToken() == ')' && s:GetPair('(',')','bW',s:skip_expr) &&
|
||||||
return num_ind + s:sw()
|
\ (s:PreviousToken() == ']' || s:LookingAt() =~ '\k' &&
|
||||||
endif
|
\ s:{s:PreviousToken() == '*' ? 'Previous' : ''}Token() !=# 'function')
|
||||||
let is_op = s:sw()
|
return num_ind + s:sw()
|
||||||
else
|
else
|
||||||
let is_op = s:sw()
|
let is_op = s:sw()
|
||||||
endif
|
endif
|
||||||
call cursor(l:lnum, len(pline))
|
call cursor(l:lnum, len(pline))
|
||||||
let b_l = s:Nat(s:IsContOne(b:js_cache[1],is_op) - (!is_op && l:line =~ '^{')) * s:sw()
|
let b_l = s:Nat(s:IsContOne(is_op) - (!is_op && l:line =~ '^{')) * s:sw()
|
||||||
endif
|
endif
|
||||||
elseif idx.s:LookingAt().&cino =~ '^-1(.*(' && (search('\m\S','nbW',num) || s:ParseCino('U'))
|
elseif idx.s:LookingAt().&cino =~ '^-1(.*(' && (search('\m\S','nbW',num) || s:ParseCino('U'))
|
||||||
let pval = s:ParseCino('(')
|
let pval = s:ParseCino('(')
|
||||||
@ -431,10 +462,10 @@ function GetJavascriptIndent()
|
|||||||
|
|
||||||
" main return
|
" main return
|
||||||
if l:line =~ '^[])}]\|^|}'
|
if l:line =~ '^[])}]\|^|}'
|
||||||
if l:line_raw[0] == ')' && getline(num)[b:js_cache[2]-1] == '('
|
if l:line_raw[0] == ')'
|
||||||
if s:ParseCino('M')
|
if s:ParseCino('M')
|
||||||
return indent(l:lnum)
|
return indent(l:lnum)
|
||||||
elseif &cino =~# 'm' && !s:ParseCino('m')
|
elseif num && &cino =~# 'm' && !s:ParseCino('m')
|
||||||
return virtcol('.') - 1
|
return virtcol('.') - 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -216,7 +216,7 @@ func s:InstallCommands()
|
|||||||
" TODO: can the K mapping be restored?
|
" TODO: can the K mapping be restored?
|
||||||
nnoremap K :Evaluate<CR>
|
nnoremap K :Evaluate<CR>
|
||||||
|
|
||||||
if has('menu')
|
if has('menu') && &mouse != ''
|
||||||
nnoremenu WinBar.Step :Step<CR>
|
nnoremenu WinBar.Step :Step<CR>
|
||||||
nnoremenu WinBar.Next :Over<CR>
|
nnoremenu WinBar.Next :Over<CR>
|
||||||
nnoremenu WinBar.Finish :Finish<CR>
|
nnoremenu WinBar.Finish :Finish<CR>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: Apache-Style configuration files (proftpd.conf/apache.conf/..)
|
" Language: Apache-Style configuration files (proftpd.conf/apache.conf/..)
|
||||||
" Maintainer: Christian Hammers <ch@westend.com>
|
" Maintainer: Ben RUBSON <ben.rubson@gmail.com>
|
||||||
" URL: none
|
" Former Maintainer: Christian Hammers <ch@westend.com>
|
||||||
" ChangeLog:
|
" ChangeLog:
|
||||||
|
" 2017-12-17,ch
|
||||||
|
" correctly detect comments
|
||||||
" 2001-05-04,ch
|
" 2001-05-04,ch
|
||||||
" adopted Vim 6.0 syntax style
|
" adopted Vim 6.0 syntax style
|
||||||
" 1999-10-28,ch
|
" 1999-10-28,ch
|
||||||
@ -27,8 +29,8 @@ endif
|
|||||||
|
|
||||||
syn case ignore
|
syn case ignore
|
||||||
|
|
||||||
syn match apComment /^\s*#.*$/
|
|
||||||
syn match apOption /^\s*[^ \t#<=]*/
|
syn match apOption /^\s*[^ \t#<=]*/
|
||||||
|
syn match apComment /^\s*#.*$/
|
||||||
"syn match apLastValue /[^ \t<=#]*$/ contains=apComment ugly
|
"syn match apLastValue /[^ \t<=#]*$/ contains=apComment ugly
|
||||||
|
|
||||||
" tags
|
" tags
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: Haskell
|
" Language: Haskell
|
||||||
" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
|
" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
|
||||||
" Last Change: 2017 Jun 04
|
" Last Change: 2017 Dec 16
|
||||||
" Original Author: John Williams <jrw@pobox.com>
|
" Original Author: John Williams <jrw@pobox.com>
|
||||||
"
|
"
|
||||||
" Thanks to Ryan Crumley for suggestions and John Meacham for
|
" Thanks to Ryan Crumley for suggestions and John Meacham for
|
||||||
@ -59,8 +59,8 @@ syn match hsSpecialCharError contained "\\&\|'''\+"
|
|||||||
syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar
|
syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar
|
||||||
syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
|
syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
|
||||||
syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
|
syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
|
||||||
syn match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
|
syn match hsNumber "\v<[0-9]%(_*[0-9])*>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*>|<0[oO]_*%(_*[0-7])*>|<0[bB]_*[01]%(_*[01])*>"
|
||||||
syn match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
|
syn match hsFloat "\v<[0-9]%(_*[0-9])*\.[0-9]%(_*[0-9])*%(_*[eE][-+]?[0-9]%(_*[0-9])*)?>|<[0-9]%(_*[0-9])*_*[eE][-+]?[0-9]%(_*[0-9])*>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*\.[0-9a-fA-F]%(_*[0-9a-fA-F])*%(_*[pP][-+]?[0-9]%(_*[0-9])*)?>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*_*[pP][-+]?[0-9]%(_*[0-9])*>"
|
||||||
|
|
||||||
" Keyword definitions. These must be patterns instead of keywords
|
" Keyword definitions. These must be patterns instead of keywords
|
||||||
" because otherwise they would match as keywords at the start of a
|
" because otherwise they would match as keywords at the start of a
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
" Maintainer: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
|
" Maintainer: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
|
||||||
" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>
|
" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>
|
||||||
" Repository: https://notabug.org/jorgesumle/vim-html-syntax
|
" Repository: https://notabug.org/jorgesumle/vim-html-syntax
|
||||||
" Last Change: 2017 Sep 30
|
" Last Change: 2017 Dec 16
|
||||||
" included patch from Christian Brabandt to make use of the strikethrough attributes
|
" Included patch from Jorge Maldonado Ventura to add the dialog element
|
||||||
"
|
"
|
||||||
|
|
||||||
" Please check :help html.vim for some comments and a description of the options
|
" Please check :help html.vim for some comments and a description of the options
|
||||||
@ -100,11 +100,11 @@ syn keyword htmlArg contained summary tabindex valuetype version
|
|||||||
" html 5 arg names
|
" html 5 arg names
|
||||||
syn keyword htmlArg contained allowfullscreen async autocomplete autofocus
|
syn keyword htmlArg contained allowfullscreen async autocomplete autofocus
|
||||||
syn keyword htmlArg contained autoplay challenge contenteditable contextmenu
|
syn keyword htmlArg contained autoplay challenge contenteditable contextmenu
|
||||||
syn keyword htmlArg contained controls crossorigin default dirname download
|
syn keyword htmlArg contained controls crossorigin default dialog dirname
|
||||||
syn keyword htmlArg contained draggable dropzone form formaction formenctype
|
syn keyword htmlArg contained download draggable dropzone form formaction
|
||||||
syn keyword htmlArg contained formmethod formnovalidate formtarget hidden
|
syn keyword htmlArg contained formenctype formmethod formnovalidate formtarget
|
||||||
syn keyword htmlArg contained high icon inputmode keytype kind list loop low
|
syn keyword htmlArg contained hidden high icon inputmode keytype kind list loop
|
||||||
syn keyword htmlArg contained max min minlength muted nonce novalidate open
|
syn keyword htmlArg contained low max min minlength muted nonce novalidate open
|
||||||
syn keyword htmlArg contained optimum pattern placeholder poster preload
|
syn keyword htmlArg contained optimum pattern placeholder poster preload
|
||||||
syn keyword htmlArg contained radiogroup required reversed sandbox spellcheck
|
syn keyword htmlArg contained radiogroup required reversed sandbox spellcheck
|
||||||
syn keyword htmlArg contained sizes srcset srcdoc srclang step title translate
|
syn keyword htmlArg contained sizes srcset srcdoc srclang step title translate
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: TeX
|
" Language: TeX
|
||||||
" Maintainer: Charles E. Campbell <NdrchipO@ScampbellPfamily.AbizM>
|
" Maintainer: Charles E. Campbell <NdrchipO@ScampbellPfamily.AbizM>
|
||||||
" Last Change: Oct 12, 2017
|
" Last Change: Dec 11, 2017
|
||||||
" Version: 105
|
" Version: 107
|
||||||
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
|
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
|
||||||
"
|
"
|
||||||
" Notes: {{{1
|
" Notes: {{{1
|
||||||
@ -396,8 +396,8 @@ endif
|
|||||||
|
|
||||||
" Bad Math (mismatched): {{{1
|
" Bad Math (mismatched): {{{1
|
||||||
if !exists("g:tex_no_math") && !s:tex_no_error
|
if !exists("g:tex_no_math") && !s:tex_no_error
|
||||||
syn match texBadMath "\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
|
syn match texBadMath "\\end\s*{\s*\(array\|bBpvV]matrix\|split\|smallmatrix\)\s*}"
|
||||||
syn match texBadMath "\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
|
syn match texBadMath "\\end\s*{\s*\(displaymath\|equation\|eqnarray\|math\)\*\=\s*}"
|
||||||
syn match texBadMath "\\[\])]"
|
syn match texBadMath "\\[\])]"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -436,17 +436,10 @@ if !exists("g:tex_no_math")
|
|||||||
endfun
|
endfun
|
||||||
|
|
||||||
" Standard Math Zones: {{{2
|
" Standard Math Zones: {{{2
|
||||||
call TexNewMathZone("A","align",1)
|
call TexNewMathZone("A","displaymath",1)
|
||||||
call TexNewMathZone("B","alignat",1)
|
call TexNewMathZone("B","eqnarray",1)
|
||||||
call TexNewMathZone("C","displaymath",1)
|
call TexNewMathZone("C","equation",1)
|
||||||
call TexNewMathZone("D","eqnarray",1)
|
call TexNewMathZone("D","math",1)
|
||||||
call TexNewMathZone("E","equation",1)
|
|
||||||
call TexNewMathZone("F","flalign",1)
|
|
||||||
call TexNewMathZone("G","gather",1)
|
|
||||||
call TexNewMathZone("H","math",1)
|
|
||||||
call TexNewMathZone("I","multline",1)
|
|
||||||
call TexNewMathZone("J","xalignat",1)
|
|
||||||
call TexNewMathZone("K","xxalignat",0)
|
|
||||||
|
|
||||||
" Inline Math Zones: {{{2
|
" Inline Math Zones: {{{2
|
||||||
if s:tex_fast =~# 'M'
|
if s:tex_fast =~# 'M'
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: Vim 8.0 script
|
" Language: Vim 8.0 script
|
||||||
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
|
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
|
||||||
" Last Change: November 03, 2017
|
" Last Change: Dec 15, 2017
|
||||||
" Version: 8.0-04
|
" Version: 8.0-07
|
||||||
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
|
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
|
||||||
" Automatically generated keyword lists: {{{1
|
" Automatically generated keyword lists: {{{1
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ syn keyword vimFTOption contained detect indent off on plugin
|
|||||||
|
|
||||||
" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
|
" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
|
||||||
" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
|
" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
|
||||||
syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue
|
syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue,vimSetEqual,vimOption
|
||||||
if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
|
if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
|
||||||
syn region vimAugroup fold matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
|
syn region vimAugroup fold matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
|
||||||
else
|
else
|
||||||
@ -215,7 +215,8 @@ syn keyword vimAugroupKey contained aug[roup]
|
|||||||
" =========
|
" =========
|
||||||
syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimRegister,vimContinue
|
syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimRegister,vimContinue
|
||||||
syn match vimOper "\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
|
syn match vimOper "\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
|
||||||
syn match vimOper "||\|&&\|[-+.]" skipwhite nextgroup=vimString,vimSpecFile
|
syn match vimOper "\(\<is\>\|\<isnot\>\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
|
||||||
|
syn match vimOper "||\|&&\|[-+.]" skipwhite nextgroup=vimString,vimSpecFile
|
||||||
syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
|
syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
|
||||||
syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
|
syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
|
||||||
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
|
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
|
||||||
@ -559,7 +560,7 @@ syn match vimHiBang contained "!" skipwhite nextgroup=@vimHighlightCluster
|
|||||||
|
|
||||||
syn match vimHiGroup contained "\i\+"
|
syn match vimHiGroup contained "\i\+"
|
||||||
syn case ignore
|
syn case ignore
|
||||||
syn keyword vimHiAttrib contained none bold inverse italic reverse standout underline undercurl
|
syn keyword vimHiAttrib contained none bold inverse italic nocombine reverse standout strikethrough underline undercurl
|
||||||
syn keyword vimFgBgAttrib contained none bg background fg foreground
|
syn keyword vimFgBgAttrib contained none bg background fg foreground
|
||||||
syn case match
|
syn case match
|
||||||
syn match vimHiAttribList contained "\i\+" contains=vimHiAttrib
|
syn match vimHiAttribList contained "\i\+" contains=vimHiAttrib
|
||||||
|
2
src/auto/configure
vendored
2
src/auto/configure
vendored
@ -7514,7 +7514,7 @@ $as_echo "defaulting to no" >&6; }
|
|||||||
$as_echo "no" >&6; }
|
$as_echo "no" >&6; }
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if test "$enable_terminal" = "yes"; then
|
if test "$enable_terminal" = "yes" -a "$enable_channel" = "yes"; then
|
||||||
$as_echo "#define FEAT_TERMINAL 1" >>confdefs.h
|
$as_echo "#define FEAT_TERMINAL 1" >>confdefs.h
|
||||||
|
|
||||||
TERM_SRC="libvterm/src/encoding.c libvterm/src/keyboard.c libvterm/src/mouse.c libvterm/src/parser.c libvterm/src/pen.c libvterm/src/screen.c libvterm/src/state.c libvterm/src/unicode.c libvterm/src/vterm.c"
|
TERM_SRC="libvterm/src/encoding.c libvterm/src/keyboard.c libvterm/src/mouse.c libvterm/src/parser.c libvterm/src/pen.c libvterm/src/screen.c libvterm/src/state.c libvterm/src/unicode.c libvterm/src/vterm.c"
|
||||||
|
23
src/buffer.c
23
src/buffer.c
@ -1665,7 +1665,8 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
long old_tw = curbuf->b_p_tw;
|
long old_tw = curbuf->b_p_tw;
|
||||||
#endif
|
#endif
|
||||||
bufref_T bufref;
|
bufref_T newbufref;
|
||||||
|
bufref_T prevbufref;
|
||||||
|
|
||||||
setpcmark();
|
setpcmark();
|
||||||
if (!cmdmod.keepalt)
|
if (!cmdmod.keepalt)
|
||||||
@ -1675,18 +1676,22 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
/* Don't restart Select mode after switching to another buffer. */
|
/* Don't restart Select mode after switching to another buffer. */
|
||||||
VIsual_reselect = FALSE;
|
VIsual_reselect = FALSE;
|
||||||
|
|
||||||
/* close_windows() or apply_autocmds() may change curbuf */
|
/* close_windows() or apply_autocmds() may change curbuf and wipe out "buf"
|
||||||
|
*/
|
||||||
prevbuf = curbuf;
|
prevbuf = curbuf;
|
||||||
set_bufref(&bufref, prevbuf);
|
set_bufref(&prevbufref, prevbuf);
|
||||||
|
set_bufref(&newbufref, buf);
|
||||||
|
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
|
/* Autocommands may delete the curren buffer and/or the buffer we wan to go
|
||||||
|
* to. In those cases don't close the buffer. */
|
||||||
if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
|
if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
|
||||||
|
|| (bufref_valid(&prevbufref)
|
||||||
|
&& bufref_valid(&newbufref)
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
|| (bufref_valid(&bufref) && !aborting())
|
&& !aborting()
|
||||||
# else
|
|
||||||
|| bufref_valid(&bufref)
|
|
||||||
# endif
|
# endif
|
||||||
)
|
))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifdef FEAT_SYN_HL
|
#ifdef FEAT_SYN_HL
|
||||||
@ -1696,9 +1701,9 @@ set_curbuf(buf_T *buf, int action)
|
|||||||
if (unload)
|
if (unload)
|
||||||
close_windows(prevbuf, FALSE);
|
close_windows(prevbuf, FALSE);
|
||||||
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
||||||
if (bufref_valid(&bufref) && !aborting())
|
if (bufref_valid(&prevbufref) && !aborting())
|
||||||
#else
|
#else
|
||||||
if (bufref_valid(&bufref))
|
if (bufref_valid(&prevbufref))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
win_T *previouswin = curwin;
|
win_T *previouswin = curwin;
|
||||||
|
@ -2059,7 +2059,7 @@ else
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if test "$enable_terminal" = "yes"; then
|
if test "$enable_terminal" = "yes" -a "$enable_channel" = "yes"; then
|
||||||
AC_DEFINE(FEAT_TERMINAL)
|
AC_DEFINE(FEAT_TERMINAL)
|
||||||
TERM_SRC="libvterm/src/encoding.c libvterm/src/keyboard.c libvterm/src/mouse.c libvterm/src/parser.c libvterm/src/pen.c libvterm/src/screen.c libvterm/src/state.c libvterm/src/unicode.c libvterm/src/vterm.c"
|
TERM_SRC="libvterm/src/encoding.c libvterm/src/keyboard.c libvterm/src/mouse.c libvterm/src/parser.c libvterm/src/pen.c libvterm/src/screen.c libvterm/src/state.c libvterm/src/unicode.c libvterm/src/vterm.c"
|
||||||
AC_SUBST(TERM_SRC)
|
AC_SUBST(TERM_SRC)
|
||||||
|
36
src/dict.c
36
src/dict.c
@ -47,6 +47,16 @@ dict_alloc(void)
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dict_T *
|
||||||
|
dict_alloc_lock(int lock)
|
||||||
|
{
|
||||||
|
dict_T *d = dict_alloc();
|
||||||
|
|
||||||
|
if (d != NULL)
|
||||||
|
d->dv_lock = lock;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate an empty dict for a return value.
|
* Allocate an empty dict for a return value.
|
||||||
* Returns OK or FAIL.
|
* Returns OK or FAIL.
|
||||||
@ -54,13 +64,12 @@ dict_alloc(void)
|
|||||||
int
|
int
|
||||||
rettv_dict_alloc(typval_T *rettv)
|
rettv_dict_alloc(typval_T *rettv)
|
||||||
{
|
{
|
||||||
dict_T *d = dict_alloc();
|
dict_T *d = dict_alloc_lock(0);
|
||||||
|
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
rettv_dict_set(rettv, d);
|
rettv_dict_set(rettv, d);
|
||||||
rettv->v_lock = 0;
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +89,7 @@ rettv_dict_set(typval_T *rettv, dict_T *d)
|
|||||||
* Free a Dictionary, including all non-container items it contains.
|
* Free a Dictionary, including all non-container items it contains.
|
||||||
* Ignores the reference count.
|
* Ignores the reference count.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
dict_free_contents(dict_T *d)
|
dict_free_contents(dict_T *d)
|
||||||
{
|
{
|
||||||
int todo;
|
int todo;
|
||||||
@ -102,6 +111,8 @@ dict_free_contents(dict_T *d)
|
|||||||
--todo;
|
--todo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The hashtab is still locked, it has to be re-initialized anyway */
|
||||||
hash_clear(&d->dv_hashtab);
|
hash_clear(&d->dv_hashtab);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -846,4 +857,23 @@ dict_list(typval_T *argvars, typval_T *rettv, int what)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make each item in the dict readonly (not the value of the item).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dict_set_items_ro(dict_T *di)
|
||||||
|
{
|
||||||
|
int todo = (int)di->dv_hashtab.ht_used;
|
||||||
|
hashitem_T *hi;
|
||||||
|
|
||||||
|
/* Set readonly */
|
||||||
|
for (hi = di->dv_hashtab.ht_array; todo > 0 ; ++hi)
|
||||||
|
{
|
||||||
|
if (HASHITEM_EMPTY(hi))
|
||||||
|
continue;
|
||||||
|
--todo;
|
||||||
|
HI2DI(hi)->di_flags |= DI_FLAGS_RO | DI_FLAGS_FIX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* defined(FEAT_EVAL) */
|
#endif /* defined(FEAT_EVAL) */
|
||||||
|
28
src/eval.c
28
src/eval.c
@ -192,6 +192,7 @@ static struct vimvar
|
|||||||
{VV_NAME("termu7resp", VAR_STRING), VV_RO},
|
{VV_NAME("termu7resp", VAR_STRING), VV_RO},
|
||||||
{VV_NAME("termstyleresp", VAR_STRING), VV_RO},
|
{VV_NAME("termstyleresp", VAR_STRING), VV_RO},
|
||||||
{VV_NAME("termblinkresp", VAR_STRING), VV_RO},
|
{VV_NAME("termblinkresp", VAR_STRING), VV_RO},
|
||||||
|
{VV_NAME("event", VAR_DICT), VV_RO},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* shorthand */
|
/* shorthand */
|
||||||
@ -319,8 +320,9 @@ eval_init(void)
|
|||||||
|
|
||||||
set_vim_var_nr(VV_SEARCHFORWARD, 1L);
|
set_vim_var_nr(VV_SEARCHFORWARD, 1L);
|
||||||
set_vim_var_nr(VV_HLSEARCH, 1L);
|
set_vim_var_nr(VV_HLSEARCH, 1L);
|
||||||
set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
|
set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc_lock(VAR_FIXED));
|
||||||
set_vim_var_list(VV_ERRORS, list_alloc());
|
set_vim_var_list(VV_ERRORS, list_alloc());
|
||||||
|
set_vim_var_dict(VV_EVENT, dict_alloc_lock(VAR_FIXED));
|
||||||
|
|
||||||
set_vim_var_nr(VV_FALSE, VVAL_FALSE);
|
set_vim_var_nr(VV_FALSE, VVAL_FALSE);
|
||||||
set_vim_var_nr(VV_TRUE, VVAL_TRUE);
|
set_vim_var_nr(VV_TRUE, VVAL_TRUE);
|
||||||
@ -6632,6 +6634,16 @@ get_vim_var_list(int idx)
|
|||||||
return vimvars[idx].vv_list;
|
return vimvars[idx].vv_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get Dict v: variable value. Caller must take care of reference count when
|
||||||
|
* needed.
|
||||||
|
*/
|
||||||
|
dict_T *
|
||||||
|
get_vim_var_dict(int idx)
|
||||||
|
{
|
||||||
|
return vimvars[idx].vv_dict;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set v:char to character "c".
|
* Set v:char to character "c".
|
||||||
*/
|
*/
|
||||||
@ -6706,25 +6718,13 @@ set_vim_var_list(int idx, list_T *val)
|
|||||||
void
|
void
|
||||||
set_vim_var_dict(int idx, dict_T *val)
|
set_vim_var_dict(int idx, dict_T *val)
|
||||||
{
|
{
|
||||||
int todo;
|
|
||||||
hashitem_T *hi;
|
|
||||||
|
|
||||||
clear_tv(&vimvars[idx].vv_di.di_tv);
|
clear_tv(&vimvars[idx].vv_di.di_tv);
|
||||||
vimvars[idx].vv_type = VAR_DICT;
|
vimvars[idx].vv_type = VAR_DICT;
|
||||||
vimvars[idx].vv_dict = val;
|
vimvars[idx].vv_dict = val;
|
||||||
if (val != NULL)
|
if (val != NULL)
|
||||||
{
|
{
|
||||||
++val->dv_refcount;
|
++val->dv_refcount;
|
||||||
|
dict_set_items_ro(val);
|
||||||
/* Set readonly */
|
|
||||||
todo = (int)val->dv_hashtab.ht_used;
|
|
||||||
for (hi = val->dv_hashtab.ht_array; todo > 0 ; ++hi)
|
|
||||||
{
|
|
||||||
if (HASHITEM_EMPTY(hi))
|
|
||||||
continue;
|
|
||||||
--todo;
|
|
||||||
HI2DI(hi)->di_flags |= DI_FLAGS_RO | DI_FLAGS_FIX;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3747,18 +3747,31 @@ ex_packloadall(exarg_T *eap)
|
|||||||
void
|
void
|
||||||
ex_packadd(exarg_T *eap)
|
ex_packadd(exarg_T *eap)
|
||||||
{
|
{
|
||||||
static char *plugpat = "pack/*/opt/%s";
|
static char *plugpat = "pack/*/%s/%s";
|
||||||
int len;
|
int len;
|
||||||
char *pat;
|
char *pat;
|
||||||
|
int round;
|
||||||
|
int res = OK;
|
||||||
|
|
||||||
len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg);
|
/* Round 1: use "start", round 2: use "opt". */
|
||||||
pat = (char *)alloc(len);
|
for (round = 1; round <= 2; ++round)
|
||||||
if (pat == NULL)
|
{
|
||||||
return;
|
/* Only look under "start" when loading packages wasn't done yet. */
|
||||||
vim_snprintf(pat, len, plugpat, eap->arg);
|
if (round == 1 && did_source_packages)
|
||||||
do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR + DIP_ERR,
|
continue;
|
||||||
add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
|
|
||||||
vim_free(pat);
|
len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
|
||||||
|
pat = (char *)alloc(len);
|
||||||
|
if (pat == NULL)
|
||||||
|
return;
|
||||||
|
vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
|
||||||
|
/* The first round don't give a "not found" error, in the second round
|
||||||
|
* only when nothing was found in the first round. */
|
||||||
|
res = do_in_path(p_pp, (char_u *)pat,
|
||||||
|
DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
|
||||||
|
add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
|
||||||
|
vim_free(pat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
|
#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
|
||||||
|
@ -172,6 +172,24 @@ abandon_cmdline(void)
|
|||||||
redraw_cmdline = TRUE;
|
redraw_cmdline = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_SEARCH_EXTRA
|
||||||
|
/*
|
||||||
|
* Guess that the pattern matches everything. Only finds specific cases, such
|
||||||
|
* as a trailing \|, which can happen while typing a pattern.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
empty_pattern(char_u *p)
|
||||||
|
{
|
||||||
|
int n = STRLEN(p);
|
||||||
|
|
||||||
|
/* remove trailing \v and the like */
|
||||||
|
while (n >= 2 && p[n - 2] == '\\'
|
||||||
|
&& vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL)
|
||||||
|
n -= 2;
|
||||||
|
return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* getcmdline() - accept a command line starting with firstc.
|
* getcmdline() - accept a command line starting with firstc.
|
||||||
*
|
*
|
||||||
@ -1794,11 +1812,11 @@ getcmdline(
|
|||||||
# endif
|
# endif
|
||||||
old_botline = curwin->w_botline;
|
old_botline = curwin->w_botline;
|
||||||
update_screen(NOT_VALID);
|
update_screen(NOT_VALID);
|
||||||
restore_last_search_pattern();
|
|
||||||
redrawcmdline();
|
redrawcmdline();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
vim_beep(BO_ERROR);
|
vim_beep(BO_ERROR);
|
||||||
|
restore_last_search_pattern();
|
||||||
goto cmdline_not_changed;
|
goto cmdline_not_changed;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2023,6 +2041,11 @@ cmdline_changed:
|
|||||||
else
|
else
|
||||||
end_pos = curwin->w_cursor; /* shutup gcc 4 */
|
end_pos = curwin->w_cursor; /* shutup gcc 4 */
|
||||||
|
|
||||||
|
/* Disable 'hlsearch' highlighting if the pattern matches
|
||||||
|
* everything. Avoids a flash when typing "foo\|". */
|
||||||
|
if (empty_pattern(ccline.cmdbuff))
|
||||||
|
SET_NO_HLSEARCH(TRUE);
|
||||||
|
|
||||||
validate_cursor();
|
validate_cursor();
|
||||||
/* May redraw the status line to show the cursor position. */
|
/* May redraw the status line to show the cursor position. */
|
||||||
if (p_ru && curwin->w_status_height > 0)
|
if (p_ru && curwin->w_status_height > 0)
|
||||||
|
11
src/fileio.c
11
src/fileio.c
@ -6478,6 +6478,7 @@ buf_modname(
|
|||||||
/*
|
/*
|
||||||
* Like fgets(), but if the file line is too long, it is truncated and the
|
* Like fgets(), but if the file line is too long, it is truncated and the
|
||||||
* rest of the line is thrown away. Returns TRUE for end-of-file.
|
* rest of the line is thrown away. Returns TRUE for end-of-file.
|
||||||
|
* If the line is truncated then buf[size - 2] will not be NUL.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
vim_fgets(char_u *buf, int size, FILE *fp)
|
vim_fgets(char_u *buf, int size, FILE *fp)
|
||||||
@ -7856,6 +7857,7 @@ static struct event_name
|
|||||||
{"WinEnter", EVENT_WINENTER},
|
{"WinEnter", EVENT_WINENTER},
|
||||||
{"WinLeave", EVENT_WINLEAVE},
|
{"WinLeave", EVENT_WINLEAVE},
|
||||||
{"VimResized", EVENT_VIMRESIZED},
|
{"VimResized", EVENT_VIMRESIZED},
|
||||||
|
{"TextYankPost", EVENT_TEXTYANKPOST},
|
||||||
{NULL, (event_T)0}
|
{NULL, (event_T)0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -9399,6 +9401,15 @@ has_funcundefined(void)
|
|||||||
return (first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL);
|
return (first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE when there is a TextYankPost autocommand defined.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
has_textyankpost(void)
|
||||||
|
{
|
||||||
|
return (first_autopat[(int)EVENT_TEXTYANKPOST] != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Execute autocommands for "event" and file name "fname".
|
* Execute autocommands for "event" and file name "fname".
|
||||||
* Return TRUE if some commands were executed.
|
* Return TRUE if some commands were executed.
|
||||||
|
77
src/gui.c
77
src/gui.c
@ -1136,7 +1136,7 @@ gui_update_cursor(
|
|||||||
if (id > 0)
|
if (id > 0)
|
||||||
{
|
{
|
||||||
cattr = syn_id2colors(id, &cfg, &cbg);
|
cattr = syn_id2colors(id, &cfg, &cbg);
|
||||||
#if defined(FEAT_MBYTE) || defined(FEAT_HANGULIN)
|
#if defined(FEAT_XIM) || defined(FEAT_HANGULIN)
|
||||||
{
|
{
|
||||||
static int iid;
|
static int iid;
|
||||||
guicolor_T fg, bg;
|
guicolor_T fg, bg;
|
||||||
@ -2885,6 +2885,18 @@ gui_insert_lines(int row, int count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Passed to ui_wait_for_chars_or_timer(), ignoring extra arguments.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
gui_wait_for_chars_3(
|
||||||
|
long wtime,
|
||||||
|
int *interrupted UNUSED,
|
||||||
|
int ignore_input UNUSED)
|
||||||
|
{
|
||||||
|
return gui_mch_wait_for_chars(wtime);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns OK if a character was found to be available within the given time,
|
* Returns OK if a character was found to be available within the given time,
|
||||||
* or FAIL otherwise.
|
* or FAIL otherwise.
|
||||||
@ -2893,32 +2905,7 @@ gui_insert_lines(int row, int count)
|
|||||||
gui_wait_for_chars_or_timer(long wtime)
|
gui_wait_for_chars_or_timer(long wtime)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_TIMERS
|
#ifdef FEAT_TIMERS
|
||||||
int due_time;
|
return ui_wait_for_chars_or_timer(wtime, gui_wait_for_chars_3, NULL, 0);
|
||||||
long remaining = wtime;
|
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
|
||||||
|
|
||||||
/* When waiting very briefly don't trigger timers. */
|
|
||||||
if (wtime >= 0 && wtime < 10L)
|
|
||||||
return gui_mch_wait_for_chars(wtime);
|
|
||||||
|
|
||||||
while (wtime < 0 || remaining > 0)
|
|
||||||
{
|
|
||||||
/* Trigger timers and then get the time in wtime until the next one is
|
|
||||||
* due. Wait up to that time. */
|
|
||||||
due_time = check_due_timer();
|
|
||||||
if (typebuf.tb_change_cnt != tb_change_cnt)
|
|
||||||
{
|
|
||||||
/* timer may have used feedkeys() */
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
|
|
||||||
due_time = remaining;
|
|
||||||
if (gui_mch_wait_for_chars(due_time))
|
|
||||||
return OK;
|
|
||||||
if (wtime > 0)
|
|
||||||
remaining -= due_time;
|
|
||||||
}
|
|
||||||
return FAIL;
|
|
||||||
#else
|
#else
|
||||||
return gui_mch_wait_for_chars(wtime);
|
return gui_mch_wait_for_chars(wtime);
|
||||||
#endif
|
#endif
|
||||||
@ -2933,10 +2920,12 @@ gui_wait_for_chars_or_timer(long wtime)
|
|||||||
* or FAIL otherwise.
|
* or FAIL otherwise.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
gui_wait_for_chars(long wtime)
|
gui_wait_for_chars(long wtime, int tb_change_cnt)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
#if defined(ELAPSED_FUNC) && defined(FEAT_AUTOCMD)
|
||||||
|
ELAPSED_TYPE start_tv;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_MENU
|
#ifdef FEAT_MENU
|
||||||
/*
|
/*
|
||||||
@ -2966,6 +2955,10 @@ gui_wait_for_chars(long wtime)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ELAPSED_FUNC) && defined(FEAT_AUTOCMD)
|
||||||
|
ELAPSED_INIT(start_tv);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* While we are waiting indefinitely for a character, blink the cursor.
|
* While we are waiting indefinitely for a character, blink the cursor.
|
||||||
*/
|
*/
|
||||||
@ -2974,13 +2967,17 @@ gui_wait_for_chars(long wtime)
|
|||||||
retval = FAIL;
|
retval = FAIL;
|
||||||
/*
|
/*
|
||||||
* We may want to trigger the CursorHold event. First wait for
|
* We may want to trigger the CursorHold event. First wait for
|
||||||
* 'updatetime' and if nothing is typed within that time put the
|
* 'updatetime' and if nothing is typed within that time, and feedkeys()
|
||||||
* K_CURSORHOLD key in the input buffer.
|
* wasn't used, put the K_CURSORHOLD key in the input buffer.
|
||||||
*/
|
*/
|
||||||
if (gui_wait_for_chars_or_timer(p_ut) == OK)
|
if (gui_wait_for_chars_or_timer(p_ut) == OK)
|
||||||
retval = OK;
|
retval = OK;
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
else if (trigger_cursorhold())
|
else if (trigger_cursorhold()
|
||||||
|
# ifdef ELAPSED_FUNC
|
||||||
|
&& ELAPSED_FUNC(start_tv) >= p_ut
|
||||||
|
# endif
|
||||||
|
&& typebuf.tb_change_cnt == tb_change_cnt)
|
||||||
{
|
{
|
||||||
char_u buf[3];
|
char_u buf[3];
|
||||||
|
|
||||||
@ -3005,6 +3002,22 @@ gui_wait_for_chars(long wtime)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Equivalent of mch_inchar() for the GUI.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
gui_inchar(
|
||||||
|
char_u *buf,
|
||||||
|
int maxlen,
|
||||||
|
long wtime, /* milli seconds */
|
||||||
|
int tb_change_cnt)
|
||||||
|
{
|
||||||
|
if (gui_wait_for_chars(wtime, tb_change_cnt)
|
||||||
|
&& !typebuf_changed(tb_change_cnt))
|
||||||
|
return read_from_input_buf(buf, (long)maxlen);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill p[4] with mouse coordinates encoded for check_termcode().
|
* Fill p[4] with mouse coordinates encoded for check_termcode().
|
||||||
*/
|
*/
|
||||||
|
@ -619,7 +619,7 @@ vim_main2(void)
|
|||||||
# ifdef FEAT_SUN_WORKSHOP
|
# ifdef FEAT_SUN_WORKSHOP
|
||||||
if (!usingSunWorkShop)
|
if (!usingSunWorkShop)
|
||||||
# endif
|
# endif
|
||||||
gui_wait_for_chars(50L);
|
gui_wait_for_chars(50L, typebuf.tb_change_cnt);
|
||||||
TIME_MSG("GUI delay");
|
TIME_MSG("GUI delay");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1432,9 +1432,14 @@ getout(int exitval)
|
|||||||
buf = wp->w_buffer;
|
buf = wp->w_buffer;
|
||||||
if (CHANGEDTICK(buf) != -1)
|
if (CHANGEDTICK(buf) != -1)
|
||||||
{
|
{
|
||||||
|
bufref_T bufref;
|
||||||
|
|
||||||
|
set_bufref(&bufref, buf);
|
||||||
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
|
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
|
||||||
buf->b_fname, FALSE, buf);
|
buf->b_fname, FALSE, buf);
|
||||||
CHANGEDTICK(buf) = -1; /* note that we did it already */
|
if (bufref_valid(&bufref))
|
||||||
|
CHANGEDTICK(buf) = -1; /* note we did it already */
|
||||||
|
|
||||||
/* start all over, autocommands may mess up the lists */
|
/* start all over, autocommands may mess up the lists */
|
||||||
next_tp = first_tabpage;
|
next_tp = first_tabpage;
|
||||||
break;
|
break;
|
||||||
|
69
src/ops.c
69
src/ops.c
@ -1645,6 +1645,65 @@ shift_delete_registers()
|
|||||||
y_regs[1].y_array = NULL; /* set register one to empty */
|
y_regs[1].y_array = NULL; /* set register one to empty */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
static void
|
||||||
|
yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
|
||||||
|
{
|
||||||
|
static int recursive = FALSE;
|
||||||
|
dict_T *v_event;
|
||||||
|
list_T *list;
|
||||||
|
int n;
|
||||||
|
char_u buf[NUMBUFLEN + 2];
|
||||||
|
long reglen = 0;
|
||||||
|
|
||||||
|
if (recursive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
v_event = get_vim_var_dict(VV_EVENT);
|
||||||
|
|
||||||
|
list = list_alloc();
|
||||||
|
for (n = 0; n < reg->y_size; n++)
|
||||||
|
list_append_string(list, reg->y_array[n], -1);
|
||||||
|
list->lv_lock = VAR_FIXED;
|
||||||
|
dict_add_list(v_event, "regcontents", list);
|
||||||
|
|
||||||
|
buf[0] = (char_u)oap->regname;
|
||||||
|
buf[1] = NUL;
|
||||||
|
dict_add_nr_str(v_event, "regname", 0, buf);
|
||||||
|
|
||||||
|
buf[0] = get_op_char(oap->op_type);
|
||||||
|
buf[1] = get_extra_op_char(oap->op_type);
|
||||||
|
buf[2] = NUL;
|
||||||
|
dict_add_nr_str(v_event, "operator", 0, buf);
|
||||||
|
|
||||||
|
buf[0] = NUL;
|
||||||
|
buf[1] = NUL;
|
||||||
|
switch (get_reg_type(oap->regname, ®len))
|
||||||
|
{
|
||||||
|
case MLINE: buf[0] = 'V'; break;
|
||||||
|
case MCHAR: buf[0] = 'v'; break;
|
||||||
|
case MBLOCK:
|
||||||
|
vim_snprintf((char *)buf, sizeof(buf), "%c%ld", Ctrl_V,
|
||||||
|
reglen + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dict_add_nr_str(v_event, "regtype", 0, buf);
|
||||||
|
|
||||||
|
/* Lock the dictionary and its keys */
|
||||||
|
dict_set_items_ro(v_event);
|
||||||
|
|
||||||
|
recursive = TRUE;
|
||||||
|
textlock++;
|
||||||
|
apply_autocmds(EVENT_TEXTYANKPOST, NULL, NULL, FALSE, curbuf);
|
||||||
|
textlock--;
|
||||||
|
recursive = FALSE;
|
||||||
|
|
||||||
|
/* Empty the dictionary, v:event is still valid */
|
||||||
|
dict_free_contents(v_event);
|
||||||
|
hash_init(&v_event->dv_hashtab);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle a delete operation.
|
* Handle a delete operation.
|
||||||
*
|
*
|
||||||
@ -1798,6 +1857,11 @@ op_delete(oparg_T *oap)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
if (did_yank && has_textyankpost())
|
||||||
|
yank_do_autocmd(oap, y_current);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3270,6 +3334,11 @@ op_yank(oparg_T *oap, int deleting, int mess)
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
if (!deleting && has_textyankpost())
|
||||||
|
yank_do_autocmd(oap, y_current);
|
||||||
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
fail: /* free the allocated lines */
|
fail: /* free the allocated lines */
|
||||||
|
@ -5790,36 +5790,8 @@ mch_breakcheck(int force)
|
|||||||
WaitForChar(long msec, int *interrupted, int ignore_input)
|
WaitForChar(long msec, int *interrupted, int ignore_input)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_TIMERS
|
#ifdef FEAT_TIMERS
|
||||||
long due_time;
|
return ui_wait_for_chars_or_timer(
|
||||||
long remaining = msec;
|
msec, WaitForCharOrMouse, interrupted, ignore_input) == OK;
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
|
||||||
|
|
||||||
/* When waiting very briefly don't trigger timers. */
|
|
||||||
if (msec >= 0 && msec < 10L)
|
|
||||||
return WaitForCharOrMouse(msec, NULL, ignore_input);
|
|
||||||
|
|
||||||
while (msec < 0 || remaining > 0)
|
|
||||||
{
|
|
||||||
/* Trigger timers and then get the time in msec until the next one is
|
|
||||||
* due. Wait up to that time. */
|
|
||||||
due_time = check_due_timer();
|
|
||||||
if (typebuf.tb_change_cnt != tb_change_cnt)
|
|
||||||
{
|
|
||||||
/* timer may have used feedkeys() */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (due_time <= 0 || (msec > 0 && due_time > remaining))
|
|
||||||
due_time = remaining;
|
|
||||||
if (WaitForCharOrMouse(due_time, interrupted, ignore_input))
|
|
||||||
return TRUE;
|
|
||||||
if (interrupted != NULL && *interrupted)
|
|
||||||
/* Nothing available, but need to return so that side effects get
|
|
||||||
* handled, such as handling a message on a channel. */
|
|
||||||
return FALSE;
|
|
||||||
if (msec > 0)
|
|
||||||
remaining -= due_time;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
#else
|
#else
|
||||||
return WaitForCharOrMouse(msec, interrupted, ignore_input);
|
return WaitForCharOrMouse(msec, interrupted, ignore_input);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
/* dict.c */
|
/* dict.c */
|
||||||
dict_T *dict_alloc(void);
|
dict_T *dict_alloc(void);
|
||||||
|
dict_T *dict_alloc_lock(int lock);
|
||||||
int rettv_dict_alloc(typval_T *rettv);
|
int rettv_dict_alloc(typval_T *rettv);
|
||||||
void rettv_dict_set(typval_T *rettv, dict_T *d);
|
void rettv_dict_set(typval_T *rettv, dict_T *d);
|
||||||
|
void dict_free_contents(dict_T *d);
|
||||||
void dict_unref(dict_T *d);
|
void dict_unref(dict_T *d);
|
||||||
int dict_free_nonref(int copyID);
|
int dict_free_nonref(int copyID);
|
||||||
void dict_free_items(int copyID);
|
void dict_free_items(int copyID);
|
||||||
@ -23,4 +25,5 @@ void dict_extend(dict_T *d1, dict_T *d2, char_u *action);
|
|||||||
dictitem_T *dict_lookup(hashitem_T *hi);
|
dictitem_T *dict_lookup(hashitem_T *hi);
|
||||||
int dict_equal(dict_T *d1, dict_T *d2, int ic, int recursive);
|
int dict_equal(dict_T *d1, dict_T *d2, int ic, int recursive);
|
||||||
void dict_list(typval_T *argvars, typval_T *rettv, int what);
|
void dict_list(typval_T *argvars, typval_T *rettv, int what);
|
||||||
|
void dict_set_items_ro(dict_T *di);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
@ -64,6 +64,7 @@ void set_vim_var_nr(int idx, varnumber_T val);
|
|||||||
varnumber_T get_vim_var_nr(int idx);
|
varnumber_T get_vim_var_nr(int idx);
|
||||||
char_u *get_vim_var_str(int idx);
|
char_u *get_vim_var_str(int idx);
|
||||||
list_T *get_vim_var_list(int idx);
|
list_T *get_vim_var_list(int idx);
|
||||||
|
dict_T * get_vim_var_dict(int idx);
|
||||||
void set_vim_var_char(int c);
|
void set_vim_var_char(int c);
|
||||||
void set_vcount(long count, long count1, int set_prevcount);
|
void set_vcount(long count, long count1, int set_prevcount);
|
||||||
void set_vim_var_string(int idx, char_u *val, int len);
|
void set_vim_var_string(int idx, char_u *val, int len);
|
||||||
|
@ -51,6 +51,7 @@ int has_textchangedI(void);
|
|||||||
int has_insertcharpre(void);
|
int has_insertcharpre(void);
|
||||||
int has_cmdundefined(void);
|
int has_cmdundefined(void);
|
||||||
int has_funcundefined(void);
|
int has_funcundefined(void);
|
||||||
|
int has_textyankpost(void);
|
||||||
void block_autocmds(void);
|
void block_autocmds(void);
|
||||||
void unblock_autocmds(void);
|
void unblock_autocmds(void);
|
||||||
int is_autocmd_blocked(void);
|
int is_autocmd_blocked(void);
|
||||||
|
@ -29,7 +29,8 @@ int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T b
|
|||||||
void gui_undraw_cursor(void);
|
void gui_undraw_cursor(void);
|
||||||
void gui_redraw(int x, int y, int w, int h);
|
void gui_redraw(int x, int y, int w, int h);
|
||||||
int gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
|
int gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
|
||||||
int gui_wait_for_chars(long wtime);
|
int gui_wait_for_chars(long wtime, int tb_change_cnt);
|
||||||
|
int gui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
||||||
void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);
|
void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);
|
||||||
int gui_xy2colrow(int x, int y, int *colp);
|
int gui_xy2colrow(int x, int y, int *colp);
|
||||||
void gui_menu_cb(vimmenu_T *menu);
|
void gui_menu_cb(vimmenu_T *menu);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
void ui_write(char_u *s, int len);
|
void ui_write(char_u *s, int len);
|
||||||
void ui_inchar_undo(char_u *s, int len);
|
void ui_inchar_undo(char_u *s, int len);
|
||||||
int ui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
int ui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
||||||
|
int ui_wait_for_chars_or_timer(long wtime, int (*wait_func)(long wtime, int *interrupted, int ignore_input), int *interrupted, int ignore_input);
|
||||||
int ui_char_avail(void);
|
int ui_char_avail(void);
|
||||||
void ui_delay(long msec, int ignoreinput);
|
void ui_delay(long msec, int ignoreinput);
|
||||||
void ui_suspend(void);
|
void ui_suspend(void);
|
||||||
|
@ -76,6 +76,7 @@ typedef struct qf_list_S
|
|||||||
int qf_multiline;
|
int qf_multiline;
|
||||||
int qf_multiignore;
|
int qf_multiignore;
|
||||||
int qf_multiscan;
|
int qf_multiscan;
|
||||||
|
long qf_changedtick;
|
||||||
} qf_list_T;
|
} qf_list_T;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1668,6 +1669,7 @@ copy_loclist(win_T *from, win_T *to)
|
|||||||
|
|
||||||
/* Assign a new ID for the location list */
|
/* Assign a new ID for the location list */
|
||||||
to_qfl->qf_id = ++last_qf_id;
|
to_qfl->qf_id = ++last_qf_id;
|
||||||
|
to_qfl->qf_changedtick = 0L;
|
||||||
|
|
||||||
/* When no valid entries are present in the list, qf_ptr points to
|
/* When no valid entries are present in the list, qf_ptr points to
|
||||||
* the first item in the list */
|
* the first item in the list */
|
||||||
@ -2965,6 +2967,7 @@ qf_free(qf_info_T *qi, int idx)
|
|||||||
free_tv(qfl->qf_ctx);
|
free_tv(qfl->qf_ctx);
|
||||||
qfl->qf_ctx = NULL;
|
qfl->qf_ctx = NULL;
|
||||||
qfl->qf_id = 0;
|
qfl->qf_id = 0;
|
||||||
|
qfl->qf_changedtick = 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3604,6 +3607,12 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last)
|
|||||||
KeyTyped = old_KeyTyped;
|
KeyTyped = old_KeyTyped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
qf_list_changed(qf_info_T *qi, int qf_idx)
|
||||||
|
{
|
||||||
|
qi->qf_lists[qf_idx].qf_changedtick++;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE when using ":vimgrep" for ":grep".
|
* Return TRUE when using ":vimgrep" for ":grep".
|
||||||
*/
|
*/
|
||||||
@ -3713,6 +3722,8 @@ ex_make(exarg_T *eap)
|
|||||||
*eap->cmdlinep, enc);
|
*eap->cmdlinep, enc);
|
||||||
if (wp != NULL)
|
if (wp != NULL)
|
||||||
qi = GET_LOC_LIST(wp);
|
qi = GET_LOC_LIST(wp);
|
||||||
|
if (res >= 0 && qi != NULL)
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
{
|
{
|
||||||
@ -4105,14 +4116,16 @@ ex_cfile(exarg_T *eap)
|
|||||||
*/
|
*/
|
||||||
res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
|
res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
|
||||||
&& eap->cmdidx != CMD_laddfile), *eap->cmdlinep, enc);
|
&& eap->cmdidx != CMD_laddfile), *eap->cmdlinep, enc);
|
||||||
|
if (wp != NULL)
|
||||||
|
qi = GET_LOC_LIST(wp);
|
||||||
|
if (res >= 0 && qi != NULL)
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
|
||||||
#endif
|
#endif
|
||||||
if (res > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile))
|
if (res > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile))
|
||||||
{
|
{
|
||||||
if (wp != NULL)
|
|
||||||
qi = GET_LOC_LIST(wp);
|
|
||||||
qf_jump(qi, 0, 0, eap->forceit); /* display first error */
|
qf_jump(qi, 0, 0, eap->forceit); /* display first error */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4469,6 +4482,7 @@ ex_vimgrep(exarg_T *eap)
|
|||||||
qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
|
qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
|
||||||
qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_start;
|
qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_start;
|
||||||
qi->qf_lists[qi->qf_curlist].qf_index = 1;
|
qi->qf_lists[qi->qf_curlist].qf_index = 1;
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
|
|
||||||
qf_update_buffer(qi, NULL);
|
qf_update_buffer(qi, NULL);
|
||||||
|
|
||||||
@ -4572,6 +4586,7 @@ load_dummy_buffer(
|
|||||||
bufref_T newbuf_to_wipe;
|
bufref_T newbuf_to_wipe;
|
||||||
int failed = TRUE;
|
int failed = TRUE;
|
||||||
aco_save_T aco;
|
aco_save_T aco;
|
||||||
|
int readfile_result;
|
||||||
|
|
||||||
/* Allocate a buffer without putting it in the buffer list. */
|
/* Allocate a buffer without putting it in the buffer list. */
|
||||||
newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
|
newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
|
||||||
@ -4585,6 +4600,9 @@ load_dummy_buffer(
|
|||||||
/* need to open the memfile before putting the buffer in a window */
|
/* need to open the memfile before putting the buffer in a window */
|
||||||
if (ml_open(newbuf) == OK)
|
if (ml_open(newbuf) == OK)
|
||||||
{
|
{
|
||||||
|
/* Make sure this buffer isn't wiped out by auto commands. */
|
||||||
|
++newbuf->b_locked;
|
||||||
|
|
||||||
/* set curwin/curbuf to buf and save a few things */
|
/* set curwin/curbuf to buf and save a few things */
|
||||||
aucmd_prepbuf(&aco, newbuf);
|
aucmd_prepbuf(&aco, newbuf);
|
||||||
|
|
||||||
@ -4599,9 +4617,11 @@ load_dummy_buffer(
|
|||||||
curbuf->b_flags &= ~BF_DUMMY;
|
curbuf->b_flags &= ~BF_DUMMY;
|
||||||
|
|
||||||
newbuf_to_wipe.br_buf = NULL;
|
newbuf_to_wipe.br_buf = NULL;
|
||||||
if (readfile(fname, NULL,
|
readfile_result = readfile(fname, NULL,
|
||||||
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
|
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
|
||||||
NULL, READ_NEW | READ_DUMMY) == OK
|
NULL, READ_NEW | READ_DUMMY);
|
||||||
|
--newbuf->b_locked;
|
||||||
|
if (readfile_result == OK
|
||||||
&& !got_int
|
&& !got_int
|
||||||
&& !(curbuf->b_flags & BF_NEW))
|
&& !(curbuf->b_flags & BF_NEW))
|
||||||
{
|
{
|
||||||
@ -4774,7 +4794,8 @@ enum {
|
|||||||
QF_GETLIST_ID = 0x20,
|
QF_GETLIST_ID = 0x20,
|
||||||
QF_GETLIST_IDX = 0x40,
|
QF_GETLIST_IDX = 0x40,
|
||||||
QF_GETLIST_SIZE = 0x80,
|
QF_GETLIST_SIZE = 0x80,
|
||||||
QF_GETLIST_ALL = 0xFF
|
QF_GETLIST_TICK = 0x100,
|
||||||
|
QF_GETLIST_ALL = 0x1FF
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4890,6 +4911,9 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
if (dict_find(what, (char_u *)"size", -1) != NULL)
|
if (dict_find(what, (char_u *)"size", -1) != NULL)
|
||||||
flags |= QF_GETLIST_SIZE;
|
flags |= QF_GETLIST_SIZE;
|
||||||
|
|
||||||
|
if (dict_find(what, (char_u *)"changedtick", -1) != NULL)
|
||||||
|
flags |= QF_GETLIST_TICK;
|
||||||
|
|
||||||
if (qi != NULL && qi->qf_listcount != 0)
|
if (qi != NULL && qi->qf_listcount != 0)
|
||||||
{
|
{
|
||||||
qf_idx = qi->qf_curlist; /* default is the current list */
|
qf_idx = qi->qf_curlist; /* default is the current list */
|
||||||
@ -4906,8 +4930,9 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
qf_idx = -1;
|
qf_idx = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((di->di_tv.v_type == VAR_STRING)
|
else if (di->di_tv.v_type == VAR_STRING
|
||||||
&& (STRCMP(di->di_tv.vval.v_string, "$") == 0))
|
&& di->di_tv.vval.v_string != NULL
|
||||||
|
&& STRCMP(di->di_tv.vval.v_string, "$") == 0)
|
||||||
/* Get the last quickfix list number */
|
/* Get the last quickfix list number */
|
||||||
qf_idx = qi->qf_listcount - 1;
|
qf_idx = qi->qf_listcount - 1;
|
||||||
else
|
else
|
||||||
@ -4957,6 +4982,8 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
status = dict_add_nr_str(retdict, "idx", 0L, NULL);
|
status = dict_add_nr_str(retdict, "idx", 0L, NULL);
|
||||||
if ((status == OK) && (flags & QF_GETLIST_SIZE))
|
if ((status == OK) && (flags & QF_GETLIST_SIZE))
|
||||||
status = dict_add_nr_str(retdict, "size", 0L, NULL);
|
status = dict_add_nr_str(retdict, "size", 0L, NULL);
|
||||||
|
if ((status == OK) && (flags & QF_GETLIST_TICK))
|
||||||
|
status = dict_add_nr_str(retdict, "changedtick", 0L, NULL);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -5029,6 +5056,10 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
status = dict_add_nr_str(retdict, "size",
|
status = dict_add_nr_str(retdict, "size",
|
||||||
qi->qf_lists[qf_idx].qf_count, NULL);
|
qi->qf_lists[qf_idx].qf_count, NULL);
|
||||||
|
|
||||||
|
if ((status == OK) && (flags & QF_GETLIST_TICK))
|
||||||
|
status = dict_add_nr_str(retdict, "changedtick",
|
||||||
|
qi->qf_lists[qf_idx].qf_changedtick, NULL);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5196,7 +5227,8 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
|
|||||||
newlist = FALSE; /* use the specified list */
|
newlist = FALSE; /* use the specified list */
|
||||||
}
|
}
|
||||||
else if (di->di_tv.v_type == VAR_STRING
|
else if (di->di_tv.v_type == VAR_STRING
|
||||||
&& STRCMP(di->di_tv.vval.v_string, "$") == 0)
|
&& di->di_tv.vval.v_string != NULL
|
||||||
|
&& STRCMP(di->di_tv.vval.v_string, "$") == 0)
|
||||||
{
|
{
|
||||||
if (qi->qf_listcount > 0)
|
if (qi->qf_listcount > 0)
|
||||||
qf_idx = qi->qf_listcount - 1;
|
qf_idx = qi->qf_listcount - 1;
|
||||||
@ -5298,6 +5330,9 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
|
|||||||
retval = OK;
|
retval = OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (retval == OK)
|
||||||
|
qf_list_changed(qi, qf_idx);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5401,7 +5436,11 @@ set_errorlist(
|
|||||||
else if (what != NULL)
|
else if (what != NULL)
|
||||||
retval = qf_set_properties(qi, what, action, title);
|
retval = qf_set_properties(qi, what, action, title);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
retval = qf_add_entries(qi, qi->qf_curlist, list, title, action);
|
retval = qf_add_entries(qi, qi->qf_curlist, list, title, action);
|
||||||
|
if (retval == OK)
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@ -5534,6 +5573,8 @@ ex_cbuffer(exarg_T *eap)
|
|||||||
&& eap->cmdidx != CMD_laddbuffer),
|
&& eap->cmdidx != CMD_laddbuffer),
|
||||||
eap->line1, eap->line2,
|
eap->line1, eap->line2,
|
||||||
qf_title, NULL);
|
qf_title, NULL);
|
||||||
|
if (res >= 0)
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
|
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
|
||||||
@ -5603,6 +5644,8 @@ ex_cexpr(exarg_T *eap)
|
|||||||
&& eap->cmdidx != CMD_laddexpr),
|
&& eap->cmdidx != CMD_laddexpr),
|
||||||
(linenr_T)0, (linenr_T)0, *eap->cmdlinep,
|
(linenr_T)0, (linenr_T)0, *eap->cmdlinep,
|
||||||
NULL);
|
NULL);
|
||||||
|
if (res >= 0)
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
|
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
|
||||||
@ -5823,6 +5866,7 @@ ex_helpgrep(exarg_T *eap)
|
|||||||
/* Darn, some plugin changed the value. */
|
/* Darn, some plugin changed the value. */
|
||||||
free_string_option(save_cpo);
|
free_string_option(save_cpo);
|
||||||
|
|
||||||
|
qf_list_changed(qi, qi->qf_curlist);
|
||||||
qf_update_buffer(qi, NULL);
|
qf_update_buffer(qi, NULL);
|
||||||
|
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
|
@ -2321,7 +2321,6 @@ nfa_regconcat(void)
|
|||||||
static int
|
static int
|
||||||
nfa_regbranch(void)
|
nfa_regbranch(void)
|
||||||
{
|
{
|
||||||
int ch;
|
|
||||||
int old_post_pos;
|
int old_post_pos;
|
||||||
|
|
||||||
old_post_pos = (int)(post_ptr - post_start);
|
old_post_pos = (int)(post_ptr - post_start);
|
||||||
@ -2330,11 +2329,13 @@ nfa_regbranch(void)
|
|||||||
if (nfa_regconcat() == FAIL)
|
if (nfa_regconcat() == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
ch = peekchr();
|
|
||||||
/* Try next concats */
|
/* Try next concats */
|
||||||
while (ch == Magic('&'))
|
while (peekchr() == Magic('&'))
|
||||||
{
|
{
|
||||||
skipchr();
|
skipchr();
|
||||||
|
/* if concat is empty do emit a node */
|
||||||
|
if (old_post_pos == (int)(post_ptr - post_start))
|
||||||
|
EMIT(NFA_EMPTY);
|
||||||
EMIT(NFA_NOPEN);
|
EMIT(NFA_NOPEN);
|
||||||
EMIT(NFA_PREV_ATOM_NO_WIDTH);
|
EMIT(NFA_PREV_ATOM_NO_WIDTH);
|
||||||
old_post_pos = (int)(post_ptr - post_start);
|
old_post_pos = (int)(post_ptr - post_start);
|
||||||
@ -2344,7 +2345,6 @@ nfa_regbranch(void)
|
|||||||
if (old_post_pos == (int)(post_ptr - post_start))
|
if (old_post_pos == (int)(post_ptr - post_start))
|
||||||
EMIT(NFA_EMPTY);
|
EMIT(NFA_EMPTY);
|
||||||
EMIT(NFA_CONCAT);
|
EMIT(NFA_CONCAT);
|
||||||
ch = peekchr();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if a branch is empty, emit one node for it */
|
/* if a branch is empty, emit one node for it */
|
||||||
|
@ -1130,7 +1130,7 @@ do_tags(exarg_T *eap UNUSED)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
msg_putchar('\n');
|
msg_putchar('\n');
|
||||||
sprintf((char *)IObuff, "%c%2d %2d %-15s %5ld ",
|
vim_snprintf((char *)IObuff, IOSIZE, "%c%2d %2d %-15s %5ld ",
|
||||||
i == tagstackidx ? '>' : ' ',
|
i == tagstackidx ? '>' : ' ',
|
||||||
i + 1,
|
i + 1,
|
||||||
tagstack[i].cur_match + 1,
|
tagstack[i].cur_match + 1,
|
||||||
|
@ -1124,3 +1124,57 @@ func Test_Filter_noshelltemp()
|
|||||||
let &shelltemp = shelltemp
|
let &shelltemp = shelltemp
|
||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_TextYankPost()
|
||||||
|
enew!
|
||||||
|
call setline(1, ['foo'])
|
||||||
|
|
||||||
|
let g:event = []
|
||||||
|
au TextYankPost * let g:event = copy(v:event)
|
||||||
|
|
||||||
|
call assert_equal({}, v:event)
|
||||||
|
call assert_fails('let v:event = {}', 'E46:')
|
||||||
|
call assert_fails('let v:event.mykey = 0', 'E742:')
|
||||||
|
|
||||||
|
norm "ayiw
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v'},
|
||||||
|
\g:event)
|
||||||
|
norm y_
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V'},
|
||||||
|
\g:event)
|
||||||
|
call feedkeys("\<C-V>y", 'x')
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161"},
|
||||||
|
\g:event)
|
||||||
|
norm "xciwbar
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v'},
|
||||||
|
\g:event)
|
||||||
|
norm "bdiw
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v'},
|
||||||
|
\g:event)
|
||||||
|
|
||||||
|
call assert_equal({}, v:event)
|
||||||
|
|
||||||
|
au! TextYankPost
|
||||||
|
unlet g:event
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_nocatch_wipe_all_buffers()
|
||||||
|
" Real nasty autocommand: wipe all buffers on any event.
|
||||||
|
au * * bwipe *
|
||||||
|
call assert_fails('next x', 'E93')
|
||||||
|
bwipe
|
||||||
|
au!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_nocatch_wipe_dummy_buffer()
|
||||||
|
" Nasty autocommand: wipe buffer on any event.
|
||||||
|
au * x bwipe
|
||||||
|
call assert_fails('lv½ /x', 'E480')
|
||||||
|
au!
|
||||||
|
endfunc
|
||||||
|
@ -45,6 +45,24 @@ func Test_packadd()
|
|||||||
call assert_fails("packadd", 'E471:')
|
call assert_fails("packadd", 'E471:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_packadd_start()
|
||||||
|
let plugdir = s:topdir . '/pack/mine/start/other'
|
||||||
|
call mkdir(plugdir . '/plugin', 'p')
|
||||||
|
set rtp&
|
||||||
|
let rtp = &rtp
|
||||||
|
filetype on
|
||||||
|
|
||||||
|
exe 'split ' . plugdir . '/plugin/test.vim'
|
||||||
|
call setline(1, 'let g:plugin_works = 24')
|
||||||
|
wq
|
||||||
|
|
||||||
|
packadd other
|
||||||
|
|
||||||
|
call assert_equal(24, g:plugin_works)
|
||||||
|
call assert_true(len(&rtp) > len(rtp))
|
||||||
|
call assert_true(&rtp =~ '/testdir/Xdir/pack/mine/start/other\($\|,\)')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_packadd_noload()
|
func Test_packadd_noload()
|
||||||
call mkdir(s:plugdir . '/plugin', 'p')
|
call mkdir(s:plugdir . '/plugin', 'p')
|
||||||
call mkdir(s:plugdir . '/syntax', 'p')
|
call mkdir(s:plugdir . '/syntax', 'p')
|
||||||
|
@ -1428,6 +1428,11 @@ func XquickfixSetListWithAct(cchar)
|
|||||||
call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
|
call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_setqflist_invalid_nr()
|
||||||
|
" The following command used to crash Vim
|
||||||
|
call setqflist([], ' ', {'nr' : $XXX_DOES_NOT_EXIST})
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_quickfix_set_list_with_act()
|
func Test_quickfix_set_list_with_act()
|
||||||
call XquickfixSetListWithAct('c')
|
call XquickfixSetListWithAct('c')
|
||||||
call XquickfixSetListWithAct('l')
|
call XquickfixSetListWithAct('l')
|
||||||
@ -2132,6 +2137,8 @@ func Test_Autocmd()
|
|||||||
|
|
||||||
call delete('Xtest')
|
call delete('Xtest')
|
||||||
call delete('Xempty')
|
call delete('Xempty')
|
||||||
|
au! QuickFixCmdPre
|
||||||
|
au! QuickFixCmdPost
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_Autocmd_Exception()
|
func Test_Autocmd_Exception()
|
||||||
@ -2896,7 +2903,8 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
call assert_equal(0, g:Xgetlist({'size' : 0}).size)
|
call assert_equal(0, g:Xgetlist({'size' : 0}).size)
|
||||||
call assert_equal('', g:Xgetlist({'title' : 0}).title)
|
call assert_equal('', g:Xgetlist({'title' : 0}).title)
|
||||||
call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
|
call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'all' : 0}))
|
call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick': 0}, g:Xgetlist({'all' : 0}))
|
||||||
|
|
||||||
" Empty quickfix list
|
" Empty quickfix list
|
||||||
Xexpr ""
|
Xexpr ""
|
||||||
@ -2908,6 +2916,7 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
call assert_equal(0, g:Xgetlist({'size' : 0}).size)
|
call assert_equal(0, g:Xgetlist({'size' : 0}).size)
|
||||||
call assert_notequal('', g:Xgetlist({'title' : 0}).title)
|
call assert_notequal('', g:Xgetlist({'title' : 0}).title)
|
||||||
call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
|
call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
|
||||||
|
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
|
||||||
let qfid = g:Xgetlist({'id' : 0}).id
|
let qfid = g:Xgetlist({'id' : 0}).id
|
||||||
call g:Xsetlist([], 'f')
|
call g:Xsetlist([], 'f')
|
||||||
@ -2921,7 +2930,8 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
|
call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
|
||||||
call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
|
call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
|
||||||
call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
|
call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
|
call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
|
||||||
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
|
||||||
|
|
||||||
" Non-existing quickfix list number
|
" Non-existing quickfix list number
|
||||||
call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
|
call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
|
||||||
@ -2932,10 +2942,78 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
|
call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
|
||||||
call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
|
call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
|
||||||
call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
|
call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
|
call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
|
||||||
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_getqflist()
|
func Test_getqflist()
|
||||||
call Xgetlist_empty_tests('c')
|
call Xgetlist_empty_tests('c')
|
||||||
call Xgetlist_empty_tests('l')
|
call Xgetlist_empty_tests('l')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_getqflist_invalid_nr()
|
||||||
|
" The following commands used to crash Vim
|
||||||
|
cexpr ""
|
||||||
|
call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
|
||||||
|
|
||||||
|
" Cleanup
|
||||||
|
call setqflist([], 'r')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Tests for the quickfix/location list changedtick
|
||||||
|
func Xqftick_tests(cchar)
|
||||||
|
call s:setup_commands(a:cchar)
|
||||||
|
|
||||||
|
call g:Xsetlist([], 'f')
|
||||||
|
|
||||||
|
Xexpr "F1:10:Line10"
|
||||||
|
let qfid = g:Xgetlist({'id' : 0}).id
|
||||||
|
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
Xaddexpr "F2:20:Line20\nF2:21:Line21"
|
||||||
|
call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
|
||||||
|
call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
|
||||||
|
call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([], 'a', {'title' : 'New Title'})
|
||||||
|
call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
|
||||||
|
enew!
|
||||||
|
call append(0, ["F5:50:L50", "F6:60:L60"])
|
||||||
|
Xaddbuffer
|
||||||
|
call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
enew!
|
||||||
|
|
||||||
|
call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
|
||||||
|
call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
|
||||||
|
\ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
|
||||||
|
call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
|
||||||
|
\ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
|
||||||
|
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
|
||||||
|
\ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
|
||||||
|
call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
|
||||||
|
call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
|
||||||
|
Xfile Xone
|
||||||
|
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
Xaddfile Xone
|
||||||
|
call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
|
||||||
|
" Test case for updating a non-current quickfix list
|
||||||
|
call g:Xsetlist([], 'f')
|
||||||
|
Xexpr "F1:1:L1"
|
||||||
|
Xexpr "F2:2:L2"
|
||||||
|
call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
|
||||||
|
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
|
call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
|
||||||
|
|
||||||
|
call delete("Xone")
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_qf_tick()
|
||||||
|
call Xqftick_tests('c')
|
||||||
|
call Xqftick_tests('l')
|
||||||
|
endfunc
|
||||||
|
@ -721,3 +721,11 @@ func Test_search_multibyte()
|
|||||||
enew!
|
enew!
|
||||||
let &encoding = save_enc
|
let &encoding = save_enc
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" This was causing E874. Also causes an invalid read?
|
||||||
|
func Test_look_behind()
|
||||||
|
new
|
||||||
|
call setline(1, '0\|\&\n\@<=')
|
||||||
|
call search(getline("."))
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
" test 'taglist' function
|
" test 'taglist' function and :tags command
|
||||||
|
|
||||||
func Test_taglist()
|
func Test_taglist()
|
||||||
call writefile([
|
call writefile([
|
||||||
@ -56,3 +56,8 @@ func Test_taglist_ctags_etags()
|
|||||||
|
|
||||||
call delete('Xtags')
|
call delete('Xtags')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_tags_too_long()
|
||||||
|
call assert_fails('tag ' . repeat('x', 1020), 'E426')
|
||||||
|
tags
|
||||||
|
endfunc
|
||||||
|
57
src/ui.c
57
src/ui.c
@ -32,7 +32,7 @@ ui_write(char_u *s, int len)
|
|||||||
{
|
{
|
||||||
gui_write(s, len);
|
gui_write(s, len);
|
||||||
if (p_wd)
|
if (p_wd)
|
||||||
gui_wait_for_chars(p_wd);
|
gui_wait_for_chars(p_wd, typebuf.tb_change_cnt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -182,18 +182,13 @@ ui_inchar(
|
|||||||
|
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
if (gui.in_use)
|
if (gui.in_use)
|
||||||
{
|
retval = gui_inchar(buf, maxlen, wtime, tb_change_cnt);
|
||||||
if (gui_wait_for_chars(wtime) && !typebuf_changed(tb_change_cnt))
|
|
||||||
retval = read_from_input_buf(buf, (long)maxlen);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_CONSOLE
|
#ifndef NO_CONSOLE
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
{
|
|
||||||
retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
|
retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (wtime == -1 || wtime > 100L)
|
if (wtime == -1 || wtime > 100L)
|
||||||
@ -212,6 +207,52 @@ theend:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_TIMERS) || defined(PROT)
|
||||||
|
/*
|
||||||
|
* Wait for a timer to fire or "wait_func" to return non-zero.
|
||||||
|
* Returns OK when something was read.
|
||||||
|
* Returns FAIL when it timed out or was interrupted.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ui_wait_for_chars_or_timer(
|
||||||
|
long wtime,
|
||||||
|
int (*wait_func)(long wtime, int *interrupted, int ignore_input),
|
||||||
|
int *interrupted,
|
||||||
|
int ignore_input)
|
||||||
|
{
|
||||||
|
int due_time;
|
||||||
|
long remaining = wtime;
|
||||||
|
int tb_change_cnt = typebuf.tb_change_cnt;
|
||||||
|
|
||||||
|
/* When waiting very briefly don't trigger timers. */
|
||||||
|
if (wtime >= 0 && wtime < 10L)
|
||||||
|
return wait_func(wtime, NULL, ignore_input);
|
||||||
|
|
||||||
|
while (wtime < 0 || remaining > 0)
|
||||||
|
{
|
||||||
|
/* Trigger timers and then get the time in wtime until the next one is
|
||||||
|
* due. Wait up to that time. */
|
||||||
|
due_time = check_due_timer();
|
||||||
|
if (typebuf.tb_change_cnt != tb_change_cnt)
|
||||||
|
{
|
||||||
|
/* timer may have used feedkeys() */
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
|
||||||
|
due_time = remaining;
|
||||||
|
if (wait_func(due_time, interrupted, ignore_input))
|
||||||
|
return OK;
|
||||||
|
if (interrupted != NULL && *interrupted)
|
||||||
|
/* Nothing available, but need to return so that side effects get
|
||||||
|
* handled, such as handling a message on a channel. */
|
||||||
|
return FALSE;
|
||||||
|
if (wtime > 0)
|
||||||
|
remaining -= due_time;
|
||||||
|
}
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return non-zero if a character is available
|
* return non-zero if a character is available
|
||||||
*/
|
*/
|
||||||
@ -245,7 +286,7 @@ ui_delay(long msec, int ignoreinput)
|
|||||||
{
|
{
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
if (gui.in_use && !ignoreinput)
|
if (gui.in_use && !ignoreinput)
|
||||||
gui_wait_for_chars(msec);
|
gui_wait_for_chars(msec, typebuf.tb_change_cnt);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
mch_delay(msec, ignoreinput);
|
mch_delay(msec, ignoreinput);
|
||||||
|
@ -771,6 +771,42 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1409,
|
||||||
|
/**/
|
||||||
|
1408,
|
||||||
|
/**/
|
||||||
|
1407,
|
||||||
|
/**/
|
||||||
|
1406,
|
||||||
|
/**/
|
||||||
|
1405,
|
||||||
|
/**/
|
||||||
|
1404,
|
||||||
|
/**/
|
||||||
|
1403,
|
||||||
|
/**/
|
||||||
|
1402,
|
||||||
|
/**/
|
||||||
|
1401,
|
||||||
|
/**/
|
||||||
|
1400,
|
||||||
|
/**/
|
||||||
|
1399,
|
||||||
|
/**/
|
||||||
|
1398,
|
||||||
|
/**/
|
||||||
|
1397,
|
||||||
|
/**/
|
||||||
|
1396,
|
||||||
|
/**/
|
||||||
|
1395,
|
||||||
|
/**/
|
||||||
|
1394,
|
||||||
|
/**/
|
||||||
|
1393,
|
||||||
|
/**/
|
||||||
|
1392,
|
||||||
/**/
|
/**/
|
||||||
1391,
|
1391,
|
||||||
/**/
|
/**/
|
||||||
|
@ -1339,6 +1339,7 @@ enum auto_event
|
|||||||
EVENT_TEXTCHANGEDI, /* text was modified in Insert mode*/
|
EVENT_TEXTCHANGEDI, /* text was modified in Insert mode*/
|
||||||
EVENT_CMDUNDEFINED, /* command undefined */
|
EVENT_CMDUNDEFINED, /* command undefined */
|
||||||
EVENT_OPTIONSET, /* option was set */
|
EVENT_OPTIONSET, /* option was set */
|
||||||
|
EVENT_TEXTYANKPOST, /* after some text was yanked */
|
||||||
NUM_EVENTS /* MUST be the last one */
|
NUM_EVENTS /* MUST be the last one */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1988,7 +1989,8 @@ typedef int sock_T;
|
|||||||
#define VV_TERMU7RESP 83
|
#define VV_TERMU7RESP 83
|
||||||
#define VV_TERMSTYLERESP 84
|
#define VV_TERMSTYLERESP 84
|
||||||
#define VV_TERMBLINKRESP 85
|
#define VV_TERMBLINKRESP 85
|
||||||
#define VV_LEN 86 /* number of v: vars */
|
#define VV_EVENT 86
|
||||||
|
#define VV_LEN 87 /* number of v: vars */
|
||||||
|
|
||||||
/* used for v_number in VAR_SPECIAL */
|
/* used for v_number in VAR_SPECIAL */
|
||||||
#define VVAL_FALSE 0L
|
#define VVAL_FALSE 0L
|
||||||
|
Reference in New Issue
Block a user