0
0
mirror of https://github.com/vim/vim.git synced 2025-08-31 20:53:42 -04:00

updated for version 7.0043

This commit is contained in:
Bram Moolenaar 2005-01-21 11:55:25 +00:00
parent ca4729948b
commit dcaf10e19a
19 changed files with 263 additions and 109 deletions

View File

@ -1,4 +1,4 @@
*eval.txt* For Vim version 7.0aa. Last change: 2005 Jan 19 *eval.txt* For Vim version 7.0aa. Last change: 2005 Jan 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -4413,7 +4413,12 @@ This would call the function "my_func_whizz(parameter)".
List item. List item.
*E106* *E106*
:let {var-name} .. List the value of variable {var-name}. Multiple :let {var-name} .. List the value of variable {var-name}. Multiple
variable names may be given. variable names may be given. Special names recognized
here: *E738*
g: global variables.
b: local buffer variables.
w: local window variables.
v: Vim variables.
:let List the values of all variables. The type of the :let List the values of all variables. The type of the
variable is indicated before the value: variable is indicated before the value:

View File

@ -1,4 +1,4 @@
*quickfix.txt* For Vim version 7.0aa. Last change: 2005 Jan 10 *quickfix.txt* For Vim version 7.0aa. Last change: 2005 Jan 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -288,6 +288,8 @@ advantages are:
- Uses Vim search patterns. Multi-line patterns can be used. - Uses Vim search patterns. Multi-line patterns can be used.
- When plugins are enabled: compressed and remote files can be searched. - When plugins are enabled: compressed and remote files can be searched.
|gzip| |netrw| |gzip| |netrw|
- When 'hidden' is set the files are kept loaded, thus repeating a search is
much faster. Uses a lot of memory though!
5.1 using Vim's internal grep 5.1 using Vim's internal grep
@ -303,6 +305,8 @@ advantages are:
'ignorecase' applies. To overrule it use |/\c| to 'ignorecase' applies. To overrule it use |/\c| to
ignore case or |/\C| to match case. 'smartcase' is ignore case or |/\C| to match case. 'smartcase' is
not used. not used.
Every second or so the searched file name is displayed
to give you an idea of the progress made.
Examples: > Examples: >
:vimgrep /an error/ *.c :vimgrep /an error/ *.c
:vimgrep /\<FileName\>/ *.h include/* :vimgrep /\<FileName\>/ *.h include/*

View File

@ -1,4 +1,4 @@
*starting.txt* For Vim version 7.0aa. Last change: 2005 Jan 07 *starting.txt* For Vim version 7.0aa. Last change: 2005 Jan 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -1193,7 +1193,7 @@ This saves the current Session, and starts off the command to load another.
When [file] is omitted or is a number from 1 to 9, a When [file] is omitted or is a number from 1 to 9, a
name is generated and 'viewdir' prepended. When last name is generated and 'viewdir' prepended. When last
directory name in 'viewdir' does not exist, this directory name in 'viewdir' does not exist, this
directory is created. directory is created. *E738*
An existing file is always overwritten then. Use An existing file is always overwritten then. Use
|:loadview| to load this view again. |:loadview| to load this view again.
When [file] is the name of a file ('viewdir' is not When [file] is the name of a file ('viewdir' is not

View File

@ -2036,13 +2036,16 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
:lefta windows.txt /*:lefta* :lefta windows.txt /*:lefta*
:leftabove windows.txt /*:leftabove* :leftabove windows.txt /*:leftabove*
:let eval.txt /*:let* :let eval.txt /*:let*
:let+= eval.txt /*:let+=*
:let-$ eval.txt /*:let-$* :let-$ eval.txt /*:let-$*
:let-= eval.txt /*:let-=*
:let-@ eval.txt /*:let-@* :let-@ eval.txt /*:let-@*
:let-environment eval.txt /*:let-environment* :let-environment eval.txt /*:let-environment*
:let-option eval.txt /*:let-option* :let-option eval.txt /*:let-option*
:let-register eval.txt /*:let-register* :let-register eval.txt /*:let-register*
:let-star eval.txt /*:let-star* :let-star eval.txt /*:let-star*
:let-unpack eval.txt /*:let-unpack* :let-unpack eval.txt /*:let-unpack*
:let.= eval.txt /*:let.=*
:list various.txt /*:list* :list various.txt /*:list*
:lm map.txt /*:lm* :lm map.txt /*:lm*
:lmap map.txt /*:lmap* :lmap map.txt /*:lmap*
@ -3634,6 +3637,7 @@ E732 eval.txt /*E732*
E733 eval.txt /*E733* E733 eval.txt /*E733*
E735 eval.txt /*E735* E735 eval.txt /*E735*
E736 eval.txt /*E736* E736 eval.txt /*E736*
E737 eval.txt /*E737*
E74 message.txt /*E74* E74 message.txt /*E74*
E75 vi_diff.txt /*E75* E75 vi_diff.txt /*E75*
E76 pattern.txt /*E76* E76 pattern.txt /*E76*
@ -5034,7 +5038,6 @@ hebrew hebrew.txt /*hebrew*
hebrew.txt hebrew.txt /*hebrew.txt* hebrew.txt hebrew.txt /*hebrew.txt*
help various.txt /*help* help various.txt /*help*
help-context help.txt /*help-context* help-context help.txt /*help-context*
help-tags tags 1
help-translated various.txt /*help-translated* help-translated various.txt /*help-translated*
help-xterm-window various.txt /*help-xterm-window* help-xterm-window various.txt /*help-xterm-window*
help.txt help.txt /*help.txt* help.txt help.txt /*help.txt*

View File

@ -1,4 +1,4 @@
*todo.txt* For Vim version 7.0aa. Last change: 2005 Jan 19 *todo.txt* For Vim version 7.0aa. Last change: 2005 Jan 21
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -30,10 +30,12 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
*known-bugs* *known-bugs*
-------------------- Known bugs and current work ----------------------- -------------------- Known bugs and current work -----------------------
Hashtable implementation: Dict member: use dict..foo instead of dict.foo to avoid confusion with string
- Use hashtable for variables and syntax keywords. concatenation?
Hashtable implementation:
- Use hashtable for syntax keywords.
":grep": display progress (filename, every second or so)
Can ":grep" made faster somehow? Do profiling. Can ":grep" made faster somehow? Do profiling.
Sanity check of eval.c: Sanity check of eval.c:

View File

@ -1,4 +1,4 @@
*various.txt* For Vim version 7.0aa. Last change: 2004 Dec 23 *various.txt* For Vim version 7.0aa. Last change: 2005 Jan 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -387,10 +387,13 @@ N *+X11* Unix only: can restore window title |X11|
:redi[r] @{a-zA-Z} Redirect messages to register {a-z}. Append to the :redi[r] @{a-zA-Z} Redirect messages to register {a-z}. Append to the
contents of the register if its name is given contents of the register if its name is given
uppercase {A-Z}. {not in Vi} uppercase {A-Z}. {not in Vi}
:redi[r] @{a-z}> Append messages to register {a-z}. {not in Vi}
:redi[r] @* Redirect messages to the clipboard. {not in Vi} :redi[r] @* Redirect messages to the clipboard. {not in Vi}
:redi[r] @*> Append messages to the clipboard. {not in Vi}
:redi[r] @" Redirect messages to the unnamed register. {not in Vi} :redi[r] @" Redirect messages to the unnamed register. {not in Vi}
:redi[r] @"> Append messages to the unnamed register. {not in Vi}
:redi[r] END End redirecting messages. {not in Vi} :redi[r] END End redirecting messages. {not in Vi}

View File

@ -1,4 +1,4 @@
*version7.txt* For Vim version 7.0aa. Last change: 2005 Jan 17 *version7.txt* For Vim version 7.0aa. Last change: 2005 Jan 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -418,6 +418,14 @@ When a register is empty it is not stored in the viminfo file.
Removed the tcltags script, it's obsolete. Removed the tcltags script, it's obsolete.
":redir @*>" and ":redir @+>" append to the clipboard. Better check for
invalid characters after the register name.
":let g:" lists global variables.
":let b:" lists buffer-local variables.
":let w:" lists window-local variables.
":let v:" lists Vim variables.
============================================================================== ==============================================================================
COMPILE TIME CHANGES *compile-changes-7* COMPILE TIME CHANGES *compile-changes-7*

View File

@ -1618,7 +1618,6 @@ ex_listdo(eap)
int next_fnum = 0; int next_fnum = 0;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
char_u *save_ei = NULL; char_u *save_ei = NULL;
char_u *new_ei;
#endif #endif
char_u *p_shm_save; char_u *p_shm_save;
@ -1632,22 +1631,9 @@ ex_listdo(eap)
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
if (eap->cmdidx != CMD_windo) if (eap->cmdidx != CMD_windo)
{ /* Don't do syntax HL autocommands. Skipping the syntax file is a
/* Add "Syntax" to 'eventignore' to skip loading syntax highlighting * great speed improvement. */
* for every buffer loaded into the window. A considerable speed save_ei = au_event_disable(",Syntax");
* improvement. */
save_ei = vim_strsave(p_ei);
if (save_ei != NULL)
{
new_ei = vim_strnsave(p_ei, (int)STRLEN(p_ei) + 8);
if (new_ei != NULL)
{
STRCAT(new_ei, ",Syntax");
set_string_option_direct((char_u *)"ei", -1, new_ei, OPT_FREE);
vim_free(new_ei);
}
}
}
#endif #endif
if (eap->cmdidx == CMD_windo if (eap->cmdidx == CMD_windo
@ -1755,13 +1741,7 @@ ex_listdo(eap)
} }
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
if (save_ei != NULL) au_event_restore(save_ei);
{
set_string_option_direct((char_u *)"ei", -1, save_ei, OPT_FREE);
apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
curbuf->b_fname, TRUE, curbuf);
vim_free(save_ei);
}
#endif #endif
} }

