]> granicus.if.org Git - vim/commitdiff
updated for version 7.0043
authorBram Moolenaar <Bram@vim.org>
Fri, 21 Jan 2005 11:55:25 +0000 (11:55 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 21 Jan 2005 11:55:25 +0000 (11:55 +0000)
19 files changed:
runtime/doc/eval.txt
runtime/doc/quickfix.txt
runtime/doc/starting.txt
runtime/doc/tags
runtime/doc/todo.txt
runtime/doc/various.txt
runtime/doc/version7.txt
src/ex_cmds2.c
src/fileio.c
src/hashtable.c
src/main.c
src/proto/eval.pro
src/proto/fileio.pro
src/proto/hashtable.pro
src/quickfix.c
src/structs.h
src/testdir/test55.in
src/testdir/test55.ok
src/version.h

index bcd71c0a1f86c817816b027b972ee9a1c6d410e5..3eeb98fd721b9ccd84d35cdb7c542bd33675ea9e 100644 (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
@@ -4413,7 +4413,12 @@ This would call the function "my_func_whizz(parameter)".
                        List item.
                                                        *E106*
 :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
                        variable is indicated before the value:
index 57ea91f9ab0774a396bea150802701c4746133a0..efec7966cecfd444a3b2f1624384e53de45a24fe 100644 (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
@@ -288,6 +288,8 @@ advantages are:
 - Uses Vim search patterns.  Multi-line patterns can be used.
 - When plugins are enabled: compressed and remote files can be searched.
        |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
@@ -303,6 +305,8 @@ advantages are:
                        'ignorecase' applies.  To overrule it use |/\c| to
                        ignore case or |/\C| to match case.  'smartcase' is
                        not used.
+                       Every second or so the searched file name is displayed
+                       to give you an idea of the progress made.
                        Examples: >
                                :vimgrep /an error/ *.c
                                :vimgrep /\<FileName\>/ *.h include/*
index 705b50fa2377265988a632c9c622c9c776253de8..39fbd44cf0bec8fca7ba6b407e9112974809f01c 100644 (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
@@ -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
                        name is generated and 'viewdir' prepended.  When last
                        directory name in 'viewdir' does not exist, this
-                       directory is created.
+                       directory is created.                   *E738*
                        An existing file is always overwritten then.  Use
                        |:loadview| to load this view again.
                        When [file] is the name of a file ('viewdir' is not
index 49d0f2dcebbb7dfa884ccf93096ff23ad8166e81..894441871930f2f904403a3eff6ffe904c11bee3 100644 (file)
@@ -2036,13 +2036,16 @@ $VIMRUNTIME     starting.txt    /*$VIMRUNTIME*
 :lefta windows.txt     /*:lefta*
 :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-environment       eval.txt        /*:let-environment*
 :let-option    eval.txt        /*:let-option*
 :let-register  eval.txt        /*:let-register*
 :let-star      eval.txt        /*:let-star*
 :let-unpack    eval.txt        /*:let-unpack*
+:let.= eval.txt        /*:let.=*
 :list  various.txt     /*:list*
 :lm    map.txt /*:lm*
 :lmap  map.txt /*:lmap*
@@ -3634,6 +3637,7 @@ E732      eval.txt        /*E732*
 E733   eval.txt        /*E733*
 E735   eval.txt        /*E735*
 E736   eval.txt        /*E736*
+E737   eval.txt        /*E737*
 E74    message.txt     /*E74*
 E75    vi_diff.txt     /*E75*
 E76    pattern.txt     /*E76*
@@ -5034,7 +5038,6 @@ hebrew    hebrew.txt      /*hebrew*
 hebrew.txt     hebrew.txt      /*hebrew.txt*
 help   various.txt     /*help*
 help-context   help.txt        /*help-context*
-help-tags      tags    1
 help-translated        various.txt     /*help-translated*
 help-xterm-window      various.txt     /*help-xterm-window*
 help.txt       help.txt        /*help.txt*
index 70a783d6793cc4a4c44bfb0780a32bbb82c05b00..06186f97616012d304928d28b46a1343801d81a8 100644 (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
@@ -30,10 +30,12 @@ be worked on, but only if you sponsor Vim development.  See |sponsor|.
                                                        *known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+Dict member: use dict..foo instead of dict.foo to avoid confusion with string
+concatenation?
+
 Hashtable implementation:
-- Use hashtable for variables and syntax keywords.
+- Use hashtable for syntax keywords.
 
-":grep": display progress (filename, every second or so)
 Can ":grep" made faster somehow?  Do profiling.
 
 Sanity check of eval.c:
index 964016ae6d4a1ca7b8d1bd41af715e4491d78a9c..a04dd30cb58ecc7888648a2d25ebba14a008f15f 100644 (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
@@ -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
                        contents of the register if its name is given
                        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] @*>           Append messages to the clipboard. {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}
 
index f2ca9674d7c3be1bc6ec0c3a595a587e8df07bce..4865bb5345472851e83b677a1bc22a32e205fc34 100644 (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
@@ -418,6 +418,14 @@ When a register is empty it is not stored in the viminfo file.
 
 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*
 
index 2600a1b245f2e187c84bb09f9ab483ed859cc76e..8ba1744d00dddb0bdf40e902bdf3fb5dd3a19ab0 100644 (file)
@@ -1618,7 +1618,6 @@ ex_listdo(eap)
     int                next_fnum = 0;
 #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
     char_u     *save_ei = NULL;
-    char_u     *new_ei;
 #endif
     char_u     *p_shm_save;
 
@@ -1632,22 +1631,9 @@ ex_listdo(eap)
 
 #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
     if (eap->cmdidx != CMD_windo)
-    {
-       /* Add "Syntax" to 'eventignore' to skip loading syntax highlighting
-        * for every buffer loaded into the window.  A considerable speed
-        * 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);
-           }
-       }
-    }
+       /* Don't do syntax HL autocommands.  Skipping the syntax file is a
+        * great speed improvement. */
+       save_ei = au_event_disable(",Syntax");
 #endif
 
     if (eap->cmdidx == CMD_windo
@@ -1755,13 +1741,7 @@ ex_listdo(eap)
     }
 
 #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
-    if (save_ei != NULL)
-    {
-       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);
-    }
+    au_event_restore(save_ei);
 #endif
 }
 
index accd81cf073a8542895ebbc68a6082323df65441..c888f353383b6416a84f45973b88dbc32dbee265 100644 (file)
@@ -7132,6 +7132,48 @@ check_ei()
     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
  *  following ways:
index 4b378aa0c64b62cd81c93813583c2b28ee43ec61..11cb469e979fe6cfd8d7c1533ab70fb05f07703b 100644 (file)
@@ -73,19 +73,17 @@ hash_init(ht)
     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
-hash_free(ht)
+hash_clear(ht)
     hashtable *ht;
 {
     if (ht->ht_array != ht->ht_smallarray)
        vim_free(ht->ht_array);
-    vim_free(ht);
 }
-#endif
 
 /*
  * 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
- * hash_lookup() and point to a used empty item.
- * The caller must take care of freeing the item.
+ * hash_lookup() and point to an empty item.
+ * The caller must take care of freeing the item itself.
  */
     void
 hash_remove(ht, hi)
@@ -241,6 +239,31 @@ hash_remove(ht, hi)
     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.
  * Grow a hashtable when there is not enough empty space.
@@ -260,6 +283,10 @@ hash_may_resize(ht)
     long_u     newmask;
     long_u     perturb;
 
+    /* Don't resize a locked table. */
+    if (ht->ht_locked > 0)
+       return OK;
+
 #ifdef HT_DEBUG
     if (ht->ht_used > ht->ht_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)
        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 */
     else
        minsize = ht->ht_used * 4;  /* make plenty of room */
index 7ab914cb5855303aedb13e16379f5edd3f86b344..3b888f278b54109a9e3835a8da240cd119222b71 100644 (file)
@@ -177,6 +177,9 @@ main
 #ifdef FEAT_MBYTE
     (void)mb_init();   /* init mb_bytelen_tab[] to ones */
 #endif
+#ifdef FEAT_EVAL
+    eval_init();       /* init global variables */
+#endif
 
 #ifdef __QNXNTO__
     qnx_init();                /* PhAttach() for clipboard, (and gui) */
index 64fb62a524692e083f72f7441356aa1db342b600..19d993552d4e85a60451ac53756d871f44246858 100644 (file)
@@ -1,4 +1,5 @@
 /* eval.c */
+void eval_init __ARGS((void));
 char_u *func_name __ARGS((void *cookie));
 linenr_T *func_breakpoint __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 *get_var_value __ARGS((char_u *name));
 void new_script_vars __ARGS((scid_T id));
-void vars_init __ARGS((garray_T *gap));
-void vars_clear __ARGS((garray_T *gap));
+void vars_init __ARGS((hashtable *ht));
+void vars_clear __ARGS((hashtable *ht));
 void ex_echo __ARGS((exarg_T *eap));
 void ex_echohl __ARGS((exarg_T *eap));
 void ex_execute __ARGS((exarg_T *eap));
index c3a872c5877959b65ec777245de500f941c0001f..d7c80956cb1e20832e4524a89695fad42071cef4 100644 (file)
@@ -23,6 +23,8 @@ void forward_slash __ARGS((char_u *fname));
 void aubuflocal_remove __ARGS((buf_T *buf));
 void do_augroup __ARGS((char_u *arg, int del_group));
 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));
 int do_doautocmd __ARGS((char_u *arg, int do_msg));
 void ex_doautoall __ARGS((exarg_T *eap));
