summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2005-01-27 14:44:31 +0000
committerBram Moolenaar <Bram@vim.org>2005-01-27 14:44:31 +0000
commit532c780ef0691152a20d0e2e176d1c0ef624cbde (patch)
treef543b7744b3fd8eae3e70de80268d2f3b496d759
parentb2956cd2182352ede0cc5dc4508d0c9ffbe7e721 (diff)
downloadvim-git-532c780ef0691152a20d0e2e176d1c0ef624cbde.tar.gz
updated for version 7.0045v7.0045
-rw-r--r--runtime/doc/pi_expl.txt215
-rw-r--r--src/eval.c69
2 files changed, 54 insertions, 230 deletions
diff --git a/runtime/doc/pi_expl.txt b/runtime/doc/pi_expl.txt
deleted file mode 100644
index 62ee2c396..000000000
--- a/runtime/doc/pi_expl.txt
+++ /dev/null
@@ -1,215 +0,0 @@
-*pi_expl.txt* For Vim version 7.0aa. Last change: 2004 Dec 29
-
-
- VIM REFERENCE MANUAL by M A Aziz Ahmed
- updated by Mark Waggoner
-
-
- *file-explorer* *file-browser*
-Plugin for exploring (or browsing) directories and files
-
-1. Starting the file explorer |expl-starting|
-
-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_explorer" variable: >
- :let loaded_explorer = 1
-
-{Vi does not have any of this}
-
-==============================================================================
-1. Starting the file explorer *expl-starting*
-
-This plugin is used to explore directories inside Vim. The file explorer is
-launched whenever the user tries to edit a directory.
- *:Explore* *:Sexplore*
-To launch the explorer in the directory of the file currently edited: >
- :Explore
-If the file has changes the window is split. To always split the window: >
- :Sexplore
-To launch the explorer in a specific directory: >
- :Explore dirname
- :Sexplore dirname
-
-From inside the explorer move your cursor to a line containing a file or
-directory name. The following command keys are available:
-
- <enter> will open the file in the window the explorer is currently
- occupying.
- 'o' will split a new window and open the file in the new window.
- 'O' will open the file chosen using the window that the cursor was in just
- before you started or entered the explorer window. If the explorer is
- the only window, it will first split a new window to use for the file to
- be opened.
- 'p' will open (or use) the preview window showing the file
- 'x' will execute the file with the system tools. Only when supported
- (currently MS-Windows and KDE).
-
-When splitting off a new window, you can control where the split window will
-go relative to the explorer window using the variables g:explVertical,
-g:explSplitBelow and g:explSplitRight.
-
- *g:explVertical*
- *g:explSplitBelow*
- *g:explSplitRight*
- *g:explStartBelow*
- *g:explStartRight*
-To control whether the split is made horizontally or vertically, use: >
- let g:explVertical=1 " Split vertically
- let g:explVertical=0 " Split horizontally (default)
-
-To control where the window goes relative to the explorer window when
-splitting horizontally, use the variable: >
- let g:explSplitBelow=1 " Put new window below explorer window
- let g:explSplitBelow=0 " Put new window above explorer window
-The default for this is the setting of splitbelow at the time the plugin is
-loaded.
-
-To control where the window goes relative to the explorer window when
-splitting vertically, use the variable: >
- let g:explSplitRight=1 " Put new window to the right of the explorer
- let g:explSplitRight=0 " Put new window to the left of the explorer
-The default for this is the setting of splitright at the time the plugin is
-loaded.
-
-To use a different split method for the explorer window, use: >
- let g:explStartRight=1 " Put new explorer window to the right of the
- " current window
- let g:explStartRight=0 " Put new explorer window to the left of the
- " current window
-The default is the value of g:explSplitRight at the time the plugin is loaded.
-
-To use a different split method for the explorer window, use: >
- let g:explStartBelow=1 " Put new explorer window below the
- " current window
- let g:explStartBelow=0 " Put new explorer window above the
- " current window
-The default is the value of g:explSplitBelow at the time the plugin is loaded.
-
-The start splits allow for the explorer window to be placed in a file browser
-type arrangement, where the directories are shown on the left and the contents
-opened on the right. The start split settings are only used when issuing
-the Sexplore command.
-
-Note that the window split is done a little bit differently than window splits
-are usually done. Ordinarily, when splitting a window, the space occupied by
-the current window will be split to give space for the new window. The
-explorer attempts to instead split from a window adjacent to the explorer
-window so that the explorer window will not change sizes. If there is not an
-adjacent window in the direction you are splitting, the explorer window is
-split.
-
- *g:explWinSize*
-After opening a file with the 'o' command, you might want to resize the
-explorer window. This can be done by setting the variable >
- let g:explWinSize=N
-N is the number of rows (when the window is split horizontally) or the number
-of columns (when the window is split vertically). If g:explWinSize is set to
-an empty string (""), resizing will not be done. g:explWinSize defaults to
-15.
-
- *g:explDetailedList*
-The file size (in bytes) and modification time can be displayed inside the
-file explorer window. By pressing 'i', you can toggle between the name only
-display and the more lengthy display. If you want the size and date to show
-by default, use >
- let g:explDetailedList=1
-Doing this may slightly slow down explorer. The difference may or may not be
-noticeable depending on your system and whether the directory is local or on
-the network and on the size of the directory.
-
- *g:explDateFormat*
-The format of date displayed is configurable using the variable
-g:explDateFormat. explorer uses this variable to pass to strftime() to fetch
-the date information. |strftime()| The default is >
- let g:explDateFormat="%d %b %Y %H:%M"
-
-Note that for sorting purposes, the date is always placed at the end of the
-line in its 'raw' form. If you have syntax highlighting turned on, this raw
-date should be invisible.
-
- *g:explHideFiles*
-You can hide some files by filling the variable g:explHidFiles with regular
-expressions. A filename that matches any of these regular expressions will not
-be shown. For example, >
-
- let g:explHideFiles='^\.,\.gz$,\.exe$,\.zip$'
-
-will not show files that begin with "." and those that end in .gz, .exe or
-.zip. However, all directory names will always be shown. If while exploring,
-you'd like to see the hidden files as well, use the command "a".
-The explorer header will indicate if filtering is being done.
-
- *g:explDetailedHelp*
-The help information spanning a few lines can be turned off (and just a single
-help message enabled) using the option >
- let g:explDetailedHelp=0
-You can anytime switch to the detailed help format by pressing ?.
-
- *explorer-delete*
-Pressing 'D' inside explorer deletes the file under the cursor. You can delete
-many files by visually selecting them and using 'D'. The deletion is
-interactive in the form y/n/a/q. Directory deletion is not supported (mainly
-because there is no way to delete a directory using a vim built-in function).
-
- *explorer-rename*
-Pressing 'R' inside explorer will allow you to rename the file under the
-cursor.
-
- *g:explSortBy*
-The display in the file explorer can be sorted in forward or reverse order by
-name, size, or modification date. You can set the default sorting direction
-with the option >
- let g:explSortBy='name' " alphabetically
- let g:explSortBy='reverse name' " reverse alphabetically
- let g:explSortBy='date' " newest first
- let g:explSortBy='reverse date' " oldest first
- let g:explSortBy='size' " largest first
- let g:explSortBy='reverse size' " smallest first
-While in the explorer, you can rotate through the sort fields by pressing the
-'s' key and you can reverse the current sort order by pressing the 'r' key.
-Sorting on fields other than the name will be faster if the size and date are
-displayed (using 'i' or g:explDetailedList).
-The explorer heading will indicate the current sort order.
-
- *g:explDirsFirst*
-To control the segregation of directories and files, you can set this option >
- let g:explDirsFirst=1 " Directories at the top of the list (default)
- let g:explDirsFirst=0 " Directories mixed in with files
- let g:explDirsFirst=-1 " Directories at the bottom of the list
-
- *g:explSuffixesLast*
-To control the segregation of files matching the suffixes option, you can set
-this option >
- let g:explSuffixesLast=1 " Files matching suffixes sorted at the bottom
- " of the list (default)
- let g:explSuffixesLast=0 " Files matching suffixes sorted normally
- let g:explSuffixesLast=-1 " Files matching suffixes sorted at the top of
- " the list
-The heading will indicate if suffixes have been moved to the end (or start) of
-the list.
-
- *g:explUseSeparators*
-Directories and files matching the suffixes list will be highlighted. If you
-have the directories, files, and suffixes separated, and you would like a
-separator line between the groups, you can set the option >
- let g:explUseSeparators=1 " Use separator lines
- let g:explUseSeparators=0 " Don't use separator lines
-<
- *g:explFileHandler*
-If you set the "g:explFileHandler" variable to the name of a function, typing
-'x' will call this function. The file or directory under the cursor will be
-passed as an argument to the function. Suppose you have KDE, you could use
-this: >
-
- function MyFileHandler(fn)
- exec "silent! !kfmclient exec " . escape(a:fn,' \%#')
- endfunction
- let g:explFileHandler = 'MyFileHandler'
-
-For Win32 the variable is set by default to invoke the execute action. If you
-type 'x' on a HTML file, Microsoft Internet Explorer will start (or whatever
-application you have associated with HTML files).
-
-==============================================================================
- vim:tw=78:noet:ts=8:ft=help:norl:
diff --git a/src/eval.c b/src/eval.c
index 1ef824b15..3a7d24530 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -116,6 +116,12 @@ static dictitem_T globvars_var;
#define globvarht globvardict.dv_hashtab
/*
+ * Old Vim variables such as "v:version" are also available without the "v:".
+ * Also in functions. We need a special hashtable for them.
+ */
+hashtab_T compat_hashtab;
+
+/*
* Array to hold the hashtab with variables local to each sourced script.
* Each item holds a variable (nameless) that points to the dict_T.
*/
@@ -213,7 +219,7 @@ typedef struct
typedef struct
{
dict_T *fd_dict; /* Dictionary used */
- char_u *fd_newkey; /* new key in "dict" */
+ char_u *fd_newkey; /* new key in "dict" in allocated memory */
dictitem_T *fd_di; /* Dictionary item used */
} funcdict_T;
@@ -599,6 +605,7 @@ eval_init()
init_var_dict(&globvardict, &globvars_var);
init_var_dict(&vimvardict, &vimvars_var);
+ hash_init(&compat_hashtab);
for (i = 0; i < VV_LEN; ++i)
{
@@ -613,8 +620,8 @@ eval_init()
/* add to v: scope dict */
hash_add(&vimvarht, p->vv_di.di_key);
if (p->vv_flags & VV_COMPAT)
- /* add to g: scope dict */
- hash_add(&globvardict.dv_hashtab, p->vv_di.di_key);
+ /* add to compat scope dict */
+ hash_add(&compat_hashtab, p->vv_di.di_key);
}
}
@@ -2548,7 +2555,9 @@ ex_call(eap)
len = STRLEN(tofree);
name = deref_func_name(tofree, &len);
- startarg = arg;
+ /* Skip white space to allow ":call func ()". Not good, but required for
+ * backward compatibility. */
+ startarg = skipwhite(arg);
rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
if (*startarg != '(')
@@ -2815,12 +2824,12 @@ get_user_var_name(xp, idx)
expand_T *xp;
int idx;
{
- static int gdone;
- static int bdone;
- static int wdone;
- static int vidx;
- static hashitem_T *hi;
- hashtab_T *ht;
+ static long_u gdone;
+ static long_u bdone;
+ static long_u wdone;
+ static int vidx;
+ static hashitem_T *hi;
+ hashtab_T *ht;
if (idx == 0)
gdone = bdone = wdone = vidx = 0;
@@ -2830,6 +2839,8 @@ get_user_var_name(xp, idx)
{
if (gdone++ == 0)
hi = globvarht.ht_array;
+ else
+ ++hi;
while (HASHITEM_EMPTY(hi))
++hi;
if (STRNCMP("g:", xp->xp_pattern, 2) == 0)
@@ -2843,6 +2854,8 @@ get_user_var_name(xp, idx)
{
if (bdone++ == 0)
hi = ht->ht_array;
+ else
+ ++hi;
while (HASHITEM_EMPTY(hi))
++hi;
return cat_prefix_varname('b', hi->hi_key);
@@ -2859,6 +2872,8 @@ get_user_var_name(xp, idx)
{
if (bdone++ == 0)
hi = ht->ht_array;
+ else
+ ++hi;
while (HASHITEM_EMPTY(hi))
++hi;
return cat_prefix_varname('w', hi->hi_key);
@@ -5717,7 +5732,7 @@ static struct fst
{"string", 1, 1, f_string},
{"strlen", 1, 1, f_strlen},
{"strpart", 2, 3, f_strpart},
- {"strridx", 2, 2, f_strridx},
+ {"strridx", 2, 3, f_strridx},
{"strtrans", 1, 1, f_strtrans},
{"submatch", 1, 1, f_submatch},
{"substitute", 4, 4, f_substitute},
@@ -11791,9 +11806,10 @@ f_stridx(argvars, rettv)
if (argvars[2].v_type != VAR_UNKNOWN)
{
start_idx = get_tv_number(&argvars[2]);
- if (start_idx < 0 || start_idx >= (int)STRLEN(haystack))
+ if (start_idx >= (int)STRLEN(haystack))
return;
- haystack += start_idx;
+ if (start_idx >= 0)
+ haystack += start_idx;
}
pos = (char_u *)strstr((char *)haystack, (char *)needle);
@@ -11885,20 +11901,38 @@ f_strridx(argvars, rettv)
char_u *haystack;
char_u *rest;
char_u *lastmatch = NULL;
+ int haystack_len, end_idx;
needle = get_tv_string(&argvars[1]);
haystack = get_tv_string_buf(&argvars[0], buf);
+ haystack_len = STRLEN(haystack);
if (*needle == NUL)
/* Empty string matches past the end. */
- lastmatch = haystack + STRLEN(haystack);
+ lastmatch = haystack + haystack_len;
else
+ {
+ if (argvars[2].v_type != VAR_UNKNOWN)
+ {
+ /* Third argument: upper limit for index */
+ end_idx = get_tv_number(&argvars[2]);
+ if (end_idx < 0)
+ {
+ /* can never find a match */
+ rettv->vval.v_number = -1;
+ return;
+ }
+ }
+ else
+ end_idx = haystack_len;
+
for (rest = haystack; *rest != '\0'; ++rest)
{
rest = (char_u *)strstr((char *)rest, (char *)needle);
- if (rest == NULL)
+ if (rest == NULL || rest > haystack + end_idx)
break;
lastmatch = rest;
}
+ }
if (lastmatch == NULL)
rettv->vval.v_number = -1;
@@ -13408,6 +13442,11 @@ find_var_ht(name, varname)
if (vim_strchr(name, ':') != NULL)
return NULL;
*varname = name;
+
+ /* "version" is "v:version" in all scopes */
+ if (!HASHITEM_EMPTY(hash_find(&compat_hashtab, name)))
+ return &compat_hashtab;
+
if (current_funccal == NULL)
return &globvarht; /* global variable */
return &current_funccal->l_vars.dv_hashtab; /* l: variable */