View File

@ -7132,6 +7132,48 @@ check_ei()
return OK; return OK;
} }
# if defined(FEAT_SYN_HL) || defined(PROTO)
/*
* Add "what" to 'eventignore' to skip loading syntax highlighting for every
* buffer loaded into the window. "what" must start with a comma.
* Returns the old value of 'eventignore' in allocated memory.
*/
char_u *
au_event_disable(what)
char *what;
{
char_u *new_ei;
char_u *save_ei;
save_ei = vim_strsave(p_ei);
if (save_ei != NULL)
{
new_ei = vim_strnsave(p_ei, (int)STRLEN(p_ei) + 8);
if (new_ei != NULL)
{
STRCAT(new_ei, what);
set_string_option_direct((char_u *)"ei", -1, new_ei, OPT_FREE);
vim_free(new_ei);
}
}
return save_ei;
}
void
au_event_restore(old_ei)
char_u *old_ei;
{
if (old_ei != NULL)
{
set_string_option_direct((char_u *)"ei", -1, old_ei, OPT_FREE);
apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
curbuf->b_fname, TRUE, curbuf);
vim_free(old_ei);
}
}
# endif /* FEAT_SYN_HL */
/* /*
* do_autocmd() -- implements the :autocmd command. Can be used in the * do_autocmd() -- implements the :autocmd command. Can be used in the
* following ways: * following ways:

View File

@ -73,19 +73,17 @@ hash_init(ht)
ht->ht_mask = HT_INIT_SIZE - 1; ht->ht_mask = HT_INIT_SIZE - 1;
} }
#if 0 /* not used */
/* /*
* Free a hash table. Does not free the items it contains! * Free the array of a hash table. Does not free the items it contains!
* If "ht" is not freed then you should call hash_init() next!
*/ */
void void
hash_free(ht) hash_clear(ht)
hashtable *ht; hashtable *ht;
{ {
if (ht->ht_array != ht->ht_smallarray) if (ht->ht_array != ht->ht_smallarray)
vim_free(ht->ht_array); vim_free(ht->ht_array);
vim_free(ht);
} }
#endif
/* /*
* Find "key" in hashtable "ht". "key" must not be NULL. * Find "key" in hashtable "ht". "key" must not be NULL.
@ -228,8 +226,8 @@ hash_set(hi, key)
/* /*
* Remove item "hi" from hashtable "ht". "hi" must have been obtained with * Remove item "hi" from hashtable "ht". "hi" must have been obtained with
* hash_lookup() and point to a used empty item. * hash_lookup() and point to an empty item.
* The caller must take care of freeing the item. * The caller must take care of freeing the item itself.
*/ */
void void
hash_remove(ht, hi) hash_remove(ht, hi)
@ -241,6 +239,31 @@ hash_remove(ht, hi)
hash_may_resize(ht); hash_may_resize(ht);
} }
/*
* Lock a hashtable: prevent that ht_array changes.
* Don't use this when items are to be added!
* Must call hash_unlock() later.
*/
void
hash_lock(ht)
hashtable *ht;
{
++ht->ht_locked;
}
/*
* Unlock a hashtable: allow ht_array changes again.
* Table will be resized (shrink) when necessary.
* This must balance a call to hash_lock().
*/
void
hash_unlock(ht)
hashtable *ht;
{
--ht->ht_locked;
(void)hash_may_resize(ht);
}
/* /*
* Shrink a hashtable when there is too much empty space. * Shrink a hashtable when there is too much empty space.
* Grow a hashtable when there is not enough empty space. * Grow a hashtable when there is not enough empty space.
@ -260,6 +283,10 @@ hash_may_resize(ht)
long_u newmask; long_u newmask;
long_u perturb; long_u perturb;
/* Don't resize a locked table. */
if (ht->ht_locked > 0)
return OK;
#ifdef HT_DEBUG #ifdef HT_DEBUG
if (ht->ht_used > ht->ht_filled) if (ht->ht_used > ht->ht_filled)
EMSG("hash_may_resize(): more used than filled"); EMSG("hash_may_resize(): more used than filled");
@ -282,7 +309,7 @@ hash_may_resize(ht)
if (ht->ht_filled * 3 < oldsize * 2 && ht->ht_used > oldsize / 5) if (ht->ht_filled * 3 < oldsize * 2 && ht->ht_used > oldsize / 5)
return OK; return OK;
if (ht->ht_used > 10000) if (ht->ht_used > 1000)
minsize = ht->ht_used * 2; /* it's big, don't make too much room */ minsize = ht->ht_used * 2; /* it's big, don't make too much room */
else else
minsize = ht->ht_used * 4; /* make plenty of room */ minsize = ht->ht_used * 4; /* make plenty of room */