index f6cb77ad9294b316439675237985f0d77914361c..6cc8041d99d5fd498b65e8c9ec8b126287805527 100644 (file)
@@ -1,6 +1,9 @@
 /* hashtable.c */
 void hash_init __ARGS((hashtable *ht));
+void hash_clear __ARGS((hashtable *ht));
 hashitem *hash_find __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_lock __ARGS((hashtable *ht));
+void hash_unlock __ARGS((hashtable *ht));
 /* vim: set ft=c : */
index 8bb2bbe76069524a5a27712e8d21414af6bf71f3..0c5a050d9be480d2ee70ba00bf3b1907b6348184 100644 (file)
@@ -2269,7 +2269,12 @@ ex_vimgrep(eap)
     int                duplicate_name = FALSE;
     int                using_dummy;
     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. */
     save_cpo = p_cpo;
@@ -2330,24 +2335,59 @@ ex_vimgrep(eap)
        goto theend;
     }
 
+    seconds = (time_t)0;
     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]);
        if (buf == NULL || buf->b_ml.ml_mfp == NULL)
        {
            /* Remember that a buffer with this name already exists. */
            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,
             * autocommands applied, etc. */
            buf = load_dummy_buffer(fnames[fi]);
-           using_dummy = TRUE;
+
+#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+           au_event_restore(save_ei);
+#endif
        }
        else
            /* Use existing, loaded buffer. */
            using_dummy = FALSE;
