diff options
author | Bram Moolenaar <Bram@vim.org> | 2005-06-27 22:48:21 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2005-06-27 22:48:21 +0000 |
commit | 9a50b1bf21cee8ba77306e319d88c4e2eeb024c0 (patch) | |
tree | fe0cc0141628a407205f51860536b56ce32cae2b | |
parent | 39a58ca3d414b0b1600f5e2b1b9ef2d8d7031c15 (diff) |
updated for version 7.0095v7.0095
-rw-r--r-- | runtime/doc/spell.txt | 60 | ||||
-rw-r--r-- | runtime/doc/todo.txt | 7 | ||||
-rw-r--r-- | src/eval.c | 340 | ||||
-rw-r--r-- | src/ex_cmds.c | 3 | ||||
-rw-r--r-- | src/hashtable.c | 2 | ||||
-rw-r--r-- | src/os_amiga.c | 2 | ||||
-rw-r--r-- | src/po/pl.po | 3832 | ||||
-rw-r--r-- | src/proto/hashtable.pro | 1 |
8 files changed, 2567 insertions, 1680 deletions
diff --git a/runtime/doc/spell.txt b/runtime/doc/spell.txt index aaef05f10e..bc0130efa5 100644 --- a/runtime/doc/spell.txt +++ b/runtime/doc/spell.txt @@ -1,4 +1,4 @@ -*spell.txt* For Vim version 7.0aa. Last change: 2005 Jun 25 +*spell.txt* For Vim version 7.0aa. Last change: 2005 Jun 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -266,7 +266,7 @@ find these functions useful: Vim uses a binary file format for spelling. This greatly speeds up loading the word list and keeps it small. - + *.aff* *.dic* *Myspell* You can create a Vim spell file from the .aff and .dic files that Myspell uses. Myspell is used by OpenOffice.org and Mozilla. You should be able to find them here: @@ -321,9 +321,14 @@ then Vim will try to guess. When the spell file was written all currently used spell files will be reloaded. -:mksp[ell] [-ascii] {add-name} - Like ":mkspell" above, using {add-name} as the input - file and producing an output file that has ".spl" +:mksp[ell] [-ascii] {name}.{enc}.add + Like ":mkspell" above, using {name}.{enc}.add as the + input file and producing an output file that has + ".spl" appended. + +:mksp[ell] [-ascii] {name} + Like ":mkspell" above, using {name} as the input file + and producing an output file that has ".{enc}.spl" appended. Since you might want to change a Myspell word list for use with Vim the @@ -557,14 +562,43 @@ contain the table with characters, so that it can be combine with spell files for any encoding. The .add.spl files also do not contain the table. +MID-WORD CHARACTERS + *spell-midword* +Some characters are only to be considered word characters if they are used in +between two ordinary word characters. An example is the single quote: It is +often used to put text in quotes, thus it can't be recognized as a word +character, but when it appears in between word characters it must be part of +the word. This is needed to detect a spelling error such as they'are. That +should be they're, but since "they" and "are" are words themselves that would +go unnoticed. + +These characters are defined with MIDWORD in the .aff file: + + MIDWORD '- ~ + + AFFIXES *spell-affix-PFX* *spell-affix-SFX* The usual PFX (prefix) and SFX (suffix) lines are supported (see the Myspell -documentation). Note that Myspell ignores any extra text after the relevant -info. Vim requires this text to start with a "#" so that mistakes don't go -unnoticed. Example: +documentation or the Aspell manual: +http://aspell.net/man-html/Affix-Compression.html). - SFX F 0 in [^i]n # Spion > Spionin ~ +Note that Myspell ignores any extra text after the relevant info. Vim +requires this text to start with a "#" so that mistakes don't go unnoticed. +Example: + + SFX F 0 in [^i]n # Spion > Spionin ~ + SFX F 0 nen in # Bauerin > Bauerinnen ~ + +An extra item for Vim is the "rare" flag. It must come after the other +fields, before a comment. When used then all words that use the affix will be +marked as rare words. Example: + + PFX F 0 nene . rare ~ + SFX F 0 oin n rare # hardly ever used ~ + +However, if the word also appears as a good word in another way it won't be +marked as rare. *spell-affix-PFXPOSTPONE* When an affix file has very many prefixes that apply to many words it's not @@ -610,8 +644,12 @@ bad words. Example: BAD ! ~ This can be used to exclude words that would otherwise be good. For example -"the the". Once a word has been marked as bad it won't be undone by -encountering the same word as good. +"the the" in the .dic file: + + the the/! ~ + +Once a word has been marked as bad it won't be undone by encountering the same +word as good. REPLACEMENTS *spell-affix-REP* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index b41ba49458..5754b6ee53 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2005 Jun 26 +*todo.txt* For Vim version 7.0aa. Last change: 2005 Jun 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,8 +30,7 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. *known-bugs* -------------------- Known bugs and current work ----------------------- -Is the fix for memory leaks in unreferencing dict/list correct? Is there a -situation where a reference from outside of the structure is not counted? +send fixes for ccmalloc port to FreeBSD. Add extra list of file locations. Can be used with: :ltag list of matching tags, like :tselect @@ -101,8 +100,6 @@ PLANNED FOR VERSION 7.0: - Add SPELLCHECKER, with support for many languages. - Spell checking code todo's: - - Special handling of ' and -: define in the .aff file. - Aspell does this with "special". - Support user function to make suggestions: :set spellsuggest=MySuggest,fast Also support a list with common mistakes? diff --git a/src/eval.c b/src/eval.c index b56c34163c..0e9a2ba179 100644 --- a/src/eval.c +++ b/src/eval.c @@ -194,10 +194,14 @@ struct ufunc #define DEL_REFCOUNT 999999 /* list/dict is being deleted */ /* - * All user-defined functions are found in this hash table. + * All user-defined functions are found in this hashtable. */ static hashtab_T func_hashtab; +/* list heads for garbage collection */ +static dict_T *first_dict = NULL; /* list of all dicts */ +static list_T *first_list = NULL; /* list of all lists */ + /* From user function to hashitem and back. */ static ufunc_T dumuf; #define UF2HIKEY(fp) ((fp)->uf_name) @@ -212,7 +216,9 @@ static ufunc_T dumuf; #define FIXVAR_CNT 12 /* number of fixed variables */ /* structure to hold info for a function that is currently being executed. */ -typedef struct funccall_S +typedef struct funccall_S funccall_T; + +struct funccall_S { ufunc_T *func; /* function being called */ int linenr; /* next line to be executed */ @@ -235,7 +241,8 @@ typedef struct funccall_S #ifdef FEAT_PROFILE proftime_T prof_child; /* time spent in a child */ #endif -} funccall_T; + funccall_T *caller; /* calling function or NULL */ +}; /* * Info used by a ":for" loop. @@ -382,10 +389,9 @@ static void list_remove __ARGS((list_T *l, listitem_T *item, listitem_T *item2)) static char_u *list2string __ARGS((typval_T *tv)); static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo)); -static int count_self_ref __ARGS((void *p, int type)); -static int count_ref_in_dict __ARGS((dict_T *d, void *rp, int copyID, garray_T *gap)); -static int count_ref_in_list __ARGS((list_T *l, void *rp, int copyID, garray_T *gap)); -static int count_ref_item __ARGS((typval_T *tv, void *rp, int copyID, garray_T *gap)); +static void set_ref_in_ht __ARGS((hashtab_T *ht, int copyID)); +static void set_ref_in_list __ARGS((list_T *l, int copyID)); +static void set_ref_in_item __ARGS((typval_T *tv, int copyID)); static void dict_unref __ARGS((dict_T *d)); static void dict_free __ARGS((dict_T *d)); @@ -460,6 +466,7 @@ static void f_foldtext __ARGS((typval_T *argvars, typval_T *rettv)); static void f_foldtextresult __ARGS((typval_T *argvars, typval_T *rettv)); static void f_foreground __ARGS((typval_T *argvars, typval_T *rettv)); static void f_function __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_garbagecollect __ARGS((typval_T *argvars, typval_T *rettv)); static void f_get __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getbufvar __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getchar __ARGS((typval_T *argvars, typval_T *rettv)); @@ -749,7 +756,12 @@ eval_clear() /* global variables */ vars_clear(&globvarht); + /* functions */ free_all_functions(); + hash_clear(&func_hashtab); + + /* unreferenced lists and dicts */ + (void)garbage_collect(); } #endif @@ -4945,7 +4957,19 @@ failret: static list_T * list_alloc() { - return (list_T *)alloc_clear(sizeof(list_T)); + list_T *l; + + l = (list_T *)alloc_clear(sizeof(list_T)); + if (l != NULL) + { + /* Prepend the list to the list of lists for garbage collection. */ + if (first_list != NULL) + first_list->lv_used_prev = l; + l->lv_used_prev = NULL; + l->lv_used_next = first_list; + first_list = l; + } + return l; } /* @@ -4956,23 +4980,8 @@ list_alloc() list_unref(l) list_T *l; { - int selfref; - - if (l != NULL && l->lv_refcount != DEL_REFCOUNT) - { - if (--l->lv_refcount > 0) - { - /* Check if the dict contains references to itself. These need to - * be subtracted from the reference count to find out if we can - * delete the dict. */ - selfref = count_self_ref(l, VAR_LIST); - } - else - selfref = 0; - if (l->lv_refcount - selfref == 0) - /* No references to the list now, free it. */ - list_free(l); - } + if (l != NULL && l->lv_refcount != DEL_REFCOUNT && --l->lv_refcount <= 0) + list_free(l); } /* @@ -4988,6 +4997,14 @@ list_free(l) /* Avoid that recursive reference to the list frees us again. */ l->lv_refcount = DEL_REFCOUNT; + /* Remove the list from the list of lists for garbage collection. */ + if (l->lv_used_prev == NULL) + first_list = l->lv_used_next; + else + l->lv_used_prev->lv_used_next = l->lv_used_next; + if (l->lv_used_next != NULL) + l->lv_used_next->lv_used_prev = l->lv_used_prev; + for (item = l->lv_first; item != NULL; item = l->lv_first) { /* Remove the item before deleting it. */ @@ -5568,157 +5585,168 @@ list_join(gap, l, sep, echo) } /* - * Count the number of references for list/dict "p" inside itself. - * This is used to find out if there are no more references elsewhere. - * The tricky bit is that we must not count references in lists/dicts that are - * used elsewhere, but we can only know by counting their references... - * This is a bit slow, but required to avoid leaking memory. + * Garbage collection for lists and dictionaries. + * + * We use reference counts to be able to free most items right away when they + * are no longer used. But for composite items it's possible that it becomes + * unused while the reference count is > 0: When there is a recursive + * reference. Example: + * :let l = [1, 2, 3] + * :let d = {9: l} + * :let l[1] = d + * + * Since this is quite unusual we handle this with garbage collection: every + * once in a while find out which lists and dicts are not referenced from any + * variable. + * + * Here is a good reference text about garbage collection (refers to Python + * but it applies to all reference-counting mechanisms): + * http://python.ca/nas/python/gc/ */ - static int -count_self_ref(p, type) - void *p; - int type; + +/* + * Do garbage collection for lists and dicts. + * Return TRUE if some memory was freed. + */ + int +garbage_collect() { - garray_T ga; - typval_T *tv; - int selfref; + dict_T *dd; + list_T *ll; + int copyID = ++current_copyID; + buf_T *buf; + win_T *wp; int i; - int n; + funccall_T *fc; + int did_free = FALSE; - ga_init2(&ga, sizeof(typval_T *), 10); - if (type == VAR_DICT) - selfref = count_ref_in_dict(p, p, ++current_copyID, &ga); - else - selfref = count_ref_in_list(p, p, ++current_copyID, &ga); - for (i = 0; i < ga.ga_len; ++i) + /* + * 1. Go through all accessible variables and mark all lists and dicts + * with copyID. + */ + /* script-local variables */ + for (i = 1; i <= ga_scripts.ga_len; ++i) + set_ref_in_ht(&SCRIPT_VARS(i), copyID); + + /* buffer-local variables */ + for (buf = firstbuf; buf != NULL; buf = buf->b_next) + set_ref_in_ht(&buf->b_vars.dv_hashtab, copyID); + + /* window-local variables */ + FOR_ALL_WINDOWS(wp) + set_ref_in_ht(&wp->w_vars.dv_hashtab, copyID); + + /* global variables */ + set_ref_in_ht(&globvarht, copyID); + + /* function-local variables */ + for (fc = current_funccal; fc != NULL; fc = fc->caller) { - tv = ((typval_T **)ga.ga_data)[i]; - if (tv->v_type == VAR_DICT) + set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID); + set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID); + } + + /* + * 2. Go through the list of dicts and free items without the copyID. + */ + for (dd = first_dict; dd != NULL; ) + if (dd->dv_copyID != copyID) { - n = count_ref_in_dict(tv->vval.v_dict, tv->vval.v_dict, - ++current_copyID, NULL); - if (n < tv->vval.v_dict->dv_refcount) - { - selfref = 0; - break; - } + dict_free(dd); + did_free = TRUE; + + /* restart, next dict may also have been freed */ + dd = first_dict; } else + dd = dd->dv_used_next; + + /* + * 3. Go through the list of lists and free items without the copyID. + */ + for (ll = first_list; ll != NULL; ) + if (ll->lv_copyID != copyID) { - n = count_ref_in_list(tv->vval.v_list, tv->vval.v_list, - ++current_copyID, NULL); - if (n < tv->vval.v_list->lv_refcount) - { - selfref = 0; - break; - } + list_free(ll); + did_free = TRUE; + + /* restart, next dict may also have been freed */ + ll = first_list; } - } + else + ll = ll->lv_used_next; - ga_clear(&ga); - return selfref; + return did_free; } /* - * Count number of references to "rp" in dictionary "d" and its members. - * We use "copyID" to avoid recursing into the same list/dict twice. + * Mark all lists and dicts referenced through hashtab "ht" with "copyID". */ - static int -count_ref_in_dict(d, rp, copyID, gap) - dict_T *d; - void *rp; + static void +set_ref_in_ht(ht, copyID) + hashtab_T *ht; int copyID; - garray_T *gap; { int todo; hashitem_T *hi; - int n = 0; - todo = d->dv_hashtab.ht_used; - for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) + todo = ht->ht_used; + for (hi = ht->ht_array; todo > 0; ++hi) if (!HASHITEM_EMPTY(hi)) { --todo; - n += count_ref_item(&HI2DI(hi)->di_tv, rp, copyID, gap); + set_ref_in_item(&HI2DI(hi)->di_tv, copyID); } - return n; } /* - * Count number of references to "rp" in list "l" and its members. - * We use "copyID" to avoid recursing into the same list/dict twice. + * Mark all lists and dicts referenced through list "l" with "copyID". */ - static int -count_ref_in_list(l, rp, copyID, gap) + static void +set_ref_in_list(l, copyID) list_T *l; - void *rp; int copyID; - garray_T *gap; { listitem_T *li; - int n = 0; for (li = l->lv_first; li != NULL; li = li->li_next) - n += count_ref_item(&li->li_tv, rp, copyID, gap); - return n; + set_ref_in_item(&li->li_tv, copyID); } /* - * Count number of references to "rp" in item "tv" and any members. - * We use "copyID" to avoid recursing into the same list/dict twice. - * When "gap" is not NULL store items that require checking for only - * references inside the structure. + * Mark all lists and dicts referenced through typval "tv" with "copyID". */ - static int -count_ref_item(tv, rp, copyID, gap) + static void +set_ref_in_item(tv, copyID) typval_T *tv; - void *rp; int copyID; - garray_T *gap; { dict_T *dd; list_T *ll; - int n; switch (tv->v_type) { case VAR_DICT: dd = tv->vval.v_dict; - if (dd == rp) - return 1; /* match, count it */ - if (dd->dv_copyID == copyID) - return 0; /* already inspected this dict */ - dd->dv_copyID = copyID; - n = count_ref_in_dict(dd, rp, copyID, gap); - if (n > 0 && gap != NULL && dd->dv_refcount > 1) + if (dd->dv_copyID != copyID) { - /* We must later check that the references to this dict are - * all in the structure we are freeing. */ - if (ga_grow(gap, 1) == FAIL) - return 0; - ((typval_T **)gap->ga_data)[gap->ga_len++] = tv; + /* Didn't see this dict yet. */ + dd->dv_copyID = copyID; + set_ref_in_ht(&dd->dv_hashtab, copyID); } - return n; + break; case VAR_LIST: ll = tv->vval.v_list; - if (ll == rp) - return 1; /* match, count it */ - if (ll->lv_copyID == copyID) - return 0; /* already inspected this list */ - ll->lv_copyID = copyID; - n = count_ref_in_list(ll, rp, copyID, gap); - if (n > 0 && gap != NULL && ll->lv_refcount > 1) + if (ll->lv_copyID != copyID) { - /* We must later check that the references to this list are - * all in the structure we are freeing. */ - if (ga_grow(gap, 1) == FAIL) - return 0; - ((typval_T **)gap->ga_data)[gap->ga_len++] = tv; + /* Didn't see this list yet. */ + ll->lv_copyID = copyID; + set_ref_in_list(ll, copyID); } - return n; + break; } - return 0; + return; } /* @@ -5732,6 +5760,12 @@ dict_alloc() d = (dict_T *)alloc(sizeof(dict_T)); if (d != NULL) { + /* Add the list to the hashtable for garbage collection. */ + if (first_dict != NULL) + first_dict->dv_used_prev = d; + d->dv_used_next = first_dict; + d->dv_used_prev = NULL; + hash_init(&d->dv_hashtab); d->dv_lock = 0; d->dv_refcount = 0; @@ -5748,23 +5782,8 @@ dict_alloc() dict_unref(d) dict_T *d; { - int selfref; - - if (d != NULL && d->dv_refcount != DEL_REFCOUNT) - { - if (--d->dv_refcount > 0) - { - /* Check if the dict contains references to itself. These need to - * be subtracted from the reference count to find out if we can - * delete the dict. */ - selfref = count_self_ref(d, VAR_DICT); - } - else - selfref = 0; - if (d->dv_refcount - selfref == 0) - /* No references to the dict now, free it. */ - dict_free(d); - } + if (d != NULL && d->dv_refcount != DEL_REFCOUNT && --d->dv_refcount <= 0) + dict_free(d); } /* @@ -5782,8 +5801,15 @@ dict_free(d) /* Avoid that recursive reference to the dict frees us again. */ d->dv_refcount = DEL_REFCOUNT; - /* Lock the hashtab, we don't want it to resize while looping through it. - * */ + /* Remove the dict from the list of dicts for garbage collection. */ + if (d->dv_used_prev == NULL) + first_dict = d->dv_used_next; + else + d->dv_used_prev->dv_used_next = d->dv_used_next; + if (d->dv_used_next != NULL) + d->dv_used_next->dv_used_prev = d->dv_used_prev; + + /* Lock the hashtab, we don't want it to resize while freeing items. */ hash_lock(&d->dv_hashtab); todo = d->dv_hashtab.ht_used; for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) @@ -6505,6 +6531,7 @@ static struct fst {"foldtextresult", 1, 1, f_foldtextresult}, {"foreground", 0, 0, f_foreground}, {"function", 1, 1, f_function}, + {"garbagecollect", 0, 0, f_garbagecollect}, {"get", 2, 3, f_get}, {"getbufvar", 2, 2, f_getbufvar}, {"getchar", 0, 1, f_getchar}, @@ -8886,6 +8913,18 @@ f_function(argvars, rettv) } /* + * "garbagecollect()" function + */ +/*ARGSUSED*/ + static void +f_garbagecollect(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + garbage_collect(); +} + +/* * "get()" function */ static void @@ -15506,8 +15545,10 @@ find_var_in_ht(ht, varname, writing) case 'v': return &vimvars_var; case 'b': return &curbuf->b_bufvar; case 'w': return &curwin->w_winvar; - case 'l': return ¤t_funccal->l_vars_var; - case 'a': return ¤t_funccal->l_avars_var; + case 'l': return current_funccal == NULL + ? NULL : ¤t_funccal->l_vars_var; + case 'a': return current_funccal == NULL + ? NULL : ¤t_funccal->l_avars_var; } return NULL; } @@ -15689,6 +15730,7 @@ vars_clear_ext(ht, free_val) } } hash_clear(ht); + ht->ht_used = 0; } /* @@ -15789,7 +15831,7 @@ set_var(name, tv, copy) } if (function_exists(name)) { - EMSG2(_("705: Variable name conflicts with existing function: %s"), + EMSG2(_("E705: Variable name conflicts with existing function: %s"), name); return; } @@ -17569,7 +17611,6 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) linenr_T save_sourcing_lnum; scid_T save_current_SID; funccall_T fc; - funccall_T *save_fcp = current_funccal; int save_did_emsg; static int depth = 0; dictitem_T *v; @@ -17594,6 +17635,7 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) line_breakcheck(); /* check for CTRL-C hit */ + fc.caller = current_funccal; current_funccal = &fc; fc.func = fp; fc.rettv = rettv; @@ -17752,7 +17794,7 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) func_do_profile(fp); if (fp->uf_profiling - || (save_fcp != NULL && &save_fcp->func->uf_profiling)) + || (fc.caller != NULL && &fc.caller->func->uf_profiling)) { ++fp->uf_tm_count; profile_start(&fp->uf_tm_start); @@ -17782,17 +17824,17 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) } #ifdef FEAT_PROFILE - if (fp->uf_profiling || (save_fcp != NULL && &save_fcp->func->uf_profiling)) + if (fp->uf_profiling || (fc.caller != NULL && &fc.caller->func->uf_profiling)) { profile_end(&fp->uf_tm_start); profile_sub_wait(&wait_start, &fp->uf_tm_start); profile_add(&fp->uf_tm_total, &fp->uf_tm_start); profile_add(&fp->uf_tm_self, &fp->uf_tm_start); profile_sub(&fp->uf_tm_self, &fp->uf_tm_children); - if (save_fcp != NULL && &save_fcp->func->uf_profiling) + if (fc.caller != NULL && &fc.caller->func->uf_profiling) { - profile_add(&save_fcp->func->uf_tm_children, &fp->uf_tm_start); - profile_add(&save_fcp->func->uf_tml_children, &fp->uf_tm_start); + profile_add(&fc.caller->func->uf_tm_children, &fp->uf_tm_start); + profile_add(&fc.caller->func->uf_tml_children, &fp->uf_tm_start); } } #endif @@ -17850,7 +17892,7 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) } did_emsg |= save_did_emsg; - current_funccal = save_fcp; + current_funccal = fc.caller; /* The a: variables typevals were not alloced, only free the allocated * variables. */ diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 9daa8f671a..1b99caf42b 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3199,6 +3199,9 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) #ifdef FEAT_DIFF curwin->w_p_diff = FALSE; /* No 'diff' */ #endif +#ifdef FEAT_SYN_HL + curwin->w_p_spell = FALSE; /* No spell checking */ +#endif #ifdef FEAT_AUTOCMD buf = curbuf; diff --git a/src/hashtable.c b/src/hashtable.c index d4177d3ea6..904be4704c 100644 --- a/src/hashtable.c +++ b/src/hashtable.c @@ -250,7 +250,7 @@ hash_set(hi, key) /* * Remove item "hi" from hashtable "ht". "hi" must have been obtained with - * hash_lookup() and point to an empty item. + * hash_lookup(). * The caller must take care of freeing the item itself. */ void diff --git a/src/os_amiga.c b/src/os_amiga.c index 1c15dc1f9e..8717825f39 100644 --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -148,7 +148,7 @@ mch_inchar(buf, maxlen, time, tb_change_cnt) return 3; } #endif - updatescript(0); + before_blocking(); } } diff --git a/src/po/pl.po b/src/po/pl.po index 7f4030d942..8a7ac76ae8 100644 --- a/src/po/pl.po +++ b/src/po/pl.po @@ -3,19 +3,20 @@ # # updated 2001 for vim-6.0 # FIRST AUTHOR Marcin Dalecki <martin@dalecki.de>, 2000. -# Mikolaj Machowski <mikmach@wp.pl>, 2004. +# Mikolaj Machowski <mikmach@wp.pl>, 2004, 2005. # msgid "" msgstr "" "Project-Id-Version: pl\n" -"POT-Creation-Date: 2004-05-23 21:41+0200\n" -"PO-Revision-Date: 2004-05-23 22:00+0200\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-06-27 01:18+0200\n" +"PO-Revision-Date: 2005-06-27 10:45+0200\n" "Last-Translator: Mikolaj Machowski <mikmach@wp.pl>\n" -"Language-Team: Polish <pl@li.org>\n" +"Language-Team: Polish <kde-transl@mer.chemia.polsl.gliwice.pl>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.9\n" +"X-Generator: KBabel 1.11\n" #: buffer.c:102 msgid "E82: Cannot allocate any buffer, exiting..." @@ -25,169 +26,170 @@ msgstr "E82: Nie mogę zarezerwować bufora; zakończenie..." msgid "E83: Cannot allocate buffer, using other one..." msgstr "E83: Nie mogę zarezerwować bufora; używam innego..." -#: buffer.c:805 +#: buffer.c:857 msgid "E515: No buffers were unloaded" msgstr "E515: Nie wyładowano żadnego bufora" -#: buffer.c:807 +#: buffer.c:859 msgid "E516: No buffers were deleted" msgstr "E516: Nie skasowano żadnego bufora" -#: buffer.c:809 +#: buffer.c:861 msgid "E517: No buffers were wiped out" msgstr "E517: Nie wyrzucono żadnego bufora" -#: buffer.c:817 +#: buffer.c:869 msgid "1 buffer unloaded" msgstr "1 bufor wyładowany" -#: buffer.c:819 +#: buffer.c:871 #, c-format msgid "%d buffers unloaded" msgstr "wyładowano %d buforów" -#: buffer.c:824 +#: buffer.c:876 msgid "1 buffer deleted" msgstr "1 bufor skasowany" -#: buffer.c:826 +#: buffer.c:878 #, c-format msgid "%d buffers deleted" msgstr "%d buforów skasowano" -#: buffer.c:831 +#: buffer.c:883 msgid "1 buffer wiped out" msgstr "wyrzucono 1 bufor " -#: buffer.c:833 +#: buffer.c:885 #, c-format msgid "%d buffers wiped out" msgstr "wyrzucono %d buforów" -#: buffer.c:894 +#: buffer.c:946 msgid "E84: No modified buffer found" msgstr "E84: Nie znaleziono zmienionych buforów" #. back where we started, didn't find anything. -#: buffer.c:933 +#: buffer.c:985 msgid "E85: There is no listed buffer" msgstr "E85: Nie ma wylistowanych buforów" -#: buffer.c:945 +#: buffer.c:997 #, c-format msgid "E86: Buffer %ld does not exist" msgstr "E86: Bufor \"%ld\" nie istnieje" -#: buffer.c:948 +#: buffer.c:1000 msgid "E87: Cannot go beyond last buffer" msgstr "E87: Nie mogę przejść poza ostatni bufor" -#: buffer.c:950 +#: buffer.c:1002 msgid "E88: Cannot go before first buffer" msgstr "E88: Nie mogę przejść przed pierwszy bufor" -#: buffer.c:988 +#: buffer.c:1044 #, c-format msgid "E89: No write since last change for buffer %ld (add ! to override)" msgstr "E89 Nie zapisano zmian w buforze %ld (wymuś przez !)" -#: buffer.c:1005 +#: buffer.c:1061 msgid "E90: Cannot unload last buffer" msgstr "E90: Nie mogę wyładować ostatniego bufora" -#: buffer.c:1538 +#: buffer.c:1611 msgid "W14: Warning: List of file names overflow" msgstr "W14: OSTRZEŻENIE: Przepełnienie listy nazw plików" -#: buffer.c:1709 +#: buffer.c:1797 #, c-format msgid "E92: Buffer %ld not found" msgstr "E92: Nie znaleziono bufora %ld" -#: buffer.c:1940 +#: buffer.c:2060 #, c-format msgid "E93: More than one match for %s" msgstr "E93: Wielokrotne dopasowania dla %s" -#: buffer.c:1942 +#: buffer.c:2062 #, c-format msgid "E94: No matching buffer for %s" msgstr "E94: Żaden bufor nie pasuje do %s" -#: buffer.c:2337 +#: buffer.c:2472 #, c-format msgid "line %ld" msgstr "wiersz %ld" -#: buffer.c:2420 +#: buffer.c:2560 msgid "E95: Buffer with this name already exists" msgstr "E95: Bufor o tej nazwie już istnieje" -#: buffer.c:2713 +#: buffer.c:2879 msgid " [Modified]" msgstr " [Zmieniony]" -#: buffer.c:2718 +#: buffer.c:2884 msgid "[Not edited]" msgstr "[Nie edytowany]" -#: buffer.c:2723 +#: buffer.c:2889 msgid "[New file]" msgstr "[Nowy Plik]" -#: buffer.c:2724 +#: buffer.c:2890 msgid "[Read errors]" msgstr "[Błąd odczytu]" -#: buffer.c:2726 fileio.c:2112 +#: buffer.c:2892 fileio.c:2112 netbeans.c:3386 msgid "[readonly]" msgstr "[tylko odczyt]" -#: buffer.c:2747 +#: buffer.c:2915 #, c-format msgid "1 line --%d%%--" msgstr "1 wiersz --%d%%--" -#: buffer.c:2749 +#: buffer.c:2918 #, c-format msgid "%ld lines --%d%%--" msgstr "%ld wiersze --%d%%--" -#: buffer.c:2756 +#: buffer.c:2925 #, c-format msgid "line %ld of %ld --%d%%-- col " msgstr "wiersz %ld z %ld --%d%%-- kol " -#: buffer.c:2864 -msgid "[No file]" -msgstr "[Brak pliku]" +#: buffer.c:3033 buffer.c:4768 memline.c:1657 +msgid "[No Name]" +msgstr "[Bez nazwy]" #. must be a help buffer -#: buffer.c:2904 +#: buffer.c:3072 msgid "help" msgstr "pomoc" -#: buffer.c:3463 screen.c:5075 +#: buffer.c:3633 screen.c:5233 msgid "[help]" msgstr "[pomoc]" -#: buffer.c:3495 screen.c:5081 +#: buffer.c:3667 screen.c:5239 msgid "[Preview]" msgstr "[Podgląd]" -#: buffer.c:3775 +#: buffer.c:3949 msgid "All" msgstr "Wszystko" -#: buffer.c:3775 +#: buffer.c:3949 msgid "Bot" msgstr "Dół" -#: buffer.c:3777 +#: buffer.c:3951 msgid "Top" msgstr "Góra" -#: buffer.c:4523 +#: buffer.c:4720 +#, c-format msgid "" "\n" "# Buffer list:\n" @@ -195,15 +197,11 @@ msgstr "" "\n" "# Lista buforów:\n" -#: buffer.c:4556 +#: buffer.c:4755 msgid "[Error List]" msgstr "[Lista Błędów]" -#: buffer.c:4569 memline.c:1520 -msgid "[No File]" -msgstr "[Brak Pliku]" - -#: buffer.c:4882 +#: buffer.c:5081 msgid "" "\n" "--- Signs ---" @@ -211,149 +209,154 @@ msgstr "" "\n" "--- Znaki ---" -#: buffer.c:4901 +#: buffer.c:5091 #, c-format msgid "Signs for %s:" msgstr "Znaki dla %s:" -#: buffer.c:4907 +#: buffer.c:5097 #, c-format msgid " line=%ld id=%d name=%s" msgstr " wiersz=%ld id=%d nazwa=%s" -#: diff.c:139 +#: diff.c:162 #, c-format msgid "E96: Can not diff more than %ld buffers" msgstr "E96: Nie mogę zróżnicować więcej niż %ld buforów" -#: diff.c:709 +#: diff.c:736 msgid "E97: Cannot create diffs" msgstr "E97: Nie mogę stworzyć różnic" -#: diff.c:814 +#: diff.c:846 msgid "Patch file" msgstr "Plik łata" -#: diff.c:1065 +#: diff.c:1149 msgid "E98: Cannot read diff output" msgstr "E98: Nie mogę wczytać wyjścia różnicy" -#: diff.c:1815 +#: diff.c:1899 msgid "E99: Current buffer is not in diff mode" msgstr "E99: Bieżący bufor nie jest w trybie różnic" -#: diff.c:1827 +#: diff.c:1911 msgid "E100: No other buffer in diff mode" msgstr "E100: Brak innego bufora w trybie różnic" -#: diff.c:1835 +#: diff.c:1919 msgid "E101: More than two buffers in diff mode, don't know which one to use" msgstr "E101: Więcej niż jeden bufor w trybie różnicowania, nie wiem którego użyć" -#: diff.c:1858 +#: diff.c:1942 #, c-format msgid "E102: Can't find buffer \"%s\"" msgstr "E102: Nie mogę znaleźć bufora \"%s\"" -#: diff.c:1864 +#: diff.c:1948 #, c-format msgid "E103: Buffer \"%s\" is not in diff mode" msgstr "E103: Bufor \"%s\" nie jest w trybie różnicowania" -#: digraph.c:2199 +#: digraph.c:2194 msgid "E104: Escape not allowed in digraph" msgstr "E104: Escape jest niedozwolone w dwugrafie" -#: digraph.c:2384 +#: digraph.c:2378 msgid "E544: Keymap file not found" msgstr "E544: Nie znaleziono pliku rozkładu klawiszy" -#: digraph.c:2411 +#: digraph.c:2405 msgid "E105: Using :loadkeymap not in a sourced file" msgstr "E105: Zastosowano :loadkeymap w niewczytanym pliku" -#: edit.c:40 +#: edit.c:41 msgid " Keyword completion (^N^P)" msgstr " Dopełnianie słów kluczowych (^N^P)" #. ctrl_x_mode == 0, ^P/^N compl. -#: edit.c:41 -msgid " ^X mode (^E^Y^L^]^F^I^K^D^V^N^P)" -msgstr " ^X tryb (^E^Y^L^]^F^I^K^D^V^N^P)" +#: edit.c:42 +msgid " ^X mode (^E^Y^L^]^F^I^K^D^U^V^N^P)" +msgstr " ^X tryb (^E^Y^L^]^F^I^K^D^U^V^N^P)" |