View File

@ -177,6 +177,9 @@ main
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
(void)mb_init(); /* init mb_bytelen_tab[] to ones */ (void)mb_init(); /* init mb_bytelen_tab[] to ones */
#endif #endif
#ifdef FEAT_EVAL
eval_init(); /* init global variables */
#endif
#ifdef __QNXNTO__ #ifdef __QNXNTO__
qnx_init(); /* PhAttach() for clipboard, (and gui) */ qnx_init(); /* PhAttach() for clipboard, (and gui) */

View File

@ -1,4 +1,5 @@
/* eval.c */ /* eval.c */
void eval_init __ARGS((void));
char_u *func_name __ARGS((void *cookie)); char_u *func_name __ARGS((void *cookie));
linenr_T *func_breakpoint __ARGS((void *cookie)); linenr_T *func_breakpoint __ARGS((void *cookie));
int *func_dbg_tick __ARGS((void *cookie)); int *func_dbg_tick __ARGS((void *cookie));
@ -41,8 +42,8 @@ char_u *v_throwpoint __ARGS((char_u *oldval));
char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg)); char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg));
char_u *get_var_value __ARGS((char_u *name)); char_u *get_var_value __ARGS((char_u *name));
void new_script_vars __ARGS((scid_T id)); void new_script_vars __ARGS((scid_T id));
void vars_init __ARGS((garray_T *gap)); void vars_init __ARGS((hashtable *ht));
void vars_clear __ARGS((garray_T *gap)); void vars_clear __ARGS((hashtable *ht));
void ex_echo __ARGS((exarg_T *eap)); void ex_echo __ARGS((exarg_T *eap));
void ex_echohl __ARGS((exarg_T *eap)); void ex_echohl __ARGS((exarg_T *eap));
void ex_execute __ARGS((exarg_T *eap)); void ex_execute __ARGS((exarg_T *eap));