+
        if (buf == NULL)
-           smsg((char_u *)_("Cannot open file \"%s\""), fnames[fi]);
+       {
+           if (!got_int)
+               smsg((char_u *)_("Cannot open file \"%s\""), fnames[fi]);
+       }
        else
        {
            found_match = FALSE;
@@ -2382,10 +2422,15 @@ ex_vimgrep(eap)
 
            if (using_dummy)
            {
+               if (found_match && first_match_buf == NULL)
+                   first_match_buf = buf;
                if (duplicate_name)
+               {
                    /* Never keep a dummy buffer if there is another buffer
                     * with the same name. */
                    wipe_dummy_buffer(buf);
+                   buf = NULL;
+               }
                else if (!buf_hide(buf))
                {
                    /* 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
                     * unload the buffer. */
                    if (!found_match)
+                   {
                        wipe_dummy_buffer(buf);
-                   else if (!first_match)
+                       buf = NULL;
+                   }
+                   else if (buf != first_match_buf)
+                   {
                        unload_dummy_buffer(buf);
+                       buf = NULL;
+                   }
+               }
+
+#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
            }
-           if (found_match)
-               first_match = FALSE;
        }
     }
 
index 051eb2df061aa42b8852cc22c5fff7d16fd4dbf8..a5e9e8d9cad1775ab235ee5e5aae965554078d0c 100644 (file)
@@ -910,6 +910,42 @@ struct stl_hlrec
     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
  *
