Compare commits

..

18 Commits

Author SHA1 Message Date
Bram Moolenaar
968a5b62ff patch 8.2.3003: Vim9: closure compiled with wrong compile type
Problem:    Vim9: closure compiled with wrong compile type.
Solution:   Use COMPILE_TYPE() when calling a function. (closes #8384)
2021-06-15 19:32:40 +02:00
Dominique Pelle
affd0bc626 patch 8.2.3002: Vim doesn't abort on a fatal Tcl error
Problem:    Vim doesn't abort on a fatal Tcl error.
Solution:   Change emsg() to iemsg(). (Dominique Pellé, closes #8383)
2021-06-15 19:09:43 +02:00
Bram Moolenaar
caf1a2f296 patch 8.2.3001: Vim9: memory leak when compilation fails
Problem:    Vim9: memory leak when compilation fails.
Solution:   Free the list of variable names.
2021-06-15 11:27:21 +02:00
Bram Moolenaar
3b814af7e1 patch 8.2.3000: Vim9: warning for uninitialized variable
Problem:    Vim9: warning for uninitialized variable.
Solution:   Add initialization. (John Marriott)
2021-06-15 10:22:17 +02:00
Bram Moolenaar
47f6db9089 patch 8.2.2999: balloon sometimes does not hide with GTK 3
Problem:    Balloon sometimes does not hide with GTK 3.
Solution:   Also listen to GDK_LEAVE_NOTIFY. (Johannes Stezenbach)
2021-06-14 22:08:46 +02:00
Bram Moolenaar
1b0a9dd413 patch 8.2.2998: Vim9: disassemble test fails
Problem:    Vim9: disassemble test fails.
Solution:   Add missing call to lookup_debug_var().
2021-06-14 21:32:21 +02:00
Bram Moolenaar
26d711645c patch 8.2.2997: Vim9: disassemble test fails
Problem:    Vim9: disassemble test fails.
Solution:   Adjust expected output.
2021-06-14 21:08:56 +02:00
Bram Moolenaar
b69c6fb7b4 patch 8.2.2996: Vim9: when debugging cannot inspect local variables
Problem:    Vim9: when debugging cannot inspect local variables.
Solution:   Make local variables available when debugging.
2021-06-14 20:40:37 +02:00
Zdenek Dohnal
90478f35a8 patch 8.2.2995: linker errors with dynamic Python 3.10
Problem:    Linker errors with dynamic Python 3.10.
Solution:   Add a couple of library entries. (Zdenek Dohnal, closes #8381,
            closes #8356)
2021-06-14 15:08:30 +02:00
Yegappan Lakshmanan
2d6d718dde patch 8.2.2994: various code is not fully tested
Problem:    Various code is not fully tested.
Solution:   Add a few more tests. (Yegappan Lakshmanan, closes #8378)
2021-06-13 21:52:48 +02:00
Bram Moolenaar
5ffefbb35a patch 8.2.2993: 'fileencodings' default value should depend on 'encoding'
Problem:    'fileencodings' default value should depend on 'encoding'. (Gary
            Johnson)
Solution:   When 'encoding' is "utf-8" use a different default value for
            'fileencodings'.
2021-06-13 20:27:36 +02:00
Bram Moolenaar
2346a63784 Update runtime files 2021-06-13 19:02:49 +02:00
Bram Moolenaar
4ee9d8e04d patch 8.2.2992: Vim9: completion for :disassemble is incomplete
Problem:    Vim9: completion for :disassemble is incomplete.
Solution:   Recognize the "debug" and "profile" arguments.
2021-06-13 18:38:48 +02:00
Bram Moolenaar
e70e12b32f patch 8.2.2991: Vim9: no completion for :vim9 and :legacy
Problem:    Vim9: no completion for :vim9 and :legacy.
Solution:   Expand argument as a command. (closes #8377)
2021-06-13 17:20:08 +02:00
kompowiec2
2e66b0d137 patch 8.2.2990: Jupyter Notebook files are not recognized
Problem:    Jupyter Notebook files are not recognized.
Solution:   Recognize *.ipynb. (closes #8375)
2021-06-13 17:03:06 +02:00
Bram Moolenaar
c2dec4cac4 patch 8.2.2989: Vim9: memory leak when debugging a :def function
Problem:    Vim9: memory leak when debugging a :def function.
Solution:   Free the debug instructions.
2021-06-13 15:39:00 +02:00
Bram Moolenaar
c3a27bbd53 patch 8.2.2988: Vim9: debugger test fails
Problem:    Vim9: debugger test fails.
Solution:   Get the debugger instructions when needed.
2021-06-13 15:16:01 +02:00
Bram Moolenaar
6d1792d408 patch 8.2.2987: build failure with normal features
Problem:    Build failure with normal features.
Solution:   Remove #define.
2021-06-13 14:33:20 +02:00
54 changed files with 862 additions and 230 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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*

View File

@@ -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('≼')

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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
<

View File

@@ -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

View File

@@ -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

View File

@@ -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}*

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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).

View File

@@ -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".

View File

@@ -457,7 +457,8 @@ 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: >
@@ -998,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: >

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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))

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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”; шта могу да ураде специјални тастери"

View File

@@ -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);

View File

@@ -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);

View File

@@ -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>", @:)

View File