View File

@ -23,6 +23,8 @@ void forward_slash __ARGS((char_u *fname));
void aubuflocal_remove __ARGS((buf_T *buf)); void aubuflocal_remove __ARGS((buf_T *buf));
void do_augroup __ARGS((char_u *arg, int del_group)); void do_augroup __ARGS((char_u *arg, int del_group));
int check_ei __ARGS((void)); int check_ei __ARGS((void));
char_u *au_event_disable __ARGS((char *what));
void au_event_restore __ARGS((char_u *old_ei));
void do_autocmd __ARGS((char_u *arg, int forceit)); void do_autocmd __ARGS((char_u *arg, int forceit));
int do_doautocmd __ARGS((char_u *arg, int do_msg)); int do_doautocmd __ARGS((char_u *arg, int do_msg));
void ex_doautoall __ARGS((exarg_T *eap)); void ex_doautoall __ARGS((exarg_T *eap));

View File

@ -1,6 +1,9 @@
/* hashtable.c */ /* hashtable.c */
void hash_init __ARGS((hashtable *ht)); void hash_init __ARGS((hashtable *ht));
void hash_clear __ARGS((hashtable *ht));
hashitem *hash_find __ARGS((hashtable *ht, char_u *key)); hashitem *hash_find __ARGS((hashtable *ht, char_u *key));
int hash_add __ARGS((hashtable *ht, char_u *key)); int hash_add __ARGS((hashtable *ht, char_u *key));
void hash_remove __ARGS((hashtable *ht, hashitem *hi)); void hash_remove __ARGS((hashtable *ht, hashitem *hi));
void hash_lock __ARGS((hashtable *ht));
void hash_unlock __ARGS((hashtable *ht));
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@ -2269,7 +2269,12 @@ ex_vimgrep(eap)
int duplicate_name = FALSE; int duplicate_name = FALSE;
int using_dummy; int using_dummy;
int found_match; int found_match;
int first_match = TRUE; buf_T *first_match_buf = NULL;
time_t seconds = 0;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
char_u *save_ei = NULL;
aco_save_T aco;
#endif
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */ /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
save_cpo = p_cpo; save_cpo = p_cpo;
@ -2330,24 +2335,59 @@ ex_vimgrep(eap)
goto theend; goto theend;
} }
seconds = (time_t)0;
for (fi = 0; fi < fcount && !got_int; ++fi) for (fi = 0; fi < fcount && !got_int; ++fi)
{ {
if (time(NULL) > seconds)
{
/* Display the file name every second or so. */
seconds = time(NULL);
msg_start();
p = msg_strtrunc(fnames[fi]);
if (p == NULL)
msg_outtrans(fnames[fi]);
else
{
msg_outtrans(p);
vim_free(p);
}
msg_clr_eos();
msg_didout = FALSE; /* overwrite this message */
msg_nowait = TRUE; /* don't wait for this message */
msg_col = 0;
out_flush();
}
buf = buflist_findname_exp(fnames[fi]); buf = buflist_findname_exp(fnames[fi]);
if (buf == NULL || buf->b_ml.ml_mfp == NULL) if (buf == NULL || buf->b_ml.ml_mfp == NULL)
{ {
/* Remember that a buffer with this name already exists. */ /* Remember that a buffer with this name already exists. */
duplicate_name = (buf != NULL); duplicate_name = (buf != NULL);
using_dummy = TRUE;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
/* Don't do Filetype autocommands to avoid loading syntax and
* indent scripts, a great speed improvement. */
save_ei = au_event_disable(",Filetype");
#endif
/* Load file into a buffer, so that 'fileencoding' is detected, /* Load file into a buffer, so that 'fileencoding' is detected,
* autocommands applied, etc. */ * autocommands applied, etc. */
buf = load_dummy_buffer(fnames[fi]); buf = load_dummy_buffer(fnames[fi]);
using_dummy = TRUE;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
au_event_restore(save_ei);
#endif
} }
else else
/* Use existing, loaded buffer. */ /* Use existing, loaded buffer. */
using_dummy = FALSE; using_dummy = FALSE;
if (buf == NULL) if (buf == NULL)
{
if (!got_int)
smsg((char_u *)_("Cannot open file \"%s\""), fnames[fi]); smsg((char_u *)_("Cannot open file \"%s\""), fnames[fi]);
}
else else
{ {
found_match = FALSE; found_match = FALSE;
@ -2382,10 +2422,15 @@ ex_vimgrep(eap)
if (using_dummy) if (using_dummy)
{ {
if (found_match && first_match_buf == NULL)
first_match_buf = buf;
if (duplicate_name) if (duplicate_name)
{
/* Never keep a dummy buffer if there is another buffer /* Never keep a dummy buffer if there is another buffer
* with the same name. */ * with the same name. */
wipe_dummy_buffer(buf); wipe_dummy_buffer(buf);
buf = NULL;
}
else if (!buf_hide(buf)) else if (!buf_hide(buf))
{ {
/* When not hiding the buffer and no match was found we /* When not hiding the buffer and no match was found we
@ -2393,13 +2438,29 @@ ex_vimgrep(eap)
* there was a match and it wasn't the first one: only * there was a match and it wasn't the first one: only
* unload the buffer. */ * unload the buffer. */
if (!found_match) if (!found_match)
{
wipe_dummy_buffer(buf); wipe_dummy_buffer(buf);
else if (!first_match) buf = NULL;
}
else if (buf != first_match_buf)
{
unload_dummy_buffer(buf); unload_dummy_buffer(buf);
buf = NULL;
} }
} }
if (found_match)
first_match = FALSE; #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
if (buf != NULL)
{
/* The buffer is still loaded, the Filetype autocommands
* need to be done now, in that buffer. */
aucmd_prepbuf(&aco, buf);
apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
buf->b_fname, TRUE, buf);
aucmd_restbuf(&aco);
}
#endif
}
} }
} }