@@ -1223,7 +1259,7 @@ struct file_buffer
 #endif
 
 #ifdef FEAT_EVAL
-    garray_T   b_vars;         /* internal variables, local to buffer */
+    hashtable  b_vars;         /* internal variables, local to buffer */
 #endif
 
     /* When a buffer is created, it starts without a swap file.  b_may_swap is
@@ -1567,7 +1603,7 @@ struct window
 #endif
 
 #ifdef FEAT_EVAL
-    garray_T   w_vars;         /* internal variables, local to window */
+    hashtable  w_vars;         /* internal variables, local to window */
 #endif
 
 #if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP)
@@ -1929,38 +1965,3 @@ typedef struct
 } prt_settings_T;
 
 #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;
index a757dae1258915c700fa10463303dd1e1b464a68..2fa26bf903ac0a2defe1afd3c664ca138bf20115 100644 (file)
@@ -76,20 +76,20 @@ STARTTEST
 :unlet d[-1]
 :$put =string(d)
 :"
-:" manipulating a big Dictionary
+:" manipulating a big Dictionary (hashtable.c has a border of 1000 entries)
 :let d = {}
-:for i in range(15000)
-: let d[i] = 30000 - i
+:for i in range(1500)
+: let d[i] = 3000 - i
 :endfor
-:$put =d[0] . ' ' . d[100] . ' ' . d[999] . ' ' . d[14000] . ' ' . d[14999]
+:$put =d[0] . ' ' . d[100] . ' ' . d[999] . ' ' . d[1400] . ' ' . d[1499]
 :try
-:  let n = d[15000]
+:  let n = d[1500]
 :catch
-:  $put =v:exception[:14] . v:exception[-5:-1]
+:  $put =v:exception[:14] . v:exception[-4:-1]
 :endtry
 :" lookup each items
-:for i in range(15000)
-: if d[i] != 30000 - i
+:for i in range(1500)
+: if d[i] != 3000 - i
 :  $put =d[i]
 : endif
 :endfor
@@ -99,12 +99,12 @@ STARTTEST
 : let i -= 2
 : unlet d[i]
 :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
 :let d[33] = 999
 :let i = 1
-:while i < 15000
-: if d[i] != 30000 - i
+:while i < 1500
+: if d[i] != 3000 - i
 :  $put =i . '=' . d[i]
 : else
 :  unlet d[i]
@@ -121,14 +121,22 @@ STARTTEST
 :endfunc
 :let dict.data = [1,2,3]
 :call dict.func("len: ")
-:echo dict.func("again: ")
+:let x = dict.func("again: ")
 :try
 :  let Fn = dict.func
 :  call Fn('xxx')
 :catch
 :  $put =v:exception[:15]
 :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)
 :let d = {1:1}
@@ -148,7 +156,7 @@ STARTTEST
 :endtry
 :"
 :endfun
-:call Test()
+:call Test()  " This may take a while
 :"
 :/^start:/,$wq! test.out
 ENDTEST
index 407b7a1b5f737ebb0c675c10fcc51b163bb505e3..868b116fb12353736ba7660fa40ac31e13970164 100644 (file)
@@ -19,13 +19,14 @@ Vim(let):E706: l
 [1, 'as''d', {'a': 1}]
 [4]
 {'1': 99, '3': 33}
-30000 29900 29001 16000 15001
-Vim(let):E716: 15000
-NONE 29999
+3000 2900 2001 1600 1501
+Vim(let):E716: 1500
+NONE 2999
 33=999
 {'33': 999}
 len: 3
 again: 3
 Vim(call):E725: 
-a:function('2')
+g:dict.func-4
+a:function('3')
 Vim(let):E698: 
index 18f33b7d485b1d677189c95bd467a176672f5148..8b531751dc65113255eba79e05c247e9bcc173c8 100644 (file)
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT      "vim70aa"
 #define VIM_VERSION_SHORT      "7.0aa"
 #define VIM_VERSION_MEDIUM     "7.0aa ALPHA"
-#define VIM_VERSION_LONG       "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 19)"
-#define VIM_VERSION_LONG_DATE  "VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 19, compiled "
+#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 20, compiled "