# HG changeset patch # User vimboss # Date 1090270554 0 # Node ID a81bc802c17ce7002b08d2e327136e3ac4d11d5a # Parent 293621502c4daa122ae601398d854857bb732a83 updated for version 7.0011 diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.0aa. Last change: 2004 Jul 18 +*eval.txt* For Vim version 7.0aa. Last change: 2004 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -831,6 +831,8 @@ executable( {expr}) Number 1 if executa exists( {expr}) Number TRUE if {expr} exists expand( {expr}) String expand special keywords in {expr} filereadable( {file}) Number TRUE if {file} is a readable file +findfile( {name}[, {path}[, {count}]]) + String Find fine {name} in {path} filewritable( {file}) Number TRUE if {file} is a writable file fnamemodify( {fname}, {mods}) String modify file name foldclosed( {lnum}) Number first line of fold at {lnum} if closed @@ -879,12 +881,12 @@ lispindent( {lnum}) Number Lisp indent localtime() Number current time maparg( {name}[, {mode}]) String rhs of mapping {name} in mode {mode} mapcheck( {name}[, {mode}]) String check for mappings matching {name} -match( {expr}, {pat}[, {start}]) +match( {expr}, {pat}[, {start}[, {count}]]) Number position where {pat} matches in {expr} -matchend( {expr}, {pat}[, {start}]) +matchend( {expr}, {pat}[, {start}[, {count}]]) Number position where {pat} ends in {expr} -matchstr( {expr}, {pat}[, {start}]) - String match of {pat} in {expr} +matchstr( {expr}, {pat}[, {start}[, {count}]]) + String {count}'th match of {pat} in {expr} mode() String current editing mode nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} nr2char( {expr}) String single char with ASCII value {expr} @@ -1412,6 +1414,23 @@ filereadable({file}) *filereadable() *file_readable()* Obsolete name: file_readable(). +finddir({name}[, {path}[, {count}]]) *finddir()* + Find directory {name} in {path}. + If {path} is omitted or empty then 'path' is used. + If the optional {count} is given, find {count}'s occurrence of + {name} in {path}. + This is quite similar to the ex-command |:find|. + When the found directory is below the current directory a + relative path is returned. Otherwise a full path is returned. + Example: > + :echo findfile("tags.vim", ".;") +< Searches from the current directory upwards until it finds + the file "tags.vim". + {only available when compiled with the +file_in_path feature} + +findfile({name}[, {path}[, {count}]]) *findfile()* + Just like |finddir()|, but find a file instead of a directory. + filewritable({file}) *filewritable()* The result is a Number, which is 1 when a file with the name {file} exists, and can be written. If {file} doesn't @@ -2027,14 +2046,20 @@ mapcheck({name}[, {mode}]) *mapcheck( < This avoids adding the "_vv" mapping when there already is a mapping for "_v" or for "_vvv". -match({expr}, {pat}[, {start}]) *match()* +match({expr}, {pat}[, {start}[, {count}]]) *match()* The result is a Number, which gives the index (byte offset) in - {expr} where {pat} matches. A match at the first character - returns zero. If there is no match -1 is returned. Example: > + {expr} where {pat} matches. + A match at the first character returns zero. + If there is no match -1 is returned. + Example: > :echo match("testing", "ing") < results in "4". See |string-match| for how {pat} is used. - If {start} is given, the search starts from index {start}. + When {count} is given use the {count}'th match. When a match + is found the search for the next one starts on character + further. Thus this example results in 1: > + echo match("testing", "..", 0, 2) +< If {start} is given, the search starts from index {start}. The result, however, is still the index counted from the first character. Example: > :echo match("testing", "ing", 2) @@ -2050,7 +2075,7 @@ match({expr}, {pat}[, {start}]) *matc the pattern. 'smartcase' is NOT used. The matching is always done like 'magic' is set and 'cpoptions' is empty. -matchend({expr}, {pat}[, {start}]) *matchend()* +matchend({expr}, {pat}[, {start}[, {count}]]) *matchend()* Same as match(), but return the index of first character after the match. Example: > :echo matchend("testing", "ing") @@ -2061,7 +2086,7 @@ matchend({expr}, {pat}[, {start}]) *ma :echo matchend("testing", "ing", 5) < result is "-1". -matchstr({expr}, {pat}[, {start}]) *matchstr()* +matchstr({expr}, {pat}[, {start}[, {count}]]) *matchstr()* Same as match(), but return the matched string. Example: > :echo matchstr("testing", "ing") < results in "ing". diff --git a/runtime/doc/os_mac.txt b/runtime/doc/os_mac.txt --- a/runtime/doc/os_mac.txt +++ b/runtime/doc/os_mac.txt @@ -1,4 +1,4 @@ -*os_mac.txt* For Vim version 7.0aa. Last change: 2004 Jun 19 +*os_mac.txt* For Vim version 7.0aa. Last change: 2004 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar et al. @@ -9,7 +9,7 @@ This file documents the particularities of the Macintosh version of Vim. NOTE: This file is a bit outdated. You might find more useful info here: - http://macvim.swdev.org/ + http://macvim.org/ 1. Filename Convention |mac-filename| 2. .vimrc an .vim files |mac-vimfile| diff --git a/runtime/doc/tags b/runtime/doc/tags --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4065,6 +4065,7 @@ builtin-tools gui.txt /*builtin-tools* builtin_terms term.txt /*builtin_terms* byte-count editing.txt /*byte-count* byte2line() eval.txt /*byte2line()* +byteidx() eval.txt /*byteidx()* bzip2 pi_gzip.txt /*bzip2* c change.txt /*c* c-syntax syntax.txt /*c-syntax* @@ -4624,6 +4625,7 @@ filewritable() eval.txt /*filewritable() filter change.txt /*filter* find-manpage usr_12.txt /*find-manpage* find-replace usr_10.txt /*find-replace* +findfile() eval.txt /*findfile()* fixed-5.1 version5.txt /*fixed-5.1* fixed-5.2 version5.txt /*fixed-5.2* fixed-5.3 version5.txt /*fixed-5.3* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2004 Jul 18 +*todo.txt* For Vim version 7.0aa. Last change: 2004 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -36,11 +36,6 @@ Add fix for zh_cn to Vim 6.3? (Liang) For version 7.0: - Include many PATCHES: 8 Add functions: - match({pat}, {string} [,start] [,count]) get index of count'th match - Patch by Ilya Sher, 2004 Jun 19 - find() find file in 'path' (patch from Johannes - Zellner 2001 Dec 20) - Update 2004 Jun 16. realname() Get user name (first, last, full) user_fullname() patch by Nikolai Weibull, Nov 3 2002) diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2004 Jul 18 +*version7.txt* For Vim version 7.0aa. Last change: 2004 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -123,10 +123,13 @@ Win32: The ":winpos" command now also wo New functions: ~ +byteidx(expr, nr) |byteidx()| Index of a character. (Ilya Sher) +finddir(name) |finddir()| Find a directory in 'path'. +findfile(name) |findfile()| Find a file in 'path'. (Johannes + Zellner) repeat(expr, count) |repeat()| Repeat "expr" "count" times. (Christophe Poucet) tr(expr, from, to) |tr()| Translate characters. (Ron Aaron) -byteidx(expr, nr) |byteidx()| Index of a character. (Ilya Sher) New autocommand events: ~ @@ -182,6 +185,8 @@ For lisp indenting and matching parenthe - #\(, #\), #\[ and #\] are recognized as character literals - Lisp line comments (delimited by semicolon) are recognized +Added the "count" argument to match(), matchend() and matchstr(). (Ilya Sher) + ============================================================================== COMPILE TIME CHANGES *compile-changes-7* diff --git a/runtime/syntax/sql.vim b/runtime/syntax/sql.vim --- a/runtime/syntax/sql.vim +++ b/runtime/syntax/sql.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: SQL, PL/SQL (Oracle 8i) -" Maintainer: Paul Moore -" Last Change: 2001 Apr 30 +" Maintainer: Paul Moore +" Last Change: 2004 Jul 19 " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded diff --git a/runtime/syntax/wsh.vim b/runtime/syntax/wsh.vim --- a/runtime/syntax/wsh.vim +++ b/runtime/syntax/wsh.vim @@ -1,6 +1,6 @@ " Vim syntax file " Language: Windows Scripting Host -" Maintainer: Paul Moore +" Maintainer: Paul Moore " Last Change: Fre, 24 Nov 2000 21:54:09 +0100 " This reuses the XML, VB and JavaScript syntax files. While VB is not diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -852,13 +852,17 @@ dimm.h dimm_i.c: dimm.idl $(OUTDIR)/glbl_ime.obj: $(OUTDIR) glbl_ime.cpp dimm.h $(INCL) +# $CFLAGS may contain backslashes and double quotes, escape them both. +E0_CFLAGS = $(CFLAGS:\=\\) +E_CFLAGS = $(E0_CFLAGS:"=\") + auto/pathdef.c: auto @echo creating auto/pathdef.c @echo /* pathdef.c */ > auto\pathdef.c @echo #include "vim.h" >> auto\pathdef.c @echo char_u *default_vim_dir = (char_u *)"$(VIMRCLOC:\=\\)"; >> auto\pathdef.c @echo char_u *default_vimruntime_dir = (char_u *)"$(VIMRUNTIMEDIR:\=\\)"; >> auto\pathdef.c - @echo char_u *all_cflags = (char_u *)"$(CC:\=\\) $(CFLAGS:\=\\)"; >> auto\pathdef.c + @echo char_u *all_cflags = (char_u *)"$(CC:\=\\) $(E_CFLAGS)"; >> auto\pathdef.c @echo char_u *all_lflags = (char_u *)"$(link:\=\\) $(LINKARGS1:\=\\) $(LINKARGS2:\=\\)"; >> auto\pathdef.c @echo char_u *compiled_user = (char_u *)"$(USERNAME)"; >> auto\pathdef.c @echo char_u *compiled_sys = (char_u *)"$(USERDOMAIN)"; >> auto\pathdef.c diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -279,6 +279,9 @@ static void f_exists __ARGS((VAR argvars static void f_expand __ARGS((VAR argvars, VAR retvar)); static void f_filereadable __ARGS((VAR argvars, VAR retvar)); static void f_filewritable __ARGS((VAR argvars, VAR retvar)); +static void f_finddir __ARGS((VAR argvars, VAR retvar)); +static void f_findfile __ARGS((VAR argvars, VAR retvar)); +static void f_findfilendir __ARGS((VAR argvars, VAR retvar, int dir)); static void f_fnamemodify __ARGS((VAR argvars, VAR retvar)); static void f_foldclosed __ARGS((VAR argvars, VAR retvar)); static void f_foldclosedend __ARGS((VAR argvars, VAR retvar)); @@ -2836,6 +2839,8 @@ static struct fst {"file_readable", 1, 1, f_filereadable}, /* obsolete */ {"filereadable", 1, 1, f_filereadable}, {"filewritable", 1, 1, f_filewritable}, + {"finddir", 1, 3, f_finddir}, + {"findfile", 1, 3, f_findfile}, {"fnamemodify", 2, 2, f_fnamemodify}, {"foldclosed", 1, 1, f_foldclosed}, {"foldclosedend", 1, 1, f_foldclosedend}, @@ -2886,9 +2891,9 @@ static struct fst {"localtime", 0, 0, f_localtime}, {"maparg", 1, 2, f_maparg}, {"mapcheck", 1, 2, f_mapcheck}, - {"match", 2, 3, f_match}, - {"matchend", 2, 3, f_matchend}, - {"matchstr", 2, 3, f_matchstr}, + {"match", 2, 4, f_match}, + {"matchend", 2, 4, f_matchend}, + {"matchstr", 2, 4, f_matchstr}, {"mode", 0, 0, f_mode}, {"nextnonblank", 1, 1, f_nextnonblank}, {"nr2char", 1, 1, f_nr2char}, @@ -4168,6 +4173,71 @@ f_filewritable(argvars, retvar) } /* + * "finddir({fname}[, {path}[, {count}]])" function + */ + static void +f_finddir(argvars, retvar) + VAR argvars; + VAR retvar; +{ + f_findfilendir(argvars, retvar, TRUE); +} + +/* + * "findfile({fname}[, {path}[, {count}]])" function + */ + static void +f_findfile(argvars, retvar) + VAR argvars; + VAR retvar; +{ + f_findfilendir(argvars, retvar, FALSE); +} + + static void +f_findfilendir(argvars, retvar, dir) + VAR argvars; + VAR retvar; + int dir; +{ +#ifdef FEAT_SEARCHPATH + char_u *fname; + char_u *fresult = NULL; + char_u *path = *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path; + char_u *p; + char_u pathbuf[NUMBUFLEN]; + int count = 1; + int first = TRUE; + + fname = get_var_string(&argvars[0]); + + if (argvars[1].var_type != VAR_UNKNOWN) + { + p = get_var_string_buf(&argvars[1], pathbuf); + if (*p != NUL) + path = p; + + if (argvars[2].var_type != VAR_UNKNOWN) + count = get_var_number(&argvars[2]); + } + + do + { + vim_free(fresult); + fresult = find_file_in_path_option(first ? fname : NULL, + first ? (int)STRLEN(fname) : 0, + 0, first, path, dir, NULL); + first = FALSE; + } while (--count > 0 && fresult != NULL); + + retvar->var_val.var_string = fresult; +#else + retvar->var_val.var_string = NULL; +#endif + retvar->var_type = VAR_STRING; +} + +/* * "fnamemodify({fname}, {mods})" function */ static void @@ -5858,17 +5928,20 @@ find_some_match(argvars, retvar, type) int type; { char_u *str; + char_u *expr; char_u *pat; regmatch_T regmatch; char_u patbuf[NUMBUFLEN]; char_u *save_cpo; long start = 0; + long nth = 1; + int match; /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ save_cpo = p_cpo; p_cpo = (char_u *)""; - str = get_var_string(&argvars[0]); + expr = str = get_var_string(&argvars[0]); pat = get_var_string_buf(&argvars[1], patbuf); if (type == 2) @@ -5887,13 +5960,30 @@ find_some_match(argvars, retvar, type) if (start > (long)STRLEN(str)) goto theend; str += start; + + if (argvars[3].var_type != VAR_UNKNOWN) + nth = get_var_number(&argvars[3]); } regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; - if (vim_regexec_nl(®match, str, (colnr_T)0)) + + while (1) + { + match = vim_regexec_nl(®match, str, (colnr_T)0); + if (!match || --nth <= 0) + break; + /* Advance to just after the match. */ +#ifdef FEAT_MBYTE + str = regmatch.startp[0] + mb_ptr2len_check(regmatch.startp[0]); +#else + str = regmatch.startp[0] + 1; +#endif + } + + if (match) { if (type == 2) retvar->var_val.var_string = vim_strnsave(regmatch.startp[0], @@ -5906,7 +5996,7 @@ find_some_match(argvars, retvar, type) else retvar->var_val.var_number = (varnumber_T)(regmatch.endp[0] - str); - retvar->var_val.var_number += start; + retvar->var_val.var_number += str - expr; } } vim_free(regmatch.regprog); diff --git a/src/gui_mac.c b/src/gui_mac.c --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -4251,12 +4251,12 @@ clip_mch_request_selection(cbd) { Handle textOfClip; + int flavor = 0; #ifdef USE_CARBONIZED Size scrapSize; ScrapFlavorFlags scrapFlags; ScrapRef scrap = nil; OSStatus error; - int flavor; #else long scrapOffset; long scrapSize; @@ -4271,7 +4271,6 @@ clip_mch_request_selection(cbd) if (error != noErr) return; - flavor = 0; error = GetScrapFlavorFlags(scrap, VIMSCRAPFLAVOR, &scrapFlags); if (error == noErr) { @@ -4315,15 +4314,16 @@ clip_mch_request_selection(cbd) #else scrapSize = GetScrap(textOfClip, 'TEXT', &scrapOffset); #endif + scrapSize -= flavor; if (flavor) type = **textOfClip; else type = (strchr(*textOfClip, '\r') != NULL) ? MLINE : MCHAR; - tempclip = lalloc(scrapSize+1, TRUE); - STRNCPY(tempclip, *textOfClip + flavor, scrapSize - flavor); - tempclip[scrapSize - flavor] = 0; + tempclip = lalloc(scrapSize + 1, TRUE); + STRNCPY(tempclip, *textOfClip + flavor, scrapSize); + tempclip[scrapSize] = 0; searchCR = (char *)tempclip; while (searchCR != NULL) diff --git a/src/misc2.c b/src/misc2.c --- a/src/misc2.c +++ b/src/misc2.c @@ -3457,10 +3457,6 @@ static ff_stack_T *ff_create_stack_eleme static int ff_path_in_stoplist __ARGS((char_u *, int, char_u **)); #endif -#ifdef FEAT_SEARCHPATH -static char_u *find_file_in_path_option __ARGS((char_u *ptr, int len, int options, int first, char_u *path_option, int need_dir, char_u *rel_fname)); -#endif - #if 0 /* * if someone likes findfirst/findnext, here are the functions @@ -4860,7 +4856,7 @@ find_directory_in_path(ptr, len, options TRUE, rel_fname); } - static char_u * + char_u * find_file_in_path_option(ptr, len, options, first, path_option, need_dir, rel_fname) char_u *ptr; /* file name */ int len; /* length of file name */ diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -82,6 +82,7 @@ char_u *vim_findfile __ARGS((void *searc void vim_findfile_free_visited __ARGS((void *search_ctx)); char_u *find_file_in_path __ARGS((char_u *ptr, int len, int options, int first, char_u *rel_fname)); char_u *find_directory_in_path __ARGS((char_u *ptr, int len, int options, char_u *rel_fname)); +char_u *find_file_in_path_option __ARGS((char_u *ptr, int len, int options, int first, char_u *path_option, int need_dir, char_u *rel_fname)); int vim_chdir __ARGS((char_u *new_dir)); int get_user_name __ARGS((char_u *buf, int len)); void sort_strings __ARGS((char_u **files, int count)); diff --git a/src/testdir/Makefile b/src/testdir/Makefile --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -32,7 +32,7 @@ gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) clean: - -rm -rf *.out *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* viminfo + -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* viminfo test1.out: test1.in -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo diff --git a/src/testdir/test37.in b/src/testdir/test37.in --- a/src/testdir/test37.in +++ b/src/testdir/test37.in @@ -1,4 +1,4 @@ -Test for 'scrollbind'. +Test for 'scrollbind'. Do not add a line below! STARTTEST :so small.vim :set noscrollbind diff --git a/src/testdir/test44.in b/src/testdir/test44.in --- a/src/testdir/test44.in +++ b/src/testdir/test44.in @@ -1,4 +1,5 @@ Tests for regexp with multi-byte encoding and various magic settings. +Test matchstr() with a count and multi-byte chars. STARTTEST :so mbyte.vim @@ -21,6 +22,12 @@ x:" Now search for multi-byte with compo x:" find word by change of word class /ち\<カヨ\>は x:?^1?,$w! test.out +:e! test.out +G:put =matchstr(\"אבגד\", \".\", 0, 2) " ב +:put =matchstr(\"אבגד\", \"..\", 0, 2) " בג +:put =matchstr(\"אבגד\", \".\", 0, 0) " א +:put =matchstr(\"אבגד\", \".\", 4, -1) " ג +:w! :qa! ENDTEST diff --git a/src/testdir/test44.ok b/src/testdir/test44.ok --- a/src/testdir/test44.ok +++ b/src/testdir/test44.ok @@ -9,3 +9,7 @@ 8 axx ab]xx 9 หม่x อx a อมx หx b カヨは +ב +בג +א +ג diff --git a/src/testdir/test53.in b/src/testdir/test53.in --- a/src/testdir/test53.in +++ b/src/testdir/test53.in @@ -1,5 +1,9 @@ Tests for string text objects. vim: set ft=vim : +Note that the end-of-line moves the cursor to the next test line. + +Also test match() and matchstr() + STARTTEST :so small.vim /^start:/ @@ -11,6 +15,12 @@ 03f'vi'ry :set quoteescape=+*- di` $F"va"oha"i"rz +k:put =matchstr(\"abcd\", \".\", 0, 2) " b +:put =matchstr(\"abcd\", \"..\", 0, 2) " bc +:put =matchstr(\"abcd\", \".\", 2, 0) " c (zero and negative -> first match) +:put =matchstr(\"abcd\", \".\", 0, -1) " a +:put =match(\"abcd\", \".\", 0, 5) " -1 +:put =match(\"abcd\", \".\", 0, -1) " 0 :/^start:/,/^end:/wq! test.out ENDTEST diff --git a/src/testdir/test53.ok b/src/testdir/test53.ok --- a/src/testdir/test53.ok +++ b/src/testdir/test53.ok @@ -5,4 +5,10 @@ out " in "" "'" 'blah'yyyyy'buh' bla `` b`la voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd +b +bc +c +a +-1 +0 end: