mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-07 15:37:14 +02:00
Merge remote-tracking branch 'vim/master'
This commit is contained in:
+8
-6
@@ -15,6 +15,7 @@ To build the installable .exe:
|
||||
vimrun.exe,
|
||||
install.exe,
|
||||
uninstal.exe,
|
||||
tee/tee.exe,
|
||||
xxd/xxd.exe,
|
||||
|
||||
Then execute tools/rename.bat to rename the executables. (mv command is
|
||||
@@ -29,14 +30,15 @@ To build the installable .exe:
|
||||
4. Go to the VisVim directory and build VisVim.dll (or get it from a binary
|
||||
archive).
|
||||
|
||||
5. Go to the OleVim directory and build OpenWithVim.exe and SendToVim.exe (or
|
||||
get them from a binary archive).
|
||||
|
||||
6. Get a "diff.exe" program and put it in the "../.." directory (above the
|
||||
"vim80" directory, it's the same for all Vim versions).
|
||||
5. Get a "diff.exe" program. If you skip this the built-in diff will always
|
||||
be used (which is fine for most users). If you do have your own
|
||||
"diff.exe" put it in the "../.." directory (above the "vim81" directory,
|
||||
it's the same for all Vim versions).
|
||||
You can find one in previous Vim versions or in this archive:
|
||||
http://www.mossbayeng.com/~ron/vim/diffutils.tar.gz
|
||||
Also put winpty32.dll and winpty-agent.exe there.
|
||||
|
||||
6 Also put winpty32.dll and winpty-agent.exe in "../.." (above the "vim81"
|
||||
directory). This is required for the terminal window.
|
||||
|
||||
7. Do "make uganda.nsis.txt" in runtime/doc. This requires sed, you may have
|
||||
to do this on Unix. Make sure the file is in DOS file format!
|
||||
|
||||
@@ -334,6 +334,9 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
|
||||
{not in Vi} {not available when compiled without the
|
||||
|+eval| feature}
|
||||
|
||||
:scr[iptnames][!] {scriptId} *:script*
|
||||
Edit script {scriptId}. Suggested name is ":script".
|
||||
|
||||
*:fini* *:finish* *E168*
|
||||
:fini[sh] Stop sourcing a script. Can only be used in a Vim
|
||||
script file. This is a quick way to skip the rest of
|
||||
|
||||
+102
-80
@@ -73,6 +73,13 @@ let s:pc_id = 12
|
||||
let s:break_id = 13 " breakpoint number is added to this
|
||||
let s:stopped = 1
|
||||
|
||||
" Take a breakpoint number as used by GDB and turn it into an integer.
|
||||
" The breakpoint may contain a dot: 123.4
|
||||
func s:Breakpoint2SignNumber(nr)
|
||||
let t = split(a:nr, '\.')
|
||||
return t[0] * 1000 + (len(t) == 2 ? t[1] : 0)
|
||||
endfunction
|
||||
|
||||
func s:Highlight(init, old, new)
|
||||
let default = a:init ? 'default ' : ''
|
||||
if a:new ==# 'light' && a:old !=# 'light'
|
||||
@@ -138,9 +145,9 @@ endfunc
|
||||
func s:StartDebug_term(dict)
|
||||
" Open a terminal window without a job, to run the debugged program in.
|
||||
let s:ptybuf = term_start('NONE', {
|
||||
\ 'term_name': 'debugged program',
|
||||
\ 'vertical': s:vertical,
|
||||
\ })
|
||||
\ 'term_name': 'debugged program',
|
||||
\ 'vertical': s:vertical,
|
||||
\ })
|
||||
if s:ptybuf == 0
|
||||
echoerr 'Failed to open the program terminal window'
|
||||
return
|
||||
@@ -155,10 +162,10 @@ func s:StartDebug_term(dict)
|
||||
|
||||
" Create a hidden terminal window to communicate with gdb
|
||||
let s:commbuf = term_start('NONE', {
|
||||
\ 'term_name': 'gdb communication',
|
||||
\ 'out_cb': function('s:CommOutput'),
|
||||
\ 'hidden': 1,
|
||||
\ })
|
||||
\ 'term_name': 'gdb communication',
|
||||
\ 'out_cb': function('s:CommOutput'),
|
||||
\ 'hidden': 1,
|
||||
\ })
|
||||
if s:commbuf == 0
|
||||
echoerr 'Failed to open the communication terminal window'
|
||||
exe 'bwipe! ' . s:ptybuf
|
||||
@@ -174,9 +181,9 @@ func s:StartDebug_term(dict)
|
||||
let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
|
||||
call ch_log('executing "' . join(cmd) . '"')
|
||||
let s:gdbbuf = term_start(cmd, {
|
||||
\ 'exit_cb': function('s:EndTermDebug'),
|
||||
\ 'term_finish': 'close',
|
||||
\ })
|
||||
\ 'exit_cb': function('s:EndTermDebug'),
|
||||
\ 'term_finish': 'close',
|
||||
\ })
|
||||
if s:gdbbuf == 0
|
||||
echoerr 'Failed to open the gdb terminal window'
|
||||
exe 'bwipe! ' . s:ptybuf
|
||||
@@ -200,18 +207,18 @@ func s:StartDebug_term(dict)
|
||||
let response = ''
|
||||
for lnum in range(1,200)
|
||||
if term_getline(s:gdbbuf, lnum) =~ 'new-ui mi '
|
||||
" response can be in the same line or the next line
|
||||
let response = term_getline(s:gdbbuf, lnum) . term_getline(s:gdbbuf, lnum + 1)
|
||||
if response =~ 'Undefined command'
|
||||
echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
|
||||
exe 'bwipe! ' . s:ptybuf
|
||||
exe 'bwipe! ' . s:commbuf
|
||||
return
|
||||
endif
|
||||
if response =~ 'New UI allocated'
|
||||
" Success!
|
||||
break
|
||||
endif
|
||||
" response can be in the same line or the next line
|
||||
let response = term_getline(s:gdbbuf, lnum) . term_getline(s:gdbbuf, lnum + 1)
|
||||
if response =~ 'Undefined command'
|
||||
echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
|
||||
exe 'bwipe! ' . s:ptybuf
|
||||
exe 'bwipe! ' . s:commbuf
|
||||
return
|
||||
endif
|
||||
if response =~ 'New UI allocated'
|
||||
" Success!
|
||||
break
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
if response =~ 'New UI allocated'
|
||||
@@ -268,9 +275,9 @@ func s:StartDebug_prompt(dict)
|
||||
call ch_log('executing "' . join(cmd) . '"')
|
||||
|
||||
let s:gdbjob = job_start(cmd, {
|
||||
\ 'exit_cb': function('s:EndPromptDebug'),
|
||||
\ 'out_cb': function('s:GdbOutCallback'),
|
||||
\ })
|
||||
\ 'exit_cb': function('s:EndPromptDebug'),
|
||||
\ 'out_cb': function('s:GdbOutCallback'),
|
||||
\ })
|
||||
if job_status(s:gdbjob) != "run"
|
||||
echoerr 'Failed to start gdb'
|
||||
exe 'bwipe! ' . s:promptbuf
|
||||
@@ -295,8 +302,8 @@ func s:StartDebug_prompt(dict)
|
||||
" Unix: Run the debugged program in a terminal window. Open it below the
|
||||
" gdb window.
|
||||
belowright let s:ptybuf = term_start('NONE', {
|
||||
\ 'term_name': 'debugged program',
|
||||
\ })
|
||||
\ 'term_name': 'debugged program',
|
||||
\ })
|
||||
if s:ptybuf == 0
|
||||
echoerr 'Failed to open the program terminal window'
|
||||
call job_stop(s:gdbjob)
|
||||
@@ -353,7 +360,8 @@ func s:StartDebugCommon(dict)
|
||||
endif
|
||||
endif
|
||||
|
||||
" Contains breakpoints that have been placed, key is the number.
|
||||
" Contains breakpoints that have been placed, key is a string with the GDB
|
||||
" breakpoint number.
|
||||
let s:breakpoints = {}
|
||||
|
||||
augroup TermDebug
|
||||
@@ -466,9 +474,9 @@ func s:DecodeMessage(quotedText)
|
||||
if a:quotedText[i] == '\'
|
||||
let i += 1
|
||||
if a:quotedText[i] == 'n'
|
||||
" drop \n
|
||||
let i += 1
|
||||
continue
|
||||
" drop \n
|
||||
let i += 1
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
let result .= a:quotedText[i]
|
||||
@@ -479,6 +487,9 @@ endfunc
|
||||
|
||||
" Extract the "name" value from a gdb message with fullname="name".
|
||||
func s:GetFullname(msg)
|
||||
if a:msg !~ 'fullname'
|
||||
return ''
|
||||
endif
|
||||
let name = s:DecodeMessage(substitute(a:msg, '.*fullname=', '', ''))
|
||||
if has('win32') && name =~ ':\\\\'
|
||||
" sometimes the name arrives double-escaped
|
||||
@@ -549,17 +560,17 @@ func s:CommOutput(chan, msg)
|
||||
endif
|
||||
if msg != ''
|
||||
if msg =~ '^\(\*stopped\|\*running\|=thread-selected\)'
|
||||
call s:HandleCursor(msg)
|
||||
call s:HandleCursor(msg)
|
||||
elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
|
||||
call s:HandleNewBreakpoint(msg)
|
||||
call s:HandleNewBreakpoint(msg)
|
||||
elseif msg =~ '^=breakpoint-deleted,'
|
||||
call s:HandleBreakpointDelete(msg)
|
||||
call s:HandleBreakpointDelete(msg)
|
||||
elseif msg =~ '^=thread-group-started'
|
||||
call s:HandleProgramRun(msg)
|
||||
call s:HandleProgramRun(msg)
|
||||
elseif msg =~ '^\^done,value='
|
||||
call s:HandleEvaluate(msg)
|
||||
call s:HandleEvaluate(msg)
|
||||
elseif msg =~ '^\^error,msg='
|
||||
call s:HandleError(msg)
|
||||
call s:HandleError(msg)
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
@@ -650,12 +661,12 @@ func s:DeleteCommands()
|
||||
let curwinid = win_getid(winnr())
|
||||
for winid in s:winbar_winids
|
||||
if win_gotoid(winid)
|
||||
aunmenu WinBar.Step
|
||||
aunmenu WinBar.Next
|
||||
aunmenu WinBar.Finish
|
||||
aunmenu WinBar.Cont
|
||||
aunmenu WinBar.Stop
|
||||
aunmenu WinBar.Eval
|
||||
aunmenu WinBar.Step
|
||||
aunmenu WinBar.Next
|
||||
aunmenu WinBar.Finish
|
||||
aunmenu WinBar.Cont
|
||||
aunmenu WinBar.Stop
|
||||
aunmenu WinBar.Eval
|
||||
endif
|
||||
endfor
|
||||
call win_gotoid(curwinid)
|
||||
@@ -673,7 +684,7 @@ func s:DeleteCommands()
|
||||
|
||||
exe 'sign unplace ' . s:pc_id
|
||||
for key in keys(s:breakpoints)
|
||||
exe 'sign unplace ' . (s:break_id + key)
|
||||
exe 'sign unplace ' . (s:break_id + s:Breakpoint2SignNumber(key))
|
||||
endfor
|
||||
unlet s:breakpoints
|
||||
|
||||
@@ -700,7 +711,7 @@ func s:SetBreakpoint()
|
||||
endif
|
||||
" Use the fname:lnum format, older gdb can't handle --source.
|
||||
call s:SendCommand('-break-insert '
|
||||
\ . fnameescape(expand('%:p')) . ':' . line('.'))
|
||||
\ . fnameescape(expand('%:p')) . ':' . line('.'))
|
||||
if do_continue
|
||||
call s:SendCommand('-exec-continue')
|
||||
endif
|
||||
@@ -714,7 +725,7 @@ func s:ClearBreakpoint()
|
||||
if val['fname'] == fname && val['lnum'] == lnum
|
||||
call s:SendCommand('-break-delete ' . key)
|
||||
" Assume this always wors, the reply is simply "^done".
|
||||
exe 'sign unplace ' . (s:break_id + key)
|
||||
exe 'sign unplace ' . (s:break_id + s:Breakpoint2SignNumber(key))
|
||||
unlet s:breakpoints[key]
|
||||
break
|
||||
endif
|
||||
@@ -839,14 +850,14 @@ func s:HandleCursor(msg)
|
||||
if lnum =~ '^[0-9]*$'
|
||||
call s:GotoSourcewinOrCreateIt()
|
||||
if expand('%:p') != fnamemodify(fname, ':p')
|
||||
if &modified
|
||||
" TODO: find existing window
|
||||
exe 'split ' . fnameescape(fname)
|
||||
let s:sourcewin = win_getid(winnr())
|
||||
call s:InstallWinbar()
|
||||
else
|
||||
exe 'edit ' . fnameescape(fname)
|
||||
endif
|
||||
if &modified
|
||||
" TODO: find existing window
|
||||
exe 'split ' . fnameescape(fname)
|
||||
let s:sourcewin = win_getid(winnr())
|
||||
call s:InstallWinbar()
|
||||
else
|
||||
exe 'edit ' . fnameescape(fname)
|
||||
endif
|
||||
endif
|
||||
exe lnum
|
||||
exe 'sign unplace ' . s:pc_id
|
||||
@@ -865,10 +876,14 @@ let s:BreakpointSigns = []
|
||||
func s:CreateBreakpoint(nr)
|
||||
if index(s:BreakpointSigns, a:nr) == -1
|
||||
call add(s:BreakpointSigns, a:nr)
|
||||
exe "sign define debugBreakpoint" . a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
|
||||
exe "sign define debugBreakpoint" . a:nr . " text=" . substitute(a:nr, '\..*', '', '') . " texthl=debugBreakpoint"
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func s:SplitMsg(s)
|
||||
return split(a:s, '{\%([a-z-]\+=[^,]\+,*\)\+}\zs')
|
||||
endfunction
|
||||
|
||||
" Handle setting a breakpoint
|
||||
" Will update the sign that shows the breakpoint
|
||||
func s:HandleNewBreakpoint(msg)
|
||||
@@ -876,50 +891,57 @@ func s:HandleNewBreakpoint(msg)
|
||||
" a watch does not have a file name
|
||||
return
|
||||
endif
|
||||
for msg in s:SplitMsg(a:msg)
|
||||
let fname = s:GetFullname(msg)
|
||||
if empty(fname)
|
||||
continue
|
||||
endif
|
||||
let nr = substitute(msg, '.*number="\([0-9.]*\)\".*', '\1', '')
|
||||
if empty(nr)
|
||||
return
|
||||
endif
|
||||
call s:CreateBreakpoint(nr)
|
||||
|
||||
let nr = substitute(a:msg, '.*number="\([0-9]*\)".*', '\1', '') + 0
|
||||
if nr == 0
|
||||
return
|
||||
endif
|
||||
call s:CreateBreakpoint(nr)
|
||||
if has_key(s:breakpoints, nr)
|
||||
let entry = s:breakpoints[nr]
|
||||
else
|
||||
let entry = {}
|
||||
let s:breakpoints[nr] = entry
|
||||
endif
|
||||
|
||||
if has_key(s:breakpoints, nr)
|
||||
let entry = s:breakpoints[nr]
|
||||
else
|
||||
let entry = {}
|
||||
let s:breakpoints[nr] = entry
|
||||
endif
|
||||
let lnum = substitute(msg, '.*line="\([^"]*\)".*', '\1', '')
|
||||
let entry['fname'] = fname
|
||||
let entry['lnum'] = lnum
|
||||
|
||||
let fname = s:GetFullname(a:msg)
|
||||
let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
|
||||
let entry['fname'] = fname
|
||||
let entry['lnum'] = lnum
|
||||
|
||||
if bufloaded(fname)
|
||||
call s:PlaceSign(nr, entry)
|
||||
endif
|
||||
if bufloaded(fname)
|
||||
call s:PlaceSign(nr, entry)
|
||||
endif
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
func s:PlaceSign(nr, entry)
|
||||
exe 'sign place ' . (s:break_id + a:nr) . ' line=' . a:entry['lnum'] . ' name=debugBreakpoint' . a:nr . ' file=' . a:entry['fname']
|
||||
exe 'sign place ' . (s:break_id + s:Breakpoint2SignNumber(a:nr)) . ' line=' . a:entry['lnum'] . ' name=debugBreakpoint' . a:nr . ' file=' . a:entry['fname']
|
||||
let a:entry['placed'] = 1
|
||||
endfunc
|
||||
|
||||
" Handle deleting a breakpoint
|
||||
" Will remove the sign that shows the breakpoint
|
||||
func s:HandleBreakpointDelete(msg)
|
||||
let nr = substitute(a:msg, '.*id="\([0-9]*\)\".*', '\1', '') + 0
|
||||
if nr == 0
|
||||
let key = substitute(a:msg, '.*id="\([0-9.]*\)\".*', '\1', '')
|
||||
if empty(key)
|
||||
return
|
||||
endif
|
||||
if has_key(s:breakpoints, nr)
|
||||
for [nr, entry] in items(s:breakpoints)
|
||||
if stridx(nr, key) != 0
|
||||
continue
|
||||
endif
|
||||
let entry = s:breakpoints[nr]
|
||||
if has_key(entry, 'placed')
|
||||
exe 'sign unplace ' . (s:break_id + nr)
|
||||
exe 'sign unplace ' . (s:break_id + s:Breakpoint2SignNumber(nr))
|
||||
unlet entry['placed']
|
||||
endif
|
||||
unlet s:breakpoints[nr]
|
||||
endif
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
" Handle the debugged program starting to run.
|
||||
|
||||
@@ -153,6 +153,7 @@ NEW_TESTS = \
|
||||
test_reltime \
|
||||
test_retab \
|
||||
test_ruby \
|
||||
test_scriptnames \
|
||||
test_scroll_opt \
|
||||
test_scrollbind \
|
||||
test_search \
|
||||
|
||||
+4
-3
@@ -7999,6 +7999,7 @@ ex_echo(exarg_T *eap)
|
||||
int needclr = TRUE;
|
||||
int atstart = TRUE;
|
||||
char_u numbuf[NUMBUFLEN];
|
||||
int did_emsg_before = did_emsg;
|
||||
|
||||
if (eap->skip)
|
||||
++emsg_skip;
|
||||
@@ -8016,7 +8017,7 @@ ex_echo(exarg_T *eap)
|
||||
* has been cancelled due to an aborting error, an interrupt, or an
|
||||
* exception.
|
||||
*/
|
||||
if (!aborting())
|
||||
if (!aborting() && did_emsg == did_emsg_before)
|
||||
EMSG2(_(e_invexpr2), p);
|
||||
need_clr_eos = FALSE;
|
||||
break;
|
||||
@@ -8114,7 +8115,7 @@ ex_execute(exarg_T *eap)
|
||||
char_u *p;
|
||||
garray_T ga;
|
||||
int len;
|
||||
int save_did_emsg;
|
||||
int save_did_emsg = did_emsg;
|
||||
|
||||
ga_init2(&ga, 1, 80);
|
||||
|
||||
@@ -8130,7 +8131,7 @@ ex_execute(exarg_T *eap)
|
||||
* has been cancelled due to an aborting error, an interrupt, or an
|
||||
* exception.
|
||||
*/
|
||||
if (!aborting())
|
||||
if (!aborting() && did_emsg == save_did_emsg)
|
||||
EMSG2(_(e_invexpr2), p);
|
||||
ret = FAIL;
|
||||
break;
|
||||
|
||||
+11
-11
@@ -62,15 +62,15 @@
|
||||
#define FILE1 (FILES | NOSPC) /* 1 file allowed, defaults to current file */
|
||||
|
||||
/* values for cmd_addr_type */
|
||||
#define ADDR_LINES 0
|
||||
#define ADDR_WINDOWS 1
|
||||
#define ADDR_ARGUMENTS 2
|
||||
#define ADDR_LOADED_BUFFERS 3
|
||||
#define ADDR_BUFFERS 4
|
||||
#define ADDR_TABS 5
|
||||
#define ADDR_TABS_RELATIVE 6 /* Tab page that only relative */
|
||||
#define ADDR_QUICKFIX 7
|
||||
#define ADDR_OTHER 99
|
||||
#define ADDR_LINES 0 // buffer line numbers
|
||||
#define ADDR_WINDOWS 1 // window number
|
||||
#define ADDR_ARGUMENTS 2 // argument number
|
||||
#define ADDR_LOADED_BUFFERS 3 // buffer number of loaded buffer
|
||||
#define ADDR_BUFFERS 4 // buffer number
|
||||
#define ADDR_TABS 5 // tab page number
|
||||
#define ADDR_TABS_RELATIVE 6 // Tab page that only relative
|
||||
#define ADDR_QUICKFIX 7 // quickfix list entry number
|
||||
#define ADDR_OTHER 99 // something else
|
||||
|
||||
#ifndef DO_DECLARE_EXCMD
|
||||
typedef struct exarg exarg_T;
|
||||
@@ -1266,8 +1266,8 @@ EX(CMD_sbrewind, "sbrewind", ex_brewind,
|
||||
EDITCMD|TRLBAR,
|
||||
ADDR_LINES),
|
||||
EX(CMD_scriptnames, "scriptnames", ex_scriptnames,
|
||||
TRLBAR|CMDWIN,
|
||||
ADDR_LINES),
|
||||
BANG|RANGE|NOTADR|COUNT|TRLBAR|CMDWIN,
|
||||
ADDR_OTHER),
|
||||
EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding,
|
||||
WORD1|TRLBAR|CMDWIN,
|
||||
ADDR_LINES),
|
||||
|
||||
+14
-1
@@ -4763,10 +4763,23 @@ theend:
|
||||
* ":scriptnames"
|
||||
*/
|
||||
void
|
||||
ex_scriptnames(exarg_T *eap UNUSED)
|
||||
ex_scriptnames(exarg_T *eap)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (eap->addr_count > 0)
|
||||
{
|
||||
// :script {scriptId}: edit the script
|
||||
if (eap->line2 < 1 || eap->line2 > script_items.ga_len)
|
||||
EMSG(_(e_invarg));
|
||||
else
|
||||
{
|
||||
eap->arg = SCRIPT_ITEM(eap->line2).sn_name;
|
||||
do_exedit(eap, NULL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i <= script_items.ga_len && !got_int; ++i)
|
||||
if (SCRIPT_ITEM(i).sn_name != NULL)
|
||||
{
|
||||
|
||||
@@ -3005,6 +3005,7 @@ parse_cmd_address(exarg_T *eap, char_u **errormsg, int silent)
|
||||
}
|
||||
break;
|
||||
case ADDR_TABS_RELATIVE:
|
||||
case ADDR_OTHER:
|
||||
*errormsg = (char_u *)_(e_invrange);
|
||||
return FAIL;
|
||||
case ADDR_ARGUMENTS:
|
||||
@@ -5956,6 +5957,7 @@ static struct
|
||||
{ADDR_BUFFERS, "buffers"},
|
||||
{ADDR_WINDOWS, "windows"},
|
||||
{ADDR_QUICKFIX, "quickfix"},
|
||||
{ADDR_OTHER, "other"},
|
||||
{-1, NULL}
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -462,6 +462,7 @@ may_do_incsearch_highlighting(
|
||||
int use_last_pat;
|
||||
|
||||
// Parsing range may already set the last search pattern.
|
||||
// NOTE: must call restore_last_search_pattern() before returning!
|
||||
save_last_search_pattern();
|
||||
|
||||
if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
|
||||
@@ -633,6 +634,7 @@ may_adjust_incsearch_highlighting(
|
||||
int save;
|
||||
|
||||
// Parsing range may already set the last search pattern.
|
||||
// NOTE: must call restore_last_search_pattern() before returning!
|
||||
save_last_search_pattern();
|
||||
|
||||
if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
|
||||
@@ -735,6 +737,7 @@ may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state)
|
||||
int skiplen, patlen;
|
||||
|
||||
// Parsing range may already set the last search pattern.
|
||||
// NOTE: must call restore_last_search_pattern() before returning!
|
||||
save_last_search_pattern();
|
||||
|
||||
if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
|
||||
@@ -742,6 +745,7 @@ may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state)
|
||||
restore_last_search_pattern();
|
||||
return FAIL;
|
||||
}
|
||||
restore_last_search_pattern();
|
||||
|
||||
// Add a character from under the cursor for 'incsearch'.
|
||||
if (is_state->did_incsearch)
|
||||
|
||||
+2
-2
@@ -636,7 +636,7 @@ emsg(char_u *s)
|
||||
if (cause_errthrow(s, severe, &ignore) == TRUE)
|
||||
{
|
||||
if (!ignore)
|
||||
did_emsg = TRUE;
|
||||
++did_emsg;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -689,7 +689,7 @@ emsg(char_u *s)
|
||||
beep_flush(); /* also includes flush_buffers() */
|
||||
else
|
||||
flush_buffers(FLUSH_MINIMAL); // flush internal buffers
|
||||
did_emsg = TRUE; // flag for DoOneCmd()
|
||||
++did_emsg; // flag for DoOneCmd()
|
||||
#ifdef FEAT_EVAL
|
||||
did_uncaught_emsg = TRUE;
|
||||
#endif
|
||||
|
||||
+4
-13
@@ -196,20 +196,11 @@ pum_display(
|
||||
return;
|
||||
|
||||
#if defined(FEAT_QUICKFIX)
|
||||
// If there is a preview window at the above avoid drawing over it.
|
||||
// Do keep at least 10 entries.
|
||||
if (pvwin != NULL && pum_row < above_row && pum_height > 10)
|
||||
// If there is a preview window above avoid drawing over it.
|
||||
if (pvwin != NULL && pum_row < above_row && pum_height > above_row)
|
||||
{
|
||||
if (pum_win_row - above_row < 10)
|
||||
{
|
||||
pum_row = pum_win_row - 10;
|
||||
pum_height = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
pum_row = above_row;
|
||||
pum_height = pum_win_row - above_row;
|
||||
}
|
||||
pum_row = above_row;
|
||||
pum_height = pum_win_row - above_row;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+28
-11
@@ -93,11 +93,8 @@ static int lastc_bytelen = 1; /* >1 for multi-byte char */
|
||||
/* copy of spats[], for keeping the search patterns while executing autocmds */
|
||||
static struct spat saved_spats[2];
|
||||
# ifdef FEAT_SEARCH_EXTRA
|
||||
/* copy of spats[RE_SEARCH], for keeping the search patterns while incremental
|
||||
* searching */
|
||||
static struct spat saved_last_search_spat;
|
||||
static int saved_last_idx = 0;
|
||||
static int saved_no_hlsearch = 0;
|
||||
static int saved_spats_last_idx = 0;
|
||||
static int saved_spats_no_hlsearch = 0;
|
||||
# endif
|
||||
|
||||
static char_u *mr_pattern = NULL; /* pattern used by search_regcomp() */
|
||||
@@ -313,8 +310,8 @@ save_search_patterns(void)
|
||||
if (spats[1].pat != NULL)
|
||||
saved_spats[1].pat = vim_strsave(spats[1].pat);
|
||||
#ifdef FEAT_SEARCH_EXTRA
|
||||
saved_last_idx = last_idx;
|
||||
saved_no_hlsearch = no_hlsearch;
|
||||
saved_spats_last_idx = last_idx;
|
||||
saved_spats_no_hlsearch = no_hlsearch;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -332,8 +329,8 @@ restore_search_patterns(void)
|
||||
vim_free(spats[1].pat);
|
||||
spats[1] = saved_spats[1];
|
||||
#ifdef FEAT_SEARCH_EXTRA
|
||||
last_idx = saved_last_idx;
|
||||
set_no_hlsearch(saved_no_hlsearch);
|
||||
last_idx = saved_spats_last_idx;
|
||||
set_no_hlsearch(saved_spats_no_hlsearch);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -357,6 +354,13 @@ free_search_patterns(void)
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_SEARCH_EXTRA
|
||||
// copy of spats[RE_SEARCH], for keeping the search patterns while incremental
|
||||
// searching
|
||||
static struct spat saved_last_search_spat;
|
||||
static int did_save_last_search_spat = 0;
|
||||
static int saved_last_idx = 0;
|
||||
static int saved_no_hlsearch = 0;
|
||||
|
||||
/*
|
||||
* Save and restore the search pattern for incremental highlight search
|
||||
* feature.
|
||||
@@ -368,6 +372,11 @@ free_search_patterns(void)
|
||||
void
|
||||
save_last_search_pattern(void)
|
||||
{
|
||||
if (did_save_last_search_spat != 0)
|
||||
IEMSG("did_save_last_search_spat is not zero");
|
||||
else
|
||||
++did_save_last_search_spat;
|
||||
|
||||
saved_last_search_spat = spats[RE_SEARCH];
|
||||
if (spats[RE_SEARCH].pat != NULL)
|
||||
saved_last_search_spat.pat = vim_strsave(spats[RE_SEARCH].pat);
|
||||
@@ -378,8 +387,16 @@ save_last_search_pattern(void)
|
||||
void
|
||||
restore_last_search_pattern(void)
|
||||
{
|
||||
if (did_save_last_search_spat != 1)
|
||||
{
|
||||
IEMSG("did_save_last_search_spat is not one");
|
||||
return;
|
||||
}
|
||||
--did_save_last_search_spat;
|
||||
|
||||
vim_free(spats[RE_SEARCH].pat);
|
||||
spats[RE_SEARCH] = saved_last_search_spat;
|
||||
saved_last_search_spat.pat = NULL;
|
||||
# if defined(FEAT_EVAL)
|
||||
set_vv_searchforward();
|
||||
# endif
|
||||
@@ -570,7 +587,7 @@ set_last_search_pat(
|
||||
saved_spats[idx].pat = NULL;
|
||||
else
|
||||
saved_spats[idx].pat = vim_strsave(spats[idx].pat);
|
||||
saved_last_idx = last_idx;
|
||||
saved_spats_last_idx = last_idx;
|
||||
}
|
||||
# ifdef FEAT_SEARCH_EXTRA
|
||||
/* If 'hlsearch' set and search pat changed: need redraw. */
|
||||
@@ -1380,7 +1397,7 @@ do_search(
|
||||
char_u *trunc;
|
||||
|
||||
if (*searchstr == NUL)
|
||||
p = spats[last_idx].pat;
|
||||
p = spats[0].pat;
|
||||
else
|
||||
p = searchstr;
|
||||
msgbuf = alloc((unsigned)(STRLEN(p) + 40));
|
||||
|
||||
@@ -158,6 +158,7 @@ NEW_TESTS = test_arabic.res \
|
||||
test_registers.res \
|
||||
test_retab.res \
|
||||
test_ruby.res \
|
||||
test_scriptnames.res \
|
||||
test_scrollbind.res \
|
||||
test_search.res \
|
||||
test_shortpathname.res \
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
|a+0&#ffffff0|b|0| @71
|
||||
|a|b|1| @71
|
||||
|a|b|2| @71
|
||||
|a|b|3| @71
|
||||
|a|b|4| @71
|
||||
|a|b|5| @71
|
||||
|a|b|6| @71
|
||||
|a|b|7| @71
|
||||
|a|b|8| @71
|
||||
|a+0#0000001#e0e0e08|b|0| @11| +0#0000000#0000001|e+1&#ffffff0|w|]|[|+|]| @34|1|,|1| @11|T|o|p
|
||||
|a+0#0000001#ffd7ff255|b|1| @11| +0#0000000#0000001| +0&#ffffff0@58
|
||||
|a+0#0000001#ffd7ff255|b|2| @11| +0#0000000#0000001| +0&#ffffff0@58
|
||||
|a+0#0000001#ffd7ff255|b|3| @11| +0#0000000#0000001| +0&#ffffff0@58
|
||||
|a+0#0000001#ffd7ff255|b|4| @11| +0#0000000#a8a8a8255| +0&#ffffff0@58
|
||||
|a+0#0000001#ffd7ff255|b|5| @11| +0#0000000#a8a8a8255| +0&#ffffff0@58
|
||||
|a+0#0000001#ffd7ff255|b|6| @11| +0#0000000#a8a8a8255| +0&#ffffff0@58
|
||||
|a|b|0> @71
|
||||
|~+0#4040ff13&| @73
|
||||
|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|0|,|1| @10|B|o|t
|
||||
|-+2&&@1| |K|e|y|w|o|r|d| |L|o|c|a|l| |c|o|m|p|l|e|t|i|o|n| |(|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |1|0| +0#0000000&@26
|
||||
@@ -28,7 +28,6 @@ undefined var3 on former level:
|
||||
Error detected while processing function Foo[2]..Bar[2]..Bazz:
|
||||
line 3:
|
||||
E121: Undefined variable: var3
|
||||
E15: Invalid expression: var3
|
||||
here var3 is defined with "another var":
|
||||
another var
|
||||
|
||||
@@ -36,7 +35,6 @@ undefined var2 on former level
|
||||
Error detected while processing function Foo[2]..Bar:
|
||||
line 3:
|
||||
E121: Undefined variable: var2
|
||||
E15: Invalid expression: var2
|
||||
here var2 is defined with 10:
|
||||
10
|
||||
|
||||
|
||||
@@ -396,6 +396,18 @@ func Test_argdelete()
|
||||
%argd
|
||||
endfunc
|
||||
|
||||
func Test_argdelete_completion()
|
||||
args foo bar
|
||||
|
||||
call feedkeys(":argdelete \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"argdelete bar foo', @:)
|
||||
|
||||
call feedkeys(":argdelete x \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"argdelete x bar foo', @:)
|
||||
|
||||
%argd
|
||||
endfunc
|
||||
|
||||
" Tests for the :next, :prev, :first, :last, :rewind commands
|
||||
func Test_argpos()
|
||||
call Reset_arglist()
|
||||
|
||||
@@ -597,3 +597,7 @@ func Test_script_detection()
|
||||
filetype off
|
||||
endfunc
|
||||
|
||||
func Test_setfiletype_completion()
|
||||
call feedkeys(":setfiletype java\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"setfiletype java javacc javascript', @:)
|
||||
endfunc
|
||||
|
||||
@@ -104,3 +104,8 @@ function Test_Search_history_window()
|
||||
call assert_equal('a', @/)
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
function Test_history_completion()
|
||||
call feedkeys(":history \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"history / : = > ? @ all cmd debug expr input search', @:)
|
||||
endfunc
|
||||
|
||||
@@ -59,3 +59,8 @@ function! Test_stopinsert_does_not_break_message_output()
|
||||
|
||||
set cmdheight&
|
||||
endfunction
|
||||
|
||||
func Test_message_completion()
|
||||
call feedkeys(":message \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"message clear', @:)
|
||||
endfunc
|
||||
|
||||
@@ -701,6 +701,28 @@ func Test_popup_and_preview_autocommand()
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
func Test_popup_and_previewwindow_dump()
|
||||
if !CanRunVimInTerminal()
|
||||
return
|
||||
endif
|
||||
call writefile([
|
||||
\ 'set previewheight=9',
|
||||
\ 'silent! pedit',
|
||||
\ 'call setline(1, map(repeat(["ab"], 10), "v:val. v:key"))',
|
||||
\ 'exec "norm! G\<C-E>\<C-E>"',
|
||||
\ ], 'Xscript')
|
||||
let buf = RunVimInTerminal('-S Xscript', {})
|
||||
|
||||
" Test that popup and previewwindow do not overlap.
|
||||
call term_sendkeys(buf, "o\<C-X>\<C-N>")
|
||||
sleep 100m
|
||||
call VerifyScreenDump(buf, 'Test_popup_and_previewwindow_01', {})
|
||||
|
||||
call term_sendkeys(buf, "\<Esc>u")
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('Xscript')
|
||||
endfunc
|
||||
|
||||
func Test_balloon_split()
|
||||
if !exists('*balloon_split')
|
||||
return
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
" Test for :scriptnames
|
||||
|
||||
func Test_scriptnames()
|
||||
call writefile(['let did_load_script = 123'], 'Xscripting')
|
||||
source Xscripting
|
||||
call assert_equal(123, g:did_load_script)
|
||||
|
||||
let scripts = split(execute('scriptnames'), "\n")
|
||||
let last = scripts[-1]
|
||||
call assert_match('\<Xscripting\>', last)
|
||||
let lastnr = substitute(last, '\D*\(\d\+\):.*', '\1', '')
|
||||
exe 'script ' . lastnr
|
||||
call assert_equal('Xscripting', expand('%:t'))
|
||||
|
||||
call assert_fails('script ' . (lastnr + 1), 'E474:')
|
||||
call assert_fails('script 0', 'E939:')
|
||||
|
||||
new
|
||||
call setline(1, 'nothing')
|
||||
call assert_fails('script ' . lastnr, 'E37:')
|
||||
exe 'script! ' . lastnr
|
||||
call assert_equal('Xscripting', expand('%:t'))
|
||||
|
||||
bwipe
|
||||
call delete('Xscripting')
|
||||
endfunc
|
||||
@@ -1142,3 +1142,15 @@ func Test_search_sentence()
|
||||
/\%'(
|
||||
/
|
||||
endfunc
|
||||
|
||||
" Test that there is no crash when there is a last search pattern but no last
|
||||
" substitute pattern.
|
||||
func Test_no_last_substitute_pat()
|
||||
" Use viminfo to set the last search pattern to a string and make the last
|
||||
" substitute pattern the most recent used and make it empty (NULL).
|
||||
call writefile(['~MSle0/bar', '~MSle0~&'], 'Xviminfo')
|
||||
rviminfo! Xviminfo
|
||||
call assert_fails('normal n', 'E35:')
|
||||
|
||||
call delete('Xviminfo')
|
||||
endfunc
|
||||
|
||||
@@ -119,6 +119,15 @@ func Test_syntime()
|
||||
bd
|
||||
endfunc
|
||||
|
||||
func Test_syntime_completion()
|
||||
if !has('profile')
|
||||
return
|
||||
endif
|
||||
|
||||
call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"syntime clear off on report', @:)
|
||||
endfunc
|
||||
|
||||
func Test_syntax_list()
|
||||
syntax on
|
||||
let a = execute('syntax list')
|
||||
|
||||
@@ -154,7 +154,7 @@ func Test_CmdCompletion()
|
||||
call assert_equal('"com -nargs=* + 0 1 ?', @:)
|
||||
|
||||
call feedkeys(":com -addr=\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"com -addr=arguments buffers lines loaded_buffers quickfix tabs windows', @:)
|
||||
call assert_equal('"com -addr=arguments buffers lines loaded_buffers other quickfix tabs windows', @:)
|
||||
|
||||
call feedkeys(":com -complete=co\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"com -complete=color command compiler', @:)
|
||||
@@ -218,3 +218,61 @@ func Test_use_execute_in_completion()
|
||||
call assert_equal('"DoExec hi', @:)
|
||||
delcommand DoExec
|
||||
endfunc
|
||||
|
||||
func Test_addr_all()
|
||||
command! -addr=lines DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
%DoSomething
|
||||
call assert_equal(1, g:a1)
|
||||
call assert_equal(line('$'), g:a2)
|
||||
|
||||
command! -addr=arguments DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
args one two three
|
||||
%DoSomething
|
||||
call assert_equal(1, g:a1)
|
||||
call assert_equal(3, g:a2)
|
||||
|
||||
command! -addr=buffers DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
%DoSomething
|
||||
for low in range(1, bufnr('$'))
|
||||
if buflisted(low)
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
call assert_equal(low, g:a1)
|
||||
call assert_equal(bufnr('$'), g:a2)
|
||||
|
||||
command! -addr=loaded_buffers DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
%DoSomething
|
||||
for low in range(1, bufnr('$'))
|
||||
if bufloaded(low)
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
call assert_equal(low, g:a1)
|
||||
for up in range(bufnr('$'), 1, -1)
|
||||
if bufloaded(up)
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
call assert_equal(up, g:a2)
|
||||
|
||||
command! -addr=windows DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
new
|
||||
%DoSomething
|
||||
call assert_equal(1, g:a1)
|
||||
call assert_equal(winnr('$'), g:a2)
|
||||
bwipe
|
||||
|
||||
command! -addr=tabs DoSomething let g:a1 = <line1> | let g:a2 = <line2>
|
||||
tabnew
|
||||
%DoSomething
|
||||
call assert_equal(1, g:a1)
|
||||
call assert_equal(len(gettabinfo()), g:a2)
|
||||
bwipe
|
||||
|
||||
command! -addr=other DoSomething echo 'nothing'
|
||||
DoSomething
|
||||
call assert_fails('%DoSomething')
|
||||
|
||||
delcommand DoSomething
|
||||
endfunc
|
||||
|
||||
@@ -807,6 +807,28 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
560,
|
||||
/**/
|
||||
559,
|
||||
/**/
|
||||
558,
|
||||
/**/
|
||||
557,
|
||||
/**/
|
||||
556,
|
||||
/**/
|
||||
555,
|
||||
/**/
|
||||
554,
|
||||
/**/
|
||||
553,
|
||||
/**/
|
||||
552,
|
||||
/**/
|
||||
551,
|
||||
/**/
|
||||
550,
|
||||
/**/
|
||||
549,
|
||||
/**/
|
||||
|
||||
+10
-13
@@ -1,4 +1,4 @@
|
||||
Uninstalling Vim on Dos and MS-Windows.
|
||||
Uninstalling Vim on MS-Windows.
|
||||
|
||||
There are three ways to remove Vim:
|
||||
|
||||
@@ -27,12 +27,11 @@ messages to avoid deleting something you want to keep.
|
||||
|
||||
Here are guidelines for removing Vim by hand:
|
||||
|
||||
1. Remove the "Edit with Vim" popup menu entry, if it exists. This will only
|
||||
be on MS-Windows 95/98/NT. This is done by running the uninstal.exe
|
||||
program. It removes the registry entries for the "Edit with Vim" popup
|
||||
menu entry. You only need to run uninstal.exe when you have installed the
|
||||
menu entry. You can also run uninstal.exe from the Control panel with the
|
||||
Add/Remove programs application.
|
||||
1. Remove the "Edit with Vim" popup menu entry, if it exists. This is done by
|
||||
running the uninstal.exe program. It removes the registry entries for the
|
||||
"Edit with Vim" popup menu entry. You only need to run uninstal.exe when
|
||||
you have installed the menu entry. You can also run uninstal.exe from the
|
||||
Control panel with the Add/Remove programs application.
|
||||
Note that uninstal.exe offers you the option to uninstal other items. You
|
||||
can skip this.
|
||||
|
||||
@@ -55,8 +54,8 @@ Here are guidelines for removing Vim by hand:
|
||||
skip the next step.
|
||||
|
||||
5. Delete the distributed files. If you followed the directions, these will
|
||||
be located in a directory like "C:\vim\vim80". If the $VIM environment
|
||||
variable is set, the directory will be $VIM\vim80. Delete the "vim80"
|
||||
be located in a directory like "C:\vim\vim81". If the $VIM environment
|
||||
variable is set, the directory will be $VIM\vim81. Delete the "vim81"
|
||||
directory and all that is in it. Warning: If you changed any of the
|
||||
distributed files, or added some of your own files, you might want to save
|
||||
these first. But normally you would not have changed or added files here.
|
||||
@@ -66,10 +65,8 @@ Here are guidelines for removing Vim by hand:
|
||||
another version of Vim. $VIMRUNTIME is mostly not set. Check if $PATH
|
||||
contains the path of the vim directory. Note that $PATH may be set in
|
||||
several places, you will have to find the right one, and only delete the
|
||||
Vim path from it. You can most likely find the lines that set $PATH, $VIM
|
||||
and/or $VIMRUNTIME in C:\autoexec.bat. Under Windows NT you might need to
|
||||
use the "System Properties" editor to change the environment variables, if
|
||||
they are not in the C:\autoexec.bat file. You can start it by selecting
|
||||
Vim path from it. You might need to use the "System Properties" editor to
|
||||
change the environment variables. You can start it by selecting
|
||||
Start/Settings/Control Panel and then "System".
|
||||
|
||||
7. If you added a Vim entry in the start menu, delete it.
|
||||
|
||||
Reference in New Issue
Block a user