View File

@ -910,6 +910,42 @@ struct stl_hlrec
int userhl; int userhl;
}; };
/* Item for a hashtable. "hi_key" can be one of three values:
* NULL: Never been used
* HI_KEY_REMOVED: Entry was removed
* Otherwise: Used item, pointer to the actual key; this usually is
* inside the item, subtract an offset to locate the item.
* This reduces the size of hashitem by 1/3.
*/
typedef struct hashitem_S
{
long_u hi_hash; /* cached hash number of hi_key */
char_u *hi_key;
} hashitem;
/* The address of "hash_removed" is used as a magic number for hi_key to
* indicate a removed item. */
#define HI_KEY_REMOVED &hash_removed
#define HASHITEM_EMPTY(hi) ((hi)->hi_key == NULL || (hi)->hi_key == &hash_removed)
/* Initial size for a hashtable. Our items are relatively small and growing
* is expensive, thus use 16 as a start. Must be a power of 2. */
#define HT_INIT_SIZE 16
typedef struct hashtable_S
{
long_u ht_mask; /* mask used for hash value (nr of items in
* array is "ht_mask" + 1) */
int ht_used; /* number of items used */
int ht_filled; /* number of items used + removed */
int ht_locked; /* counter for hash_lock() */
int ht_error; /* when set growing failed, can't add more
items before growing works */
hashitem *ht_array; /* points to the array, allocated when it's
not "ht_smallarray" */
hashitem ht_smallarray[HT_INIT_SIZE]; /* initial array */
} hashtable;
/* /*
* buffer: structure that holds information about one file * buffer: structure that holds information about one file
* *
@ -1223,7 +1259,7 @@ struct file_buffer
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
garray_T b_vars; /* internal variables, local to buffer */ hashtable b_vars; /* internal variables, local to buffer */
#endif #endif
/* When a buffer is created, it starts without a swap file. b_may_swap is /* When a buffer is created, it starts without a swap file. b_may_swap is
@ -1567,7 +1603,7 @@ struct window
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
garray_T w_vars; /* internal variables, local to window */ hashtable w_vars; /* internal variables, local to window */
#endif #endif
#if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP) #if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP)
@ -1929,38 +1965,3 @@ typedef struct
} prt_settings_T; } prt_settings_T;
#define PRINT_NUMBER_WIDTH 8 #define PRINT_NUMBER_WIDTH 8
/* Item for a hashtable. "hi_key" can be one of three values:
* NULL: Never been used
* HI_KEY_REMOVED: Entry was removed
* Otherwise: Used item, pointer to the actual key; this usually is
* inside the item, subtract an offset to locate the item.
* This reduces the size of hashitem by 1/3.
*/
typedef struct hashitem_S
{
long_u hi_hash; /* cached hash number of hi_key */
char_u *hi_key;
} hashitem;
/* The address of "hash_removed" is used as a magic number for hi_key to
* indicate a removed item. */
#define HI_KEY_REMOVED &hash_removed
#define HASHITEM_EMPTY(hi) ((hi)->hi_key == NULL || (hi)->hi_key == &hash_removed)
/* Initial size for a hashtable. Our items are relatively small and growing
* is expensive, thus use 16 as a start. Must be a power of 2. */
#define HT_INIT_SIZE 16
typedef struct hashtable_S
{
long_u ht_mask; /* mask used for hash value (nr of items in
* array is "ht_mask" + 1) */
int ht_used; /* number of items used */
int ht_filled; /* number of items used + removed */
int ht_error; /* when set growing failed, can't add more
items before growing works */
hashitem *ht_array; /* points to the array, allocated when it's
not "ht_smallarray" */
hashitem ht_smallarray[HT_INIT_SIZE]; /* initial array */
} hashtable;

