Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
968a5b62ff | ||
|
|
affd0bc626 | ||
|
|
caf1a2f296 | ||
|
|
3b814af7e1 | ||
|
|
47f6db9089 | ||
|
|
1b0a9dd413 | ||
|
|
26d711645c | ||
|
|
b69c6fb7b4 | ||
|
|
90478f35a8 | ||
|
|
2d6d718dde | ||
|
|
5ffefbb35a | ||
|
|
2346a63784 | ||
|
|
4ee9d8e04d | ||
|
|
e70e12b32f | ||
|
|
2e66b0d137 | ||
|
|
c2dec4cac4 | ||
|
|
c3a27bbd53 | ||
|
|
6d1792d408 | ||
|
|
d9f31c13d2 | ||
|
|
e99d422bbd | ||
|
|
e6174fd58d | ||
|
|
4a27aefe3b | ||
|
|
a993153538 | ||
|
|
7423577180 | ||
|
|
6654ca702c | ||
|
|
0b71955552 | ||
|
|
5958549760 | ||
|
|
744aecf877 | ||
|
|
22db0d549f | ||
|
|
8de901e1f1 | ||
|
|
f0a4069e3d |
@@ -4,6 +4,12 @@
|
||||
|
||||
<sub>For translations of this README see the end.</sub>
|
||||
|
||||
If you find a bug or want to discuss the best way to add a new feature, please
|
||||
open an [issue](https://github.com/vim/vim/issues).
|
||||
If you have a question or want to discuss the best way to do something with
|
||||
Vim, you can use [StackExchange](https://vi.stackexchange.com/)
|
||||
or one of the [Maillists](https://www.vim.org/community.php).
|
||||
|
||||
|
||||
## What is Vim? ##
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ effects. Be careful not to destroy your text.
|
||||
:au[tocmd] [group] {event} {pat} [++once] [++nested] {cmd}
|
||||
Add {cmd} to the list of commands that Vim will
|
||||
execute automatically on {event} for a file matching
|
||||
{pat} |autocmd-patterns|.
|
||||
{pat} |autocmd-patterns|.
|
||||
Here {event} cannot be "*". *E1155*
|
||||
Note: A quote character is seen as argument to the
|
||||
:autocmd and won't start a comment.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*change.txt* For Vim version 8.2. Last change: 2021 Mar 01
|
||||
*change.txt* For Vim version 8.2. Last change: 2021 Jun 10
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*eval.txt* For Vim version 8.2. Last change: 2021 May 07
|
||||
*eval.txt* For Vim version 8.2. Last change: 2021 Jun 07
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -2102,7 +2102,7 @@ v:null An empty String. Used to put "null" in JSON. See
|
||||
v:numbermax Maximum value of a number.
|
||||
|
||||
*v:numbermin* *numbermin-variable*
|
||||
v:numbermin Minimum value of a number (negative)
|
||||
v:numbermin Minimum value of a number (negative).
|
||||
|
||||
*v:numbersize* *numbersize-variable*
|
||||
v:numbersize Number of bits in a Number. This is normally 64, but on some
|
||||
@@ -2508,7 +2508,7 @@ char2nr({expr} [, {utf8}]) Number ASCII/UTF8 value of first char in {expr}
|
||||
charclass({string}) Number character class of {string}
|
||||
charcol({expr}) Number column number of cursor or mark
|
||||
charidx({string}, {idx} [, {countcc}])
|
||||
Number char index of byte {idx} in {string}
|
||||
Number char index of byte {idx} in {string}
|
||||
chdir({dir}) String change current working directory
|
||||
cindent({lnum}) Number C indent for line {lnum}
|
||||
clearmatches([{win}]) none clear all matches
|
||||
@@ -2529,7 +2529,7 @@ cscope_connection([{num}, {dbpath} [, {prepend}]])
|
||||
cursor({lnum}, {col} [, {off}])
|
||||
Number move cursor to {lnum}, {col}, {off}
|
||||
cursor({list}) Number move cursor to position in {list}
|
||||
debugbreak({pid}) Number interrupt process being debugged
|
||||
debugbreak({pid}) Number interrupt process being debugged
|
||||
deepcopy({expr} [, {noref}]) any make a full copy of {expr}
|
||||
delete({fname} [, {flags}]) Number delete the file or directory {fname}
|
||||
deletebufline({expr}, {first} [, {last}])
|
||||
@@ -4951,7 +4951,7 @@ funcref({name} [, {arglist}] [, {dict}])
|
||||
Can also be used as a |method|: >
|
||||
GetFuncname()->funcref([arg])
|
||||
<
|
||||
*function()* *E700* *E922* *E923*
|
||||
*function()* *partial* *E700* *E922* *E923*
|
||||
function({name} [, {arglist}] [, {dict}])
|
||||
Return a |Funcref| variable that refers to function {name}.
|
||||
{name} can be the name of a user defined function or an
|
||||
@@ -5500,8 +5500,8 @@ getcurpos([{winid}])
|
||||
|
||||
Can also be used as a |method|: >
|
||||
GetWinid()->getcurpos()
|
||||
|
||||
< *getcursorcharpos()*
|
||||
<
|
||||
*getcursorcharpos()*
|
||||
getcursorcharpos([{winid}])
|
||||
Same as |getcurpos()| but the column number in the returned
|
||||
List is a character index instead of a byte index.
|
||||
@@ -5510,8 +5510,8 @@ getcursorcharpos([{winid}])
|
||||
With the cursor on '보' in line 3 with text "여보세요": >
|
||||
getcursorcharpos() returns [0, 3, 2, 0, 3]
|
||||
getcurpos() returns [0, 3, 4, 0, 3]
|
||||
|
||||
< Can also be used as a |method|: >
|
||||
<
|
||||
Can also be used as a |method|: >
|
||||
GetWinid()->getcursorcharpos()
|
||||
|
||||
< *getcwd()*
|
||||
@@ -5736,11 +5736,11 @@ getmarklist([{expr}]) *getmarklist()*
|
||||
see |bufname()|.
|
||||
|
||||
Each item in the returned List is a |Dict| with the following:
|
||||
name - name of the mark prefixed by "'"
|
||||
pos - a |List| with the position of the mark:
|
||||
mark name of the mark prefixed by "'"
|
||||
pos a |List| with the position of the mark:
|
||||
[bufnum, lnum, col, off]
|
||||
Refer to |getpos()| for more information.
|
||||
file - file name
|
||||
Refer to |getpos()| for more information.
|
||||
file file name
|
||||
|
||||
Refer to |getpos()| for getting information about a specific
|
||||
mark.
|
||||
@@ -5822,7 +5822,7 @@ getpos({expr}) Get the position for {expr}. For possible values of {expr}
|
||||
'> is a large number.
|
||||
The column number in the returned List is the byte position
|
||||
within the line. To get the character position in the line,
|
||||
use |getcharpos()|
|
||||
use |getcharpos()|.
|
||||
The column number can be very large, e.g. 2147483647, in which
|
||||
case it means "after the end of the line".
|
||||
This can be used to save and restore the position of a mark: >
|
||||
@@ -7637,7 +7637,7 @@ matchfuzzypos({list}, {str} [, {dict}]) *matchfuzzypos()*
|
||||
Same as |matchfuzzy()|, but returns the list of matched
|
||||
strings, the list of character positions where characters
|
||||
in {str} matches and a list of matching scores. You can
|
||||
use |byteidx()|to convert a character position to a byte
|
||||
use |byteidx()| to convert a character position to a byte
|
||||
position.
|
||||
|
||||
If {str} matches multiple times in a string, then only the
|
||||
@@ -9961,7 +9961,7 @@ sinh({expr}) *sinh()*
|
||||
{only available when compiled with the |+float| feature}
|
||||
|
||||
|
||||
slice({expr}, {start} [, {end}]) *slice()*
|
||||
slice({expr}, {start} [, {end}]) *slice()*
|
||||
Similar to using a |slice| "expr[start : end]", but "end" is
|
||||
used exclusive. And for a string the indexes are used as
|
||||
character indexes instead of byte indexes, like in
|
||||
|
||||
@@ -632,7 +632,7 @@ For fish, add to the config file
|
||||
MARKDOWN *ft-markdown-plugin*
|
||||
|
||||
To enable folding use this: >
|
||||
let g:markdown_folding = 1
|
||||
let g:markdown_folding = 1
|
||||
<
|
||||
|
||||
PDF *ft-pdf-plugin*
|
||||
|
||||
@@ -45,7 +45,7 @@ Numbers, subscripts and superscripts are available with 's' and 'S':
|
||||
1s ₁ 1S ¹ ~
|
||||
2s ₂ 9S ⁹ ~
|
||||
|
||||
But some don´t come defined by default. Those are digraph definitions you can
|
||||
But some don't come defined by default. Those are digraph definitions you can
|
||||
add in your ~/.vimrc file. >
|
||||
exec 'digraph \\ '.char2nr('∖')
|
||||
exec 'digraph \< '.char2nr('≼')
|
||||
|
||||
@@ -132,7 +132,7 @@ Advanced editing ~
|
||||
|windows.txt| commands for using multiple windows and buffers
|
||||
|tabpage.txt| commands for using multiple tab pages
|
||||
|spell.txt| spell checking
|
||||
|diff.txt| working with two to four versions of the same file
|
||||
|diff.txt| working with two to eight versions of the same file
|
||||
|autocmd.txt| automatically executing commands on an event
|
||||
|eval.txt| expression evaluation, conditional commands
|
||||
|channel.txt| Jobs, Channels, inter-process communication
|
||||
@@ -145,6 +145,7 @@ Special issues ~
|
||||
|term.txt| using different terminals and mice
|
||||
|terminal.txt| Terminal window support
|
||||
|popup.txt| popup window support
|
||||
|vim9.txt| using Vim9 script
|
||||
|
||||
Programming language support ~
|
||||
|indent.txt| automatic indenting for C and other languages
|
||||
@@ -153,6 +154,8 @@ Programming language support ~
|
||||
|filetype.txt| settings done specifically for a type of file
|
||||
|quickfix.txt| commands for a quick edit-compile-fix cycle
|
||||
|ft_ada.txt| Ada (the programming language) support
|
||||
|ft_ps1.txt| Filetype plugin for Windows PowerShell
|
||||
|ft_raku.txt| Filetype plugin for Raku
|
||||
|ft_rust.txt| Filetype plugin for Rust
|
||||
|ft_sql.txt| about the SQL filetype plugin
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*motion.txt* For Vim version 8.2. Last change: 2021 Mar 28
|
||||
*motion.txt* For Vim version 8.2. Last change: 2021 Jun 13
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -59,9 +59,14 @@ or change text. The following operators are available:
|
||||
|<| < shift left
|
||||
|zf| zf define a fold
|
||||
|g@| g@ call function set with the 'operatorfunc' option
|
||||
|
||||
*motion-count-multiplied*
|
||||
If the motion includes a count and the operator also had a count before it,
|
||||
the two counts are multiplied. For example: "2d3w" deletes six words.
|
||||
*operator-doubled*
|
||||
When doubling the operator it operates on a line. When using a count, before
|
||||
or after the first character, that many lines are operated upon. Thus `3dd`
|
||||
deletes three lines. A count before and after the first character is
|
||||
multiplied, thus `2y3y` yanks six lines.
|
||||
|
||||
After applying the operator the cursor is mostly left at the start of the text
|
||||
that was operated upon. For example, "yfe" doesn't move the cursor, but "yFe"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*options.txt* For Vim version 8.2. Last change: 2021 May 16
|
||||
*options.txt* For Vim version 8.2. Last change: 2021 May 31
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
|
||||
@@ -767,12 +767,12 @@ GNU_TOOLS.ZIP package downloadable from http://www.polarhome.com/vim/
|
||||
|
||||
Version 8.2
|
||||
- make all changes needed for clean compile build of v8.2 on VMS on all platforms
|
||||
- fix the call mkdir bug (vicente_polo@yahoo.es)
|
||||
- fix the call mkdir bug (vicente_polo@yahoo.es)
|
||||
- test on VSI OpenVMS Alpha and Itanium platforms
|
||||
- added LUA support
|
||||
- added XPM support - Motif GUI with toolbar on all platforms
|
||||
- XPM v3.4.11 libraries for IA64, AXP and VAX are added
|
||||
- start integrating the new test scripts
|
||||
- XPM v3.4.11 libraries for IA64, AXP and VAX are added
|
||||
- start integrating the new test scripts
|
||||
|
||||
Version 8.1
|
||||
- make necessary changes to build v8.1 on VMS
|
||||
|
||||
@@ -1217,7 +1217,7 @@ x A single character, with no special meaning, matches itself
|
||||
|
||||
\%d123 Matches the character specified with a decimal number. Must be
|
||||
followed by a non-digit.
|
||||
\%o40 Matches the character specified with an octal number up to 0377.
|
||||
\%o40 Matches the character specified with an octal number up to 0o377.
|
||||
Numbers below 0o40 must be followed by a non-octal digit or a
|
||||
non-digit.
|
||||
\%x2a Matches the character specified with up to two hexadecimal characters.
|
||||
|
||||
@@ -3809,7 +3809,7 @@ netrw:
|
||||
Decho.vim is provided as a "vimball"; see |vimball-intro|. You
|
||||
should edit the Decho.vba.gz file and source it in: >
|
||||
|
||||
vim Decho.vba.gz
|
||||
vim Decho.vba.gz
|
||||
:so %
|
||||
:q
|
||||
<
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*repeat.txt* For Vim version 8.2. Last change: 2021 May 08
|
||||
*repeat.txt* For Vim version 8.2. Last change: 2021 Jun 11
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -279,7 +279,9 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
|
||||
ftdetect scripts are loaded, only the matching
|
||||
directories are added to 'runtimepath'. This is
|
||||
useful in your .vimrc. The plugins will then be
|
||||
loaded during initialization, see |load-plugins|.
|
||||
loaded during initialization, see |load-plugins| (note
|
||||
that the loading order will be reversed, because each
|
||||
directory is inserted before others).
|
||||
Note that for ftdetect scripts to be loaded
|
||||
you will need to write `filetype plugin indent on`
|
||||
AFTER all `packadd!` commands.
|
||||
@@ -372,7 +374,7 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
|
||||
for some commands.
|
||||
See |:vim9cmd| for executing one command with Vim9
|
||||
syntax and semantics.
|
||||
|
||||
|
||||
*:scr* *:scriptnames*
|
||||
:scr[iptnames] List all sourced script names, in the order they were
|
||||
first sourced. The number is used for the script ID
|
||||
|
||||
@@ -3430,8 +3430,8 @@ syntax highlighting script handles this with the following logic:
|
||||
Tex: Match Check Control~
|
||||
|
||||
Sometimes one actually wants mismatched parentheses, square braces,
|
||||
and or curly braces; for example, \text{(1,10] is a range from but
|
||||
not including 1 to and including 10}. This wish, of course, conflicts
|
||||
and or curly braces; for example, \text{(1,10]} is a range from but
|
||||
not including 1 to and including 10. This wish, of course, conflicts
|
||||
with the desire to provide delimiter mismatch detection. To
|
||||
accommodate these conflicting goals, syntax/tex.vim provides >
|
||||
g:tex_matchcheck = '[({[]'
|
||||
@@ -4084,7 +4084,7 @@ match in the same position overrules an earlier one). The "transparent"
|
||||
argument makes the "myVim" match use the same highlighting as "myString". But
|
||||
it does not contain anything. If the "contains=NONE" argument would be left
|
||||
out, then "myVim" would use the contains argument from myString and allow
|
||||
"myWord" to be contained, which will be highlighted as a Constant. This
|
||||
"myWord" to be contained, which will be highlighted as a Comment. This
|
||||
happens because a contained match doesn't match inside itself in the same
|
||||
position, thus the "myVim" match doesn't overrule the "myWord" match here.
|
||||
|
||||
@@ -4970,8 +4970,8 @@ ctermul={color-nr} *highlight-ctermul*
|
||||
*tmux*
|
||||
When using tmux you may want to use this in the tmux config: >
|
||||
# tmux colors
|
||||
set -g default-terminal "xterm-256color"
|
||||
set -ag terminal-overrides ",xterm-256color:Tc"
|
||||
set -s default-terminal "tmux-256color"
|
||||
set -as terminal-overrides ",*-256color:Tc"
|
||||
< More info at:
|
||||
https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-a-256-colour-terminal
|
||||
https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-rgb-colour
|
||||
|
||||
@@ -7000,6 +7000,7 @@ getchar() eval.txt /*getchar()*
|
||||
getcharmod() eval.txt /*getcharmod()*
|
||||
getcharpos() eval.txt /*getcharpos()*
|
||||
getcharsearch() eval.txt /*getcharsearch()*
|
||||
getcharstr() eval.txt /*getcharstr()*
|
||||
getcmdline() eval.txt /*getcmdline()*
|
||||
getcmdpos() eval.txt /*getcmdpos()*
|
||||
getcmdtype() eval.txt /*getcmdtype()*
|
||||
@@ -7901,6 +7902,7 @@ moo.vim syntax.txt /*moo.vim*
|
||||
more-compatible version5.txt /*more-compatible*
|
||||
more-prompt message.txt /*more-prompt*
|
||||
more-variables eval.txt /*more-variables*
|
||||
motion-count-multiplied motion.txt /*motion-count-multiplied*
|
||||
motion.txt motion.txt /*motion.txt*
|
||||
mouse-mode-table term.txt /*mouse-mode-table*
|
||||
mouse-overview term.txt /*mouse-overview*
|
||||
@@ -8348,6 +8350,7 @@ omni-sql-completion ft_sql.txt /*omni-sql-completion*
|
||||
online-help helphelp.txt /*online-help*
|
||||
opening-window windows.txt /*opening-window*
|
||||
operator motion.txt /*operator*
|
||||
operator-doubled motion.txt /*operator-doubled*
|
||||
operator-pending-index index.txt /*operator-pending-index*
|
||||
operator-variable eval.txt /*operator-variable*
|
||||
option-backslash options.txt /*option-backslash*
|
||||
@@ -8401,6 +8404,7 @@ page_up intro.txt /*page_up*
|
||||
pager message.txt /*pager*
|
||||
papp.vim syntax.txt /*papp.vim*
|
||||
paragraph motion.txt /*paragraph*
|
||||
partial eval.txt /*partial*
|
||||
pascal.vim syntax.txt /*pascal.vim*
|
||||
patches-8 version8.txt /*patches-8*
|
||||
patches-8.1 version8.txt /*patches-8.1*
|
||||
@@ -10066,6 +10070,7 @@ v_u change.txt /*v_u*
|
||||
v_v visual.txt /*v_v*
|
||||
v_x change.txt /*v_x*
|
||||
v_y change.txt /*v_y*
|
||||
v_zy change.txt /*v_zy*
|
||||
v_~ change.txt /*v_~*
|
||||
vab motion.txt /*vab*
|
||||
val-variable eval.txt /*val-variable*
|
||||
@@ -10435,6 +10440,7 @@ zOS-PuTTY os_390.txt /*zOS-PuTTY*
|
||||
zOS-has-ebcdic os_390.txt /*zOS-has-ebcdic*
|
||||
zOS-limitations os_390.txt /*zOS-limitations*
|
||||
zOS-open-source os_390.txt /*zOS-open-source*
|
||||
zP change.txt /*zP*
|
||||
zR fold.txt /*zR*
|
||||
zW spell.txt /*zW*
|
||||
zX fold.txt /*zX*
|
||||
@@ -10462,6 +10468,7 @@ zl scroll.txt /*zl*
|
||||
zm fold.txt /*zm*
|
||||
zn fold.txt /*zn*
|
||||
zo fold.txt /*zo*
|
||||
zp change.txt /*zp*
|
||||
zr fold.txt /*zr*
|
||||
zs scroll.txt /*zs*
|
||||
zsh.vim syntax.txt /*zsh.vim*
|
||||
@@ -10473,6 +10480,7 @@ zuw spell.txt /*zuw*
|
||||
zv fold.txt /*zv*
|
||||
zw spell.txt /*zw*
|
||||
zx fold.txt /*zx*
|
||||
zy change.txt /*zy*
|
||||
zz scroll.txt /*zz*
|
||||
{ motion.txt /*{*
|
||||
{Visual} intro.txt /*{Visual}*
|
||||
|
||||
@@ -373,10 +373,10 @@ Added by Vim (there are no standard codes for these):
|
||||
t_Ri restore icon text from stack *t_Ri* *'t_Ri'*
|
||||
t_TE end of "raw" mode *t_TE* *'t_TE'*
|
||||
t_TI put terminal into "raw" mode *t_TI* *'t_TI'*
|
||||
t_fd disable focus-event tracking *t_fd* *'t_fd'*
|
||||
|xterm-focus-event|
|
||||
t_fe enable focus-event tracking *t_fe* *'t_fe'*
|
||||
|xterm-focus-event|
|
||||
t_fd disable focus-event tracking *t_fd* *'t_fd'*
|
||||
|xterm-focus-event|
|
||||
|
||||
Some codes have a start, middle and end part. The start and end are defined
|
||||
by the termcap option, the middle part is text.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*todo.txt* For Vim version 8.2. Last change: 2021 May 28
|
||||
*todo.txt* For Vim version 8.2. Last change: 2021 Jun 13
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -38,57 +38,30 @@ browser use: https://github.com/vim/vim/issues/1234
|
||||
*known-bugs*
|
||||
-------------------- Known bugs and current work -----------------------
|
||||
|
||||
Geen memory leak?
|
||||
|
||||
Crash using outer var from nested lambda:
|
||||
vim9script
|
||||
def F(text: string): func(string): func(string): string
|
||||
return (arg: string): func(string): string => ((sep: string): string => {
|
||||
return text .. ' ' .. arg
|
||||
})
|
||||
enddef
|
||||
|
||||
echo F('hello')(' ')('there')
|
||||
|
||||
|
||||
|
||||
Vim9 - Make everything work:
|
||||
- function returning nothing should return void instead of zero
|
||||
- compile "expr" and "call" expression of a channel in channel_exe_cmd()?
|
||||
- Need some solution for dict function. Can we implement part of classes?
|
||||
- A lambda without {} does not require a return type, using { return x } does.
|
||||
That's unexpected, since the arguments are not required to have a type.
|
||||
alt 1: not require a return type, figure it out from the common type of all
|
||||
the return statements found
|
||||
alt 2: also require argument types
|
||||
- Using "windo echo expr" does not accept a line break inside "expr" (in a
|
||||
:def function and at script level in a not executed block). #7681
|
||||
- use CheckLegacyAndVim9Success(lines) in many more places
|
||||
- Make debugging work - at least per function.
|
||||
- How to evaluate the stack and variables on the stack?
|
||||
- FIXME in test_debugger.vim
|
||||
- For builtin functions using tv_get_string*() use check_for_string() to be
|
||||
more strict about the argument type (not a bool).
|
||||
done: balloon_()
|
||||
- Check many more builtin function arguments at compile time.
|
||||
map() could check that the return type of the function argument matches
|
||||
the type of the list or dict member. (#8092)
|
||||
- Allow for using an autoload function name without quotes. It is then loaded
|
||||
(and compiled) right away. #8124
|
||||
- Test more expressions in legacy and Vim9 script, using
|
||||
CheckLegacyAndVim9Success()
|
||||
Same for other functions, such as searchpair().
|
||||
- use CheckLegacyAndVim9Success(lines) in many more places
|
||||
- Test try/catch and throw better, also nested.
|
||||
Test that return inside try/finally jumps to finally and then returns.
|
||||
- Test that a function defined inside a :def function is local to that
|
||||
function, g: functions can be defined and script-local functions cannot be
|
||||
defined.
|
||||
- Make debugging work - at least per function. Need to recompile a function
|
||||
to step through it line-by-line? Evaluate the stack and variables on the
|
||||
stack?
|
||||
- Reserve command for future use: :type, :class, :enum
|
||||
- compile get_lambda_tv() in popup_add_timeout()
|
||||
|
||||
Once Vim9 is stable:
|
||||
- Add the "vim9script" feature, can use has('vim9script')
|
||||
- Change the help to prefer Vim9 syntax where appropriate
|
||||
- Add all the error numbers in a good place in documentation.
|
||||
- In the generic eval docs, point out the Vim9 syntax where it differs.
|
||||
- Add the "vim9script" feature, can use has('vim9script')
|
||||
- Use Vim9 for runtime files.
|
||||
PR #7497 for autoload/ccomplete.vim
|
||||
|
||||
@@ -100,13 +73,12 @@ Further Vim9 improvements, possibly after launch:
|
||||
Give an error if compilation fails. (#7625)
|
||||
Use the location where the option was set for deciding whether it's to be
|
||||
evaluated in Vim9 script context.
|
||||
- implement :type, import type declaration.
|
||||
- implement enum, import enum.
|
||||
- Future work: See |vim9-classes|
|
||||
- implement :type, "import type"
|
||||
- implement enum, "import enum".
|
||||
- implement class and interface: See |vim9-classes|
|
||||
- For range: make table of first ASCII character with flag to quickly check if
|
||||
it can be a Vim9 command. E.g. "+" can, but "." can't.
|
||||
- compile get_lambda_tv() in popup_add_timeout()
|
||||
- inline call to map() and filter()
|
||||
- Inline call to map() and filter(), better type checking.
|
||||
- Make accessing varargs faster: arg[expr]
|
||||
EVAL expr
|
||||
LOADVARARG (varargs idx)
|
||||
@@ -300,6 +272,9 @@ inconsistent with the documentation.
|
||||
Making breakat support multibyte characters (Yasuhiro Matsumoto, #6598)
|
||||
Scroll doesn't work correctly, why?
|
||||
|
||||
glob() and globfile() do not always honor 'wildignorecase'. #8350
|
||||
globpath() does not use 'wildignorecase' at all?
|
||||
|
||||
Add 'termguiattr' option, use "gui=" attributes in the terminal? Would work
|
||||
with 'termguicolors'. #1740
|
||||
|
||||
@@ -344,6 +319,9 @@ Should also work without any group:
|
||||
:echo matchstr('aaa bbb', '.\{-1,}\>\|.*')
|
||||
aaa bbb (should be aaa)
|
||||
|
||||
Should add a match/str/list/pos method that also returns the test and position
|
||||
of submatches. #8355
|
||||
|
||||
Check out PR #543 (Roland Puntaier).
|
||||
Patch for multibyte characters in langmap and applying a mapping on them.
|
||||
(Christian Brabandt, 2015 Jun 12, update July 25)
|
||||
@@ -380,6 +358,10 @@ work.
|
||||
Using "au!" after "filetype on" is a bit slow. Can the matching of
|
||||
autocommands be made faster? (#7056)
|
||||
|
||||
Append in Visual block mode inserts the wrong character.
|
||||
Test_visual_block_mode() already has the proper check, which is commented out.
|
||||
(#8288)
|
||||
|
||||
Add the <=> (spaceship) operator and "cond ?< expr ?= expr ?> expr"
|
||||
replace this:
|
||||
let left = GetLeftFunc()
|
||||
@@ -2263,9 +2245,6 @@ Win32: Improved Makefile for MSVC. (Leonardo Valeri Manera, 2010 Aug 18)
|
||||
|
||||
Win32: Expanding 'path' runs into a maximum size limit. (bgold12, 2009 Nov 15)
|
||||
|
||||
Win32: Patch for enabling quick edit mode in console. (Craig Barkhouse, 2010
|
||||
Sep 1)
|
||||
|
||||
Win32: Patch for using .png files for icons. (Charles Peacech, 2012 Feb 5)
|
||||
|
||||
Putting a Visual block while 'visualedit' is "all" does not leave the cursor
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*usr_41.txt* For Vim version 8.2. Last change: 2021 Apr 19
|
||||
*usr_41.txt* For Vim version 8.2. Last change: 2021 Jun 07
|
||||
|
||||
VIM USER MANUAL - by Bram Moolenaar
|
||||
|
||||
|
||||
@@ -724,7 +724,7 @@ K Run a program to lookup the keyword under the
|
||||
feature}
|
||||
|
||||
*:sl!* *:sleep!*
|
||||
:[N]sl[eep]! [N] [m] Same as above, but hide the cursor.
|
||||
:[N]sl[eep]! [N][m] Same as above, but hide the cursor.
|
||||
|
||||
*:xrestore* *:xr*
|
||||
:xr[estore] [display] Reinitializes the connection to the X11 server. Useful
|
||||
|
||||
@@ -186,7 +186,7 @@ behave mostly like Vi, even though a .vimrc file exists.
|
||||
.TP
|
||||
\-d
|
||||
Start in diff mode.
|
||||
There should be two, three or four file name arguments.
|
||||
There should between two to eight file name arguments.
|
||||
.B Vim
|
||||
will open all the files and show differences between them.
|
||||
Works like vimdiff(1).
|
||||
|
||||
@@ -135,9 +135,9 @@ OPTIONS
|
||||
Vim behave mostly like Vi, even though a .vimrc file ex‐
|
||||
ists.
|
||||
|
||||
-d Start in diff mode. There should be two, three or four
|
||||
file name arguments. Vim will open all the files and show
|
||||
differences between them. Works like vimdiff(1).
|
||||
-d Start in diff mode. There should between two to eight file
|
||||
name arguments. Vim will open all the files and show dif‐
|
||||
ferences between them. Works like vimdiff(1).
|
||||
|
||||
-d {device} Open {device} for use as a terminal. Only on the Amiga.
|
||||
Example: "-d con:20/30/600/150".
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*vim9.txt* For Vim version 8.2. Last change: 2021 May 26
|
||||
*vim9.txt* For Vim version 8.2. Last change: 2021 Jun 12
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -169,6 +169,14 @@ created yet. In this case you can call `execute()` to invoke it at runtime. >
|
||||
used for the command or inside a `:try` block), does not get a range passed
|
||||
cannot be a "dict" function, and can always be a closure.
|
||||
|
||||
Later classes will be added, which replaces the "dict function" mechanism.
|
||||
For now you will need to pass the dictionary explicitly: >
|
||||
def DictFunc(d: dict<any>, arg: string)
|
||||
echo d[arg]
|
||||
enddef
|
||||
var d = {item: 'value', func: DictFunc}
|
||||
d.func(d, 'item')
|
||||
|
||||
The argument types and return type need to be specified. The "any" type can
|
||||
be used, type checking will then be done at runtime, like with legacy
|
||||
functions.
|
||||
@@ -445,11 +453,12 @@ it is the start of a lambda or a dictionary, which is now more complicated
|
||||
because of the use of argument types.
|
||||
|
||||
To avoid these problems Vim9 script uses a different syntax for a lambda,
|
||||
which is similar to Javascript: >
|
||||
which is similar to JavaScript: >
|
||||
var Lambda = (arg) => expression
|
||||
|
||||
No line break is allowed in the arguments of a lambda up to and including the
|
||||
"=>". This is OK: >
|
||||
"=>" (so that Vim can tell the difference between an expression in parenthesis
|
||||
and lambda arguments). This is OK: >
|
||||
filter(list, (k, v) =>
|
||||
v > 0)
|
||||
This does not work: >
|
||||
@@ -522,7 +531,7 @@ And when a dict spans multiple lines: >
|
||||
one: 1,
|
||||
two: 2,
|
||||
}
|
||||
Function call: >
|
||||
With a function call: >
|
||||
var result = Func(
|
||||
arg1,
|
||||
arg2
|
||||
@@ -555,10 +564,31 @@ at the start of the line indicates line continuation: >
|
||||
| echo 'match'
|
||||
| endif
|
||||
|
||||
Note that this means that in heredoc the first line cannot be a bar: >
|
||||
var lines =<< trim END
|
||||
| this doesn't work
|
||||
END
|
||||
Either use an empty line at the start or do not use heredoc. Or temporarily
|
||||
add the "C" flag to 'cpoptions': >
|
||||
set cpo+=C
|
||||
var lines =<< trim END
|
||||
| this doesn't work
|
||||
END
|
||||
set cpo-=C
|
||||
If the heredoc is inside a function 'cpoptions' must be set before :def and
|
||||
restored after the :enddef.
|
||||
|
||||
In places where line continuation with a backslash is still needed, such as
|
||||
splitting up a long Ex command, comments can start with #\ instead of "\: >
|
||||
syn region Text
|
||||
\ start='foo'
|
||||
#\ comment
|
||||
\ end='bar'
|
||||
|
||||
< *E1050*
|
||||
To make it possible for the operator at the start of the line to be
|
||||
recognized, it is required to put a colon before a range. This will add
|
||||
"start" and print: >
|
||||
recognized, it is required to put a colon before a range. This example will
|
||||
add "start" and print: >
|
||||
var result = start
|
||||
+ print
|
||||
Like this: >
|
||||
@@ -610,6 +640,9 @@ Notes:
|
||||
< This does not work: >
|
||||
echo [1, 2]
|
||||
[3, 4]
|
||||
- In some cases it is difficult for Vim to parse a command, especially when
|
||||
commands are used as an argument to another command, such as `windo`. In
|
||||
those cases the line continuation with a backslash has to be used.
|
||||
|
||||
|
||||
White space ~
|
||||
@@ -966,9 +999,14 @@ prefix if they do not exist at the time of compiling.
|
||||
Note that for command line completion of {func} you
|
||||
can prepend "s:" to find script-local functions.
|
||||
|
||||
:disa[ssemble]! {func} Like `:disassemble` but with the instructions used for
|
||||
:disa[ssemble] profile {func}
|
||||
Like `:disassemble` but with the instructions used for
|
||||
profiling.
|
||||
|
||||
:disa[ssemble] debug {func}
|
||||
Like `:disassemble` but with the instructions used for
|
||||
debugging.
|
||||
|
||||
Limitations ~
|
||||
|
||||
Local variables will not be visible to string evaluation. For example: >
|
||||
@@ -1240,9 +1278,10 @@ Exporting an item can be written as: >
|
||||
export const someValue = ...
|
||||
export def MyFunc() ...
|
||||
export class MyClass ...
|
||||
export interface MyClass ...
|
||||
|
||||
As this suggests, only constants, variables, `:def` functions and classes can
|
||||
be exported. {not implemented yet: export class}
|
||||
be exported. {not implemented yet: class, interface}
|
||||
|
||||
*E1042*
|
||||
`:export` can only be used in Vim9 script, at the script level.
|
||||
@@ -1342,27 +1381,46 @@ implementing classes is going to be a lot of work, it is left for the future.
|
||||
For now we'll just make sure classes can be added later.
|
||||
|
||||
Thoughts:
|
||||
- `class` / `endclass`, everything in one file
|
||||
- Class names are always CamelCase
|
||||
- Single constructor
|
||||
- `class` / `endclass`, the whole class must be in one file
|
||||
- Class names are always CamelCase (to avoid a name clash with builtin types)
|
||||
- A single constructor called "constructor"
|
||||
- Single inheritance with `class ThisClass extends BaseClass`
|
||||
- `abstract class`
|
||||
- `interface` (Abstract class without any implementation)
|
||||
- `abstract class` (class with incomplete implementation)
|
||||
- `interface` / `endinterface` (abstract class without any implementation)
|
||||
- `class SomeClass implements SomeInterface`
|
||||
- Generics for class: `class <Tkey, Tentry>`
|
||||
- Generics for function: `def <Tkey> GetLast(key: Tkey)`
|
||||
|
||||
Again, much of this is from TypeScript.
|
||||
Again, much of this is from TypeScript with a slightly different syntax.
|
||||
|
||||
Some things that look like good additions:
|
||||
- Use a class as an interface (like Dart)
|
||||
- Extend a class with methods, using an import (like Dart)
|
||||
- Mixins
|
||||
- For testing: Mock mechanism
|
||||
|
||||
An important class that will be provided is "Promise". Since Vim is single
|
||||
threaded, connecting asynchronous operations is a natural way of allowing
|
||||
plugins to do their work without blocking the user. It's a uniform way to
|
||||
invoke callbacks and handle timeouts and errors.
|
||||
|
||||
Some examples: >
|
||||
|
||||
abstract class Person
|
||||
static const prefix = 'xxx'
|
||||
var name: string
|
||||
|
||||
def constructor(name: string)
|
||||
this.name = name;
|
||||
enddef
|
||||
|
||||
def display(): void
|
||||
echo name
|
||||
enddef
|
||||
|
||||
abstract def find(string): Person
|
||||
endclass
|
||||
|
||||
==============================================================================
|
||||
|
||||
9. Rationale *vim9-rationale*
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
.TH VIMDIFF 1 "2001 March 30"
|
||||
.SH NAME
|
||||
vimdiff \- edit two, three or four versions of a file with Vim and show differences
|
||||
vimdiff \- edit between two and eight versions of a file with Vim and show differences
|
||||
.SH SYNOPSIS
|
||||
.br
|
||||
.B vimdiff
|
||||
[options] file1 file2 [file3 [file4]]
|
||||
[options] file1 file2 [file3 [file4 [file5 [file6 [file7 [file8]]]]]]
|
||||
.PP
|
||||
.B gvimdiff
|
||||
.SH DESCRIPTION
|
||||
.B Vimdiff
|
||||
starts
|
||||
.B Vim
|
||||
on two (or three or four) files.
|
||||
on two up to eight files.
|
||||
Each file gets its own window.
|
||||
The differences between the files are highlighted.
|
||||
This is a nice way to inspect changes and to move changes from one version
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
VIMDIFF(1) VIMDIFF(1)
|
||||
VIMDIFF(1) General Commands Manual VIMDIFF(1)
|
||||
|
||||
|
||||
|
||||
NAME
|
||||
vimdiff - edit two, three or four versions of a file with Vim and show
|
||||
differences
|
||||
vimdiff - edit between two and eight versions of a file with Vim and
|
||||
show differences
|
||||
|
||||
SYNOPSIS
|
||||
vimdiff [options] file1 file2 [file3 [file4]]
|
||||
vimdiff [options] file1 file2 [file3 [file4 [file5 [file6 [file7
|
||||
[file8]]]]]]
|
||||
|
||||
gvimdiff
|
||||
|
||||
DESCRIPTION
|
||||
Vimdiff starts Vim on two (or three or four) files. Each file gets its
|
||||
own window. The differences between the files are highlighted. This
|
||||
is a nice way to inspect changes and to move changes from one version
|
||||
to another version of the same file.
|
||||
Vimdiff starts Vim on two up to eight files. Each file gets its own
|
||||
window. The differences between the files are highlighted. This is a
|
||||
nice way to inspect changes and to move changes from one version to an‐
|
||||
other version of the same file.
|
||||
|
||||
See vim(1) for details about Vim itself.
|
||||
|
||||
When started as gvimdiff the GUI will be started, if available.
|
||||
|
||||
In each window the 'diff' option will be set, which causes the differ-
|
||||
In each window the 'diff' option will be set, which causes the differ‐
|
||||
ences to be highlighted.
|
||||
The 'wrap' and 'scrollbind' options are set to make the text look good.
|
||||
The 'foldmethod' option is set to "diff", which puts ranges of lines
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
" Vim support file to detect file types
|
||||
"
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2021 Apr 17
|
||||
" Last Change: 2021 Jun 13
|
||||
|
||||
" Listen very carefully, I will say this only once
|
||||
if exists("did_load_filetypes")
|
||||
@@ -855,6 +855,9 @@ au BufNewFile,BufRead *.jov,*.j73,*.jovial setf jovial
|
||||
" JSON
|
||||
au BufNewFile,BufRead *.json,*.jsonp,*.webmanifest setf json
|
||||
|
||||
" Jupyter Notebook is also json
|
||||
au BufNewFile,BufRead *.ipynb setf json
|
||||
|
||||
" Kixtart
|
||||
au BufNewFile,BufRead *.kix setf kix
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@ Icon[de]=gvim
|
||||
Icon[eo]=gvim
|
||||
Icon[fr]=gvim
|
||||
Icon[ru]=gvim
|
||||
Icon[sr]=gvim
|
||||
Icon=gvim
|
||||
Categories=Utility;TextEditor;
|
||||
StartupNotify=true
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
" Vim indent script for HTML
|
||||
" Maintainer: Bram Moolenaar
|
||||
" Original Author: Andy Wokula <anwoku@yahoo.de>
|
||||
" Last Change: 2021 Jan 26
|
||||
" Last Change: 2021 Jun 13
|
||||
" Version: 1.0 "{{{
|
||||
" Description: HTML indent script with cached state for faster indenting on a
|
||||
" range of lines.
|
||||
@@ -62,7 +62,7 @@ let s:tagname = '\w\+\(-\w\+\)*'
|
||||
" Prefer using buffer-local settings over global settings, so that there can
|
||||
" be defaults for all HTML files and exceptions for specific types of HTML
|
||||
" files.
|
||||
func! HtmlIndent_CheckUserSettings()
|
||||
func HtmlIndent_CheckUserSettings()
|
||||
"{{{
|
||||
let inctags = ''
|
||||
if exists("b:html_indent_inctags")
|
||||
@@ -178,7 +178,7 @@ let s:endtags = [0,0,0,0,0,0,0] " long enough for the highest index
|
||||
"}}}
|
||||
|
||||
" Add a list of tag names for a pair of <tag> </tag> to "tags".
|
||||
func! s:AddITags(tags, taglist)
|
||||
func s:AddITags(tags, taglist)
|
||||
"{{{
|
||||
for itag in a:taglist
|
||||
let a:tags[itag] = 1
|
||||
@@ -187,7 +187,7 @@ func! s:AddITags(tags, taglist)
|
||||
endfunc "}}}
|
||||
|
||||
" Take a list of tag name pairs that are not to be used as tag pairs.
|
||||
func! s:RemoveITags(tags, taglist)
|
||||
func s:RemoveITags(tags, taglist)
|
||||
"{{{
|
||||
for itag in a:taglist
|
||||
let a:tags[itag] = 1
|
||||
@@ -196,7 +196,7 @@ func! s:RemoveITags(tags, taglist)
|
||||
endfunc "}}}
|
||||
|
||||
" Add a block tag, that is a tag with a different kind of indenting.
|
||||
func! s:AddBlockTag(tag, id, ...)
|
||||
func s:AddBlockTag(tag, id, ...)
|
||||
"{{{
|
||||
if !(a:id >= 2 && a:id < len(s:endtags))
|
||||
echoerr 'AddBlockTag ' . a:id
|
||||
@@ -255,7 +255,7 @@ call s:AddBlockTag('<!--[', 6, '![endif]-->')
|
||||
" Return non-zero when "tagname" is an opening tag, not being a block tag, for
|
||||
" which there should be a closing tag. Can be used by scripts that include
|
||||
" HTML indenting.
|
||||
func! HtmlIndent_IsOpenTag(tagname)
|
||||
func HtmlIndent_IsOpenTag(tagname)
|
||||
"{{{
|
||||
if get(s:indent_tags, a:tagname) == 1
|
||||
return 1
|
||||
@@ -264,7 +264,7 @@ func! HtmlIndent_IsOpenTag(tagname)
|
||||
endfunc "}}}
|
||||
|
||||
" Get the value for "tagname", taking care of buffer-local tags.
|
||||
func! s:get_tag(tagname)
|
||||
func s:get_tag(tagname)
|
||||
"{{{
|
||||
let i = get(s:indent_tags, a:tagname)
|
||||
if (i == 1 || i == -1) && get(b:hi_removed_tags, a:tagname) != 0
|
||||
@@ -277,7 +277,7 @@ func! s:get_tag(tagname)
|
||||
endfunc "}}}
|
||||
|
||||
" Count the number of start and end tags in "text".
|
||||
func! s:CountITags(text)
|
||||
func s:CountITags(text)
|
||||
"{{{
|
||||
" Store the result in s:curind and s:nextrel.
|
||||
let s:curind = 0 " relative indent steps for current line [unit &sw]:
|
||||
@@ -289,7 +289,7 @@ func! s:CountITags(text)
|
||||
endfunc "}}}
|
||||
|
||||
" Count the number of start and end tags in text.
|
||||
func! s:CountTagsAndState(text)
|
||||
func s:CountTagsAndState(text)
|
||||
"{{{
|
||||
" Store the result in s:curind and s:nextrel. Update b:hi_newstate.block.
|
||||
let s:curind = 0 " relative indent steps for current line [unit &sw]:
|
||||
@@ -304,7 +304,7 @@ func! s:CountTagsAndState(text)
|
||||
endfunc "}}}
|
||||
|
||||
" Used by s:CountITags() and s:CountTagsAndState().
|
||||
func! s:CheckTag(itag)
|
||||
func s:CheckTag(itag)
|
||||
"{{{
|
||||
" Returns an empty string or "SCRIPT".
|
||||
" a:itag can be "tag" or "/tag" or "<!--" or "-->"
|
||||
@@ -338,7 +338,7 @@ func! s:CheckTag(itag)
|
||||
endfunc "}}}
|
||||
|
||||
" Used by s:CheckTag(). Returns an empty string or "SCRIPT".
|
||||
func! s:CheckBlockTag(blocktag, ind)
|
||||
func s:CheckBlockTag(blocktag, ind)
|
||||
"{{{
|
||||
if a:ind > 0
|
||||
" a block starts here
|
||||
@@ -366,7 +366,7 @@ func! s:CheckBlockTag(blocktag, ind)
|
||||
endfunc "}}}
|
||||
|
||||
" Used by s:CheckTag().
|
||||
func! s:CheckCustomTag(ctag)
|
||||
func s:CheckCustomTag(ctag)
|
||||
"{{{
|
||||
" Returns 1 if ctag is the tag for a custom element, 0 otherwise.
|
||||
" a:ctag can be "tag" or "/tag" or "<!--" or "-->"
|
||||
@@ -396,7 +396,7 @@ func! s:CheckCustomTag(ctag)
|
||||
endfunc "}}}
|
||||
|
||||
" Return the <script> type: either "javascript" or ""
|
||||
func! s:GetScriptType(str)
|
||||
func s:GetScriptType(str)
|
||||
"{{{
|
||||
if a:str == "" || a:str =~ "java"
|
||||
return "javascript"
|
||||
@@ -407,7 +407,7 @@ endfunc "}}}
|
||||
|
||||
" Look back in the file, starting at a:lnum - 1, to compute a state for the
|
||||
" start of line a:lnum. Return the new state.
|
||||
func! s:FreshState(lnum)
|
||||
func s:FreshState(lnum)
|
||||
"{{{
|
||||
" A state is to know ALL relevant details about the
|
||||
" lines 1..a:lnum-1, initial calculating (here!) can be slow, but updating is
|
||||
@@ -568,24 +568,29 @@ func! s:FreshState(lnum)
|
||||
endfunc "}}}
|
||||
|
||||
" Indent inside a <pre> block: Keep indent as-is.
|
||||
func! s:Alien2()
|
||||
func s:Alien2()
|
||||
"{{{
|
||||
return -1
|
||||
endfunc "}}}
|
||||
|
||||
" Return the indent inside a <script> block for javascript.
|
||||
func! s:Alien3()
|
||||
func s:Alien3()
|
||||
"{{{
|
||||
let lnum = prevnonblank(v:lnum - 1)
|
||||
while lnum > 1 && getline(lnum) =~ '^\s*/[/*]'
|
||||
" Skip over comments to avoid that cindent() aligns with the <script> tag
|
||||
let lnum = prevnonblank(lnum - 1)
|
||||
endwhile
|
||||
if lnum < b:hi_indent.blocklnr
|
||||
" indent for <script> itself
|
||||
return b:hi_indent.blocktagind
|
||||
endif
|
||||
if lnum == b:hi_indent.blocklnr
|
||||
" indent for the first line after <script>
|
||||
return eval(b:hi_js1indent)
|
||||
endif
|
||||
if b:hi_indent.scripttype == "javascript"
|
||||
" indent for further lines
|
||||
return eval(b:hi_js1indent) + GetJavascriptIndent()
|
||||
else
|
||||
return -1
|
||||
@@ -593,7 +598,7 @@ func! s:Alien3()
|
||||
endfunc "}}}
|
||||
|
||||
" Return the indent inside a <style> block.
|
||||
func! s:Alien4()
|
||||
func s:Alien4()
|
||||
"{{{
|
||||
if prevnonblank(v:lnum-1) == b:hi_indent.blocklnr
|
||||
" indent for first content line
|
||||
@@ -603,7 +608,7 @@ func! s:Alien4()
|
||||
endfunc "}}}
|
||||
|
||||
" Indending inside a <style> block. Returns the indent.
|
||||
func! s:CSSIndent()
|
||||
func s:CSSIndent()
|
||||
"{{{
|
||||
" This handles standard CSS and also Closure stylesheets where special lines
|
||||
" start with @.
|
||||
@@ -720,13 +725,13 @@ endfunc "}}}
|
||||
" tag: blah
|
||||
" tag: blah &&
|
||||
" tag: blah ||
|
||||
func! s:CssUnfinished(text)
|
||||
func s:CssUnfinished(text)
|
||||
"{{{
|
||||
return a:text =~ '\(||\|&&\|:\|\k\)\s*$'
|
||||
endfunc "}}}
|
||||
|
||||
" Search back for the first unfinished line above "lnum".
|
||||
func! s:CssFirstUnfinished(lnum, min_lnum)
|
||||
func s:CssFirstUnfinished(lnum, min_lnum)
|
||||
"{{{
|
||||
let align_lnum = a:lnum
|
||||
while align_lnum > a:min_lnum && s:CssUnfinished(getline(align_lnum - 1))
|
||||
@@ -736,7 +741,7 @@ func! s:CssFirstUnfinished(lnum, min_lnum)
|
||||
endfunc "}}}
|
||||
|
||||
" Find the non-empty line at or before "lnum" that is not a comment.
|
||||
func! s:CssPrevNonComment(lnum, stopline)
|
||||
func s:CssPrevNonComment(lnum, stopline)
|
||||
"{{{
|
||||
" caller starts from a line a:lnum + 1 that is not a comment
|
||||
let lnum = prevnonblank(a:lnum)
|
||||
@@ -761,7 +766,7 @@ func! s:CssPrevNonComment(lnum, stopline)
|
||||
endfunc "}}}
|
||||
|
||||
" Check the number of {} and () in line "lnum". Return a dict with the counts.
|
||||
func! HtmlIndent_CountBraces(lnum)
|
||||
func HtmlIndent_CountBraces(lnum)
|
||||
"{{{
|
||||
let brs = substitute(getline(a:lnum), '[''"].\{-}[''"]\|/\*.\{-}\*/\|/\*.*$\|[^{}()]', '', 'g')
|
||||
let c_open = 0
|
||||
@@ -794,7 +799,7 @@ func! HtmlIndent_CountBraces(lnum)
|
||||
endfunc "}}}
|
||||
|
||||
" Return the indent for a comment: <!-- -->
|
||||
func! s:Alien5()
|
||||
func s:Alien5()
|
||||
"{{{
|
||||
let curtext = getline(v:lnum)
|
||||
if curtext =~ '^\s*\zs-->'
|
||||
@@ -826,7 +831,7 @@ func! s:Alien5()
|
||||
endfunc "}}}
|
||||
|
||||
" Return the indent for conditional comment: <!--[ ![endif]-->
|
||||
func! s:Alien6()
|
||||
func s:Alien6()
|
||||
"{{{
|
||||
let curtext = getline(v:lnum)
|
||||
if curtext =~ '\s*\zs<!\[endif\]-->'
|
||||
@@ -840,7 +845,7 @@ func! s:Alien6()
|
||||
endfunc "}}}
|
||||
|
||||
" When the "lnum" line ends in ">" find the line containing the matching "<".
|
||||
func! HtmlIndent_FindTagStart(lnum)
|
||||
func HtmlIndent_FindTagStart(lnum)
|
||||
"{{{
|
||||
" Avoids using the indent of a continuation line.
|
||||
" Moves the cursor.
|
||||
@@ -863,7 +868,7 @@ func! HtmlIndent_FindTagStart(lnum)
|
||||
endfunc "}}}
|
||||
|
||||
" Find the unclosed start tag from the current cursor position.
|
||||
func! HtmlIndent_FindStartTag()
|
||||
func HtmlIndent_FindStartTag()
|
||||
"{{{
|
||||
" The cursor must be on or before a closing tag.
|
||||
" If found, positions the cursor at the match and returns the line number.
|
||||
@@ -877,7 +882,7 @@ func! HtmlIndent_FindStartTag()
|
||||
endfunc "}}}
|
||||
|
||||
" Moves the cursor from a "<" to the matching ">".
|
||||
func! HtmlIndent_FindTagEnd()
|
||||
func HtmlIndent_FindTagEnd()
|
||||
"{{{
|
||||
" Call this with the cursor on the "<" of a start tag.
|
||||
" This will move the cursor to the ">" of the matching end tag or, when it's
|
||||
@@ -897,7 +902,7 @@ func! HtmlIndent_FindTagEnd()
|
||||
endfunc "}}}
|
||||
|
||||
" Indenting inside a start tag. Return the correct indent or -1 if unknown.
|
||||
func! s:InsideTag(foundHtmlString)
|
||||
func s:InsideTag(foundHtmlString)
|
||||
"{{{
|
||||
if a:foundHtmlString
|
||||
" Inside an attribute string.
|
||||
@@ -958,7 +963,7 @@ func! s:InsideTag(foundHtmlString)
|
||||
endfunc "}}}
|
||||
|
||||
" THE MAIN INDENT FUNCTION. Return the amount of indent for v:lnum.
|
||||
func! HtmlIndent()
|
||||
func HtmlIndent()
|
||||
"{{{
|
||||
if prevnonblank(v:lnum - 1) < 1
|
||||
" First non-blank line has no indent.
|
||||
|
||||
85
runtime/syntax/gvpr.vim
Normal file
85
runtime/syntax/gvpr.vim
Normal file
@@ -0,0 +1,85 @@
|
||||
" Vim syntax file
|
||||
" Language: Graphviz program
|
||||
" Maintainer: Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||
" Last Change: Tue, 28 Jul 2020 17:20:44 -0700
|
||||
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
let s:cpo_save = &cpo
|
||||
set cpo&vim
|
||||
|
||||
syn keyword gvArg ARGC ARGV
|
||||
syn keyword gvBeg BEGIN BEG_G N E END END_G
|
||||
syn keyword gvFunc
|
||||
\ graph fstsubg isDirect isStrict isSubg nEdges nNodes nxtsubg subg
|
||||
\ degreeOf fstnode indegreeOf isNode isSubnode node nxtnode nxtnode_sg
|
||||
\ outDegreeOf subnode
|
||||
\ edge edge_sg fstedge fstedge_sg fstin fstin_sg fstout fstout_sg isEdge
|
||||
\ isEdge_sg isSubedge nxtedge nxtedge_sg nxtin nxtin_sg nxtout nxtout_sg opp
|
||||
\ subedge
|
||||
\ freadG fwriteG readG write[] writeG
|
||||
\ aget aset clone cloneG compOf copy[] copyA delete[] fstAttr getDflt hasAttr
|
||||
\ induce isAttr isIn kindOf lock[] nxtAttr setDflt
|
||||
\ canon gsub html index ishtml length llOf match[] rindex split[] sprintf
|
||||
\ sscanf strcmp sub substr tokens tolower toupper urOf xOf yOf
|
||||
\ closeF openF print[] printf scanf readL
|
||||
\ atan2 cos exp log MAX MIN pow sin[] sqrt
|
||||
\ in[] unset
|
||||
\ colorx exit[] rand srand system
|
||||
syn keyword gvCons
|
||||
\ NULL TV_bfs TV_dfs TV_en TV_flat TV_fwd TV_ne TV_prepostdfs TV_prepostfwd
|
||||
\ TV_prepostrev TV_postdfs TV_postfwd tv_postrev TV_rev
|
||||
syn keyword gvType char double float int long unsigned void
|
||||
\ string
|
||||
\ edge_t graph_t node_t obj_t
|
||||
syn match gvVar
|
||||
\ "\$\(\(F\|G\|NG\|O\|T\|tgtname\|tvedge\|tvnext\|tvroot\|tvtype\)\>\)\?\(\<\)\@!"
|
||||
syn keyword gvWord break continue else for forr if return switch while
|
||||
|
||||
" numbers adapted from c.vim's cNumbers and friends
|
||||
syn match gvNums transparent "\<\d\|\.\d" contains=gvNumber,gvFloat,gvOctal
|
||||
syn match gvNumber contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
|
||||
syn match gvNumber contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
|
||||
syn match gvOctal contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=gvOctalZero
|
||||
syn match gvOctalZero contained "\<0"
|
||||
syn match gvFloat contained "\d\+f"
|
||||
syn match gvFloat contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
|
||||
syn match gvFloat contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
|
||||
syn match gvFloat contained "\d\+e[-+]\=\d\+[fl]\=\>"
|
||||
|
||||
syn region gvString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=gvFormat,gvSpecial extend
|
||||
syn region gvString start="'" skip="\\\\\|\\'" end="'" contains=gvFormat,gvSpecial extend
|
||||
|
||||
" adapted from c.vim's cFormat for c_no_c99
|
||||
syn match gvFormat "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
|
||||
|
||||
syn match gvSpecial "\\." contained
|
||||
|
||||
syn region gvCComment start="//" skip="\\$" end="$" keepend
|
||||
syn region gvCPPComment start="#" skip="\\$" end="$" keepend
|
||||
syn region gvCXXComment start="/\*" end="\*/" fold
|
||||
|
||||
hi def link gvArg Identifier
|
||||
hi def link gvBeg Keyword
|
||||
hi def link gvFloat Number
|
||||
hi def link gvFunc Identifier
|
||||
hi def link gvCons Number
|
||||
hi def link gvNumber Number
|
||||
hi def link gvType Type
|
||||
hi def link gvVar Statement
|
||||
hi def link gvWord Keyword
|
||||
|
||||
hi def link gvString String
|
||||
hi def link gvFormat Special
|
||||
hi def link gvSpecial Special
|
||||
|
||||
hi def link gvCComment Comment
|
||||
hi def link gvCPPComment Comment
|
||||
hi def link gvCXXComment Comment
|
||||
|
||||
let b:current_syntax = "gvpr"
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
@@ -112,6 +112,7 @@ Icon[de]=gvim
|
||||
Icon[eo]=gvim
|
||||
Icon[fr]=gvim
|
||||
Icon[ru]=gvim
|
||||
Icon[sr]=gvim
|
||||
Icon=gvim
|
||||
Categories=Utility;TextEditor;
|
||||
StartupNotify=false
|
||||
|
||||
@@ -284,7 +284,8 @@ open the window from the start menu, MSYS2 64 bit / MSYS2 MSYS.
|
||||
Execute:
|
||||
$ pacman -Syu
|
||||
|
||||
And restart MSYS2 console (select "MSYS2 MSYS" icon from the Start Menu).
|
||||
And restart MSYS2 console (select "MSYS2 MSYS 32-Bit" icon from the Start
|
||||
Menu for building 32 bit Vim, otherwise select "MSYS2 MinGW 64-Bit").
|
||||
Then execute:
|
||||
$ pacman -Su
|
||||
|
||||
|
||||
@@ -1370,6 +1370,8 @@ set_one_cmd_context(
|
||||
case CMD_verbose:
|
||||
case CMD_vertical:
|
||||
case CMD_windo:
|
||||
case CMD_vim9cmd:
|
||||
case CMD_legacy:
|
||||
return arg;
|
||||
|
||||
case CMD_filter:
|
||||
@@ -1555,10 +1557,12 @@ set_one_cmd_context(
|
||||
|
||||
case CMD_function:
|
||||
case CMD_delfunction:
|
||||
case CMD_disassemble:
|
||||
xp->xp_context = EXPAND_USER_FUNC;
|
||||
xp->xp_pattern = arg;
|
||||
break;
|
||||
case CMD_disassemble:
|
||||
set_context_in_disassemble_cmd(xp, arg);
|
||||
break;
|
||||
|
||||
case CMD_echohl:
|
||||
set_context_in_echohl_cmd(xp, arg);
|
||||
@@ -2118,6 +2122,7 @@ ExpandFromContext(
|
||||
{EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE},
|
||||
{EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE},
|
||||
{EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE},
|
||||
{EXPAND_DISASSEMBLE, get_disassemble_argument, FALSE, TRUE},
|
||||
{EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE},
|
||||
# endif
|
||||
# ifdef FEAT_MENU
|
||||
|
||||
@@ -218,7 +218,7 @@ do_debug(char_u *cmd)
|
||||
|
||||
if (last_cmd != 0)
|
||||
{
|
||||
// Execute debug command: decided where to break next and
|
||||
// Execute debug command: decide where to break next and
|
||||
// return.
|
||||
switch (last_cmd)
|
||||
{
|
||||
|
||||
@@ -425,3 +425,5 @@ EXTERN char e_nr_arguments_too_few[]
|
||||
INIT(= N_("E1190: %d arguments too few"));
|
||||
EXTERN char e_call_to_function_that_failed_to_compile_str[]
|
||||
INIT(= N_("E1191: Call to function that failed to compile: %s"));
|
||||
EXTERN char e_empty_function_name[]
|
||||
INIT(= N_("E1192: Empty function name"));
|
||||
|
||||
17
src/eval.c
17
src/eval.c
@@ -3530,9 +3530,13 @@ eval7(
|
||||
{
|
||||
ufunc_T *ufunc = rettv->vval.v_partial->pt_func;
|
||||
|
||||
// compile it here to get the return type
|
||||
// Compile it here to get the return type. The return
|
||||
// type is optional, when it's missing use t_unknown.
|
||||
// This is recognized in compile_return().
|
||||
if (ufunc->uf_ret_type->tt_type == VAR_VOID)
|
||||
ufunc->uf_ret_type = &t_unknown;
|
||||
if (compile_def_function(ufunc,
|
||||
TRUE, PROFILING(ufunc), NULL) == FAIL)
|
||||
FALSE, COMPILE_TYPE(ufunc), NULL) == FAIL)
|
||||
{
|
||||
clear_tv(rettv);
|
||||
ret = FAIL;
|
||||
@@ -3772,7 +3776,15 @@ call_func_rettv(
|
||||
s = partial_name(pt);
|
||||
}
|
||||
else
|
||||
{
|
||||
s = functv.vval.v_string;
|
||||
if (s == NULL || *s == NUL)
|
||||
{
|
||||
emsg(_(e_empty_function_name));
|
||||
ret = FAIL;
|
||||
goto theend;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
s = (char_u *)"";
|
||||
@@ -3786,6 +3798,7 @@ call_func_rettv(
|
||||
funcexe.basetv = basetv;
|
||||
ret = get_func_tv(s, -1, rettv, arg, evalarg, &funcexe);
|
||||
|
||||
theend:
|
||||
// Clear the funcref afterwards, so that deleting it while
|
||||
// evaluating the arguments is possible (see test55).
|
||||
if (evaluate)
|
||||
|
||||
@@ -2571,13 +2571,17 @@ eval_variable(
|
||||
cc = name[len];
|
||||
name[len] = NUL;
|
||||
|
||||
// Check for user-defined variables.
|
||||
v = find_var(name, NULL, flags & EVAL_VAR_NOAUTOLOAD);
|
||||
if (v != NULL)
|
||||
// Check for local variable when debugging.
|
||||
if ((tv = lookup_debug_var(name)) == NULL)
|
||||
{
|
||||
tv = &v->di_tv;
|
||||
if (dip != NULL)
|
||||
*dip = v;
|
||||
// Check for user-defined variables.
|
||||
v = find_var(name, NULL, flags & EVAL_VAR_NOAUTOLOAD);
|
||||
if (v != NULL)
|
||||
{
|
||||
tv = &v->di_tv;
|
||||
if (dip != NULL)
|
||||
*dip = v;
|
||||
}
|
||||
}
|
||||
|
||||
if (tv == NULL && (in_vim9script() || STRNCMP(name, "s:", 2) == 0))
|
||||
@@ -2921,8 +2925,9 @@ find_var_ht(char_u *name, char_u **varname)
|
||||
if (ht != NULL)
|
||||
return ht; // local variable
|
||||
|
||||
// in Vim9 script items at the script level are script-local
|
||||
if (in_vim9script())
|
||||
// In Vim9 script items at the script level are script-local, except
|
||||
// for autoload names.
|
||||
if (in_vim9script() && vim_strchr(name, AUTOLOAD_CHAR) == NULL)
|
||||
{
|
||||
ht = get_script_local_ht();
|
||||
if (ht != NULL)
|
||||
|
||||
@@ -6,31 +6,31 @@
|
||||
static const unsigned short cmdidxs1[26] =
|
||||
{
|
||||
/* a */ 0,
|
||||
/* b */ 19,
|
||||
/* c */ 43,
|
||||
/* d */ 110,
|
||||
/* e */ 135,
|
||||
/* f */ 162,
|
||||
/* g */ 179,
|
||||
/* h */ 185,
|
||||
/* i */ 194,
|
||||
/* j */ 213,
|
||||
/* k */ 215,
|
||||
/* l */ 220,
|
||||
/* m */ 283,
|
||||
/* n */ 301,
|
||||
/* o */ 321,
|
||||
/* p */ 333,
|
||||
/* q */ 372,
|
||||
/* r */ 375,
|
||||
/* s */ 395,
|
||||
/* t */ 464,
|
||||
/* u */ 510,
|
||||
/* v */ 521,
|
||||
/* w */ 542,
|
||||
/* x */ 556,
|
||||
/* y */ 566,
|
||||
/* z */ 567
|
||||
/* b */ 20,
|
||||
/* c */ 44,
|
||||
/* d */ 111,
|
||||
/* e */ 136,
|
||||
/* f */ 164,
|
||||
/* g */ 181,
|
||||
/* h */ 187,
|
||||
/* i */ 196,
|
||||
/* j */ 216,
|
||||
/* k */ 218,
|
||||
/* l */ 223,
|
||||
/* m */ 286,
|
||||
/* n */ 304,
|
||||
/* o */ 324,
|
||||
/* p */ 336,
|
||||
/* q */ 375,
|
||||
/* r */ 378,
|
||||
/* s */ 398,
|
||||
/* t */ 468,
|
||||
/* u */ 514,
|
||||
/* v */ 525,
|
||||
/* w */ 546,
|
||||
/* x */ 560,
|
||||
/* y */ 570,
|
||||
/* z */ 571
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -41,15 +41,15 @@ static const unsigned short cmdidxs1[26] =
|
||||
*/
|
||||
static const unsigned char cmdidxs2[26][26] =
|
||||
{ /* a b c d e f g h i j k l m n o p q r s t u v w x y z */
|
||||
/* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 7, 15, 0, 16, 0, 0, 0, 0, 0 },
|
||||
/* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 8, 16, 0, 17, 0, 0, 0, 0, 0 },
|
||||
/* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 },
|
||||
/* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 },
|
||||
/* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 },
|
||||
/* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 22, 0, 0 },
|
||||
/* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, 0, 0, 0, 0, 0, 0, 0, 22, 0, 23, 0, 0 },
|
||||
/* f */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0 },
|
||||
/* g */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 4, 5, 0, 0, 0, 0 },
|
||||
/* h */ { 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
/* i */ { 1, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 5, 6, 0, 0, 0, 0, 0, 14, 0, 16, 0, 0, 0, 0, 0 },
|
||||
/* i */ { 1, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 5, 6, 0, 0, 0, 0, 0, 15, 0, 17, 0, 0, 0, 0, 0 },
|
||||
/* j */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
|
||||
/* k */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
/* l */ { 3, 11, 15, 19, 20, 25, 28, 33, 0, 0, 0, 35, 38, 41, 45, 51, 0, 53, 62, 54, 55, 59, 61, 0, 0, 0 },
|
||||
@@ -59,7 +59,7 @@ static const unsigned char cmdidxs2[26][26] =
|
||||
/* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 },
|
||||
/* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
/* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 },
|
||||
/* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 50, 0, 51, 0, 63, 64, 0, 65, 0 },
|
||||
/* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 50, 0, 51, 0, 64, 65, 0, 66, 0 },
|
||||
/* t */ { 2, 0, 19, 0, 24, 26, 0, 27, 0, 28, 0, 29, 33, 36, 38, 39, 0, 40, 42, 0, 43, 0, 0, 0, 45, 0 },
|
||||
/* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
/* v */ { 1, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 12, 15, 0, 0, 0, 0, 18, 0, 19, 0, 0, 0, 0, 0 },
|
||||
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
|
||||
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static const int command_count = 584;
|
||||
static const int command_count = 588;
|
||||
|
||||
@@ -122,6 +122,9 @@ EXCMD(CMD_abclear, "abclear", ex_abclear,
|
||||
EXCMD(CMD_aboveleft, "aboveleft", ex_wrongmodifier,
|
||||
EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_abstract, "abstract", ex_ni,
|
||||
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_all, "all", ex_all,
|
||||
EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR,
|
||||
ADDR_OTHER),
|
||||
@@ -551,6 +554,9 @@ EXCMD(CMD_emenu, "emenu", ex_emenu,
|
||||
EXCMD(CMD_endif, "endif", ex_endif,
|
||||
EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_endinterface, "endinterface", ex_ni,
|
||||
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_endclass, "endclass", ex_ni,
|
||||
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
@@ -734,6 +740,9 @@ EXCMD(CMD_inoremenu, "inoremenu", ex_menu,
|
||||
EXCMD(CMD_intro, "intro", ex_intro,
|
||||
EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_interface, "interface", ex_ni,
|
||||
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_isearch, "isearch", ex_findpat,
|
||||
EX_BANG|EX_RANGE|EX_DFLALL|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_LINES),
|
||||
@@ -1463,6 +1472,9 @@ EXCMD(CMD_startgreplace, "startgreplace", ex_startinsert,
|
||||
EXCMD(CMD_startreplace, "startreplace", ex_startinsert,
|
||||
EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_static, "static", ex_ni,
|
||||
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
EXCMD(CMD_stopinsert, "stopinsert", ex_stopinsert,
|
||||
EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
|
||||
ADDR_NONE),
|
||||
|
||||
@@ -253,6 +253,9 @@ addEventHandler(GtkWidget *target, BalloonEval *beval)
|
||||
if (gtk_socket_id == 0 && gui.mainwin != NULL
|
||||
&& gtk_widget_is_ancestor(target, gui.mainwin))
|
||||
{
|
||||
gtk_widget_add_events(gui.mainwin,
|
||||
GDK_LEAVE_NOTIFY_MASK);
|
||||
|
||||
g_signal_connect(G_OBJECT(gui.mainwin), "event",
|
||||
G_CALLBACK(mainwin_event_cb),
|
||||
beval);
|
||||
@@ -360,6 +363,12 @@ mainwin_event_cb(GtkWidget *widget UNUSED, GdkEvent *event, gpointer data)
|
||||
case GDK_KEY_RELEASE:
|
||||
key_event(beval, event->key.keyval, FALSE);
|
||||
break;
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
// Ignore LeaveNotify events that are not "normal".
|
||||
// Apparently we also get it when somebody else grabs focus.
|
||||
if (event->crossing.mode == GDK_CROSSING_NORMAL)
|
||||
cancelBalloon(beval);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -184,6 +184,9 @@ typedef PySliceObject PySliceObject_T;
|
||||
# ifndef PyMapping_Keys
|
||||
# define PyMapping_Keys py3_PyMapping_Keys
|
||||
# endif
|
||||
# if PY_VERSION_HEX >= 0x030a00b2
|
||||
# define PyIter_Check py3_PyIter_Check
|
||||
# endif
|
||||
# define PyIter_Next py3_PyIter_Next
|
||||
# define PyObject_GetIter py3_PyObject_GetIter
|
||||
# define PyObject_Repr py3_PyObject_Repr
|
||||
@@ -358,6 +361,9 @@ static PyObject* (*py3_PyDict_GetItemString)(PyObject *, const char *);
|
||||
static int (*py3_PyDict_Next)(PyObject *, Py_ssize_t *, PyObject **, PyObject **);
|
||||
static PyObject* (*py3_PyLong_FromLong)(long);
|
||||
static PyObject* (*py3_PyDict_New)(void);
|
||||
# if PY_VERSION_HEX >= 0x030a00b2
|
||||
static int (*py3_PyIter_Check)(PyObject *o);
|
||||
# endif
|
||||
static PyObject* (*py3_PyIter_Next)(PyObject *);
|
||||
static PyObject* (*py3_PyObject_GetIter)(PyObject *);
|
||||
static PyObject* (*py3_PyObject_Repr)(PyObject *);
|
||||
@@ -538,6 +544,9 @@ static struct
|
||||
{"PyDict_Next", (PYTHON_PROC*)&py3_PyDict_Next},
|
||||
{"PyMapping_Check", (PYTHON_PROC*)&py3_PyMapping_Check},
|
||||
{"PyMapping_Keys", (PYTHON_PROC*)&py3_PyMapping_Keys},
|
||||
# if PY_VERSION_HEX >= 0x030a00b2
|
||||
{"PyIter_Check", (PYTHON_PROC*)&py3_PyIter_Check},
|
||||
# endif
|
||||
{"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next},
|
||||
{"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter},
|
||||
{"PyObject_Repr", (PYTHON_PROC*)&py3_PyObject_Repr},
|
||||
@@ -671,6 +680,15 @@ py3_PyType_HasFeature(PyTypeObject *type, unsigned long feature)
|
||||
# define PyType_HasFeature(t,f) py3_PyType_HasFeature(t,f)
|
||||
# endif
|
||||
|
||||
# if PY_VERSION_HEX >= 0x030a00b2
|
||||
static inline int
|
||||
py3__PyObject_TypeCheck(PyObject *ob, PyTypeObject *type)
|
||||
{
|
||||
return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type);
|
||||
}
|
||||
# define _PyObject_TypeCheck(o,t) py3__PyObject_TypeCheck(o,t)
|
||||
# endif
|
||||
|
||||
# ifdef MSWIN
|
||||
/*
|
||||
* Look up the library "libname" using the InstallPath registry key.
|
||||
|
||||
@@ -1531,7 +1531,7 @@ tclsetdelcmd(
|
||||
reflist = reflist->next;
|
||||
}
|
||||
// This should never happen. Famous last word?
|
||||
emsg(_("E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim.org"));
|
||||
iemsg(_("E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim.org"));
|
||||
Tcl_SetResult(interp, _("cannot register callback command: buffer/window reference not found"), TCL_STATIC);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -733,8 +733,7 @@ codepage_invalid:
|
||||
|
||||
// When using Unicode, set default for 'fileencodings'.
|
||||
if (enc_utf8 && !option_was_set((char_u *)"fencs"))
|
||||
set_string_option_direct((char_u *)"fencs", -1,
|
||||
(char_u *)"ucs-bom,utf-8,default,latin1", OPT_FREE, 0);
|
||||
set_fencs_unicode();
|
||||
|
||||
#if defined(HAVE_BIND_TEXTDOMAIN_CODESET) && defined(FEAT_GETTEXT)
|
||||
// GNU gettext 0.10.37 supports this feature: set the codeset used for
|
||||
|
||||
20
src/option.c
20
src/option.c
@@ -535,6 +535,19 @@ set_init_1(int clean_arg)
|
||||
#endif
|
||||
}
|
||||
|
||||
static char_u *fencs_utf8_default = (char_u *)"ucs-bom,utf-8,default,latin1";
|
||||
|
||||
/*
|
||||
* Set the "fileencodings" option to the default value for when 'encoding' is
|
||||
* utf-8.
|
||||
*/
|
||||
void
|
||||
set_fencs_unicode()
|
||||
{
|
||||
set_string_option_direct((char_u *)"fencs", -1, fencs_utf8_default,
|
||||
OPT_FREE, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set an option to its default value.
|
||||
* This does not take care of side effects!
|
||||
@@ -558,9 +571,12 @@ set_option_default(
|
||||
dvi = ((flags & P_VI_DEF) || compatible) ? VI_DEFAULT : VIM_DEFAULT;
|
||||
if (flags & P_STRING)
|
||||
{
|
||||
// 'fencs' default value depends on 'encoding'
|
||||
if (options[opt_idx].var == (char_u *)&p_fencs && enc_utf8)
|
||||
set_fencs_unicode();
|
||||
// Use set_string_option_direct() for local options to handle
|
||||
// freeing and allocating the value.
|
||||
if (options[opt_idx].indir != PV_NONE)
|
||||
else if (options[opt_idx].indir != PV_NONE)
|
||||
set_string_option_direct(NULL, opt_idx,
|
||||
options[opt_idx].def_val[dvi], opt_flags, 0);
|
||||
else
|
||||
@@ -1684,6 +1700,8 @@ do_set(
|
||||
#endif
|
||||
newval = term_bg_default();
|
||||
}
|
||||
else if ((char_u **)varp == &p_fencs && enc_utf8)
|
||||
newval = fencs_utf8_default;
|
||||
|
||||
// expand environment variables and ~ (since the
|
||||
// default value was already expanded, only
|
||||
|
||||
221
src/po/sr.po
221
src/po/sr.po
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Do ":help uganda" in Vim to read copying and usage conditions.
|
||||
# Do ":help credits" in Vim to see a list of people who contributed.
|
||||
# Copyright (C) 2017
|
||||
# Copyright (C) 2021
|
||||
# This file is distributed under the same license as the Vim package.
|
||||
# FIRST AUTHOR Ivan Pešić <ivan.pesic@gmail.com>, 2017.
|
||||
#
|
||||
@@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Vim(Serbian)\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-14 01:49+0400\n"
|
||||
"PO-Revision-Date: 2021-02-14 01:54+0400\n"
|
||||
"POT-Creation-Date: 2021-06-13 13:16+0400\n"
|
||||
"PO-Revision-Date: 2021-06-13 13:50+0400\n"
|
||||
"Last-Translator: Ivan Pešić <ivan.pesic@gmail.com>\n"
|
||||
"Language-Team: Serbian\n"
|
||||
"Language: sr\n"
|
||||
@@ -97,6 +97,9 @@ msgstr "Извршавање %s"
|
||||
msgid "autocommand %s"
|
||||
msgstr "аутокоманда %s"
|
||||
|
||||
msgid "E972: Blob value does not have the right number of bytes"
|
||||
msgstr "E972: Блоб вредност нема одговарајући број бајтова"
|
||||
|
||||
msgid "E831: bf_key_init() called with empty password"
|
||||
msgstr "E831: bf_key_init() је позвана са празном лозинком"
|
||||
|
||||
@@ -731,9 +734,6 @@ msgstr "E708: [:] мора да буде последња"
|
||||
msgid "E709: [:] requires a List or Blob value"
|
||||
msgstr "E709: [:] захтева вредност типа Листа или Блоб"
|
||||
|
||||
msgid "E972: Blob value does not have the right number of bytes"
|
||||
msgstr "E972: Блоб вредност нема одговарајући број бајтова"
|
||||
|
||||
msgid "E996: Cannot lock a range"
|
||||
msgstr "E996: Опсег не може да се закључа"
|
||||
|
||||
@@ -763,9 +763,6 @@ msgstr ""
|
||||
"\n"
|
||||
"\tПоследње постављено из "
|
||||
|
||||
msgid "E808: Number or Float required"
|
||||
msgstr "E808: Захтева се Број или Покретни"
|
||||
|
||||
#, c-format
|
||||
msgid "E158: Invalid buffer name: %s"
|
||||
msgstr "E158: Неисправно име бафера: %s"
|
||||
@@ -932,6 +929,10 @@ msgstr "E135: *Филтер* Аутокоманде не смеју да мењ
|
||||
msgid "[No write since last change]\n"
|
||||
msgstr "[Нема уписа од последње промене]\n"
|
||||
|
||||
#, c-format
|
||||
msgid "E503: \"%s\" is not a file or writable device"
|
||||
msgstr "E503: „%s” није фајл или уређај на који може да се уписује"
|
||||
|
||||
msgid "Save As"
|
||||
msgstr "Сачувај као"
|
||||
|
||||
@@ -1594,6 +1595,9 @@ msgstr "E446: Под курсором се не налази име фајла"
|
||||
msgid "E447: Can't find file \"%s\" in path"
|
||||
msgstr "E447: Фајл \"%s\" не може да се пронађе у путањи"
|
||||
|
||||
msgid "E808: Number or Float required"
|
||||
msgstr "E808: Захтева се Број или Покретни"
|
||||
|
||||
msgid "E490: No fold found"
|
||||
msgstr "E490: Није пронађен ниједан свијутак"
|
||||
|
||||
@@ -4069,12 +4073,12 @@ msgstr "E531: Користите \":gui\" да покренете ГКИ"
|
||||
msgid "E589: 'backupext' and 'patchmode' are equal"
|
||||
msgstr "E589: 'backupext' и 'patchmode' су истоветни"
|
||||
|
||||
msgid "E834: Conflicts with value of 'listchars'"
|
||||
msgstr "E834: У конфликту са вредношћу 'listchars'"
|
||||
|
||||
msgid "E835: Conflicts with value of 'fillchars'"
|
||||
msgstr "E835: У конфликту са вредношћу 'fillchars'"
|
||||
|
||||
msgid "E834: Conflicts with value of 'listchars'"
|
||||
msgstr "E834: У конфликту са вредношћу 'listchars'"
|
||||
|
||||
msgid "E617: Cannot be changed in the GTK+ 2 GUI"
|
||||
msgstr "E617: Не може да се промени у GTK+ 2 ГКИ"
|
||||
|
||||
@@ -4513,7 +4517,7 @@ msgstr "E554: Синтаксна грешка у %s{...}"
|
||||
|
||||
#, c-format
|
||||
msgid "E888: (NFA regexp) cannot repeat %s"
|
||||
msgstr "E888: (НКА регизраз) не може да се понови %s"
|
||||
msgstr "E888: (НКА регуларни израз) не може да се понови %s"
|
||||
|
||||
msgid ""
|
||||
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
|
||||
@@ -4579,15 +4583,15 @@ msgid "External submatches:\n"
|
||||
msgstr "Спољна подподударања:\n"
|
||||
|
||||
msgid "E865: (NFA) Regexp end encountered prematurely"
|
||||
msgstr "E865: (НКА) прерано је достигнут крај регизраза"
|
||||
msgstr "E865: (НКА) прерано је достигнут крај регуларног израза"
|
||||
|
||||
#, c-format
|
||||
msgid "E866: (NFA regexp) Misplaced %c"
|
||||
msgstr "E866: (НКА регизраз) %c је на погрешном месту"
|
||||
msgstr "E866: (НКА регуларни израз) %c је на погрешном месту"
|
||||
|
||||
#, c-format
|
||||
msgid "E877: (NFA regexp) Invalid character class: %d"
|
||||
msgstr "E877: (НКА регизраз) Неважећа карактер класа: %d"
|
||||
msgstr "E877: (НКА регуларни израз) Неважећа карактер класа: %d"
|
||||
|
||||
msgid "E951: \\% value too large"
|
||||
msgstr "E951: Вредност \\% је предугачка"
|
||||
@@ -4608,19 +4612,19 @@ msgid "E869: (NFA) Unknown operator '\\@%c'"
|
||||
msgstr "E869: (НКА) Непознати оператор '\\@%c'"
|
||||
|
||||
msgid "E870: (NFA regexp) Error reading repetition limits"
|
||||
msgstr "E870: (НКА регизраз) Грешка при читању граница понављања"
|
||||
msgstr "E870: (НКА регуларни израз) Грешка при читању граница понављања"
|
||||
|
||||
msgid "E871: (NFA regexp) Can't have a multi follow a multi"
|
||||
msgstr "E871: (НКА регизраз) Мулти не може следи иза мулти"
|
||||
msgstr "E871: (НКА регуларни израз) Мулти не може следи иза мулти"
|
||||
|
||||
msgid "E872: (NFA regexp) Too many '('"
|
||||
msgstr "E872: (НКА регизраз) Превише '('"
|
||||
msgstr "E872: (НКА регуларни израз) Превише '('"
|
||||
|
||||
msgid "E879: (NFA regexp) Too many \\z("
|
||||
msgstr "E879: (НКА регизраз) Превише \\z("
|
||||
msgstr "E879: (НКА регуларни израз) Превише \\z("
|
||||
|
||||
msgid "E873: (NFA regexp) proper termination error"
|
||||
msgstr "E873: (НКА регизраз) грешка правилне терминације"
|
||||
msgstr "E873: (НКА регуларни израз) грешка правилне терминације"
|
||||
|
||||
msgid "Could not open temporary log file for writing, displaying on stderr... "
|
||||
msgstr ""
|
||||
@@ -4634,12 +4638,12 @@ msgid ""
|
||||
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
|
||||
"left on stack"
|
||||
msgstr ""
|
||||
"E875: (НКА регизраз) (Док је вршена конверзија из постфикног облика у НКА), "
|
||||
"E875: (НКА регуларни израз) (Док је вршена конверзија из постфикног облика у НКА), "
|
||||
"превише стања је остало на стеку"
|
||||
|
||||
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
|
||||
msgstr ""
|
||||
"E876: (НКА регизраз) Нема довољно простора да се ускладишти комплетан НКА "
|
||||
"E876: (НКА регуларни израз) Нема довољно простора да се ускладишти комплетан НКА "
|
||||
|
||||
msgid "E878: (NFA) Could not allocate memory for branch traversal!"
|
||||
msgstr "E878: (НКА) Није могла да се алоцира меморија за обилазак грана!"
|
||||
@@ -6027,6 +6031,13 @@ msgstr "E853: Име аргумента је дуплирано: %s"
|
||||
msgid "E989: Non-default argument follows default argument"
|
||||
msgstr "E989: Неподразумевани аргумент следи иза подразумеваног аргумента"
|
||||
|
||||
msgid "E126: Missing :endfunction"
|
||||
msgstr "E126: Недостаје :endfunction"
|
||||
|
||||
#, c-format
|
||||
msgid "W22: Text found after :endfunction: %s"
|
||||
msgstr "W22: Пронађен текст након :endfunction: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E451: Expected }: %s"
|
||||
msgstr "E451: Очекује се }: %s"
|
||||
@@ -6102,17 +6113,6 @@ msgstr "E862: Овде не може да се користи g:"
|
||||
msgid "E932: Closure function should not be at top level: %s"
|
||||
msgstr "E932: Затварајућа функција не би требало да буде на највишем нивоу: %s"
|
||||
|
||||
msgid "E126: Missing :endfunction"
|
||||
msgstr "E126: Недостаје :endfunction"
|
||||
|
||||
#, c-format
|
||||
msgid "W1001: Text found after :enddef: %s"
|
||||
msgstr "W1001: Пронађен је текст након :enddef: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "W22: Text found after :endfunction: %s"
|
||||
msgstr "W22: Пронађен текст након :endfunction: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E707: Function name conflicts with variable: %s"
|
||||
msgstr "E707: Име функције је у конфликту са променљивом: %s"
|
||||
@@ -6635,25 +6635,25 @@ msgid "E366: Not allowed to enter a popup window"
|
||||
msgstr "E366: Није дозвољено да се уђе у искачући прозор"
|
||||
|
||||
msgid "Edit with &multiple Vims"
|
||||
msgstr "Уређуј са &више Vim-ова"
|
||||
msgstr "Уређуј са &више Vim програма"
|
||||
|
||||
msgid "Edit with single &Vim"
|
||||
msgstr "Уређуј са једним &Vim-ом"
|
||||
msgstr "Уређуј са једним програмом &Vim"
|
||||
|
||||
msgid "Diff with Vim"
|
||||
msgstr "Diff са Vim"
|
||||
msgstr "Diff са програмом Vim"
|
||||
|
||||
msgid "Edit with &Vim"
|
||||
msgstr "Уређуј са &Vim-ом"
|
||||
msgstr "Уређуј са програмом &Vim"
|
||||
|
||||
msgid "Edit with existing Vim"
|
||||
msgstr "Уређуј са постојећим Vim-ом"
|
||||
msgstr "Уређуј са постојећим програмом Vim"
|
||||
|
||||
msgid "Edit with existing Vim - "
|
||||
msgstr "Уређуј са постојећим Vim - "
|
||||
msgstr "Уређуј са постојећим програмом Vim - "
|
||||
|
||||
msgid "Edits the selected file(s) with Vim"
|
||||
msgstr "Уређује селектован(е) фајл(ове) са Vim-ом"
|
||||
msgstr "Уређује селектован(е) фајл(ове) програмом Vim"
|
||||
|
||||
msgid "Error creating process: Check if gvim is in your path!"
|
||||
msgstr ""
|
||||
@@ -6699,6 +6699,10 @@ msgstr ""
|
||||
"E856: \"assert_fails()\" други аргумент мора бити стринг или листа са једним "
|
||||
"или два стринга"
|
||||
|
||||
#, c-format
|
||||
msgid "E908: using an invalid value as a String: %s"
|
||||
msgstr "E908: Користи се неважећа вредност као Стринг: %s"
|
||||
|
||||
msgid "E909: Cannot index a special variable"
|
||||
msgstr "E909: Специјална променљива не може да се индексира"
|
||||
|
||||
@@ -7188,8 +7192,8 @@ msgid "E1143: Empty expression: \"%s\""
|
||||
msgstr "E1143: Празан израз: \"%s\""
|
||||
|
||||
#, c-format
|
||||
msgid "E1144: Command is not followed by white space: %s"
|
||||
msgstr "E1144: Иза команде се не налази празан простор: %s"
|
||||
msgid "E1144: Command \"%s\" is not followed by white space: %s"
|
||||
msgstr "E1144: Иза команде „%s” се не налази празан простор: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E1145: Missing heredoc end marker: %s"
|
||||
@@ -7242,7 +7246,8 @@ msgid "E1159: Cannot split a window when closing the buffer"
|
||||
msgstr "E1159: Прозор не може да се подели када се затвара бафер"
|
||||
|
||||
msgid "E1160: Cannot use a default for variable arguments"
|
||||
msgstr "E1160: За аргументе променљиве не може да се користи подразумевана вредност"
|
||||
msgstr ""
|
||||
"E1160: За аргументе променљиве не може да се користи подразумевана вредност"
|
||||
|
||||
#, c-format
|
||||
msgid "E1161: Cannot json encode a %s"
|
||||
@@ -7254,7 +7259,116 @@ msgstr "E1162: Име регистра мора бити један каракт
|
||||
|
||||
#, c-format
|
||||
msgid "E1163: Variable %d: type mismatch, expected %s but got %s"
|
||||
msgstr "E1163: Променљива %d: неодговарајући тип, очекује се %s али је наведено %s"
|
||||
msgstr ""
|
||||
"E1163: Променљива %d: неодговарајући тип, очекује се %s али је наведено %s"
|
||||
|
||||
msgid "E1164: vim9cmd must be followed by a command"
|
||||
msgstr "E1164: Иза vim9cmd мора да следи команда"
|
||||
|
||||
#, c-format
|
||||
msgid "E1165: Cannot use a range with an assignment: %s"
|
||||
msgstr "E1165: Опсег не може да се користи са доделом: %s"
|
||||
|
||||
msgid "E1166: Cannot use a range with a dictionary"
|
||||
msgstr "E1166: Опсег не може да се користи са речником"
|
||||
|
||||
#, c-format
|
||||
msgid "E1167: Argument name shadows existing variable: %s"
|
||||
msgstr "E1167: Име аргумента заклања постојећу променљиву: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E1168: Argument already declared in the script: %s"
|
||||
msgstr "E1168: Аргумент је већ декларисан у скрипти: %s"
|
||||
|
||||
msgid "E1169: 'import * as {name}' not supported here"
|
||||
msgstr "E1169: Овде се не подржава 'import * as {име}'"
|
||||
|
||||
msgid "E1170: Cannot use #{ to start a comment"
|
||||
msgstr "E1170: #{ не може да се користи за почетак коментара"
|
||||
|
||||
msgid "E1171: Missing } after inline function"
|
||||
msgstr "E1171: Након inline функције недостаје }"
|
||||
|
||||
msgid "E1172: Cannot use default values in a lambda"
|
||||
msgstr "E1172: Није могућа употреба подразумеваних вредности у ламбди"
|
||||
|
||||
#, c-format
|
||||
msgid "E1173: Text found after enddef: %s"
|
||||
msgstr "E1173: Пронађен је текст након enddef: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E1174: String required for argument %d"
|
||||
msgstr "E1174: Неопходан је стринг за аргумент %d"
|
||||
|
||||
#, c-format
|
||||
msgid "E1175: Non-empty string required for argument %d"
|
||||
msgstr "E1175: Неопходан је непразни стринг за аргумент %d"
|
||||
|
||||
msgid "E1176: Misplaced command modifier"
|
||||
msgstr "E1176: Модификатор команде није на одговарајућем месту"
|
||||
|
||||
#, c-format
|
||||
msgid "E1177: For loop on %s not supported"
|
||||
msgstr "E1177: Не подржава се for петља над %s"
|
||||
|
||||
msgid "E1178: Cannot lock or unlock a local variable"
|
||||
msgstr "E1178: Локална променљива не може да се закључа или откључа"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"E1179: Failed to extract PWD from %s, check your shell's config related to "
|
||||
"OSC 7"
|
||||
msgstr ""
|
||||
"E1179: Није успело издвајање PWD из %s, проверите подешавање командног окружења "
|
||||
"које се тиче OSC 7"
|
||||
|
||||
#, c-format
|
||||
msgid "E1180: Variable arguments type must be a list: %s"
|
||||
msgstr "E1180: Тип променљивих аргумената мора бити листа: %s"
|
||||
|
||||
msgid "E1181: Cannot use an underscore here"
|
||||
msgstr "E1181: Овде не може да се користи доња црта"
|
||||
|
||||
msgid "E1182: Blob required"
|
||||
msgstr "E1182: Потребан је Блоб"
|
||||
|
||||
#, c-format
|
||||
msgid "E1183: Cannot use a range with an assignment operator: %s"
|
||||
msgstr "E1183: Опсег не може да се користи са оператором доделе: %s"
|
||||
|
||||
msgid "E1184: Blob not set"
|
||||
msgstr "E1184: Blob није постављен"
|
||||
|
||||
msgid "E1185: Cannot nest :redir"
|
||||
msgstr "E1185: :redir не може да се угњеждава"
|
||||
|
||||
msgid "E1185: Missing :redir END"
|
||||
msgstr "E1185: Недостаје :redir END"
|
||||
|
||||
#, c-format
|
||||
msgid "E1186: Expression does not result in a value: %s"
|
||||
msgstr "E1186: Резултат израза није вредност: %s"
|
||||
|
||||
msgid "E1187: Failed to source defaults.vim"
|
||||
msgstr "E1187: Није успело учитавање defaults.vim"
|
||||
|
||||
msgid "E1188: Cannot open a terminal from the command line window"
|
||||
msgstr "E1188: Из прозора командне линије не може да се отвори терминал"
|
||||
|
||||
#, c-format
|
||||
msgid "E1189: Cannot use :legacy with this command: %s"
|
||||
msgstr "E1189: :legacy не може да се користи са овом командом: %s"
|
||||
|
||||
msgid "E1190: One argument too few"
|
||||
msgstr "E1190: Фали један аргумент"
|
||||
|
||||
#, c-format
|
||||
msgid "E1190: %d arguments too few"
|
||||
msgstr "E1190: фали %d аргумената"
|
||||
|
||||
#, c-format
|
||||
msgid "E1191: Call to function that failed to compile: %s"
|
||||
msgstr "E1191: Позив функције која није успела да се компајлира: %s"
|
||||
|
||||
msgid "--No lines in buffer--"
|
||||
msgstr "--У баферу нема линија--"
|
||||
@@ -7355,8 +7469,8 @@ msgid "E475: Invalid value for argument %s: %s"
|
||||
msgstr "E475: Неважећа вредност за аргумент %s: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "E15: Invalid expression: %s"
|
||||
msgstr "E15: Неважећи израз: %s"
|
||||
msgid "E15: Invalid expression: \"%s\""
|
||||
msgstr "E15: Неважећи израз: „%s”"
|
||||
|
||||
msgid "E16: Invalid range"
|
||||
msgstr "E16: Неважећи опсег"
|
||||
@@ -7591,9 +7705,6 @@ msgstr "E896: Аргумент за %s мора бити Листа, Речни
|
||||
msgid "E804: Cannot use '%' with Float"
|
||||
msgstr "E804: '%' не може да се користи са Покретни"
|
||||
|
||||
msgid "E908: using an invalid value as a String"
|
||||
msgstr "E908: Користи се недозвољена вредност као Стринг"
|
||||
|
||||
msgid "E996: Cannot lock an option"
|
||||
msgstr "E996: Опција не може да се закључа"
|
||||
|
||||
@@ -8133,6 +8244,9 @@ msgstr "Уређујте текст фајлове"
|
||||
msgid "Text;editor;"
|
||||
msgstr "Текст;едитор;"
|
||||
|
||||
msgid "gvim"
|
||||
msgstr "gvim"
|
||||
|
||||
msgid "Vim"
|
||||
msgstr "Vim"
|
||||
|
||||
@@ -8233,6 +8347,9 @@ msgstr "листа имена директоријума који се кори
|
||||
msgid "change to directory of file in buffer"
|
||||
msgstr "мења на директоријум фајла у баферу"
|
||||
|
||||
msgid "change to pwd of shell in terminal buffer"
|
||||
msgstr "мења на pwd командног окружења терминал баферу"
|
||||
|
||||
msgid "search commands wrap around the end of the buffer"
|
||||
msgstr "команде претраге се обавијају око краја бафера"
|
||||
|
||||
@@ -8245,7 +8362,7 @@ msgstr ""
|
||||
"претраге"
|
||||
|
||||
msgid "select the default regexp engine used"
|
||||
msgstr "бира подразумевани регизраз механизам"
|
||||
msgstr "бира подразумевани механизам регуларних израза"
|
||||
|
||||
msgid "ignore case when using a search pattern"
|
||||
msgstr "не прави разлику у величини слова када се користи шаблон претраге"
|
||||
@@ -8837,7 +8954,7 @@ msgid ""
|
||||
"\"autoselect\" to always put selected text on the clipboard"
|
||||
msgstr ""
|
||||
"„unnamed” да се користи * регистар као неименовани регистар\n"
|
||||
"„autoselect” да се изабрани текст увек ставља у клипборд"
|
||||
"„autoselect” да се изабрани текст увек ставља у системску оставу"
|
||||
|
||||
msgid "\"startsel\" and/or \"stopsel\"; what special keys can do"
|
||||
msgstr "„startsel” и/или „stopsel”; шта могу да ураде специјални тастери"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* option.c */
|
||||
void set_init_1(int clean_arg);
|
||||
void set_fencs_unicode(void);
|
||||
void set_string_default(char *name, char_u *val);
|
||||
void set_number_default(char *name, long val);
|
||||
void set_local_options_default(win_T *wp, int do_buffer);
|
||||
|
||||
@@ -3,7 +3,7 @@ int check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg);
|
||||
int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2);
|
||||
int use_typecheck(type_T *actual, type_T *expected);
|
||||
int need_type(type_T *actual, type_T *expected, int offset, int arg_idx, cctx_T *cctx, int silent, int actual_is_const);
|
||||
int func_needs_compiling(ufunc_T *ufunc, int profile);
|
||||
int func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type);
|
||||
int get_script_item_idx(int sid, char_u *name, int check_writable, cctx_T *cctx);
|
||||
imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx);
|
||||
imported_T *find_imported_in_script(char_u *name, size_t len, int sid);
|
||||
@@ -17,7 +17,7 @@ void fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx);
|
||||
int assignment_len(char_u *p, int *heredoc);
|
||||
void vim9_declare_error(char_u *name);
|
||||
int check_vim9_unlet(char_u *name);
|
||||
int compile_def_function(ufunc_T *ufunc, int check_return_type, int profiling, cctx_T *outer_cctx);
|
||||
int compile_def_function(ufunc_T *ufunc, int check_return_type, compiletype_T compile_type, cctx_T *outer_cctx);
|
||||
void set_function_type(ufunc_T *ufunc);
|
||||
void delete_instr(isn_T *isn);
|
||||
void unlink_def_function(ufunc_T *ufunc);
|
||||
|
||||
@@ -4,9 +4,12 @@ void funcstack_check_refcount(funcstack_T *funcstack);
|
||||
char_u *char_from_string(char_u *str, varnumber_T index);
|
||||
char_u *string_slice(char_u *str, varnumber_T first, varnumber_T last, int exclusive);
|
||||
int fill_partial_and_closure(partial_T *pt, ufunc_T *ufunc, ectx_T *ectx);
|
||||
typval_T *lookup_debug_var(char_u *name);
|
||||
int exe_typval_instr(typval_T *tv, typval_T *rettv);
|
||||
char_u *exe_substitute_instr(void);
|
||||
int call_def_function(ufunc_T *ufunc, int argc_arg, typval_T *argv, partial_T *partial, typval_T *rettv);
|
||||
void set_context_in_disassemble_cmd(expand_T *xp, char_u *arg);
|
||||
char_u *get_disassemble_argument(expand_T *xp, int idx);
|
||||
void ex_disassemble(exarg_T *eap);
|
||||
int tv2bool(typval_T *tv);
|
||||
void emsg_using_string_as(typval_T *tv, int as_number);
|
||||
|
||||
@@ -1119,6 +1119,7 @@ do_source(
|
||||
int save_debug_break_level = debug_break_level;
|
||||
int sid;
|
||||
scriptitem_T *si = NULL;
|
||||
int save_estack_compiling = estack_compiling;
|
||||
#endif
|
||||
#ifdef STARTUPTIME
|
||||
struct timeval tv_rel;
|
||||
@@ -1142,8 +1143,9 @@ do_source(
|
||||
smsg(_("Cannot source a directory: \"%s\""), fname);
|
||||
goto theend;
|
||||
}
|
||||
|
||||
#ifdef FEAT_EVAL
|
||||
estack_compiling = FALSE;
|
||||
|
||||
// See if we loaded this script before.
|
||||
for (sid = script_items.ga_len; sid > 0; --sid)
|
||||
{
|
||||
@@ -1508,6 +1510,9 @@ almosttheend:
|
||||
|
||||
theend:
|
||||
vim_free(fname_exp);
|
||||
#ifdef FEAT_EVAL
|
||||
estack_compiling = save_estack_compiling;
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -804,6 +804,22 @@ func Test_cmdline_complete_various()
|
||||
call feedkeys(":topleft new\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"topleft new", @:)
|
||||
|
||||
" completion for vim9 and legacy commands
|
||||
call feedkeys(":vim9 call strle\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"vim9 call strlen(", @:)
|
||||
call feedkeys(":legac call strle\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"legac call strlen(", @:)
|
||||
|
||||
" completion for the :disassemble command
|
||||
call feedkeys(":disas deb\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"disas debug", @:)
|
||||
call feedkeys(":disas pro\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"disas profile", @:)
|
||||
call feedkeys(":disas debug Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"disas debug Test_cmdline_complete_various", @:)
|
||||
call feedkeys(":disas profile Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"disas profile Test_cmdline_complete_various", @:)
|
||||
|
||||
" completion for the :match command
|
||||
call feedkeys(":match Search /pat/\<C-A>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal("\"match Search /pat/\<C-A>", @:)
|
||||
|
||||
@@ -853,6 +853,7 @@ func Test_Backtrace_DefFunction()
|
||||
enddef
|
||||
|
||||
def g:GlobalFunction()
|
||||
var some = "some var"
|
||||
CallAFunction()
|
||||
enddef
|
||||
|
||||
@@ -884,19 +885,22 @@ func Test_Backtrace_DefFunction()
|
||||
\ ':debug call GlobalFunction()',
|
||||
\ ['cmd: call GlobalFunction()'])
|
||||
|
||||
" FIXME: Vim9 lines are not debugged!
|
||||
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
||||
call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
|
||||
call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
|
||||
call RunDbgCmd(buf, 'echo some', ['some var'])
|
||||
|
||||
" But they do appear in the backtrace
|
||||
call RunDbgCmd(buf, 'backtrace', [
|
||||
\ '\V>backtrace',
|
||||
\ '\V 2 function GlobalFunction[1]',
|
||||
\ '\V 1 <SNR>\.\*_CallAFunction[1]',
|
||||
\ '\V->0 <SNR>\.\*_SourceAnotherFile',
|
||||
\ '\Vline 1: source Xtest2.vim'],
|
||||
\ '\V->0 function GlobalFunction',
|
||||
\ '\Vline 2: CallAFunction()',
|
||||
\ ],
|
||||
\ #{match: 'pattern'})
|
||||
|
||||
|
||||
call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
|
||||
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
||||
" Repeated line, because we fist are in the compiled function before the
|
||||
" EXEC and then in do_cmdline() before the :source command.
|
||||
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
||||
call RunDbgCmd(buf, 'step', ['line 1: vim9script'])
|
||||
call RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number'])
|
||||
call RunDbgCmd(buf, 'step', ['line 9: export def File2Function()'])
|
||||
@@ -905,7 +909,7 @@ func Test_Backtrace_DefFunction()
|
||||
call RunDbgCmd(buf, 'step', ['line 14: File2Function()'])
|
||||
call RunDbgCmd(buf, 'backtrace', [
|
||||
\ '\V>backtrace',
|
||||
\ '\V 3 function GlobalFunction[1]',
|
||||
\ '\V 3 function GlobalFunction[2]',
|
||||
\ '\V 2 <SNR>\.\*_CallAFunction[1]',
|
||||
\ '\V 1 <SNR>\.\*_SourceAnotherFile[1]',
|
||||
\ '\V->0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||
@@ -913,22 +917,48 @@ func Test_Backtrace_DefFunction()
|
||||
\ #{match: 'pattern'})
|
||||
|
||||
" Don't step into compiled functions...
|
||||
call RunDbgCmd(buf, 'step', ['line 15: End of sourced file'])
|
||||
call RunDbgCmd(buf, 'next', ['line 15: End of sourced file'])
|
||||
call RunDbgCmd(buf, 'backtrace', [
|
||||
\ '\V>backtrace',
|
||||
\ '\V 3 function GlobalFunction[1]',
|
||||
\ '\V 3 function GlobalFunction[2]',
|
||||
\ '\V 2 <SNR>\.\*_CallAFunction[1]',
|
||||
\ '\V 1 <SNR>\.\*_SourceAnotherFile[1]',
|
||||
\ '\V->0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||
\ '\Vline 15: End of sourced file'],
|
||||
\ #{match: 'pattern'})
|
||||
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('Xtest1.vim')
|
||||
call delete('Xtest2.vim')
|
||||
endfunc
|
||||
|
||||
func Test_debug_def_function()
|
||||
CheckCWD
|
||||
let file =<< trim END
|
||||
vim9script
|
||||
def g:Func()
|
||||
var n: number
|
||||
def Closure(): number
|
||||
return n + 3
|
||||
enddef
|
||||
n += Closure()
|
||||
echo 'result: ' .. n
|
||||
enddef
|
||||
END
|
||||
call writefile(file, 'Xtest.vim')
|
||||
|
||||
let buf = RunVimInTerminal('-S Xtest.vim', {})
|
||||
|
||||
call RunDbgCmd(buf,
|
||||
\ ':debug call Func()',
|
||||
\ ['cmd: call Func()'])
|
||||
call RunDbgCmd(buf, 'next', ['result: 3'])
|
||||
call term_sendkeys(buf, "\r")
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('Xtest.vim')
|
||||
endfunc
|
||||
|
||||
func Test_debug_backtrace_level()
|
||||
CheckCWD
|
||||
let lines =<< trim END
|
||||
@@ -1116,6 +1146,7 @@ func Test_debug_backtrace_level()
|
||||
\ [ 'E121: Undefined variable: s:file1_var' ] )
|
||||
call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] )
|
||||
|
||||
call RunDbgCmd(buf, 'cont')
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('Xtest1.vim')
|
||||
call delete('Xtest2.vim')
|
||||
|
||||
@@ -1871,4 +1871,28 @@ func Test_read_invalid()
|
||||
set encoding=utf-8
|
||||
endfunc
|
||||
|
||||
" Test for the 'revins' option
|
||||
func Test_edit_revins()
|
||||
CheckFeature rightleft
|
||||
new
|
||||
set revins
|
||||
exe "normal! ione\ttwo three"
|
||||
call assert_equal("eerht owt\teno", getline(1))
|
||||
call setline(1, "one\ttwo three")
|
||||
normal! gg$bi a
|
||||
call assert_equal("one\ttwo a three", getline(1))
|
||||
exe "normal! $bi\<BS>\<BS>"
|
||||
call assert_equal("one\ttwo a ree", getline(1))
|
||||
exe "normal! 0wi\<C-W>"
|
||||
call assert_equal("one\t a ree", getline(1))
|
||||
exe "normal! 0wi\<C-U>"
|
||||
call assert_equal("one\t ", getline(1))
|
||||
" newline in insert mode starts at the end of the line
|
||||
call setline(1, 'one two three')
|
||||
exe "normal! wi\nfour"
|
||||
call assert_equal(['one two three', 'ruof'], getline(1, '$'))
|
||||
set revins&
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -593,6 +593,12 @@ func Sandbox_tests()
|
||||
if has('unix')
|
||||
call assert_fails('cd `pwd`', 'E48:')
|
||||
endif
|
||||
" some options cannot be changed in a sandbox
|
||||
call assert_fails('set exrc', 'E48:')
|
||||
call assert_fails('set cdpath', 'E48:')
|
||||
if has('xim') && has('gui_gtk')
|
||||
call assert_fails('set imstyle', 'E48:')
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func Test_sandbox()
|
||||
|
||||
@@ -257,7 +257,7 @@ let s:filename_checks = {
|
||||
\ 'jgraph': ['file.jgr'],
|
||||
\ 'jovial': ['file.jov', 'file.j73', 'file.jovial'],
|
||||
\ 'jproperties': ['file.properties', 'file.properties_xx', 'file.properties_xx_xx', 'some.properties_xx_xx_file'],
|
||||
\ 'json': ['file.json', 'file.jsonp', 'file.webmanifest', 'Pipfile.lock'],
|
||||
\ 'json': ['file.json', 'file.jsonp', 'file.webmanifest', 'Pipfile.lock', 'file.ipynb'],
|
||||
\ 'jsp': ['file.jsp'],
|
||||
\ 'kconfig': ['Kconfig', 'Kconfig.debug', 'Kconfig.file'],
|
||||
\ 'kivy': ['file.kv'],
|
||||
|
||||
@@ -2174,9 +2174,11 @@ func Test_call()
|
||||
call assert_fails("call call('Mylen', [], 0)", 'E715:')
|
||||
call assert_fails('call foo', 'E107:')
|
||||
|
||||
" This once caused a crash.
|
||||
" These once caused a crash.
|
||||
call call(test_null_function(), [])
|
||||
call call(test_null_partial(), [])
|
||||
call assert_fails('call test_null_function()()', 'E1192:')
|
||||
call assert_fails('call test_null_partial()()', 'E117:')
|
||||
endfunc
|
||||
|
||||
func Test_char2nr()
|
||||
|
||||
@@ -123,5 +123,15 @@ func Test_helptag_cmd_readonly()
|
||||
call delete('Xdir', 'rf')
|
||||
endfunc
|
||||
|
||||
" Test for setting the 'helpheight' option in the help window
|
||||
func Test_help_window_height()
|
||||
let &cmdheight = &lines - 24
|
||||
set helpheight=10
|
||||
help
|
||||
set helpheight=14
|
||||
call assert_equal(14, winheight(0))
|
||||
set helpheight& cmdheight=1
|
||||
close
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -485,6 +485,11 @@ func Test_list_mappings()
|
||||
call assert_equal(['n ,k <Nop>'],
|
||||
\ execute('nmap ,k')->trim()->split("\n"))
|
||||
|
||||
" map with space at the beginning
|
||||
exe "nmap \<C-V> w <Nop>"
|
||||
call assert_equal(['n <Space>w <Nop>'],
|
||||
\ execute("nmap \<C-V> w")->trim()->split("\n"))
|
||||
|
||||
nmapclear
|
||||
endfunc
|
||||
|
||||
@@ -1411,4 +1416,19 @@ func Test_abbreviate_multi_byte()
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" Test for abbreviations with 'latin1' encoding
|
||||
func Test_abbreviate_latin1_encoding()
|
||||
set encoding=latin1
|
||||
call assert_fails('abbr ab#$c ABC', 'E474:')
|
||||
new
|
||||
iabbr <buffer> #i #include
|
||||
iabbr <buffer> ## #enddef
|
||||
exe "normal i#i\<C-]>"
|
||||
call assert_equal('#include', getline(1))
|
||||
exe "normal 0Di##\<C-]>"
|
||||
call assert_equal('#enddef', getline(1))
|
||||
%bw!
|
||||
set encoding=utf-8
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -1019,6 +1019,19 @@ func Test_mkvimrc()
|
||||
endfor
|
||||
|
||||
call s:ClearMappings()
|
||||
|
||||
" the 'pastetoggle', 'wildchar' and 'wildcharm' option values should be
|
||||
" stored as key names in the vimrc file
|
||||
set pastetoggle=<F5>
|
||||
set wildchar=<F6>
|
||||
set wildcharm=<F7>
|
||||
call assert_fails('mkvimrc Xtestvimrc')
|
||||
mkvimrc! Xtestvimrc
|
||||
call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set pastetoggle=<F5>'))
|
||||
call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildchar=<F6>'))
|
||||
call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildcharm=<F7>'))
|
||||
set pastetoggle& wildchar& wildcharm&
|
||||
|
||||
call delete('Xtestvimrc')
|
||||
endfunc
|
||||
|
||||
|
||||
@@ -334,4 +334,30 @@ func Test_modeline_setoption_verbose()
|
||||
call delete('Xmodeline')
|
||||
endfunc
|
||||
|
||||
" Test for the 'modeline' default value in compatible and non-compatible modes
|
||||
" for root and non-root accounts
|
||||
func Test_modeline_default()
|
||||
set compatible
|
||||
call assert_false(&modeline)
|
||||
set nocompatible
|
||||
call assert_equal(IsRoot() ? 0 : 1, &modeline)
|
||||
set compatible&vi
|
||||
call assert_false(&modeline)
|
||||
set compatible&vim
|
||||
call assert_equal(IsRoot() ? 0 : 1, &modeline)
|
||||
set compatible& modeline&
|
||||
endfunc
|
||||
|
||||
" Some options cannot be set from the modeline when 'diff' option is set
|
||||
func Test_modeline_diff_buffer()
|
||||
call writefile(['vim: diff foldmethod=marker wrap'], 'Xfile')
|
||||
set foldmethod& nowrap
|
||||
new Xfile
|
||||
call assert_equal('manual', &foldmethod)
|
||||
call assert_false(&wrap)
|
||||
set wrap&
|
||||
call delete('Xfile')
|
||||
bw
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -434,6 +434,7 @@ func Test_set_errors()
|
||||
set nomodifiable
|
||||
call assert_fails('set fileencoding=latin1', 'E21:')
|
||||
set modifiable&
|
||||
call assert_fails('set t_#-&', 'E522:')
|
||||
endfunc
|
||||
|
||||
func CheckWasSet(name)
|
||||
@@ -946,6 +947,18 @@ func Test_opt_local_to_global()
|
||||
call assert_equal('gnewprg', &l:equalprg)
|
||||
call assert_equal('gnewprg', &equalprg)
|
||||
set equalprg&
|
||||
|
||||
" Test for setting the global/local value of a boolean option
|
||||
setglobal autoread
|
||||
setlocal noautoread
|
||||
call assert_false(&autoread)
|
||||
set autoread<
|
||||
call assert_true(&autoread)
|
||||
setglobal noautoread
|
||||
setlocal autoread
|
||||
setlocal autoread<
|
||||
call assert_false(&autoread)
|
||||
set autoread&
|
||||
endfunc
|
||||
|
||||
" Test for incrementing, decrementing and multiplying a number option value
|
||||
@@ -1121,4 +1134,47 @@ func Test_VIM_POSIX()
|
||||
call setenv('VIM_POSIX', saved_VIM_POSIX)
|
||||
endfunc
|
||||
|
||||
" Test for setting an option to a Vi or Vim default
|
||||
func Test_opt_default()
|
||||
set formatoptions&vi
|
||||
call assert_equal('vt', &formatoptions)
|
||||
set formatoptions&vim
|
||||
call assert_equal('tcq', &formatoptions)
|
||||
|
||||
call assert_equal('ucs-bom,utf-8,default,latin1', &fencs)
|
||||
set fencs=latin1
|
||||
set fencs&
|
||||
call assert_equal('ucs-bom,utf-8,default,latin1', &fencs)
|
||||
set fencs=latin1
|
||||
set all&
|
||||
call assert_equal('ucs-bom,utf-8,default,latin1', &fencs)
|
||||
endfunc
|
||||
|
||||
" Test for the 'cmdheight' option
|
||||
func Test_cmdheight()
|
||||
%bw!
|
||||
let ht = &lines
|
||||
set cmdheight=9999
|
||||
call assert_equal(1, winheight(0))
|
||||
call assert_equal(ht - 1, &cmdheight)
|
||||
set cmdheight&
|
||||
endfunc
|
||||
|
||||
" To specify a control character as a option value, '^' can be used
|
||||
func Test_opt_control_char()
|
||||
set wildchar=^v
|
||||
call assert_equal("\<C-V>", nr2char(&wildchar))
|
||||
set wildcharm=^r
|
||||
call assert_equal("\<C-R>", nr2char(&wildcharm))
|
||||
" Bug: This doesn't work for the 'cedit' and 'termwinkey' options
|
||||
set wildchar& wildcharm&
|
||||
endfunc
|
||||
|
||||
" Test for the 'errorbells' option
|
||||
func Test_opt_errorbells()
|
||||
set errorbells
|
||||
call assert_beeps('s/a1b2/x1y2/')
|
||||
set noerrorbells
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -159,8 +159,68 @@ func Test_pastetoggle()
|
||||
call feedkeys("i\<F4>", 'xt')
|
||||
call assert_false(&paste)
|
||||
call assert_equal('Hello', getline(1))
|
||||
" command-line completion for 'pastetoggle' value
|
||||
call feedkeys(":set pastetoggle=\<Tab>\<C-B>\"\<CR>", 'xt')
|
||||
call assert_equal('"set pastetoggle=<F4>', @:)
|
||||
set pastetoggle&
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" Test for restoring option values when 'paste' is disabled
|
||||
func Test_paste_opt_restore()
|
||||
set autoindent expandtab ruler showmatch
|
||||
if has('rightleft')
|
||||
set revins hkmap
|
||||
endif
|
||||
set smarttab softtabstop=3 textwidth=27 wrapmargin=12
|
||||
if has('vartabs')
|
||||
set varsofttabstop=10,20
|
||||
endif
|
||||
|
||||
" enabling 'paste' should reset the above options
|
||||
set paste
|
||||
call assert_false(&autoindent)
|
||||
call assert_false(&expandtab)
|
||||
if has('rightleft')
|
||||
call assert_false(&revins)
|
||||
call assert_false(&hkmap)
|
||||
endif
|
||||
call assert_false(&ruler)
|
||||
call assert_false(&showmatch)
|
||||
call assert_false(&smarttab)
|
||||
call assert_equal(0, &softtabstop)
|
||||
call assert_equal(0, &textwidth)
|
||||
call assert_equal(0, &wrapmargin)
|
||||
if has('vartabs')
|
||||
call assert_equal('', &varsofttabstop)
|
||||
endif
|
||||
|
||||
" disabling 'paste' should restore the option values
|
||||
set nopaste
|
||||
call assert_true(&autoindent)
|
||||
call assert_true(&expandtab)
|
||||
if has('rightleft')
|
||||
call assert_true(&revins)
|
||||
call assert_true(&hkmap)
|
||||
endif
|
||||
call assert_true(&ruler)
|
||||
call assert_true(&showmatch)
|
||||
call assert_true(&smarttab)
|
||||
call assert_equal(3, &softtabstop)
|
||||
call assert_equal(27, &textwidth)
|
||||
call assert_equal(12, &wrapmargin)
|
||||
if has('vartabs')
|
||||
call assert_equal('10,20', &varsofttabstop)
|
||||
endif
|
||||
|
||||
set autoindent& expandtab& ruler& showmatch&
|
||||
if has('rightleft')
|
||||
set revins& hkmap&
|
||||
endif
|
||||
set smarttab& softtabstop& textwidth& wrapmargin&
|
||||
if has('vartabs')
|
||||
set varsofttabstop&
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -1552,6 +1552,7 @@ func Test_popup_filter()
|
||||
call assert_equal(9, getcurpos()[2])
|
||||
call feedkeys('0', 'xt')
|
||||
call assert_equal('0', g:ignored)
|
||||
redraw
|
||||
call assert_equal(1, getcurpos()[2])
|
||||
|
||||
" x closes the popup
|
||||
|
||||
@@ -198,103 +198,102 @@ func Test_recover_corrupted_swap_file()
|
||||
let b = readblob(sn)
|
||||
let save_b = copy(b)
|
||||
bw!
|
||||
" Run these tests only on little-endian systems. These tests fail on a
|
||||
" big-endian system (IBM S390x system).
|
||||
if b[1008:1011] == 0z33323130
|
||||
\ && b[4096:4097] == 0z7470
|
||||
\ && b[8192:8193] == 0z6164
|
||||
|
||||
" clear the B0_MAGIC_LONG field
|
||||
let b[1008:1011] = 0z00000000
|
||||
call writefile(b, sn)
|
||||
let msg = execute('recover Xfile1')
|
||||
call assert_match('the file has been damaged', msg)
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
" Not all fields are written in a system-independent manner. Detect whether
|
||||
" the test is running on a little or big-endian system, so the correct
|
||||
" corruption values can be set.
|
||||
let little_endian = b[1008:1015] == 0z33323130.00000000
|
||||
|
||||
" reduce the page size
|
||||
let b = copy(save_b)
|
||||
let b[12:15] = 0z00010000
|
||||
call writefile(b, sn)
|
||||
let msg = execute('recover Xfile1')
|
||||
call assert_match('page size is smaller than minimum value', msg)
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
" clear the B0_MAGIC_LONG field
|
||||
let b[1008:1015] = 0z0000000000000000
|
||||
call writefile(b, sn)
|
||||
let msg = execute('recover Xfile1')
|
||||
call assert_match('the file has been damaged', msg)
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" clear the pointer ID
|
||||
let b = copy(save_b)
|
||||
let b[4096:4097] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E310:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
" reduce the page size
|
||||
let b = copy(save_b)
|
||||
let b[12:15] = 0z00010000
|
||||
call writefile(b, sn)
|
||||
let msg = execute('recover Xfile1')
|
||||
call assert_match('page size is smaller than minimum value', msg)
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" set the number of pointers in a pointer block to zero
|
||||
let b = copy(save_b)
|
||||
let b[4098:4099] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???EMPTY BLOCK'], getline(1, '$'))
|
||||
bw!
|
||||
" clear the pointer ID
|
||||
let b = copy(save_b)
|
||||
let b[4096:4097] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E310:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal([''], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" set the block number in a pointer entry to a negative number
|
||||
let b = copy(save_b)
|
||||
let b[4104:4111] = 0z00000000.00000080
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???LINES MISSING'], getline(1, '$'))
|
||||
bw!
|
||||
" set the number of pointers in a pointer block to zero
|
||||
let b = copy(save_b)
|
||||
let b[4098:4099] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???EMPTY BLOCK'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" clear the data block ID
|
||||
let b = copy(save_b)
|
||||
let b[8192:8193] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???BLOCK MISSING'], getline(1, '$'))
|
||||
bw!
|
||||
" set the block number in a pointer entry to a negative number
|
||||
let b = copy(save_b)
|
||||
let b[4104:4111] = little_endian ? 0z00000000.00000080 : 0z80000000.00000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???LINES MISSING'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" set the number of lines in the data block to zero
|
||||
let b = copy(save_b)
|
||||
let b[8208:8211] = 0z00000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['??? from here until ???END lines may have been inserted/deleted',
|
||||
\ '???END'], getline(1, '$'))
|
||||
bw!
|
||||
" clear the data block ID
|
||||
let b = copy(save_b)
|
||||
let b[8192:8193] = 0z0000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???BLOCK MISSING'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" use an invalid text start for the lines in a data block
|
||||
let b = copy(save_b)
|
||||
let b[8216:8219] = 0z00000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???'], getline(1, '$'))
|
||||
bw!
|
||||
" set the number of lines in the data block to zero
|
||||
let b = copy(save_b)
|
||||
let b[8208:8215] = 0z00000000.00000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['??? from here until ???END lines may have been inserted/deleted',
|
||||
\ '???END'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" use an incorrect text end (db_txt_end) for the data block
|
||||
let b = copy(save_b)
|
||||
let b[8204:8207] = 0z80000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['??? from here until ???END lines may be messed up', '',
|
||||
\ '???END'], getline(1, '$'))
|
||||
bw!
|
||||
" use an invalid text start for the lines in a data block
|
||||
let b = copy(save_b)
|
||||
let b[8216:8219] = 0z00000000
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" remove the data block
|
||||
let b = copy(save_b)
|
||||
call writefile(b[:8191], sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???MANY LINES MISSING'], getline(1, '$'))
|
||||
endif
|
||||
" use an incorrect text end (db_txt_end) for the data block
|
||||
let b = copy(save_b)
|
||||
let b[8204:8207] = little_endian ? 0z80000000 : 0z00000080
|
||||
call writefile(b, sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['??? from here until ???END lines may be messed up', '',
|
||||
\ '???END'], getline(1, '$'))
|
||||
bw!
|
||||
|
||||
" remove the data block
|
||||
let b = copy(save_b)
|
||||
call writefile(b[:8191], sn)
|
||||
call assert_fails('recover Xfile1', 'E312:')
|
||||
call assert_equal('Xfile1', @%)
|
||||
call assert_equal(['???MANY LINES MISSING'], getline(1, '$'))
|
||||
|
||||
bw!
|
||||
call delete(sn)
|
||||
|
||||
@@ -419,4 +419,17 @@ func Test_varsofttabstop()
|
||||
close!
|
||||
endfunc
|
||||
|
||||
" Setting 'shiftwidth' to a negative value, should set it to either the value
|
||||
" of 'tabstop' (if 'vartabstop' is not set) or to the first value in
|
||||
" 'vartabstop'
|
||||
func Test_shiftwidth_vartabstop()
|
||||
setlocal tabstop=7 vartabstop=
|
||||
call assert_fails('set shiftwidth=-1', 'E487:')
|
||||
call assert_equal(7, &shiftwidth)
|
||||
setlocal tabstop=7 vartabstop=5,7,10
|
||||
call assert_fails('set shiftwidth=-1', 'E487:')
|
||||
call assert_equal(5, &shiftwidth)
|
||||
setlocal shiftwidth& vartabstop& tabstop&
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -982,6 +982,8 @@ def Test_assignment_failure()
|
||||
|
||||
CheckDefFailure(['var true = 1'], 'E1034:')
|
||||
CheckDefFailure(['var false = 1'], 'E1034:')
|
||||
CheckDefFailure(['var null = 1'], 'E1034:')
|
||||
CheckDefFailure(['var this = 1'], 'E1034:')
|
||||
|
||||
CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
|
||||
CheckDefExecFailure(['var a: number',
|
||||
|
||||
@@ -2146,6 +2146,7 @@ enddef
|
||||
|
||||
def s:Profiled(): string
|
||||
echo "profiled"
|
||||
var some = "some text"
|
||||
return "done"
|
||||
enddef
|
||||
|
||||
@@ -2153,18 +2154,41 @@ def Test_profiled()
|
||||
if !has('profile')
|
||||
MissingFeature 'profile'
|
||||
endif
|
||||
var res = execute('disass! s:Profiled')
|
||||
var res = execute('disass profile s:Profiled')
|
||||
assert_match('<SNR>\d*_Profiled\_s*' ..
|
||||
'echo "profiled"\_s*' ..
|
||||
'\d PROFILE START line 1\_s*' ..
|
||||
'\d PUSHS "profiled"\_s*' ..
|
||||
'\d ECHO 1\_s*' ..
|
||||
'return "done"\_s*' ..
|
||||
'var some = "some text"\_s*' ..
|
||||
'\d PROFILE END\_s*' ..
|
||||
'\d PROFILE START line 2\_s*' ..
|
||||
'\d PUSHS "some text"\_s*' ..
|
||||
'\d STORE $0\_s*' ..
|
||||
'return "done"\_s*' ..
|
||||
'\d PROFILE END\_s*' ..
|
||||
'\d PROFILE START line 3\_s*' ..
|
||||
'\d PUSHS "done"\_s*' ..
|
||||
'\d RETURN\_s*' ..
|
||||
'\d PROFILE END',
|
||||
'\d\+ RETURN\_s*' ..
|
||||
'\d\+ PROFILE END',
|
||||
res)
|
||||
enddef
|
||||
|
||||
def Test_debugged()
|
||||
var res = execute('disass debug s:Profiled')
|
||||
assert_match('<SNR>\d*_Profiled\_s*' ..
|
||||
'echo "profiled"\_s*' ..
|
||||
'\d DEBUG line 1 varcount 0\_s*' ..
|
||||
'\d PUSHS "profiled"\_s*' ..
|
||||
'\d ECHO 1\_s*' ..
|
||||
'var some = "some text"\_s*' ..
|
||||
'\d DEBUG line 2 varcount 0\_s*' ..
|
||||
'\d PUSHS "some text"\_s*' ..
|
||||
'\d STORE $0\_s*' ..
|
||||
'return "done"\_s*' ..
|
||||
'\d DEBUG line 3 varcount 1\_s*' ..
|
||||
'\d PUSHS "done"\_s*' ..
|
||||
'\d RETURN\_s*',
|
||||
res)
|
||||
enddef
|
||||
|
||||
|
||||
@@ -114,6 +114,34 @@ def Test_autoload_name_mismatch()
|
||||
delete(dir, 'rf')
|
||||
enddef
|
||||
|
||||
def Test_autoload_names()
|
||||
var dir = 'Xdir/autoload'
|
||||
mkdir(dir, 'p')
|
||||
|
||||
var lines =<< trim END
|
||||
func foobar#function()
|
||||
return 'yes'
|
||||
endfunc
|
||||
let foobar#var = 'no'
|
||||
END
|
||||
writefile(lines, dir .. '/foobar.vim')
|
||||
|
||||
var save_rtp = &rtp
|
||||
exe 'set rtp=' .. getcwd() .. '/Xdir'
|
||||
|
||||
lines =<< trim END
|
||||
assert_equal('yes', foobar#function())
|
||||
var Function = foobar#function
|
||||
assert_equal('yes', Function())
|
||||
|
||||
assert_equal('no', foobar#var)
|
||||
END
|
||||
CheckDefAndScriptSuccess(lines)
|
||||
|
||||
&rtp = save_rtp
|
||||
delete(dir, 'rf')
|
||||
enddef
|
||||
|
||||
def CallRecursive(n: number): number
|
||||
return CallRecursive(n + 1)
|
||||
enddef
|
||||
@@ -920,6 +948,26 @@ def Test_lambda_return_type()
|
||||
echo FilterWithCond('foo', (v) => v .. '^b')
|
||||
END
|
||||
CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected func(string): bool but got func(any): string', 1)
|
||||
|
||||
lines =<< trim END
|
||||
var Lambda1 = (x) => {
|
||||
return x
|
||||
}
|
||||
assert_equal('asdf', Lambda1('asdf'))
|
||||
var Lambda2 = (x): string => {
|
||||
return x
|
||||
}
|
||||
assert_equal('foo', Lambda2('foo'))
|
||||
END
|
||||
CheckDefAndScriptSuccess(lines)
|
||||
|
||||
lines =<< trim END
|
||||
var Lambda = (x): string => {
|
||||
return x
|
||||
}
|
||||
echo Lambda(['foo'])
|
||||
END
|
||||
CheckDefExecAndScriptFailure(lines, 'E1012:')
|
||||
enddef
|
||||
|
||||
def Test_lambda_uses_assigned_var()
|
||||
|
||||
@@ -397,7 +397,15 @@ func Test_window_width()
|
||||
call assert_inrange(ww1, ww1 + 1, ww2)
|
||||
call assert_inrange(ww3, ww3 + 1, ww2)
|
||||
|
||||
bw Xa Xb Xc
|
||||
" when the current window width is less than the new 'winwidth', the current
|
||||
" window width should be increased.
|
||||
enew | only
|
||||
split
|
||||
10vnew
|
||||
set winwidth=15
|
||||
call assert_equal(15, winwidth(0))
|
||||
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
func Test_equalalways_on_close()
|
||||
|
||||
@@ -1377,7 +1377,7 @@ get_lambda_tv(
|
||||
goto errret;
|
||||
}
|
||||
else
|
||||
fp->uf_ret_type = &t_any;
|
||||
fp->uf_ret_type = &t_unknown;
|
||||
}
|
||||
|
||||
fp->uf_lines = newlines;
|
||||
@@ -4395,7 +4395,7 @@ ex_defcompile(exarg_T *eap UNUSED)
|
||||
&& ufunc->uf_def_status == UF_TO_BE_COMPILED
|
||||
&& (ufunc->uf_flags & FC_DEAD) == 0)
|
||||
{
|
||||
(void)compile_def_function(ufunc, FALSE, FALSE, NULL);
|
||||
(void)compile_def_function(ufunc, FALSE, CT_NONE, NULL);
|
||||
|
||||
if (func_hashtab.ht_changed != changed)
|
||||
{
|
||||
|
||||
@@ -750,6 +750,64 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
3003,
|
||||
/**/
|
||||
3002,
|
||||
/**/
|
||||
3001,
|
||||
/**/
|
||||
3000,
|
||||
/**/
|
||||
2999,
|
||||
/**/
|
||||
2998,
|
||||
/**/
|
||||
2997,
|
||||
/**/
|
||||
2996,
|
||||
/**/
|
||||
2995,
|
||||
/**/
|
||||
2994,
|
||||
/**/
|
||||
2993,
|
||||
/**/
|
||||
2992,
|
||||
/**/
|
||||
2991,
|
||||
/**/
|
||||
2990,
|
||||
/**/
|
||||
2989,
|
||||
/**/
|
||||
2988,
|
||||
/**/
|
||||
2987,
|
||||
/**/
|
||||
2986,
|
||||
/**/
|
||||
2985,
|
||||
/**/
|
||||
2984,
|
||||
/**/
|
||||
2983,
|
||||
/**/
|
||||
2982,
|
||||
/**/
|
||||
2981,
|
||||
/**/
|
||||
2980,
|
||||
/**/
|
||||
2979,
|
||||
/**/
|
||||
2978,
|
||||
/**/
|
||||
2977,
|
||||
/**/
|
||||
2976,
|
||||
/**/
|
||||
2975,
|
||||
/**/
|
||||
2974,
|
||||
/**/
|
||||
|
||||
13
src/vim.h
13
src/vim.h
@@ -777,6 +777,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
|
||||
#define EXPAND_MAPCLEAR 47
|
||||
#define EXPAND_ARGLIST 48
|
||||
#define EXPAND_DIFF_BUFFERS 49
|
||||
#define EXPAND_DISASSEMBLE 50
|
||||
|
||||
// Values for exmode_active (0 is no exmode)
|
||||
#define EXMODE_NORMAL 1
|
||||
@@ -1794,10 +1795,18 @@ typedef struct timeval proftime_T;
|
||||
typedef int proftime_T; // dummy for function prototypes
|
||||
#endif
|
||||
|
||||
// Type of compilation passed to compile_def_function()
|
||||
typedef enum {
|
||||
CT_NONE, // use df_instr
|
||||
CT_PROFILE, // use df_instr_prof
|
||||
CT_DEBUG // use df_instr_debug, overrules CT_PROFILE
|
||||
} compiletype_T;
|
||||
|
||||
// Keep in sync with INSTRUCTIONS().
|
||||
#ifdef FEAT_PROFILE
|
||||
# define PROFILING(ufunc) (do_profiling == PROF_YES && (ufunc)->uf_profiling)
|
||||
# define COMPILE_TYPE(ufunc) (debug_break_level > 0 ? CT_DEBUG : do_profiling == PROF_YES && (ufunc)->uf_profiling ? CT_PROFILE : CT_NONE)
|
||||
#else
|
||||
# define PROFILING(ufunc) FALSE
|
||||
# define COMPILE_TYPE(ufunc) debug_break_level > 0 ? CT_DEBUG : CT_NONE
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
19
src/vim9.h
19
src/vim9.h
@@ -168,6 +168,9 @@ typedef enum {
|
||||
ISN_PROF_START, // start a line for profiling
|
||||
ISN_PROF_END, // end a line for profiling
|
||||
|
||||
ISN_DEBUG, // check for debug breakpoint, isn_arg.number is current
|
||||
// number of local variables
|
||||
|
||||
ISN_UNPACK, // unpack list into items, uses isn_arg.unpack
|
||||
ISN_SHUFFLE, // move item on stack up or down
|
||||
ISN_DROP, // pop stack and discard value
|
||||
@@ -445,6 +448,7 @@ struct dfunc_S {
|
||||
// was compiled.
|
||||
|
||||
garray_T df_def_args_isn; // default argument instructions
|
||||
garray_T df_var_names; // names of local vars
|
||||
|
||||
// After compiling "df_instr" and/or "df_instr_prof" is not NULL.
|
||||
isn_T *df_instr; // function body to be executed
|
||||
@@ -453,6 +457,8 @@ struct dfunc_S {
|
||||
isn_T *df_instr_prof; // like "df_instr" with profiling
|
||||
int df_instr_prof_count; // size of "df_instr_prof"
|
||||
#endif
|
||||
isn_T *df_instr_debug; // like "df_instr" with debugging
|
||||
int df_instr_debug_count; // size of "df_instr_debug"
|
||||
|
||||
int df_varcount; // number of local variables
|
||||
int df_has_closure; // one if a closure was created
|
||||
@@ -489,10 +495,17 @@ extern garray_T def_functions;
|
||||
// Used for "lnum" when a range is to be taken from the stack and "!" is used.
|
||||
#define LNUM_VARIABLE_RANGE_ABOVE -888
|
||||
|
||||
// Keep in sync with COMPILE_TYPE()
|
||||
#ifdef FEAT_PROFILE
|
||||
# define INSTRUCTIONS(dfunc) \
|
||||
((do_profiling == PROF_YES && (dfunc->df_ufunc)->uf_profiling) \
|
||||
? (dfunc)->df_instr_prof : (dfunc)->df_instr)
|
||||
(debug_break_level > 0 \
|
||||
? (dfunc)->df_instr_debug \
|
||||
: ((do_profiling == PROF_YES && (dfunc->df_ufunc)->uf_profiling) \
|
||||
? (dfunc)->df_instr_prof \
|
||||
: (dfunc)->df_instr))
|
||||
#else
|
||||
# define INSTRUCTIONS(dfunc) ((dfunc)->df_instr)
|
||||
# define INSTRUCTIONS(dfunc) \
|
||||
(debug_break_level > 0 \
|
||||
? (dfunc)->df_instr_debug \
|
||||
: (dfunc)->df_instr)
|
||||
#endif
|
||||
|
||||
@@ -174,10 +174,9 @@ struct cctx_S {
|
||||
char_u *ctx_line_start; // start of current line or NULL
|
||||
garray_T ctx_instr; // generated instructions
|
||||
|
||||
int ctx_profiling; // when TRUE generate ISN_PROF_START
|
||||
compiletype_T ctx_compile_type;
|
||||
|
||||
garray_T ctx_locals; // currently visible local variables
|
||||
int ctx_locals_count; // total number of local variables
|
||||
|
||||
int ctx_has_closure; // set to one if a closures was created in
|
||||
// the function
|
||||
@@ -454,7 +453,7 @@ item_exists(char_u *name, size_t len, int cmd UNUSED, cctx_T *cctx)
|
||||
if (name[len] == '(' || (p[0] == '-' && p[1] == '>'))
|
||||
{
|
||||
// Do not check for an internal function, since it might also be a
|
||||
// valid command, such as ":split" versuse "split()".
|
||||
// valid command, such as ":split" versus "split()".
|
||||
// Skip "g:" before a function name.
|
||||
is_global = (name[0] == 'g' && name[1] == ':');
|
||||
return find_func(is_global ? name + 2 : name, is_global, cctx) != NULL;
|
||||
@@ -574,6 +573,22 @@ generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type)
|
||||
return isn;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate an ISN_DEBUG instruction.
|
||||
*/
|
||||
static isn_T *
|
||||
generate_instr_debug(cctx_T *cctx)
|
||||
{
|
||||
isn_T *isn;
|
||||
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
|
||||
+ cctx->ctx_ufunc->uf_dfunc_idx;
|
||||
|
||||
if ((isn = generate_instr(cctx, ISN_DEBUG)) == NULL)
|
||||
return NULL;
|
||||
isn->isn_arg.number = dfunc->df_var_names.ga_len;
|
||||
return isn;
|
||||
}
|
||||
|
||||
/*
|
||||
* If type at "offset" isn't already VAR_STRING then generate ISN_2STRING.
|
||||
* But only for simple types.
|
||||
@@ -1857,7 +1872,7 @@ generate_BLOBAPPEND(cctx_T *cctx)
|
||||
* "profile" indicates profiling is to be done.
|
||||
*/
|
||||
int
|
||||
func_needs_compiling(ufunc_T *ufunc, int profile UNUSED)
|
||||
func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type)
|
||||
{
|
||||
switch (ufunc->uf_def_status)
|
||||
{
|
||||
@@ -1866,15 +1881,20 @@ func_needs_compiling(ufunc_T *ufunc, int profile UNUSED)
|
||||
|
||||
case UF_COMPILED:
|
||||
{
|
||||
#ifdef FEAT_PROFILE
|
||||
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
|
||||
+ ufunc->uf_dfunc_idx;
|
||||
|
||||
return profile ? dfunc->df_instr_prof == NULL
|
||||
: dfunc->df_instr == NULL;
|
||||
#else
|
||||
break;
|
||||
switch (compile_type)
|
||||
{
|
||||
case CT_PROFILE:
|
||||
#ifdef FEAT_PROFILE
|
||||
return dfunc->df_instr_prof == NULL;
|
||||
#endif
|
||||
case CT_NONE:
|
||||
return dfunc->df_instr == NULL;
|
||||
case CT_DEBUG:
|
||||
return dfunc->df_instr_debug == NULL;
|
||||
}
|
||||
}
|
||||
|
||||
case UF_NOT_COMPILED:
|
||||
@@ -1945,9 +1965,9 @@ generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount)
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
if (func_needs_compiling(ufunc, PROFILING(ufunc))
|
||||
if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, ufunc->uf_ret_type == NULL,
|
||||
PROFILING(ufunc), NULL) == FAIL)
|
||||
COMPILE_TYPE(ufunc), NULL) == FAIL)
|
||||
return FAIL;
|
||||
}
|
||||
if (ufunc->uf_def_status == UF_COMPILE_ERROR)
|
||||
@@ -2313,14 +2333,28 @@ current_instr_idx(cctx_T *cctx)
|
||||
garray_T *instr = &cctx->ctx_instr;
|
||||
int idx = instr->ga_len;
|
||||
|
||||
if (cctx->ctx_has_cmdmod && ((isn_T *)instr->ga_data)[idx - 1]
|
||||
while (idx > 0)
|
||||
{
|
||||
if (cctx->ctx_has_cmdmod && ((isn_T *)instr->ga_data)[idx - 1]
|
||||
.isn_type == ISN_CMDMOD)
|
||||
--idx;
|
||||
{
|
||||
--idx;
|
||||
continue;
|
||||
}
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling && ((isn_T *)instr->ga_data)[idx - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
--idx;
|
||||
if (((isn_T *)instr->ga_data)[idx - 1].isn_type == ISN_PROF_START)
|
||||
{
|
||||
--idx;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (((isn_T *)instr->ga_data)[idx - 1].isn_type == ISN_DEBUG)
|
||||
{
|
||||
--idx;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
@@ -2328,7 +2362,7 @@ current_instr_idx(cctx_T *cctx)
|
||||
static void
|
||||
may_generate_prof_end(cctx_T *cctx, int prof_lnum)
|
||||
{
|
||||
if (cctx->ctx_profiling && prof_lnum >= 0)
|
||||
if (cctx->ctx_compile_type == CT_PROFILE && prof_lnum >= 0)
|
||||
generate_instr(cctx, ISN_PROF_END);
|
||||
}
|
||||
#endif
|
||||
@@ -2346,6 +2380,7 @@ reserve_local(
|
||||
type_T *type)
|
||||
{
|
||||
lvar_T *lvar;
|
||||
dfunc_T *dfunc;
|
||||
|
||||
if (arg_exists(name, len, NULL, NULL, NULL, cctx) == OK)
|
||||
{
|
||||
@@ -2362,12 +2397,20 @@ reserve_local(
|
||||
// the last ones when leaving a scope, but then variables used in a closure
|
||||
// might get overwritten. To keep things simple do not re-use stack
|
||||
// entries. This is less efficient, but memory is cheap these days.
|
||||
lvar->lv_idx = cctx->ctx_locals_count++;
|
||||
dfunc = ((dfunc_T *)def_functions.ga_data) + cctx->ctx_ufunc->uf_dfunc_idx;
|
||||
lvar->lv_idx = dfunc->df_var_names.ga_len;
|
||||
|
||||
lvar->lv_name = vim_strnsave(name, len == 0 ? STRLEN(name) : len);
|
||||
lvar->lv_const = isConst;
|
||||
lvar->lv_type = type;
|
||||
|
||||
// Remember the name for debugging.
|
||||
if (ga_grow(&dfunc->df_var_names, 1) == FAIL)
|
||||
return NULL;
|
||||
((char_u **)dfunc->df_var_names.ga_data)[lvar->lv_idx] =
|
||||
vim_strsave(lvar->lv_name);
|
||||
++dfunc->df_var_names.ga_len;
|
||||
|
||||
return lvar;
|
||||
}
|
||||
|
||||
@@ -2972,8 +3015,8 @@ generate_funcref(cctx_T *cctx, char_u *name)
|
||||
return FAIL;
|
||||
|
||||
// Need to compile any default values to get the argument types.
|
||||
if (func_needs_compiling(ufunc, PROFILING(ufunc))
|
||||
&& compile_def_function(ufunc, TRUE, PROFILING(ufunc), NULL)
|
||||
if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, TRUE, COMPILE_TYPE(ufunc), NULL)
|
||||
== FAIL)
|
||||
return FAIL;
|
||||
return generate_PUSHFUNC(cctx, ufunc->uf_name, ufunc->uf_func_type);
|
||||
@@ -3084,7 +3127,13 @@ compile_load(
|
||||
if (name == NULL)
|
||||
return FAIL;
|
||||
|
||||
if (arg_exists(*arg, len, &idx, &type, &gen_load_outer, cctx) == OK)
|
||||
if (vim_strchr(name, AUTOLOAD_CHAR) != NULL)
|
||||
{
|
||||
script_autoload(name, FALSE);
|
||||
res = generate_LOAD(cctx, ISN_LOADAUTO, 0, name, &t_any);
|
||||
}
|
||||
else if (arg_exists(*arg, len, &idx, &type, &gen_load_outer, cctx)
|
||||
== OK)
|
||||
{
|
||||
if (gen_load_outer == 0)
|
||||
gen_load = TRUE;
|
||||
@@ -3559,8 +3608,12 @@ compile_lambda(char_u **arg, cctx_T *cctx)
|
||||
++ufunc->uf_refcount;
|
||||
clear_tv(&rettv);
|
||||
|
||||
// Compile the function into instructions.
|
||||
compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx);
|
||||
// Compile it here to get the return type. The return type is optional,
|
||||
// when it's missing use t_unknown. This is recognized in
|
||||
// compile_return().
|
||||
if (ufunc->uf_ret_type->tt_type == VAR_VOID)
|
||||
ufunc->uf_ret_type = &t_unknown;
|
||||
compile_def_function(ufunc, FALSE, COMPILE_TYPE(ufunc), cctx);
|
||||
|
||||
// evalarg.eval_tofree_cmdline may have a copy of the last line and "*arg"
|
||||
// points into it. Point to the original line to avoid a dangling pointer.
|
||||
@@ -5392,10 +5445,15 @@ compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx)
|
||||
|
||||
if (cctx->ctx_skip != SKIP_YES)
|
||||
{
|
||||
// "check_return_type" with uf_ret_type set to &t_unknown is used
|
||||
// for an inline function without a specified return type. Set the
|
||||
// return type here.
|
||||
stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
|
||||
if (check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL
|
||||
if ((check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL
|
||||
|| cctx->ctx_ufunc->uf_ret_type == &t_unknown
|
||||
|| cctx->ctx_ufunc->uf_ret_type == &t_any))
|
||||
|| (!check_return_type
|
||||
&& cctx->ctx_ufunc->uf_ret_type == &t_unknown))
|
||||
{
|
||||
cctx->ctx_ufunc->uf_ret_type = stack_type;
|
||||
}
|
||||
@@ -5551,8 +5609,8 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx)
|
||||
}
|
||||
}
|
||||
|
||||
if (func_needs_compiling(ufunc, PROFILING(ufunc))
|
||||
&& compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx)
|
||||
if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, TRUE, COMPILE_TYPE(ufunc), cctx)
|
||||
== FAIL)
|
||||
{
|
||||
func_ptr_unref(ufunc);
|
||||
@@ -7361,7 +7419,7 @@ compile_if(char_u *arg, cctx_T *cctx)
|
||||
scope->se_u.se_if.is_if_label = -1;
|
||||
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling && cctx->ctx_skip == SKIP_YES
|
||||
if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES
|
||||
&& skip_save != SKIP_YES)
|
||||
{
|
||||
// generated a profile start, need to generate a profile end, since it
|
||||
@@ -7442,13 +7500,19 @@ compile_elseif(char_u *arg, cctx_T *cctx)
|
||||
{
|
||||
cctx->ctx_skip = SKIP_UNKNOWN;
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling)
|
||||
if (cctx->ctx_compile_type == CT_PROFILE)
|
||||
{
|
||||
// the previous block was skipped, need to profile this line
|
||||
generate_instr(cctx, ISN_PROF_START);
|
||||
instr_count = instr->ga_len;
|
||||
}
|
||||
#endif
|
||||
if (cctx->ctx_compile_type == CT_DEBUG)
|
||||
{
|
||||
// the previous block was skipped, may want to debug this line
|
||||
generate_instr_debug(cctx);
|
||||
instr_count = instr->ga_len;
|
||||
}
|
||||
}
|
||||
if (compile_expr1(&p, cctx, &ppconst) == FAIL)
|
||||
{
|
||||
@@ -7516,12 +7580,13 @@ compile_else(char_u *arg, cctx_T *cctx)
|
||||
scope->se_u.se_if.is_seen_else = TRUE;
|
||||
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling)
|
||||
if (cctx->ctx_compile_type == CT_PROFILE)
|
||||
{
|
||||
if (cctx->ctx_skip == SKIP_NOT
|
||||
&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
// the previous block was executed, do not count "else" for profiling
|
||||
// the previous block was executed, do not count "else" for
|
||||
// profiling
|
||||
--instr->ga_len;
|
||||
if (cctx->ctx_skip == SKIP_YES && !scope->se_u.se_if.is_seen_skip_not)
|
||||
{
|
||||
@@ -7597,7 +7662,7 @@ compile_endif(char_u *arg, cctx_T *cctx)
|
||||
#ifdef FEAT_PROFILE
|
||||
// even when skipping we count the endif as executed, unless the block it's
|
||||
// in is skipped
|
||||
if (cctx->ctx_profiling && cctx->ctx_skip == SKIP_YES
|
||||
if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES
|
||||
&& scope->se_skip_save != SKIP_YES)
|
||||
{
|
||||
cctx->ctx_skip = SKIP_NOT;
|
||||
@@ -8168,7 +8233,8 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
|
||||
{
|
||||
#ifdef FEAT_PROFILE
|
||||
// the profile-start should be after the jump
|
||||
if (cctx->ctx_profiling && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
if (cctx->ctx_compile_type == CT_PROFILE
|
||||
&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
--instr->ga_len;
|
||||
#endif
|
||||
@@ -8188,7 +8254,7 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
|
||||
isn->isn_arg.jump.jump_where = instr->ga_len;
|
||||
}
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling)
|
||||
if (cctx->ctx_compile_type == CT_PROFILE)
|
||||
{
|
||||
// a "throw" that jumps here needs to be counted
|
||||
generate_instr(cctx, ISN_PROF_END);
|
||||
@@ -8196,6 +8262,8 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
|
||||
generate_instr(cctx, ISN_PROF_START);
|
||||
}
|
||||
#endif
|
||||
if (cctx->ctx_compile_type == CT_DEBUG)
|
||||
generate_instr_debug(cctx);
|
||||
}
|
||||
|
||||
p = skipwhite(arg);
|
||||
@@ -8283,7 +8351,8 @@ compile_finally(char_u *arg, cctx_T *cctx)
|
||||
|
||||
this_instr = instr->ga_len;
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
if (cctx->ctx_compile_type == CT_PROFILE
|
||||
&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
// jump to the profile start of the "finally"
|
||||
--this_instr;
|
||||
@@ -8352,7 +8421,8 @@ compile_endtry(char_u *arg, cctx_T *cctx)
|
||||
}
|
||||
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
if (cctx->ctx_compile_type == CT_PROFILE
|
||||
&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
|
||||
.isn_type == ISN_PROF_START)
|
||||
// move the profile start after "endtry" so that it's not counted when
|
||||
// the exception is rethrown.
|
||||
@@ -8384,7 +8454,7 @@ compile_endtry(char_u *arg, cctx_T *cctx)
|
||||
&& generate_instr(cctx, ISN_ENDTRY) == NULL)
|
||||
return NULL;
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx->ctx_profiling)
|
||||
if (cctx->ctx_compile_type == CT_PROFILE)
|
||||
generate_instr(cctx, ISN_PROF_START);
|
||||
#endif
|
||||
}
|
||||
@@ -8930,6 +9000,7 @@ add_def_function(ufunc_T *ufunc)
|
||||
ufunc->uf_dfunc_idx = dfunc->df_idx;
|
||||
dfunc->df_ufunc = ufunc;
|
||||
dfunc->df_name = vim_strsave(ufunc->uf_name);
|
||||
ga_init2(&dfunc->df_var_names, sizeof(char_u *), 10);
|
||||
++dfunc->df_refcount;
|
||||
++def_functions.ga_len;
|
||||
return OK;
|
||||
@@ -8950,10 +9021,10 @@ add_def_function(ufunc_T *ufunc)
|
||||
*/
|
||||
int
|
||||
compile_def_function(
|
||||
ufunc_T *ufunc,
|
||||
int check_return_type,
|
||||
int profiling UNUSED,
|
||||
cctx_T *outer_cctx)
|
||||
ufunc_T *ufunc,
|
||||
int check_return_type,
|
||||
compiletype_T compile_type,
|
||||
cctx_T *outer_cctx)
|
||||
{
|
||||
char_u *line = NULL;
|
||||
char_u *line_to_free = NULL;
|
||||
@@ -8972,6 +9043,7 @@ compile_def_function(
|
||||
#ifdef FEAT_PROFILE
|
||||
int prof_lnum = -1;
|
||||
#endif
|
||||
int debug_lnum = -1;
|
||||
|
||||
// When using a function that was compiled before: Free old instructions.
|
||||
// The index is reused. Otherwise add a new entry in "def_functions".
|
||||
@@ -8979,7 +9051,21 @@ compile_def_function(
|
||||
{
|
||||
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
|
||||
+ ufunc->uf_dfunc_idx;
|
||||
delete_def_function_contents(dfunc, FALSE);
|
||||
isn_T *instr_dest = NULL;
|
||||
|
||||
switch (compile_type)
|
||||
{
|
||||
case CT_PROFILE:
|
||||
#ifdef FEAT_PROFILE
|
||||
instr_dest = dfunc->df_instr_prof; break;
|
||||
#endif
|
||||
case CT_NONE: instr_dest = dfunc->df_instr; break;
|
||||
case CT_DEBUG: instr_dest = dfunc->df_instr_debug; break;
|
||||
}
|
||||
if (instr_dest != NULL)
|
||||
// Was compiled in this mode before: Free old instructions.
|
||||
delete_def_function_contents(dfunc, FALSE);
|
||||
ga_clear_strings(&dfunc->df_var_names);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -8992,9 +9078,7 @@ compile_def_function(
|
||||
|
||||
CLEAR_FIELD(cctx);
|
||||
|
||||
#ifdef FEAT_PROFILE
|
||||
cctx.ctx_profiling = profiling;
|
||||
#endif
|
||||
cctx.ctx_compile_type = compile_type;
|
||||
cctx.ctx_ufunc = ufunc;
|
||||
cctx.ctx_lnum = -1;
|
||||
cctx.ctx_outer = outer_cctx;
|
||||
@@ -9144,8 +9228,8 @@ compile_def_function(
|
||||
}
|
||||
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx.ctx_profiling && cctx.ctx_lnum != prof_lnum &&
|
||||
cctx.ctx_skip != SKIP_YES)
|
||||
if (cctx.ctx_compile_type == CT_PROFILE && cctx.ctx_lnum != prof_lnum
|
||||
&& cctx.ctx_skip != SKIP_YES)
|
||||
{
|
||||
may_generate_prof_end(&cctx, prof_lnum);
|
||||
|
||||
@@ -9153,6 +9237,12 @@ compile_def_function(
|
||||
generate_instr(&cctx, ISN_PROF_START);
|
||||
}
|
||||
#endif
|
||||
if (cctx.ctx_compile_type == CT_DEBUG && cctx.ctx_lnum != debug_lnum
|
||||
&& cctx.ctx_skip != SKIP_YES)
|
||||
{
|
||||
debug_lnum = cctx.ctx_lnum;
|
||||
generate_instr_debug(&cctx);
|
||||
}
|
||||
|
||||
// Some things can be recognized by the first character.
|
||||
switch (*ea.cmd)
|
||||
@@ -9581,7 +9671,9 @@ nextline:
|
||||
|
||||
if (!cctx.ctx_had_return)
|
||||
{
|
||||
if (ufunc->uf_ret_type->tt_type != VAR_VOID)
|
||||
if (ufunc->uf_ret_type->tt_type == VAR_UNKNOWN)
|
||||
ufunc->uf_ret_type = &t_void;
|
||||
else if (ufunc->uf_ret_type->tt_type != VAR_VOID)
|
||||
{
|
||||
emsg(_(e_missing_return_statement));
|
||||
goto erret;
|
||||
@@ -9600,18 +9692,24 @@ nextline:
|
||||
dfunc->df_deleted = FALSE;
|
||||
dfunc->df_script_seq = current_sctx.sc_seq;
|
||||
#ifdef FEAT_PROFILE
|
||||
if (cctx.ctx_profiling)
|
||||
if (cctx.ctx_compile_type == CT_PROFILE)
|
||||
{
|
||||
dfunc->df_instr_prof = instr->ga_data;
|
||||
dfunc->df_instr_prof_count = instr->ga_len;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (cctx.ctx_compile_type == CT_DEBUG)
|
||||
{
|
||||
dfunc->df_instr_debug = instr->ga_data;
|
||||
dfunc->df_instr_debug_count = instr->ga_len;
|
||||
}
|
||||
else
|
||||
{
|
||||
dfunc->df_instr = instr->ga_data;
|
||||
dfunc->df_instr_count = instr->ga_len;
|
||||
}
|
||||
dfunc->df_varcount = cctx.ctx_locals_count;
|
||||
dfunc->df_varcount = dfunc->df_var_names.ga_len;
|
||||
dfunc->df_has_closure = cctx.ctx_has_closure;
|
||||
if (cctx.ctx_outer_used)
|
||||
ufunc->uf_flags |= FC_CLOSURE;
|
||||
@@ -9626,8 +9724,10 @@ erret:
|
||||
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
|
||||
+ ufunc->uf_dfunc_idx;
|
||||
|
||||
// Compiling aborted, free the generated instructions.
|
||||
clear_instr_ga(instr);
|
||||
VIM_CLEAR(dfunc->df_name);
|
||||
ga_clear_strings(&dfunc->df_var_names);
|
||||
|
||||
// If using the last entry in the table and it was added above, we
|
||||
// might as well remove it.
|
||||
@@ -9902,6 +10002,7 @@ delete_instr(isn_T *isn)
|
||||
case ISN_COMPARESTRING:
|
||||
case ISN_CONCAT:
|
||||
case ISN_COND2BOOL:
|
||||
case ISN_DEBUG:
|
||||
case ISN_DROP:
|
||||
case ISN_ECHO:
|
||||
case ISN_ECHOERR:
|
||||
@@ -9910,6 +10011,7 @@ delete_instr(isn_T *isn)
|
||||
case ISN_EXECCONCAT:
|
||||
case ISN_EXECUTE:
|
||||
case ISN_FINALLY:
|
||||
case ISN_FINISH:
|
||||
case ISN_FOR:
|
||||
case ISN_GETITEM:
|
||||
case ISN_JUMP:
|
||||
@@ -9932,7 +10034,6 @@ delete_instr(isn_T *isn)
|
||||
case ISN_NEWLIST:
|
||||
case ISN_OPANY:
|
||||
case ISN_OPFLOAT:
|
||||
case ISN_FINISH:
|
||||
case ISN_OPNR:
|
||||
case ISN_PCALL:
|
||||
case ISN_PCALL_END:
|
||||
@@ -9977,6 +10078,7 @@ delete_def_function_contents(dfunc_T *dfunc, int mark_deleted)
|
||||
int idx;
|
||||
|
||||
ga_clear(&dfunc->df_def_args_isn);
|
||||
ga_clear_strings(&dfunc->df_var_names);
|
||||
|
||||
if (dfunc->df_instr != NULL)
|
||||
{
|
||||
@@ -9985,6 +10087,13 @@ delete_def_function_contents(dfunc_T *dfunc, int mark_deleted)
|
||||
VIM_CLEAR(dfunc->df_instr);
|
||||
dfunc->df_instr = NULL;
|
||||
}
|
||||
if (dfunc->df_instr_debug != NULL)
|
||||
{
|
||||
for (idx = 0; idx < dfunc->df_instr_debug_count; ++idx)
|
||||
delete_instr(dfunc->df_instr_debug + idx);
|
||||
VIM_CLEAR(dfunc->df_instr_debug);
|
||||
dfunc->df_instr_debug = NULL;
|
||||
}
|
||||
#ifdef FEAT_PROFILE
|
||||
if (dfunc->df_instr_prof != NULL)
|
||||
{
|
||||
|
||||
@@ -172,6 +172,7 @@ call_dfunc(
|
||||
int argcount = argcount_arg;
|
||||
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) + cdf_idx;
|
||||
ufunc_T *ufunc = dfunc->df_ufunc;
|
||||
int did_emsg_before = did_emsg_cumul + did_emsg;
|
||||
int arg_to_add;
|
||||
int vararg_count = 0;
|
||||
int varcount;
|
||||
@@ -204,13 +205,26 @@ call_dfunc(
|
||||
// Profiling might be enabled/disabled along the way. This should not
|
||||
// fail, since the function was compiled before and toggling profiling
|
||||
// doesn't change any errors.
|
||||
if (func_needs_compiling(ufunc, PROFILING(ufunc))
|
||||
&& compile_def_function(ufunc, FALSE, PROFILING(ufunc), NULL)
|
||||
if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, FALSE, COMPILE_TYPE(ufunc), NULL)
|
||||
== FAIL)
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
// When debugging and using "cont" switches to the not-debugged
|
||||
// instructions, may need to still compile them.
|
||||
if ((func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, FALSE, COMPILE_TYPE(ufunc), NULL)
|
||||
== FAIL)
|
||||
|| INSTRUCTIONS(dfunc) == NULL)
|
||||
{
|
||||
if (did_emsg_cumul + did_emsg == did_emsg_before)
|
||||
semsg(_(e_function_is_not_compiled_str),
|
||||
printable_func_name(ufunc));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
if (ufunc->uf_va_name != NULL)
|
||||
{
|
||||
// Need to make a list out of the vararg arguments.
|
||||
@@ -264,6 +278,7 @@ call_dfunc(
|
||||
// If depth of calling is getting too high, don't execute the function.
|
||||
if (funcdepth_increment() == FAIL)
|
||||
return FAIL;
|
||||
++ex_nesting_level;
|
||||
|
||||
// Only make a copy of funclocal if it contains something to restore.
|
||||
if (ectx->ec_funclocal.floc_restore_cmdmod)
|
||||
@@ -647,6 +662,7 @@ func_return(ectx_T *ectx)
|
||||
ectx->ec_stack.ga_len = top;
|
||||
|
||||
funcdepth_decrement();
|
||||
--ex_nesting_level;
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -736,14 +752,11 @@ call_ufunc(
|
||||
int error;
|
||||
int idx;
|
||||
int did_emsg_before = did_emsg;
|
||||
#ifdef FEAT_PROFILE
|
||||
int profiling = do_profiling == PROF_YES && ufunc->uf_profiling;
|
||||
#else
|
||||
# define profiling FALSE
|
||||
#endif
|
||||
compiletype_T compile_type = COMPILE_TYPE(ufunc);
|
||||
|
||||
if (func_needs_compiling(ufunc, profiling)
|
||||
&& compile_def_function(ufunc, FALSE, profiling, NULL) == FAIL)
|
||||
if (func_needs_compiling(ufunc, compile_type)
|
||||
&& compile_def_function(ufunc, FALSE, compile_type, NULL)
|
||||
== FAIL)
|
||||
return FAIL;
|
||||
if (ufunc->uf_def_status == UF_COMPILED)
|
||||
{
|
||||
@@ -1379,6 +1392,36 @@ typedef struct subs_expr_S {
|
||||
// Get pointer to a local variable on the stack. Negative for arguments.
|
||||
#define STACK_TV_VAR(idx) (((typval_T *)ectx->ec_stack.ga_data) + ectx->ec_frame_idx + STACK_FRAME_SIZE + idx)
|
||||
|
||||
// Set when calling do_debug().
|
||||
static ectx_T *debug_context = NULL;
|
||||
static int debug_arg_count;
|
||||
|
||||
/*
|
||||
* When debugging lookup "name" and return the typeval.
|
||||
* When not found return NULL.
|
||||
*/
|
||||
typval_T *
|
||||
lookup_debug_var(char_u *name)
|
||||
{
|
||||
int idx;
|
||||
dfunc_T *dfunc;
|
||||
ectx_T *ectx = debug_context;
|
||||
|
||||
if (ectx == NULL)
|
||||
return NULL;
|
||||
dfunc = ((dfunc_T *)def_functions.ga_data) + ectx->ec_dfunc_idx;
|
||||
|
||||
// Go through the local variable names, from last to first.
|
||||
for (idx = debug_arg_count - 1; idx >= 0; --idx)
|
||||
{
|
||||
char_u *s = ((char_u **)dfunc->df_var_names.ga_data)[idx];
|
||||
if (STRCMP(s, name) == 0)
|
||||
return STACK_TV_VAR(idx);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute instructions in execution context "ectx".
|
||||
* Return OK or FAIL;
|
||||
@@ -4084,7 +4127,7 @@ exec_instructions(ectx_T *ectx)
|
||||
funccall_T cookie;
|
||||
ufunc_T *cur_ufunc =
|
||||
(((dfunc_T *)def_functions.ga_data)
|
||||
+ ectx->ec_dfunc_idx)->df_ufunc;
|
||||
+ ectx->ec_dfunc_idx)->df_ufunc;
|
||||
|
||||
cookie.func = cur_ufunc;
|
||||
if (iptr->isn_type == ISN_PROF_START)
|
||||
@@ -4099,6 +4142,25 @@ exec_instructions(ectx_T *ectx)
|
||||
}
|
||||
break;
|
||||
|
||||
case ISN_DEBUG:
|
||||
if (ex_nesting_level <= debug_break_level)
|
||||
{
|
||||
char_u *line;
|
||||
ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
|
||||
+ ectx->ec_dfunc_idx)->df_ufunc;
|
||||
|
||||
SOURCING_LNUM = iptr->isn_lnum;
|
||||
debug_context = ectx;
|
||||
debug_arg_count = iptr->isn_arg.number;
|
||||
line = ((char_u **)ufunc->uf_lines.ga_data)[
|
||||
iptr->isn_lnum - 1];
|
||||
if (line == NULL)
|
||||
line = (char_u *)"[empty]";
|
||||
do_debug(line);
|
||||
debug_context = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case ISN_SHUFFLE:
|
||||
{
|
||||
typval_T tmp_tv;
|
||||
@@ -4258,6 +4320,7 @@ call_def_function(
|
||||
int save_emsg_silent_def = emsg_silent_def;
|
||||
int save_did_emsg_def = did_emsg_def;
|
||||
int orig_funcdepth;
|
||||
int orig_nesting_level = ex_nesting_level;
|
||||
|
||||
// Get pointer to item in the stack.
|
||||
#undef STACK_TV
|
||||
@@ -4273,8 +4336,8 @@ call_def_function(
|
||||
|
||||
if (ufunc->uf_def_status == UF_NOT_COMPILED
|
||||
|| ufunc->uf_def_status == UF_COMPILE_ERROR
|
||||
|| (func_needs_compiling(ufunc, PROFILING(ufunc))
|
||||
&& compile_def_function(ufunc, FALSE, PROFILING(ufunc), NULL)
|
||||
|| (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
|
||||
&& compile_def_function(ufunc, FALSE, COMPILE_TYPE(ufunc), NULL)
|
||||
== FAIL))
|
||||
{
|
||||
if (did_emsg_cumul + did_emsg == did_emsg_before)
|
||||
@@ -4310,6 +4373,7 @@ call_def_function(
|
||||
ga_init2(&ectx.ec_trystack, sizeof(trycmd_T), 10);
|
||||
ga_init2(&ectx.ec_funcrefs, sizeof(partial_T *), 10);
|
||||
ectx.ec_did_emsg_before = did_emsg_before;
|
||||
++ex_nesting_level;
|
||||
|
||||
idx = argc - ufunc->uf_args.ga_len;
|
||||
if (idx > 0 && ufunc->uf_va_name == NULL)
|
||||
@@ -4553,6 +4617,7 @@ failed_early:
|
||||
// Free all local variables, but not arguments.
|
||||
for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)
|
||||
clear_tv(STACK_TV(idx));
|
||||
ex_nesting_level = orig_nesting_level;
|
||||
|
||||
vim_free(ectx.ec_stack.ga_data);
|
||||
vim_free(ectx.ec_trystack.ga_data);
|
||||
@@ -5315,13 +5380,19 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
|
||||
case ISN_CMDMOD_REV: smsg("%s%4d CMDMOD_REV", pfx, current); break;
|
||||
|
||||
case ISN_PROF_START:
|
||||
smsg("%s%4d PROFILE START line %d", pfx, current, iptr->isn_lnum);
|
||||
smsg("%s%4d PROFILE START line %d", pfx, current,
|
||||
iptr->isn_lnum);
|
||||
break;
|
||||
|
||||
case ISN_PROF_END:
|
||||
smsg("%s%4d PROFILE END", pfx, current);
|
||||
break;
|
||||
|
||||
case ISN_DEBUG:
|
||||
smsg("%s%4d DEBUG line %d varcount %lld", pfx, current,
|
||||
iptr->isn_lnum, iptr->isn_arg.number);
|
||||
break;
|
||||
|
||||
case ISN_UNPACK: smsg("%s%4d UNPACK %d%s", pfx, current,
|
||||
iptr->isn_arg.unpack.unp_count,
|
||||
iptr->isn_arg.unpack.unp_semicolon ? " semicolon" : "");
|
||||
@@ -5343,6 +5414,40 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle command line completion for the :disassemble command.
|
||||
*/
|
||||
void
|
||||
set_context_in_disassemble_cmd(expand_T *xp, char_u *arg)
|
||||
{
|
||||
char_u *p;
|
||||
|
||||
// Default: expand user functions, "debug" and "profile"
|
||||
xp->xp_context = EXPAND_DISASSEMBLE;
|
||||
xp->xp_pattern = arg;
|
||||
|
||||
// first argument already typed: only user function names
|
||||
if (*arg != NUL && *(p = skiptowhite(arg)) != NUL)
|
||||
{
|
||||
xp->xp_context = EXPAND_USER_FUNC;
|
||||
xp->xp_pattern = skipwhite(p);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Function given to ExpandGeneric() to obtain the list of :disassemble
|
||||
* arguments.
|
||||
*/
|
||||
char_u *
|
||||
get_disassemble_argument(expand_T *xp, int idx)
|
||||
{
|
||||
if (idx == 0)
|
||||
return (char_u *)"debug";
|
||||
if (idx == 1)
|
||||
return (char_u *)"profile";
|
||||
return get_user_func_name(xp, idx - 2);
|
||||
}
|
||||
|
||||
/*
|
||||
* ":disassemble".
|
||||
* We don't really need this at runtime, but we do have tests that require it,
|
||||
@@ -5358,6 +5463,18 @@ ex_disassemble(exarg_T *eap)
|
||||
isn_T *instr;
|
||||
int instr_count;
|
||||
int is_global = FALSE;
|
||||
compiletype_T compile_type = CT_NONE;
|
||||
|
||||
if (STRNCMP(arg, "profile", 7) == 0)
|
||||
{
|
||||
compile_type = CT_PROFILE;
|
||||
arg = skipwhite(arg + 7);
|
||||
}
|
||||
else if (STRNCMP(arg, "debug", 5) == 0)
|
||||
{
|
||||
compile_type = CT_DEBUG;
|
||||
arg = skipwhite(arg + 5);
|
||||
}
|
||||
|
||||
if (STRNCMP(arg, "<lambda>", 8) == 0)
|
||||
{
|
||||
@@ -5389,8 +5506,8 @@ ex_disassemble(exarg_T *eap)
|
||||
semsg(_(e_cannot_find_function_str), eap->arg);
|
||||
return;
|
||||
}
|
||||
if (func_needs_compiling(ufunc, eap->forceit)
|
||||
&& compile_def_function(ufunc, FALSE, eap->forceit, NULL) == FAIL)
|
||||
if (func_needs_compiling(ufunc, compile_type)
|
||||
&& compile_def_function(ufunc, FALSE, compile_type, NULL) == FAIL)
|
||||
return;
|
||||
if (ufunc->uf_def_status != UF_COMPILED)
|
||||
{
|
||||
@@ -5403,14 +5520,24 @@ ex_disassemble(exarg_T *eap)
|
||||
msg((char *)ufunc->uf_name);
|
||||
|
||||
dfunc = ((dfunc_T *)def_functions.ga_data) + ufunc->uf_dfunc_idx;
|
||||
switch (compile_type)
|
||||
{
|
||||
case CT_PROFILE:
|
||||
#ifdef FEAT_PROFILE
|
||||
instr = eap->forceit ? dfunc->df_instr_prof : dfunc->df_instr;
|
||||
instr_count = eap->forceit ? dfunc->df_instr_prof_count
|
||||
: dfunc->df_instr_count;
|
||||
#else
|
||||
instr = dfunc->df_instr;
|
||||
instr_count = dfunc->df_instr_count;
|
||||
instr = dfunc->df_instr_prof;
|
||||
instr_count = dfunc->df_instr_prof_count;
|
||||
break;
|
||||
#endif
|
||||
// FALLTHROUGH
|
||||
case CT_NONE:
|
||||
instr = dfunc->df_instr;
|
||||
instr_count = dfunc->df_instr_count;
|
||||
break;
|
||||
case CT_DEBUG:
|
||||
instr = dfunc->df_instr_debug;
|
||||
instr_count = dfunc->df_instr_debug_count;
|
||||
break;
|
||||
}
|
||||
|
||||
list_instructions("", instr, instr_count, ufunc);
|
||||
}
|
||||
|
||||
@@ -979,6 +979,7 @@ static char *reserved[] = {
|
||||
"true",
|
||||
"false",
|
||||
"null",
|
||||
"this",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member)
|
||||
// May need to get the argument types from default values by
|
||||
// compiling the function.
|
||||
if (ufunc->uf_def_status == UF_TO_BE_COMPILED
|
||||
&& compile_def_function(ufunc, TRUE, FALSE, NULL)
|
||||
&& compile_def_function(ufunc, TRUE, CT_NONE, NULL)
|
||||
== FAIL)
|
||||
return NULL;
|
||||
if (ufunc->uf_func_type == NULL)
|
||||
|
||||
Reference in New Issue
Block a user