diff options
author | Bram Moolenaar <Bram@vim.org> | 2006-02-27 23:58:35 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2006-02-27 23:58:35 +0000 |
commit | 5e3cb7e8699f855193179a8cb799d1087f4a2ac9 (patch) | |
tree | 297e019074e2c2b85d5151701fcfae03bf02ceb9 | |
parent | eddf53b02e2b007208b19c74fb616be2c0839b36 (diff) |
updated for version 7.0209v7.0209
38 files changed, 874 insertions, 389 deletions
diff --git a/runtime/doc/Makefile b/runtime/doc/Makefile index 1cf3241b65..3e77c53b1b 100644 --- a/runtime/doc/Makefile +++ b/runtime/doc/Makefile @@ -71,6 +71,7 @@ DOCS = \ pattern.txt \ pi_gzip.txt \ pi_netrw.txt \ + pi_paren.txt \ pi_spec.txt \ pi_tar.txt \ pi_zip.txt \ @@ -196,6 +197,7 @@ HTMLS = \ pattern.html \ pi_gzip.html \ pi_netrw.html \ + pi_paren.html \ pi_spec.html \ print.html \ quickfix.html \ diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index 4899648bf2..4dd34eb6aa 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 20 +*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -471,6 +471,8 @@ CursorHoldI Just like CursorHold, but in Insert mode. *CursorMoved* CursorMoved After the cursor was moved in Normal mode. + Also when the text of the cursor line has been + changed, e.g., with "x", "rx" or "p". Not triggered when there is typeahead or when an operator is pending. For an example see |match-parens|. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index b6534e0e91..a1c751d08e 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 26 +*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3361,12 +3361,6 @@ match({expr}, {pat}[, {start}[, {count}]]) *match()* "\c" to the pattern to ignore case: > :let idx = match(haystack, '\cneedle') < - When {count} is given use the {count}'th match. When a match - is found in a String the search for the next one starts on - character further. Thus this example results in 1: > - echo match("testing", "..", 0, 2) -< In a |List| the search continues in the next item. - If {start} is given, the search starts from byte index {start} in a String or item {start} in a |List|. The result, however, is still the index counted from the @@ -3377,11 +3371,19 @@ match({expr}, {pat}[, {start}[, {count}]]) *match()* < result is again "4". > :echo match("testing", "t", 2) < result is "3". + For a String, if {start} > 0 then it is like the string starts + {start} bytes later, thus "^" will match there. For a String, if {start} < 0, it will be set to 0. For a list the index is counted from the end. If {start} is out of range (> strlen({expr} for a String or > len({expr} for a |List|) -1 is returned. + When {count} is given use the {count}'th match. When a match + is found in a String the search for the next one starts on + character further. Thus this example results in 1: > + echo match("testing", "..", 0, 2) +< In a |List| the search continues in the next item. + See |pattern| for the patterns that are accepted. The 'ignorecase' option is used to set the ignore-caseness of the pattern. 'smartcase' is NOT used. The matching is always diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt index de4b317c6a..b3b0dd92bc 100644 --- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -1,4 +1,4 @@ -*gui.txt* For Vim version 7.0aa. Last change: 2006 Feb 21 +*gui.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -24,9 +24,9 @@ Other GUI documentation: 1. Starting the GUI *gui-start* *E229* *E233* First you must make sure you actually have a version of Vim with the GUI code -included. You can check this with the ":version" command, it should include -"+GUI_Athena", "+GUI_GTK", "+GUI_KDE", "+GUI_Motif" or "MS-Windows ... bit -GUI version". +included. You can check this with the ":version" command, it says "with xxx +GUI", where "xxx" is X11-Motif, X11-Athena, Photon, GTK, GTK2, etc., or +"MS-Windows 32 bit GUI version". How to start the GUI depends on the system used. Mostly you can run the GUI version of Vim with: diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt index 42f0eb1e4d..3192df56e2 100644 --- a/runtime/doc/help.txt +++ b/runtime/doc/help.txt @@ -1,4 +1,4 @@ -*help.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 +*help.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM - main help file k @@ -187,9 +187,11 @@ Remarks about specific systems ~ |os_win32.txt| MS-Windows 95/98/NT *standard-plugin-list* Standard plugins ~ -|pi_netrw.txt| Reading and writing files over a network |pi_gzip.txt| Reading and writing compressed files -|pi_expl.txt| File explorer +|pi_netrw.txt| Reading and writing files over a network +|pi_paren.txt| Highlight matching parens +|pi_tar.txt| Tar file explorer +|pi_zip.txt| Zip archive explorer LOCAL ADDITIONS: *local-additions* diff --git a/runtime/doc/makehtml.awk b/runtime/doc/makehtml.awk index 8ae067e814..34a55445b8 100644 --- a/runtime/doc/makehtml.awk +++ b/runtime/doc/makehtml.awk @@ -581,7 +581,7 @@ function find_tag2() { ntags=split(atag,blata,"[ ]"); if ( ntags > 1 ) { return; } if ( ( allow_one_char == "no" ) && \ - ( index("!#$%\&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",atag) !=0 ) ) { + ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",atag) !=0 ) ) { return; } if ( skip_word[atag] == "yes" ) { return; } @@ -610,7 +610,7 @@ function find_tag3() { ntags=split(btag,blata,"[ ]"); if ( ntags > 1 ) { return; } if ( ( allow_one_char == "no" ) && \ - ( index("!#$%\&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",btag) !=0 ) ) { + ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",btag) !=0 ) ) { return; } if ( skip_word[btag] == "yes" ) { return; } diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 13642e6f56..b17fba95e2 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 26 +*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4639,7 +4639,7 @@ A jump table for the options with a short description can be found at |Q_op|. {only available when compiled with the |+linebreak| feature} Minimal number of columns to use for the line number. Only relevant - when the 'number' option is set or printint lines with a line number. + when the 'number' option is set or printing lines with a line number. Since one space is always between the number and the text, there is one less character for the number itself. The value is the minimum width. A bigger width is used when needed to diff --git a/runtime/doc/pi_paren.txt b/runtime/doc/pi_paren.txt new file mode 100644 index 0000000000..d1733c6c7d --- /dev/null +++ b/runtime/doc/pi_paren.txt @@ -0,0 +1,42 @@ +*pi_paren.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 + + + VIM REFERENCE MANUAL by Bram Moolenaar + + +Highlighting matching parens *matchparen* + +The functionality mentioned here is a |standard-plugin|. +This plugin is only available if 'compatible' is not set. + +You can avoid loading this plugin by setting the "loaded_matchparen" variable: > + :let loaded_matchparen = 1 + +The plugin installs CursorMoved autocommands to redefine the match +highlighting. + +To disable the plugin after it was loaded use this command: > + + :NoMatchParen + +And to enable it again: > + + :DoMatchParen + +The highlighting used is ParenMatch. You can specify different colors with +the ":highlight" command. Example: > + + :hi ParenMatch ctermbg=blue guibg=lightblue + +The characters to be matched come from the 'matchpairs' option. You can +change the value to highlight different matches. Note that not everything is +possible. For example, you can't highlight single or double quotes, because +the start and end are equal. + +The syntax highlighting attributes are used. When the cursor currently is not +in a string or comment syntax item, then matches inside string and comment +syntax items are ignored. Any syntax items with "string" or "comment" +somewhere in their name are considered string or comment items. + +============================================================================== + vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/doc/tags b/runtime/doc/tags index 0a5d062e11..3da16a4f3c 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -5920,6 +5920,7 @@ match-parens tips.txt /*match-parens* matchend() eval.txt /*matchend()* matchit-install usr_05.txt /*matchit-install* matchlist() eval.txt /*matchlist()* +matchparen pi_paren.txt /*matchparen* matchstr() eval.txt /*matchstr()* max() eval.txt /*max()* mbyte-IME mbyte.txt /*mbyte-IME* @@ -6180,6 +6181,7 @@ new-items-7 version7.txt /*new-items-7* new-line-continuation version5.txt /*new-line-continuation* new-location-list version7.txt /*new-location-list* new-manpage-trans version7.txt /*new-manpage-trans* +new-matchparen version7.txt /*new-matchparen* new-multi-byte version5.txt /*new-multi-byte* new-multi-lang version6.txt /*new-multi-lang* new-netrw-explore version7.txt /*new-netrw-explore* @@ -6318,6 +6320,7 @@ php3.vim syntax.txt /*php3.vim* phtml.vim syntax.txt /*phtml.vim* pi_gzip.txt pi_gzip.txt /*pi_gzip.txt* pi_netrw.txt pi_netrw.txt /*pi_netrw.txt* +pi_paren.txt pi_paren.txt /*pi_paren.txt* pi_spec.txt pi_spec.txt /*pi_spec.txt* plugin usr_05.txt /*plugin* plugin-details filetype.txt /*plugin-details* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 00aa9b1cdf..efee16c9f3 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 26 +*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,11 +30,8 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. *known-bugs* -------------------- Known bugs and current work ----------------------- -Script ID is only remembered for global options. Should remember it for every -local option separately. - Change PV_XXX values in separate ranges for buffer and window. - Move the enums to option.h so that the size is known in structs.h - use array for each window and buffer with scriptID values. +test 49 fails because of the function line numbering now taking care of +continuation lines. Crash with X command server (Ciaran McCreesh). @@ -43,7 +40,6 @@ maintanance. "fsutil hardlink" can create a hard link on an NTFS file system. (Daniel Einspanjer) What library function can detect that? - Win32: use GetFileInformationByHandle() to detect hard links on NTFS? (George Reilly) @@ -90,9 +86,6 @@ spelling: adding a bad word like "zw" would. Use "zuw" to undo "zw"? (Antonio Colombo) -An error in a function uses a line number that doesn't take line continuation -into account. (Mikolaj Machowski) Store line count in an extra array? - Is it possible to keep the command-line window open? Would actually work like closing it, executing the command and re-opening it (at the same position). @@ -1603,7 +1596,7 @@ Syntax highlighting: "%" match. :syntax nomatch cMatchError (,{,[,),},] [contained] 8 Highlight the text between two matching parens (e.g., with a grey background) when on one of the parens or in between them. - Or highlight the matching paren when the cursor is on one. + Option for the matchparen plugin? 8 Add a command to jump to the next character highlighted with "Error". 8 When using a cterm, and no ctermfg or ctermbg are defined, use start/stop sequences. Add remark in docs that :if 'term' == "term-name" should be @@ -1796,17 +1789,16 @@ Built-in script language: specified in any way? To be able to jump to the last edited file. 8 Pass the executable name to the Vim scripts in some way. As v:argv0? 8 Add command arguments with three dashes, passed on to Vim scripts. -8 When starting to source a vim script, delete all functions that it has - previously defined? Avoids using ":fun!" all the time. 7 Add optional arguments to user functions: :func myFunc(arg1, arg2, arg3 = "blah", arg4 = 17) 6 User functions: Functions local to buffer "b:func()"? -8 Add ":let var[{expr}] = {expr}". When past the end of "var" just ignore. +8 For Strings add ":let var[{expr}] = {expr}". When past the end of "var" + just ignore. 8 The "= register should be writable, if followed by the name of a variable, option or environment variable. 8 ":let &option" should list the value of the option. -7 Add synIDlist(), making the whole list of syntax items on the - stack available (separated with '\n'). +7 Add synIDlist(), making the whole list of syntax items on the syntax stack + available as a List. 8 Add autocommand-event for when a variable is changed: :au VarChanged {varname} {commands} 8 Add "has("gui_capable")", to check if the GUI can be started. diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt index 29e8afc087..065cfaa926 100644 --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 26 +*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -23,6 +23,7 @@ Spell checking |new-spell| Omni completion |new-omni-completion| MzScheme interface |new-MzScheme| Printing multi-byte text |new-print-multi-byte| +Highlighting matching parens |new-matchparen| Translated manual pages |new-manpage-trans| Internal grep |new-vimgrep| Scroll back in messages |new-scroll-back| @@ -227,6 +228,16 @@ The 'printmbcharset' and 'printmbfont' options are used for this. Also see |postscript-cjk-printing|. (Mike Williams) +Highlighting matching parens *new-matchparen* +---------------------------- + +When moving the cursor through the text and it is on a paren, then the +matching paren can be highlighted. This uses the new |CursorMoved| +autocommand event. + +See |pi_paren.txt| for more information. + + Translated manual pages *new-manpage-trans* ----------------------- @@ -1767,4 +1778,17 @@ the end of every line only up to the length of the last line was counted. "dip" in trailing empty lines left one empty line behind. +The script ID was only remembered globally for each option. When a buffer- or +window-local option was set the same "last set" location was changed for all +buffers and windows. Now remember the script ID for each local option +separately. + +GUI: The "Replace All" button didn't handle backslashes in the replacement in +the same way as "Replace". Escape backslashes so that they are taken +literally. + +An error in a function reported a line number that doesn't take line +continuation into account. Now store a NULL for continuation lines, so that +the index is equal to the line number in the sourced file. + vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 2a3cc2a584..c25ab53714 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2006 Feb 25 +" Last Change: 2006 Feb 27 " Listen very carefully, I will say this only once if exists("did_load_filetypes") @@ -1658,19 +1658,29 @@ au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex au BufNewFile,BufRead *.tex call s:FTtex() fun! s:FTtex() - let n = 1 - while n < 10 && n < line("$") - let line = getline(n) - if line =~ '^\s*\\\%(documentclass\>\|usepackage\>\|begin{\)' - setf tex - return - elseif line =~ '^\s*\\\%(start\l\+\|setup\l\+\|usemodule\|enablemode\>\|enableregime\>\|setvariables\>\|useencoding\>\|usesymbols\>\|stel\l\+\|verwende\l\+\|stel\l\+\|gebruik\l\+\|usa\l\+\|imposta\l\+\|regle\l\+\|utilisemodule\>\)\>' - setf context - return + let lnum = 1 + let checked = 0 + while checked < 25 && lnum < line("$") + let line = getline(lnum) + if line !~ '^\s*%' + if line =~ '^\s*\\\%(documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>\)' + setf tex + return + elseif line =~ '^\s*\\\%(start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\)\>' + setf context + return + endif + let checked = checked + 1 endif - let n = n + 1 + let lnum = lnum + 1 endwhile - setf tex + + " Didn't recognize anything, guess. + if exists("g:tex_flavour") && g:tex_flavour == "context" + setf context + else + setf tex + endif endfun " Context diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim new file mode 100644 index 0000000000..c11ca9fede --- /dev/null +++ b/runtime/plugin/matchparen.vim @@ -0,0 +1,106 @@ +" Vim plugin for showing matching parens +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last Change: 2006 Feb 27 + +" Exit quickly when: +" - this plugin was already loaded (or disabled) +" - when 'compatible' is set +" - the "CursorMoved" autocmd event is not availble. +if exists("g:loaded_matchparen") || &cp || !exists("##CursorMoved") + finish +endif +let g:loaded_matchparen = 1 + +augroup matchparen + " Replace all matchparen autocommands + autocmd! CursorMoved,CursorMovedI * call s:Highlight_Matching_Pair() +augroup END + +let s:paren_hl_on = 0 + +" Skip the rest if it was already done. +if exists("*s:Highlight_Matching_Pair") + finish +endif + +" The function that is invoked (very often) to define a ":match" highlighting +" for any matching paren. +function! s:Highlight_Matching_Pair() + " Remove any previous match. + if s:paren_hl_on + match none + let s:paren_hl_on = 0 + endif + + " Get the character under the cursor and check if it's in 'matchpairs'. + let c_lnum = line('.') + let c_col = col('.') + let before = 0 + + let c = getline(c_lnum)[c_col - 1] + let plist = split(&matchpairs, ':\|,') + let i = index(plist, c) + if i < 0 + " not found, in Insert mode try character before the cursor + if c_col > 1 && (mode() == 'i' || mode() == 'R') + let before = 1 + let c = getline(c_lnum)[c_col - 2] + let i = index(plist, c) + endif + if i < 0 + " not found, nothing to do + return + endif + endif + + " Figure out the arguments for searchpairpos(). + " Restrict the search to visible lines with "stopline". + if i % 2 == 0 + let s_flags = 'nW' + let c2 = plist[i + 1] + let stopline = line('w$') + else + let s_flags = 'nbW' + let c2 = c + let c = plist[i - 1] + let stopline = line('w0') + endif + if c == '[' + let c = '\[' + let c2 = '\]' + endif + + " When not in a string or comment ignore matches inside them. + let s_skip ='synIDattr(synID(c_lnum, c_col - before, 0), "name") ' . + \ '=~? "string\\|comment"' + execute 'if' s_skip '| let s_skip = 0 | endif' + + " Find the match. When it was just before the cursor move it there for a + " moment. To restore the cursor position use "N|" and when 'virtualedit' + " is set, cursor() otherwise. + if before > 0 + if &ve != '' + let vcol = virtcol('.') + endif + call cursor(c_lnum, c_col - before) + endif + let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) + if before > 0 + if &ve != '' + exe 'normal ' . vcol . '|' + else + call cursor(0, c_col) + endif + endif + + " If a match is found setup match highlighting. + if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$') + exe 'match MatchParen /\(\%' . c_lnum . 'l\%' . (c_col - before) . + \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/' + let s:paren_hl_on = 1 + endif +endfunction + +" Define commands that will disable and enable the plugin. +command! NoMatchParen match none | unlet! g:loaded_matchparen | au! matchparen +command! DoMatchParen runtime plugin/matchparen.vim | doau CursorMoved diff --git a/src/diff.c b/src/diff.c index d5cb97c4e5..82be8b9ae2 100644 --- a/src/diff.c +++ b/src/diff.c @@ -1083,10 +1083,7 @@ diff_win_options(wp, addbuf) curwin = wp; curbuf = curwin->w_buffer; set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff", - OPT_LOCAL|OPT_FREE); -# ifdef FEAT_EVAL - set_option_scriptID((char_u *)"fdm", current_SID); -# endif + OPT_LOCAL|OPT_FREE, 0); curwin = old_curwin; curbuf = curwin->w_buffer; wp->w_p_fdc = 2; @@ -1133,10 +1130,7 @@ ex_diffoff(eap) curwin = wp; curbuf = curwin->w_buffer; set_string_option_direct((char_u *)"fdm", -1, - (char_u *)"manual", OPT_LOCAL|OPT_FREE); -# ifdef FEAT_EVAL - set_option_scriptID((char_u *)"fdm", current_SID); -# endif + (char_u *)"manual", OPT_LOCAL|OPT_FREE, 0); curwin = old_curwin; curbuf = curwin->w_buffer; wp->w_p_fdc = 0; diff --git a/src/edit.c b/src/edit.c index bfd27cec24..25a10be2a9 100644 --- a/src/edit.c +++ b/src/edit.c @@ -136,6 +136,7 @@ static void ins_compl_free __ARGS((void)); static void ins_compl_clear __ARGS((void)); static int ins_compl_bs __ARGS((void)); static void ins_compl_addleader __ARGS((int c)); +static void ins_compl_set_original_text __ARGS((char_u *str)); static void ins_compl_addfrommatch __ARGS((void)); static int ins_compl_prep __ARGS((int c)); static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag)); @@ -1387,7 +1388,7 @@ ins_redraw(ready) if (!char_avail()) { #ifdef FEAT_AUTOCMD - /* Trigger CursorMoved if the cursor moved. */ + /* Trigger CursorMoved if the cursor moved. */ if (ready && has_cursormovedI() && !equalpos(last_cursormoved, curwin->w_cursor)) { @@ -2109,11 +2110,8 @@ ins_compl_add(str, len, icase, fname, extra, cdir, flags) return FAIL; match->cp_number = -1; if (flags & ORIGINAL_TEXT) - { match->cp_number = 0; - match->cp_str = compl_orig_text; - } - else if ((match->cp_str = vim_strnsave(str, len)) == NULL) + if ((match->cp_str = vim_strnsave(str, len)) == NULL) { vim_free(match); return FAIL; @@ -2818,7 +2816,9 @@ ins_compl_bs() ins_compl_delete(); ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); - if (!compl_started) + if (compl_started) + ins_compl_set_original_text(compl_leader); + else { /* Matches were cleared, need to search for them now. */ if (ins_complete(Ctrl_N) == FAIL) @@ -2872,6 +2872,28 @@ ins_compl_addleader(c) ins_compl_del_pum(); ins_compl_show_pum(); compl_used_match = FALSE; + ins_compl_set_original_text(compl_leader); + } +} + +/* + * Set the first match, the original text. + */ + static void +ins_compl_set_original_text(str) + char_u *str; +{ + char_u *p; + + /* Replace the original text entry. */ + if (compl_first_match->cp_flags & ORIGINAL_TEXT) /* safety check */ + { + p = vim_strsave(str); + if (p != NULL) + { + vim_free(compl_first_match->cp_str); + compl_first_match->cp_str = p; + } } } @@ -4328,9 +4350,8 @@ ins_complete(c) else edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode)); - /* Always add completion for the original text. Note that - * "compl_orig_text" itself (not a copy) is added, it will be freed - * when the list of matches is freed. */ + /* Always add completion for the original text. */ + vim_free(compl_orig_text); compl_orig_text = vim_strnsave(line + compl_col, compl_length); if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, -1, FALSE, NULL, NULL, 0, ORIGINAL_TEXT) != OK) @@ -5779,6 +5800,8 @@ free_last_insert() { vim_free(last_insert); last_insert = NULL; + vim_free(compl_orig_text); + compl_orig_text = NULL; } #endif diff --git a/src/eval.c b/src/eval.c index 9f79560b47..ee5f0c9e79 100644 --- a/src/eval.c +++ b/src/eval.c @@ -11731,6 +11731,7 @@ find_some_match(argvars, rettv, type) char_u *save_cpo; long start = 0; long nth = 1; + colnr_T startcol = 0; int match = 0; list_T *l = NULL; listitem_T *li = NULL; @@ -11811,12 +11812,12 @@ find_some_match(argvars, rettv, type) break; } vim_free(tofree); - str = echo_string(&li->li_tv, &tofree, strbuf,0); + str = echo_string(&li->li_tv, &tofree, strbuf, 0); if (str == NULL) break; } - match = vim_regexec_nl(®match, str, (colnr_T)0); + match = vim_regexec_nl(®match, str, (colnr_T)startcol); if (match && --nth <= 0) break; @@ -11832,9 +11833,10 @@ find_some_match(argvars, rettv, type) else { #ifdef FEAT_MBYTE - str = regmatch.startp[0] + (*mb_ptr2len)(regmatch.startp[0]); + startcol = regmatch.startp[0] + + (*mb_ptr2len)(regmatch.startp[0]) - str; #else - str = regmatch.startp[0] + 1; + startcol = regmatch.startp[0] + 1 - str; #endif } } @@ -17400,6 +17402,7 @@ ex_function(eap) hashtab_T *ht; int todo; hashitem_T *hi; + int sourcing_lnum_off; /* * ":function" without argument: list functions. @@ -17522,6 +17525,8 @@ ex_function(eap) list_func_head(fp, TRUE); for (j = 0; j < fp->uf_lines.ga_len && !got_int; ++j) { + if (FUNCLINE(fp, j) == NULL) + continue; msg_putchar('\n'); msg_outnum((long)(j + 1)); if (j < 9) @@ -17693,6 +17698,8 @@ ex_function(eap) { msg_scroll = TRUE; need_wait_return = FALSE; + sourcing_lnum_off = sourcing_lnum; + if (line_arg != NULL) { /* Use eap->arg, split up in parts by line breaks. */ @@ -17718,6 +17725,12 @@ ex_function(eap) goto erret; } + /* Detect line continuation: sourcing_lnum increased more than one. */ |