View File

@ -76,20 +76,20 @@ STARTTEST
:unlet d[-1] :unlet d[-1]
:$put =string(d) :$put =string(d)
:" :"
:" manipulating a big Dictionary :" manipulating a big Dictionary (hashtable.c has a border of 1000 entries)
:let d = {} :let d = {}
:for i in range(15000) :for i in range(1500)
: let d[i] = 30000 - i : let d[i] = 3000 - i
:endfor :endfor
:$put =d[0] . ' ' . d[100] . ' ' . d[999] . ' ' . d[14000] . ' ' . d[14999] :$put =d[0] . ' ' . d[100] . ' ' . d[999] . ' ' . d[1400] . ' ' . d[1499]
:try :try
: let n = d[15000] : let n = d[1500]
:catch :catch
: $put =v:exception[:14] . v:exception[-5:-1] : $put =v:exception[:14] . v:exception[-4:-1]
:endtry :endtry
:" lookup each items :" lookup each items
:for i in range(15000) :for i in range(1500)
: if d[i] != 30000 - i : if d[i] != 3000 - i
: $put =d[i] : $put =d[i]
: endif : endif
:endfor :endfor
@ -99,12 +99,12 @@ STARTTEST
: let i -= 2 : let i -= 2
: unlet d[i] : unlet d[i]
:endwhile :endwhile
:$put =get(d, 15000 - 100, 'NONE') . ' ' . d[1] :$put =get(d, 1500 - 100, 'NONE') . ' ' . d[1]
:" delete odd items, checking value, one intentionally wrong :" delete odd items, checking value, one intentionally wrong
:let d[33] = 999 :let d[33] = 999
:let i = 1 :let i = 1
:while i < 15000 :while i < 1500
: if d[i] != 30000 - i : if d[i] != 3000 - i
: $put =i . '=' . d[i] : $put =i . '=' . d[i]
: else : else
: unlet d[i] : unlet d[i]
@ -121,14 +121,22 @@ STARTTEST
:endfunc :endfunc
:let dict.data = [1,2,3] :let dict.data = [1,2,3]
:call dict.func("len: ") :call dict.func("len: ")
:echo dict.func("again: ") :let x = dict.func("again: ")
:try :try
: let Fn = dict.func : let Fn = dict.func
: call Fn('xxx') : call Fn('xxx')
:catch :catch
: $put =v:exception[:15] : $put =v:exception[:15]
:endtry :endtry
:sleep 5 :"
:" Function in script-local List or Dict
:let g:dict = {}
:function g:dict.func() dict
: $put ='g:dict.func'.self.foo[1].self.foo[0]('asdf')
:endfunc
:let g:dict.foo = ['-', 2, 3]
:call insert(g:dict.foo, function('strlen'))
:call g:dict.func()
:" :"
:" Nasty: remove func from Dict that's being called (works) :" Nasty: remove func from Dict that's being called (works)
:let d = {1:1} :let d = {1:1}
@ -148,7 +156,7 @@ STARTTEST
:endtry :endtry
:" :"
:endfun :endfun
:call Test() :call Test() " This may take a while
:" :"
:/^start:/,$wq! test.out :/^start:/,$wq! test.out
ENDTEST ENDTEST

View File

@ -19,13 +19,14 @@ Vim(let):E706: l
[1, 'as''d', {'a': 1}] [1, 'as''d', {'a': 1}]
[4] [4]
{'1': 99, '3': 33} {'1': 99, '3': 33}
30000 29900 29001 16000 15001 3000 2900 2001 1600 1501
Vim(let):E716: 15000 Vim(let):E716: 1500
NONE 29999 NONE 2999
33=999 33=999
{'33': 999} {'33': 999}
len: 3 len: 3
again: 3 again: 3
Vim(call):E725: Vim(call):E725:
a:function('2') g:dict.func-4
a:function('3')
Vim(let):E698: Vim(let):E698:

View File

@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa" #define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa" #define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA" #define VIM_VERSION_MEDIUM "7.0aa ALPHA"
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 19)" #define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 20)"
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 19, compiled " #define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 20, compiled "