@@ -853,6 +853,7 @@ func Test_Backtrace_DefFunction()
enddef
def g:GlobalFunction()
var some = "some var"
CallAFunction()
enddef
@@ -884,19 +885,21 @@ func Test_Backtrace_DefFunction()
\ ':debug call GlobalFunction()',
\ ['cmd: call GlobalFunction()'])
call RunDbgCmd(buf, 'step', ['line 1: CallAFunction()'])
call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
call RunDbgCmd(buf, 'echo some', ['some var'])
" FIXME: not quite right
call RunDbgCmd(buf, 'backtrace', [
\ '\V>backtrace',
\ '\V->0 function GlobalFunction',
\ '\Vline 1: CallAFunction()',
\ '\Vline 2: CallAFunction()',
\ ],
\ #{match: 'pattern'})
call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
" FIXME: repeated line
" 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'])
@@ -906,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',
@@ -917,7 +920,7 @@ func Test_Backtrace_DefFunction()
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',
@@ -929,6 +932,33 @@ func Test_Backtrace_DefFunction()
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

View File

@@ -596,7 +596,7 @@ func Sandbox_tests()
" some options cannot be changed in a sandbox
call assert_fails('set exrc', 'E48:')
call assert_fails('set cdpath', 'E48:')
if has('xim')
if has('xim') && has('gui_gtk')
call assert_fails('set imstyle', 'E48:')
endif
endfunc

View File

@@ -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'],

View File

@@ -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

View File

@@ -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

View File

@@ -1140,6 +1140,14 @@ func Test_opt_default()
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
@@ -1152,4 +1160,21 @@ func Test_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

View File

@@ -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

View File

@@ -2146,6 +2146,7 @@ enddef
def s:Profiled(): string
echo "profiled"
var some = "some text"
return "done"
enddef
@@ -2159,12 +2160,17 @@ def Test_profiled()
'\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
@@ -2172,11 +2178,15 @@ def Test_debugged()
var res = execute('disass debug s:Profiled')
assert_match('<SNR>\d*_Profiled\_s*' ..
'echo "profiled"\_s*' ..
'\d DEBUG line 1\_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 2\_s*' ..
'\d DEBUG line 3 varcount 1\_s*' ..
'\d PUSHS "done"\_s*' ..
'\d RETURN\_s*',
res)

View File

@@ -750,6 +750,40 @@ 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,
/**/

View File

@@ -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
@@ -1801,6 +1802,7 @@ typedef enum {
CT_DEBUG // use df_instr_debug, overrules CT_PROFILE
} compiletype_T;
// Keep in sync with INSTRUCTIONS().
#ifdef FEAT_PROFILE
# define COMPILE_TYPE(ufunc) (debug_break_level > 0 ? CT_DEBUG : do_profiling == PROF_YES && (ufunc)->uf_profiling ? CT_PROFILE : CT_NONE)
#else

View File

@@ -168,7 +168,8 @@ 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_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
@@ -447,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
@@ -493,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

View File

@@ -177,7 +177,6 @@ struct cctx_S {
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.
@@ -2365,6 +2380,7 @@ reserve_local(
type_T *type)
{
lvar_T *lvar;
dfunc_T *dfunc;
if (arg_exists(name, len, NULL, NULL, NULL, cctx) == OK)
{
@@ -2381,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;
}
@@ -7486,7 +7510,7 @@ compile_elseif(char_u *arg, cctx_T *cctx)
if (cctx->ctx_compile_type == CT_DEBUG)
{
// the previous block was skipped, may want to debug this line
generate_instr(cctx, ISN_DEBUG);
generate_instr_debug(cctx);
instr_count = instr->ga_len;
}
}
@@ -8239,7 +8263,7 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
}
#endif
if (cctx->ctx_compile_type == CT_DEBUG)
generate_instr(cctx, ISN_DEBUG);
generate_instr_debug(cctx);
}
p = skipwhite(arg);
@@ -8976,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;
@@ -9026,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
{
@@ -9202,7 +9241,7 @@ compile_def_function(
&& cctx.ctx_skip != SKIP_YES)
{
debug_lnum = cctx.ctx_lnum;
generate_instr(&cctx, ISN_DEBUG);
generate_instr_debug(&cctx);
}
// Some things can be recognized by the first character.
@@ -9670,7 +9709,7 @@ nextline:
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;
@@ -9685,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.
@@ -10037,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)
{
@@ -10045,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)
{

View File

@@ -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;
@@ -211,6 +212,19 @@ call_dfunc(
}
#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.
@@ -738,12 +752,7 @@ call_ufunc(
int error;
int idx;
int did_emsg_before = did_emsg;
#ifdef FEAT_PROFILE
compiletype_T compile_type = do_profiling == PROF_YES
&& ufunc->uf_profiling ? CT_PROFILE : CT_NONE;
#else
# define compile_type CT_NONE
#endif
compiletype_T compile_type = COMPILE_TYPE(ufunc);
if (func_needs_compiling(ufunc, compile_type)
&& compile_def_function(ufunc, FALSE, compile_type, NULL)
@@ -1383,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;
@@ -4088,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)
@@ -4111,11 +4150,14 @@ exec_instructions(ectx_T *ectx)
+ 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;
@@ -5347,7 +5389,8 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
break;
case ISN_DEBUG:
smsg("%s%4d DEBUG line %d", pfx, current, iptr->isn_lnum);
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,
@@ -5371,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,