From 05159a0c6a27a030c8497c5cf836977090f9e75d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 26 Feb 2005 23:04:13 +0000 Subject: updated for version 7.0052 --- src/buffer.c | 38 +- src/eval.c | 452 +++- src/ex_cmds.c | 80 +- src/ex_cmds.h | 6 +- src/ex_cmds2.c | 750 +++++- src/ex_docmd.c | 61 +- src/feature.h | 7 + src/fileio.c | 12 + src/globals.h | 5 + src/gui.c | 2 +- src/gui_mac.c | 2 +- src/gui_w32.c | 3 +- src/main.c | 4 + src/misc1.c | 59 + src/misc2.c | 48 +- src/normal.c | 4 +- src/option.c | 25 +- src/os_mswin.c | 39 +- src/po/Make_ming.mak | 4 +- src/po/Make_mvc.mak | 4 +- src/po/Makefile | 4 +- src/po/vi.po | 6625 ++++++++++++++++++++++++++++++++++++++++++++++++ src/proto/eval.pro | 11 +- src/proto/ex_cmds2.pro | 21 +- src/proto/misc2.pro | 1 + src/proto/os_mswin.pro | 1 + src/proto/quickfix.pro | 3 +- src/quickfix.c | 156 +- src/regexp.c | 57 +- src/ui.c | 17 +- src/version.c | 5 + src/version.h | 4 +- src/vim.h | 13 +- src/window.c | 36 + 34 files changed, 8315 insertions(+), 244 deletions(-) create mode 100644 src/po/vi.po (limited to 'src') diff --git a/src/buffer.c b/src/buffer.c index a634062cf..1eb23a324 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2082,25 +2082,38 @@ ExpandBufnames(pat, num_file, file, options) char_u *p; int attempt; regprog_T *prog; + char_u *patc; *num_file = 0; /* return values in case of FAIL */ *file = NULL; + /* Make a copy of "pat" and change "^" to "\(^\|[\/]\)". */ + if (*pat == '^') + { + patc = alloc((unsigned)STRLEN(pat) + 11); + if (patc == NULL) + return FAIL; + STRCPY(patc, "\\(^\\|[\\/]\\)"); + STRCPY(patc + 11, pat + 1); + } + else + patc = pat; + /* - * attempt == 1: try match with '^', match at start - * attempt == 2: try match without '^', match anywhere + * attempt == 0: try match with '\<', match at start of word + * attempt == 2: try match without '\<', match anywhere */ - for (attempt = 1; attempt <= 2; ++attempt) + for (attempt = 0; attempt <= 2; attempt += 2) { - if (attempt == 2) - { - if (*pat != '^') /* there's no '^', no need to try again */ - break; - ++pat; /* skip the '^' */ - } - prog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + if (attempt == 2 && patc == pat) + break; /* there was no anchor, no need to try again */ + prog = vim_regcomp(patc + attempt, RE_MAGIC); if (prog == NULL) + { + if (patc != pat) + vim_free(patc); return FAIL; + } /* * round == 1: Count the matches. @@ -2136,6 +2149,8 @@ ExpandBufnames(pat, num_file, file, options) if (*file == NULL) { vim_free(prog); + if (patc != pat) + vim_free(patc); return FAIL; } } @@ -2145,6 +2160,9 @@ ExpandBufnames(pat, num_file, file, options) break; } + if (patc != pat) + vim_free(patc); + *num_file = count; return (count == 0 ? FAIL : OK); } diff --git a/src/eval.c b/src/eval.c index 1aa4dc307..13382940b 100644 --- a/src/eval.c +++ b/src/eval.c @@ -106,6 +106,7 @@ static char *e_funcdict = N_("E717: Dictionary entry already exists"); static char *e_funcref = N_("E718: Funcref required"); static char *e_dictrange = N_("E719: Cannot use [:] with a Dictionary"); static char *e_letwrong = N_("E734: Wrong variable type for %s="); +static char *e_nofunc = N_("E130: Unknown function: %s"); /* * All user-defined global variables are stored in dictionary "globvardict". @@ -153,6 +154,24 @@ struct ufunc int uf_calls; /* nr of active calls */ garray_T uf_args; /* arguments */ garray_T uf_lines; /* function lines */ +#ifdef FEAT_PROFILE + int uf_profiling; /* TRUE when func is being profiled */ + /* profiling the function as a whole */ + int uf_tm_count; /* nr of calls */ + proftime_T uf_tm_total; /* time spend in function + children */ + proftime_T uf_tm_self; /* time spend in function itself */ + proftime_T uf_tm_start; /* time at function call */ + proftime_T uf_tm_children; /* time spent in children this call */ + /* profiling the function per line */ + int *uf_tml_count; /* nr of times line was executed */ + proftime_T *uf_tml_total; /* time spend in a line + children */ + proftime_T *uf_tml_self; /* time spend in a line itself */ + proftime_T uf_tml_start; /* start time for current line */ + proftime_T uf_tml_children; /* time spent in children for this line */ + proftime_T uf_tml_wait; /* start wait time for current line */ + int uf_tml_idx; /* index of line being timed; -1 if none */ + int uf_tml_execed; /* line being timed was executed */ +#endif scid_T uf_script_ID; /* ID of script where function was defined, used for s: variables */ int uf_refcount; /* for numbered function: reference count */ @@ -205,6 +224,9 @@ typedef struct funccall_S linenr_T breakpoint; /* next line with breakpoint or zero */ int dbg_tick; /* debug_tick when breakpoint was set */ int level; /* top nesting level of executed function */ +#ifdef FEAT_PROFILE + proftime_T prof_child; /* time spent in a child */ +#endif } funccall_T; /* @@ -293,6 +315,7 @@ static struct vimvar {VV_NAME("insertmode", VAR_STRING), VV_RO}, {VV_NAME("val", VAR_UNKNOWN), VV_RO}, {VV_NAME("key", VAR_UNKNOWN), VV_RO}, + {VV_NAME("profiling", VAR_NUMBER), VV_RO}, }; /* shorthand */ @@ -345,7 +368,6 @@ 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 dict_T *dict_alloc __ARGS((void)); static void dict_unref __ARGS((dict_T *d)); static void dict_free __ARGS((dict_T *d)); static dictitem_T *dictitem_alloc __ARGS((char_u *key)); @@ -399,6 +421,7 @@ static void f_did_filetype __ARGS((typval_T *argvars, typval_T *rettv)); static void f_diff_filler __ARGS((typval_T *argvars, typval_T *rettv)); static void f_diff_hlID __ARGS((typval_T *argvars, typval_T *rettv)); static void f_empty __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_errorlist __ARGS((typval_T *argvars, typval_T *rettv)); static void f_escape __ARGS((typval_T *argvars, typval_T *rettv)); static void f_eval __ARGS((typval_T *argvars, typval_T *rettv)); static void f_eventhandler __ARGS((typval_T *argvars, typval_T *rettv)); @@ -582,6 +605,9 @@ static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); static ufunc_T *find_func __ARGS((char_u *name)); static int function_exists __ARGS((char_u *name)); static int builtin_function __ARGS((char_u *name)); +#ifdef FEAT_PROFILE +static void func_do_profile __ARGS((ufunc_T *fp)); +#endif static int script_autoload __ARGS((char_u *name)); static char_u *autoload_name __ARGS((char_u *name)); static void func_free __ARGS((ufunc_T *fp)); @@ -1170,19 +1196,59 @@ call_vim_function(func, argc, argv, safe) void * save_funccal() { - funccall_T *fc; + funccall_T *fc = current_funccal; - fc = current_funccal; current_funccal = NULL; return (void *)fc; } void -restore_funccal(fc) - void *fc; +restore_funccal(vfc) + void *vfc; +{ + funccall_T *fc = (funccall_T *)vfc; + + current_funccal = fc; +} + +#if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Prepare profiling for entering a child or something else that is not + * counted for the script/function itself. + * Should always be called in pair with prof_child_exit(). + */ + void +prof_child_enter(tm) + proftime_T *tm; /* place to store waittime */ +{ + funccall_T *fc = current_funccal; + + if (fc != NULL && fc->func->uf_profiling) + profile_start(&fc->prof_child); + script_prof_save(tm); +} + +/* + * Take care of time spent in a child. + * Should always be called after prof_child_enter(). + */ + void +prof_child_exit(tm) + proftime_T *tm; /* where waittime was stored */ { - current_funccal = (funccall_T *)fc; + funccall_T *fc = current_funccal; + + if (fc != NULL && fc->func->uf_profiling) + { + profile_end(&fc->prof_child); + profile_sub_wait(tm, &fc->prof_child); /* don't count waiting time */ + profile_add(&fc->func->uf_tm_children, &fc->prof_child); + profile_add(&fc->func->uf_tml_children, &fc->prof_child); + } + script_prof_restore(tm); } +#endif + #ifdef FEAT_FOLDING /* @@ -5020,12 +5086,33 @@ list_append_tv(l, tv) list_T *l; typval_T *tv; { - listitem_T *ni = listitem_alloc(); + listitem_T *li = listitem_alloc(); - if (ni == NULL) + if (li == NULL) return FAIL; - copy_tv(tv, &ni->li_tv); - list_append(l, ni); + copy_tv(tv, &li->li_tv); + list_append(l, li); + return OK; +} + +/* + * Add a dictionary to a list. Used by errorlist(). + * Return FAIL when out of memory. + */ + int +list_append_dict(list, dict) + list_T *list; + dict_T *dict; +{ + listitem_T *li = listitem_alloc(); + + if (li == NULL) + return FAIL; + li->li_tv.v_type = VAR_DICT; + li->li_tv.v_lock = 0; + li->li_tv.vval.v_dict = dict; + list_append(list, li); + ++dict->dv_refcount; return OK; } @@ -5266,7 +5353,7 @@ list_join(gap, l, sep, echo) /* * Allocate an empty header for a dictionary. */ - static dict_T * + dict_T * dict_alloc() { dict_T *d; @@ -5469,6 +5556,42 @@ dict_add(d, item) return hash_add(&d->dv_hashtab, item->di_key); } +/* + * Add a number or string entry to dictionary "d". + * When "str" is NULL use number "nr", otherwise use "str". + * Returns FAIL when out of memory and when key already exists. + */ + int +dict_add_nr_str(d, key, nr, str) + dict_T *d; + char *key; + long nr; + char_u *str; +{ + dictitem_T *item; + + item = dictitem_alloc((char_u *)key); + if (item == NULL) + return FAIL; + item->di_tv.v_lock = 0; + if (str == NULL) + { + item->di_tv.v_type = VAR_NUMBER; + item->di_tv.vval.v_number = nr; + } + else + { + item->di_tv.v_type = VAR_STRING; + item->di_tv.vval.v_string = vim_strsave(str); + } + if (dict_add(d, item) == FAIL) + { + dictitem_free(item); + return FAIL; + } + return OK; +} + /* * Get the number of items in a Dictionary. */ @@ -5844,6 +5967,7 @@ get_env_tv(arg, rettv, evaluate) int len; int cc; char_u *name; + int mustfree = FALSE; ++*arg; name = *arg; @@ -5854,12 +5978,18 @@ get_env_tv(arg, rettv, evaluate) { cc = name[len]; name[len] = NUL; - /* first try mch_getenv(), fast for normal environment vars */ - string = mch_getenv(name); + /* first try vim_getenv(), fast for normal environment vars */ + string = vim_getenv(name, &mustfree); if (string != NULL && *string != NUL) - string = vim_strsave(string); + { + if (!mustfree) + string = vim_strsave(string); + } else { + if (mustfree) + vim_free(string); + /* next try expanding things like $VIM and ${HOME} */ string = expand_env_save(name - 1); if (string != NULL && *string == '$') @@ -5923,6 +6053,7 @@ static struct fst {"diff_filler", 1, 1, f_diff_filler}, {"diff_hlID", 2, 2, f_diff_hlID}, {"empty", 1, 1, f_empty}, + {"errorlist", 0, 0, f_errorlist}, {"escape", 2, 2, f_escape}, {"eval", 1, 1, f_eval}, {"eventhandler", 0, 0, f_eventhandler}, @@ -7420,6 +7551,36 @@ f_empty(argvars, rettv) rettv->vval.v_number = n; } +/* + * "errorlist()" function + */ +/*ARGSUSED*/ + static void +f_errorlist(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ +#ifdef FEAT_QUICKFIX + list_T *l; +#endif + + rettv->vval.v_number = FALSE; +#ifdef FEAT_QUICKFIX + l = list_alloc(); + if (l != NULL) + { + if (get_errorlist(l) != FAIL) + { + rettv->vval.v_list = l; + rettv->v_type = VAR_LIST; + ++l->lv_refcount; + } + else + list_free(l); + } +#endif +} + /* * "escape({string}, {chars})" function */ @@ -9212,6 +9373,9 @@ f_has(argvars, rettv) #ifdef FEAT_PRINTER "printer", #endif +#ifdef FEAT_PROFILE + "profile", +#endif #ifdef FEAT_QUICKFIX "quickfix", #endif @@ -12651,25 +12815,27 @@ f_strridx(argvars, rettv) 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 + haystack_len; - else + if (argvars[2].v_type != VAR_UNKNOWN) { - if (argvars[2].v_type != VAR_UNKNOWN) + /* Third argument: upper limit for index */ + end_idx = get_tv_number(&argvars[2]); + if (end_idx < 0) { - /* 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; - } + /* can never find a match */ + rettv->vval.v_number = -1; + return; } - else - end_idx = haystack_len; + } + else + end_idx = haystack_len; + if (*needle == NUL) + { + /* Empty string matches past the end. */ + lastmatch = haystack + end_idx; + } + else + { for (rest = haystack; *rest != '\0'; ++rest) { rest = (char_u *)strstr((char *)rest, (char *)needle); @@ -15625,6 +15791,14 @@ ex_function(eap) } fp->uf_args = newargs; fp->uf_lines = newlines; +#ifdef FEAT_PROFILE + fp->uf_tml_count = NULL; + fp->uf_tml_total = NULL; + fp->uf_tml_self = NULL; + fp->uf_profiling = FALSE; + if (prof_def_func()) + func_do_profile(fp); +#endif fp->uf_varargs = varargs; fp->uf_flags = flags; fp->uf_calls = 0; @@ -15912,6 +16086,92 @@ builtin_function(name) return ASCII_ISLOWER(name[0]) && vim_strchr(name, ':') == NULL; } +#if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Start profiling function "fp". + */ + static void +func_do_profile(fp) + ufunc_T *fp; +{ + fp->uf_tm_count = 0; + profile_zero(&fp->uf_tm_self); + profile_zero(&fp->uf_tm_total); + if (fp->uf_tml_count == NULL) + fp->uf_tml_count = (int *)alloc_clear((unsigned) + (sizeof(int) * fp->uf_lines.ga_len)); + if (fp->uf_tml_total == NULL) + fp->uf_tml_total = (proftime_T *)alloc_clear((unsigned) + (sizeof(proftime_T) * fp->uf_lines.ga_len)); + if (fp->uf_tml_self == NULL) + fp->uf_tml_self = (proftime_T *)alloc_clear((unsigned) + (sizeof(proftime_T) * fp->uf_lines.ga_len)); + fp->uf_tml_idx = -1; + if (fp->uf_tml_count == NULL || fp->uf_tml_total == NULL + || fp->uf_tml_self == NULL) + return; /* out of memory */ + + fp->uf_profiling = TRUE; +} + +/* + * Dump the profiling results for all functions in file "fd". + */ + void +func_dump_profile(fd) + FILE *fd; +{ + hashitem_T *hi; + int todo; + ufunc_T *fp; + int i; + + todo = func_hashtab.ht_used; + for (hi = func_hashtab.ht_array; todo > 0; ++hi) + { + if (!HASHITEM_EMPTY(hi)) + { + --todo; + fp = HI2UF(hi); + if (fp->uf_profiling) + { + if (fp->uf_name[0] == K_SPECIAL) + fprintf(fd, "FUNCTION %s()\n", fp->uf_name + 3); + else + fprintf(fd, "FUNCTION %s()\n", fp->uf_name); + if (fp->uf_tm_count == 1) + fprintf(fd, "Called 1 time\n"); + else + fprintf(fd, "Called %d times\n", fp->uf_tm_count); + fprintf(fd, "Total time: %s\n", profile_msg(&fp->uf_tm_total)); + fprintf(fd, " Self time: %s\n", profile_msg(&fp->uf_tm_self)); + fprintf(fd, "\n"); + fprintf(fd, "count total (s) self (s)\n"); + + for (i = 0; i < fp->uf_lines.ga_len; ++i) + { + if (fp->uf_tml_count[i] > 0) + { + fprintf(fd, "%5d ", fp->uf_tml_count[i]); + if (profile_equal(&fp->uf_tml_total[i], + &fp->uf_tml_self[i])) + fprintf(fd, " "); + else + fprintf(fd, "%s ", + profile_msg(&fp->uf_tml_total[i])); + fprintf(fd, "%s ", profile_msg(&fp->uf_tml_self[i])); + } + else + fprintf(fd, " "); + fprintf(fd, "%s\n", FUNCLINE(fp, i)); + } + fprintf(fd, "\n"); + } + } + } +} +#endif + /* * If "name" has a package name try autoloading the script for it. * Return TRUE if a package was loaded. @@ -16065,7 +16325,7 @@ ex_delfunction(eap) { if (fp == NULL) { - EMSG2(_("E130: Undefined function: %s"), eap->arg); + EMSG2(_(e_nofunc), eap->arg); return; } if (fp->uf_calls > 0) @@ -16097,6 +16357,11 @@ func_free(fp) /* clear this function */ ga_clear_strings(&(fp->uf_args)); ga_clear_strings(&(fp->uf_lines)); +#ifdef FEAT_PROFILE + vim_free(fp->uf_tml_count); + vim_free(fp->uf_tml_total); + vim_free(fp->uf_tml_self); +#endif /* remove the function from the function hashtable */ hi = hash_find(&func_hashtab, UF2HIKEY(fp)); @@ -16178,6 +16443,9 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) int ai; char_u numbuf[NUMBUFLEN]; char_u *name; +#ifdef FEAT_PROFILE + proftime_T wait_start; +#endif /* If depth of calling is getting too high, don't execute the function */ if (depth >= p_mfd) @@ -16341,6 +16609,22 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) --no_wait_return; } } +#ifdef FEAT_PROFILE + if (do_profiling) + { + 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)) + { + ++fp->uf_tm_count; + profile_start(&fp->uf_tm_start); + profile_zero(&fp->uf_tm_children); + } + script_prof_save(&wait_start); + } +#endif + save_current_SID = current_SID; current_SID = fp->uf_script_ID; save_did_emsg = did_emsg; @@ -16360,6 +16644,22 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) rettv->vval.v_number = -1; } +#ifdef FEAT_PROFILE + if (fp->uf_profiling || (save_fcp != NULL && &save_fcp->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) + { + profile_add(&save_fcp->func->uf_tm_children, &fp->uf_tm_start); + profile_add(&save_fcp->func->uf_tml_children, &fp->uf_tm_start); + } + } +#endif + /* when being verbose, mention the return value */ if (p_verbose >= 12) { @@ -16398,6 +16698,10 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict) sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; current_SID = save_current_SID; +#ifdef FEAT_PROFILE + if (do_profiling) + script_prof_restore(&wait_start); +#endif if (p_verbose >= 12 && sourcing_name != NULL) { @@ -16624,19 +16928,24 @@ get_func_line(c, cookie, indent) int indent; /* not used */ { funccall_T *fcp = (funccall_T *)cookie; - char_u *retval; - garray_T *gap; /* growarray with function lines */ + ufunc_T *fp = fcp->func; + char_u *retval; + garray_T *gap; /* growarray with function lines */ /* If breakpoints have been added/deleted need to check for it. */ if (fcp->dbg_tick != debug_tick) { - fcp->breakpoint = dbg_find_breakpoint(FALSE, fcp->func->uf_name, + fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, sourcing_lnum); fcp->dbg_tick = debug_tick; } +#ifdef FEAT_PROFILE + if (do_profiling) + func_line_end(cookie); +#endif - gap = &fcp->func->uf_lines; - if ((fcp->func->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try()) + gap = &fp->uf_lines; + if ((fp->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try()) retval = NULL; else if (fcp->returned || fcp->linenr >= gap->ga_len) retval = NULL; @@ -16644,14 +16953,18 @@ get_func_line(c, cookie, indent) { retval = vim_strsave(((char_u **)(gap->ga_data))[fcp->linenr++]); sourcing_lnum = fcp->linenr; +#ifdef FEAT_PROFILE + if (do_profiling) + func_line_start(cookie); +#endif } /* Did we encounter a breakpoint? */ if (fcp->breakpoint != 0 && fcp->breakpoint <= sourcing_lnum) { - dbg_breakpoint(fcp->func->uf_name, sourcing_lnum); + dbg_breakpoint(fp->uf_name, sourcing_lnum); /* Find next breakpoint. */ - fcp->breakpoint = dbg_find_breakpoint(FALSE, fcp->func->uf_name, + fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, sourcing_lnum); fcp->dbg_tick = debug_tick; } @@ -16659,6 +16972,71 @@ get_func_line(c, cookie, indent) return retval; } +#if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Called when starting to read a function line. + * "sourcing_lnum" must be correct! + * When skipping lines it may not actually be executed, but we won't find out + * until later and we need to store the time now. + */ + void +func_line_start(cookie) + void *cookie; +{ + funccall_T *fcp = (funccall_T *)cookie; + ufunc_T *fp = fcp->func; + + if (fp->uf_profiling && sourcing_lnum >= 1 + && sourcing_lnum <= fp->uf_lines.ga_len) + { + fp->uf_tml_idx = sourcing_lnum - 1; + fp->uf_tml_execed = FALSE; + profile_start(&fp->uf_tml_start); + profile_zero(&fp->uf_tml_children); + profile_get_wait(&fp->uf_tml_wait); + } +} + +/* + * Called when actually executing a function line. + */ + void +func_line_exec(cookie) + void *cookie; +{ + funccall_T *fcp = (funccall_T *)cookie; + ufunc_T *fp = fcp->func; + + if (fp->uf_profiling && fp->uf_tml_idx >= 0) + fp->uf_tml_execed = TRUE; +} + +/* + * Called when done with a function line. + */ + void +func_line_end(cookie) + void *cookie; +{ + funccall_T *fcp = (funccall_T *)cookie; + ufunc_T *fp = fcp->func; + + if (fp->uf_profiling && fp->uf_tml_idx >= 0) + { + if (fp->uf_tml_execed) + { + ++fp->uf_tml_count[fp->uf_tml_idx]; + profile_end(&fp->uf_tml_start); + profile_sub_wait(&fp->uf_tml_wait, &fp->uf_tml_start); + profile_add(&fp->uf_tml_self[fp->uf_tml_idx], &fp->uf_tml_start); + profile_add(&fp->uf_tml_total[fp->uf_tml_idx], &fp->uf_tml_start); + profile_sub(&fp->uf_tml_self[fp->uf_tml_idx], &fp->uf_tml_children); + } + fp->uf_tml_idx = -1; + } +} +#endif + /* * Return TRUE if the currently active function should be ended, because a * return was encountered or an error occured. Used inside a ":while". diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 9ebf39cfb..419c1981d 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -30,7 +30,7 @@ static int check_readonly __ARGS((int *forceit, buf_T *buf)); #ifdef FEAT_AUTOCMD static void delbuf_msg __ARGS((char_u *name)); #endif -static int do_sub_msg __ARGS((void)); +static int do_sub_msg __ARGS((int count_only)); static int #ifdef __BORLANDC__ _RTLENTRYF @@ -3661,6 +3661,7 @@ do_sub(eap) regmmatch_T regmatch; static int do_all = FALSE; /* do multiple substitutions per line */ static int do_ask = FALSE; /* ask for confirmation */ + static int do_count = FALSE; /* count only */ static int do_error = TRUE; /* if false, ignore errors */ static int do_print = FALSE; /* print last line with subs. */ static int do_list = FALSE; /* list last line with subs. */ @@ -3684,6 +3685,7 @@ do_sub(eap) linenr_T sub_firstlnum; /* nr of first sub line */ char_u *sub_firstline; /* allocated copy of first sub line */ int endcolumn = FALSE; /* cursor in last column when done */ + pos_T old_cursor = curwin->w_cursor; cmd = eap->arg; if (!global_busy) @@ -3822,6 +3824,8 @@ do_sub(eap) do_all = !do_all; else if (*cmd == 'c') do_ask = !do_ask; + else if (*cmd == 'n') + do_count = TRUE; else if (*cmd == 'e') do_error = !do_error; else if (*cmd == 'r') /* use last used regexp */ @@ -3846,6 +3850,8 @@ do_sub(eap) break; ++cmd; } + if (do_count) + do_ask = FALSE; /* * check for a trailing count @@ -4030,8 +4036,25 @@ do_sub(eap) prev_matchcol = matchcol; /* - * 2. If do_ask is set, ask for confirmation. + * 2. If do_count is set only increase the counter. + * If do_ask is set, ask for confirmation. */ + if (do_count) + { + /* For a multi-line match, put matchcol at the NUL at + * the end of the line and set nmatch to one, so that + * we continue looking for a match on the next line. + * Avoids that ":s/\nB\@=//gc" get stuck. */ + if (nmatch > 1) + { + matchcol = STRLEN(sub_firstline); + nmatch = 1; + } + sub_nsubs++; + did_sub = TRUE; + goto skip; + } + if (do_ask) { /* change State to CONFIRM, so that the mouse works @@ -4064,9 +4087,9 @@ do_sub(eap) curwin->w_cursor.col = regmatch.endpos[0].col - 1; getvcol(curwin, &curwin->w_cursor, NULL, NULL, &ec); msg_start(); - for (i = 0; i < sc; ++i) + for (i = 0; i < (long)sc; ++i) msg_putchar(' '); - for ( ; i <= ec; ++i) + for ( ; i <= (long)ec; ++i) msg_putchar('^'); resp = getexmodeline('?', NULL, 0); @@ -4458,6 +4481,11 @@ skip: outofmem: vim_free(sub_firstline); /* may have to free allocated copy of the line */ + + /* ":s/pat//n" doesn't move the cursor */ + if (do_count) + curwin->w_cursor = old_cursor; + if (sub_nsubs) { /* Set the '[ and '] marks. */ @@ -4471,7 +4499,7 @@ outofmem: coladvance((colnr_T)MAXCOL); else beginline(BL_WHITE | BL_FIX); - if (!do_sub_msg() && do_ask) + if (!do_sub_msg(do_count) && do_ask) MSG(""); } else @@ -4498,7 +4526,8 @@ outofmem: * Return TRUE if a message was given. */ static int -do_sub_msg() +do_sub_msg(count_only) + int count_only; /* used 'n' flag for ":s" */ { /* * Only report substitutions when: @@ -4506,8 +4535,8 @@ do_sub_msg() * - command was typed by user, or number of changed lines > 'report' * - giving messages is not disabled by 'lazyredraw' */ - if (sub_nsubs > p_report - && (KeyTyped || sub_nlines > 1 || p_report < 1) + if (((sub_nsubs > p_report && (KeyTyped || sub_nlines > 1 || p_report < 1)) + || count_only) && messaging()) { if (got_int) @@ -4515,9 +4544,10 @@ do_sub_msg() else msg_buf[0] = NUL; if (sub_nsubs == 1) - STRCAT(msg_buf, _("1 substitution")); + STRCAT(msg_buf, count_only ? _("1 match") : _("1 substitution")); else - sprintf((char *)msg_buf + STRLEN(msg_buf), _("%ld substitutions"), + sprintf((char *)msg_buf + STRLEN(msg_buf), + count_only ? _("%ld matches") : _("%ld substitutions"), sub_nsubs); if (sub_nlines == 1) STRCAT(msg_buf, _(" on 1 line")); @@ -4561,7 +4591,7 @@ ex_global(eap) exarg_T *eap; { linenr_T lnum; /* line number according to old situation */ - int ndone; + int ndone = 0; int type; /* first char of cmd: 'v' or 'g' */ char_u *cmd; /* command argument */ @@ -4633,10 +4663,29 @@ ex_global(eap) return; } +#ifdef HAVE_SETJMP_H + /* + * Matching with a regexp may cause a very deep recursive call of + * regmatch(). Vim will crash when running out of stack space. + * Catch this here if the system supports it. + * It's a bit slow, thus do it outside of the loop. + */ + mch_startjmp(); + if (SETJMP(lc_jump_env) != 0) + { + mch_didjmp(); +# ifdef SIGHASARG + if (lc_signal != SIGINT) +# endif + EMSG(_(e_complex)); + got_int = TRUE; + goto jumpend; + } +#endif + /* * pass 1: set marks for each (not) matching line */ - ndone = 0; for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) { /* a match on this line? */ @@ -4649,6 +4698,11 @@ ex_global(eap) line_breakcheck(); } +#ifdef HAVE_SETJMP_H +jumpend: + mch_endjmp(); +#endif + /* * pass 2: execute the command for each line that has been marked */ @@ -4719,7 +4773,7 @@ global_exe(cmd) /* If subsitutes done, report number of substitues, otherwise report * number of extra or deleted lines. */ - if (!do_sub_msg()) + if (!do_sub_msg(FALSE)) msgmore(curbuf->b_ml.ml_line_count - old_lcount); } diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 1628449fd..9b105feea 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -609,6 +609,8 @@ EX(CMD_promptfind, "promptfind", gui_mch_find_dialog, EXTRA|NOTRLCOM|CMDWIN), EX(CMD_promptrepl, "promptrepl", gui_mch_replace_dialog, EXTRA|NOTRLCOM|CMDWIN), +EX(CMD_profile, "profile", ex_profile, + BANG|EXTRA|TRLBAR|CMDWIN), EX(CMD_psearch, "psearch", ex_psearch, BANG|RANGE|WHOLEFOLD|DFLALL|EXTRA), EX(CMD_ptag, "ptag", ex_ptag, @@ -850,9 +852,9 @@ EX(CMD_visual, "visual", ex_edit, EX(CMD_view, "view", ex_edit, BANG|FILE1|EDITCMD|ARGOPT|TRLBAR), EX(CMD_vimgrep, "vimgrep", ex_vimgrep, - NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_vimgrepadd, "vimgrepadd", ex_vimgrep, - NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_viusage, "viusage", ex_viusage, TRLBAR), EX(CMD_vmap, "vmap", ex_map, diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 6c8ece95b..f1b8d2a87 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -25,6 +25,54 @@ static void cmd_source __ARGS((char_u *fname, exarg_T *eap)); +#ifdef FEAT_EVAL +/* Growarray to store the names of sourced scripts. + * For Unix also store the dev/ino, so that we don't have to stat() each + * script when going through the list. */ +typedef struct scriptitem_S +{ + char_u *sn_name; +# ifdef UNIX + int sn_dev; + ino_t sn_ino; +# endif +# ifdef FEAT_PROFILE + int sn_prof_on; /* TRUE when script is/was profiled */ + int sn_pr_force; /* forceit: profile defined functions */ + proftime_T sn_pr_child; /* time set when going into first child */ + int sn_pr_nest; /* nesting for sn_pr_child */ + /* profiling the script as a whole */ + int sn_pr_count; /* nr of times sourced */ + proftime_T sn_pr_total; /* time spend in script + children */ + proftime_T sn_pr_self; /* time spend in script itself */ + proftime_T sn_pr_start; /* time at script start */ + proftime_T sn_pr_children; /* time in children after script start */ + /* profiling the script per line */ + garray_T sn_prl_ga; /* things stored for every line */ + proftime_T sn_prl_start; /* start time for current line */ + proftime_T sn_prl_children; /* time spent in children for this line */ + proftime_T sn_prl_wait; /* wait start time for current line */ + int sn_prl_idx; /* index of line being timed; -1 if none */ + int sn_prl_execed; /* line being timed was executed */ +# endif +} scriptitem_T; + +static garray_T script_items = {0, 0, sizeof(scriptitem_T), 4, NULL}; +#define SCRIPT_ITEM(id) (((scriptitem_T *)script_items.ga_data)[(id) - 1]) + +# ifdef FEAT_PROFILE +/* Struct used in sn_prl_ga for every line of a script. */ +typedef struct sn_prl_S +{ + int snp_count; /* nr of times line was executed */ + proftime_T sn_prl_total; /* time spend in a line + children */ + proftime_T sn_prl_self; /* time spend in a line itself */ +} sn_prl_T; + +# define PRL_ITEM(si, idx) (((sn_prl_T *)(si)->sn_prl_ga.ga_data)[(idx)]) +# endif +#endif + #if defined(FEAT_EVAL) || defined(PROTO) static int debug_greedy = FALSE; /* batch mode debugging: don't save and restore typeahead. */ @@ -352,41 +400,54 @@ struct debuggy char_u *dbg_name; /* function or file name */ regprog_T *dbg_prog; /* regexp program */ linenr_T dbg_lnum; /* line number in function or file */ + int dbg_forceit; /* ! used */ }; static garray_T dbg_breakp = {0, 0, sizeof(struct debuggy), 4, NULL}; -#define BREAKP(idx) (((struct debuggy *)dbg_breakp.ga_data)[idx]) +#define BREAKP(idx) (((struct debuggy *)dbg_breakp.ga_data)[idx]) +#define DEBUGGY(gap, idx) (((struct debuggy *)gap->ga_data)[idx]) static int last_breakp = 0; /* nr of last defined breakpoint */ +#ifdef FEAT_PROFILE +/* Profiling uses file and func names similar to breakpoints. */ +static garray_T prof_ga = {0, 0, sizeof(struct debuggy), 4, NULL}; +#endif #define DBG_FUNC 1 #define DBG_FILE 2 -static int dbg_parsearg __ARGS((char_u *arg)); +static int dbg_parsearg __ARGS((char_u *arg, garray_T *gap)); +static linenr_T debuggy_find __ARGS((int file,char_u *fname, linenr_T after, garray_T *gap, int *fp)); /* - * Parse the arguments of ":breakadd" or ":breakdel" and put them in the entry - * just after the last one in dbg_breakp. Note that "dbg_name" is allocated. + * Parse the arguments of ":profile", ":breakadd" or ":breakdel" and put them + * in the entry just after the last one in dbg_breakp. Note that "dbg_name" + * is allocated. * Returns FAIL for failure. */ static int -dbg_parsearg(arg) +dbg_parsearg(arg, gap) char_u *arg; + garray_T *gap; /* either &dbg_breakp or &prof_ga */ { char_u *p = arg; char_u *q; struct debuggy *bp; int here = FALSE; - if (ga_grow(&dbg_breakp, 1) == FAIL) + if (ga_grow(gap, 1) == FAIL) return FAIL; - bp = &BREAKP(dbg_breakp.ga_len); + bp = &DEBUGGY(gap, gap->ga_len); /* Find "func" or "file". */ if (STRNCMP(p, "func", 4) == 0) bp->dbg_type = DBG_FUNC; else if (STRNCMP(p, "file", 4) == 0) bp->dbg_type = DBG_FILE; - else if (STRNCMP(p, "here", 4) == 0) + else if ( +#ifdef FEAT_PROFILE + gap != &prof_ga && +#endif + STRNCMP(p, "here", 4) == 0) { if (curbuf->b_ffname == NULL) { @@ -406,7 +467,11 @@ dbg_parsearg(arg) /* Find optional line number. */ if (here) bp->dbg_lnum = curwin->w_cursor.lnum; - else if (VIM_ISDIGIT(*p)) + else if ( +#ifdef FEAT_PROFILE + gap != &prof_ga && +#endif + VIM_ISDIGIT(*p)) { bp->dbg_lnum = getdigits(&p); p = skipwhite(p); @@ -474,10 +539,19 @@ ex_breakadd(eap) { struct debuggy *bp; char_u *pat; + garray_T *gap; - if (dbg_parsearg(eap->arg) == OK) + gap = &dbg_breakp; +#ifdef FEAT_PROFILE + if (eap->cmdidx == CMD_profile) + gap = &prof_ga; +#endif + + if (dbg_parsearg(eap->arg, gap) == OK) { - bp = &BREAKP(dbg_breakp.ga_len); + bp = &DEBUGGY(gap, gap->ga_len); + bp->dbg_forceit = eap->forceit; + pat = file_pat_to_reg_pat(bp->dbg_name, NULL, NULL, FALSE); if (pat != NULL) { @@ -490,8 +564,14 @@ ex_breakadd(eap) { if (bp->dbg_lnum == 0) /* default line number is 1 */ bp->dbg_lnum = 1; - BREAKP(dbg_breakp.ga_len++).dbg_nr = ++last_breakp; - ++debug_tick; +#ifdef FEAT_PROFILE + if (eap->cmdidx != CMD_profile) +#endif + { + DEBUGGY(gap, gap->ga_len).dbg_nr = ++last_breakp; + ++debug_tick; + } + ++gap->ga_len; } } } @@ -536,7 +616,7 @@ ex_breakdel(eap) else { /* ":breakdel {func|file} [lnum] {name}" */ - if (dbg_parsearg(eap->arg) == FAIL) + if (dbg_parsearg(eap->arg, &dbg_breakp) == FAIL) return; bp = &BREAKP(dbg_breakp.ga_len); for (i = 0; i < dbg_breakp.ga_len; ++i) @@ -604,6 +684,35 @@ dbg_find_breakpoint(file, fname, after) int file; /* TRUE for a file, FALSE for a function */ char_u *fname; /* file or function name */ linenr_T after; /* after this line number */ +{ + return debuggy_find(file, fname, after, &dbg_breakp, NULL); +} + +#if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Return TRUE if profiling is on for a function or sourced file. + */ + int +has_profiling(file, fname, fp) + int file; /* TRUE for a file, FALSE for a function */ + char_u *fname; /* file or function name */ + int *fp; /* return: forceit */ +{ + return (debuggy_find(file, fname, (linenr_T)0, &prof_ga, fp) + != (linenr_T)0); +} +#endif + +/* + * Common code for dbg_find_breakpoint() and has_profiling(). + */ + static linenr_T +debuggy_find(file, fname, after, gap, fp) + int file; /* TRUE for a file, FALSE for a function */ + char_u *fname; /* file or function name */ + linenr_T after; /* after this line number */ + garray_T *gap; /* either &dbg_breakp or &prof_ga */ + int *fp; /* if not NULL: return forceit */ { struct debuggy *bp; int i; @@ -612,6 +721,10 @@ dbg_find_breakpoint(file, fname, after) char_u *name = fname; int prev_got_int; + /* Return quickly when there are no breakpoints. */ + if (gap->ga_len == 0) + return (linenr_T)0; + /* Replace K_SNR in function name with "". */ if (!file && fname[0] == K_SPECIAL) { @@ -625,26 +738,32 @@ dbg_find_breakpoint(file, fname, after) } } - for (i = 0; i < dbg_breakp.ga_len; ++i) + for (i = 0; i < gap->ga_len; ++i) { - /* skip entries that are not useful or are for a line that is beyond - * an already found breakpoint */ - bp = &BREAKP(i); - if ((bp->dbg_type == DBG_FILE) == file - && bp->dbg_lnum > after - && (lnum == 0 || bp->dbg_lnum < lnum)) + /* Skip entries that are not useful or are for a line that is beyond + * an already found breakpoint. */ + bp = &DEBUGGY(gap, i); + if (((bp->dbg_type == DBG_FILE) == file && ( +#ifdef FEAT_PROFILE + gap == &prof_ga || +#endif + (bp->dbg_lnum > after && (lnum == 0 || bp->dbg_lnum < lnum))))) { regmatch.regprog = bp->dbg_prog; regmatch.rm_ic = FALSE; /* - * Save the value of got_int and reset it. We don't want a previous - * interruption cancel matching, only hitting CTRL-C while matching - * should abort it. + * Save the value of got_int and reset it. We don't want a + * previous interruption cancel matching, only hitting CTRL-C + * while matching should abort it. */ prev_got_int = got_int; got_int = FALSE; if (vim_regexec(®match, name, (colnr_T)0)) + { lnum = bp->dbg_lnum; + if (fp != NULL) + *fp = bp->dbg_forceit; + } got_int |= prev_got_int; } } @@ -666,6 +785,339 @@ dbg_breakpoint(name, lnum) debug_breakpoint_name = name; debug_breakpoint_lnum = lnum; } + + +# if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Functions for profiling. + */ +static void script_do_profile __ARGS((scriptitem_T *si)); +static void script_dump_profile __ARGS((FILE *fd)); +static proftime_T prof_wait_time; + +/* + * Set the time in "tm" to zero. + */ + void +profile_zero(tm) + proftime_T *tm; +{ + tm->tv_usec = 0; + tm->tv_sec = 0; +} + +/* + * Store the current time in "tm". + */ + void +profile_start(tm) + proftime_T *tm; +{ + gettimeofday(tm, NULL); +} + +/* + * Compute the elapsed time from "tm" till now and store in "tm". + */ + void +profile_end(tm) + proftime_T *tm; +{ + proftime_T now; + + gettimeofday(&now, NULL); + tm->tv_usec = now.tv_usec - tm->tv_usec; + tm->tv_sec = now.tv_sec - tm->tv_sec; + if (tm->tv_usec < 0) + { + tm->tv_usec += 1000000; + --tm->tv_sec; + } +} + +/* + * Subtract the time "tm2" from "tm". + */ + void +profile_sub(tm, tm2) + proftime_T *tm, *tm2; +{ + tm->tv_usec -= tm2->tv_usec; + tm->tv_sec -= tm2->tv_sec; + if (tm->tv_usec < 0) + { + tm->tv_usec += 1000000; + --tm->tv_sec; + } +} + +/* + * Add the time "tm2" to "tm". + */ + void +profile_add(tm, tm2) + proftime_T *tm, *tm2; +{ + tm->tv_usec += tm2->tv_usec; + tm->tv_sec += tm2->tv_sec; + if (tm->tv_usec >= 1000000) + { + tm->tv_usec -= 1000000; + ++tm->tv_sec; + } +} + +/* + * Get the current waittime. + */ + void +profile_get_wait(tm) + proftime_T *tm; +{ + *tm = prof_wait_time; +} + +/* + * Subtract the passed waittime since "tm" from "tma". + */ + void +profile_sub_wait(tm, tma) + proftime_T *tm, *tma; +{ + proftime_T tm3 = prof_wait_time; + + profile_sub(&tm3, tm); + profile_sub(tma, &tm3); +} + +/* + * Return TRUE if "tm1" and "tm2" are equal. + */ + int +profile_equal(tm1, tm2) + proftime_T *tm1, *tm2; +{ + return (tm1->tv_usec == tm2->tv_usec && tm1->tv_sec == tm2->tv_sec); +} + +/* + * Return a string that represents a time. + * Uses a static buffer! + */ + char * +profile_msg(tm) + proftime_T *tm; +{ + static char buf[50]; + + sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec); + return buf; +} + +static char_u *profile_fname = NULL; + +/* + * ":profile cmd args" + */ + void +ex_profile(eap) + exarg_T *eap; +{ + char_u *e; + int len; + + e = skiptowhite(eap->arg); + len = e - eap->arg; + e = skipwhite(e); + + if (len == 5 && STRNCMP(eap->arg, "start", 5) == 0 && *e != NUL) + { + vim_free(profile_fname); + profile_fname = vim_strsave(e); + do_profiling = TRUE; + profile_zero(&prof_wait_time); + set_vim_var_nr(VV_PROFILING, 1L); + } + else if (!do_profiling) + EMSG(_("E750: First use :profile start ")); + else + { + /* The rest is similar to ":breakadd". */ + ex_breakadd(eap); + } +} + +/* + * Dump the profiling info. + */ + void +profile_dump() +{ + FILE *fd; + + if (profile_fname != NULL) + { + fd = fopen((char *)profile_fname, "w"); + if (fd == NULL) + EMSG2(_(e_notopen), profile_fname); + else + { + func_dump_profile(fd); + script_dump_profile(fd); + fclose(fd); + } + } +} + +/* + * Start profiling script "fp". + */ + static void +script_do_profile(si) + scriptitem_T *si; +{ + si->sn_pr_count = 0; + profile_zero(&si->sn_pr_total); + profile_zero(&si->sn_pr_self); + + ga_init2(&si->sn_prl_ga, sizeof(sn_prl_T), 100); + si->sn_prl_idx = -1; + si->sn_prof_on = TRUE; + si->sn_pr_nest = 0; +} + +/* + * save time when starting to invoke another script or function. + */ + void +script_prof_save(tm) + proftime_T *tm; /* place to store wait time */ +{ + scriptitem_T *si; + + if (current_SID > 0 && current_SID <= script_items.ga_len) + { + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on && si->sn_pr_nest++ == 0) + profile_start(&si->sn_pr_child); + } + profile_get_wait(tm); +} + +/* + * Count time spent in children after invoking another script or function. + */ + void +script_prof_restore(tm) + proftime_T *tm; +{ + scriptitem_T *si; + + if (current_SID > 0 && current_SID <= script_items.ga_len) + { + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on && --si->sn_pr_nest == 0) + { + profile_end(&si->sn_pr_child); + profile_sub_wait(tm, &si->sn_pr_child); /* don't count wait time */ + profile_add(&si->sn_pr_children, &si->sn_pr_child); + profile_add(&si->sn_prl_children, &si->sn_pr_child); + } + } +} + +static proftime_T inchar_time; + +/* + * Called when starting to wait for the user to type a character. + */ + void +prof_inchar_enter() +{ + profile_start(&inchar_time); +} + +/* + * Called when finished waiting for the user to type a character. + */ + void +prof_inchar_exit() +{ + profile_end(&inchar_time); + profile_add(&prof_wait_time, &inchar_time); +} + +/* + * Dump the profiling results for all scripts in file "fd". + */ + static void +script_dump_profile(fd) + FILE *fd; +{ + int id; + scriptitem_T *si; + int i; + FILE *sfd; + sn_prl_T *pp; + + for (id = 1; id <= script_items.ga_len; ++id) + { + si = &SCRIPT_ITEM(id); + if (si->sn_prof_on) + { + fprintf(fd, "SCRIPT %s\n", si->sn_name); + if (si->sn_pr_count == 1) + fprintf(fd, "Sourced 1 time\n"); + else + fprintf(fd, "Sourced %d times\n", si->sn_pr_count); + fprintf(fd, "Total time: %s\n", profile_msg(&si->sn_pr_total)); + fprintf(fd, " Self time: %s\n", profile_msg(&si->sn_pr_self)); + fprintf(fd, "\n"); + fprintf(fd, "count total (s) self (s)\n"); + + sfd = fopen((char *)si->sn_name, "r"); + if (sfd == NULL) + fprintf(fd, "Cannot open file!\n"); + else + { + for (i = 0; i < si->sn_prl_ga.ga_len; ++i) + { + if (vim_fgets(IObuff, IOSIZE, sfd)) + break; + pp = &PRL_ITEM(si, i); + if (pp->snp_count > 0) + { + fprintf(fd, "%5d ", pp->snp_count); + if (profile_equal(&pp->sn_prl_total, &pp->sn_prl_self)) + fprintf(fd, " "); + else + fprintf(fd, "%s ", profile_msg(&pp->sn_prl_total)); + fprintf(fd, "%s ", profile_msg(&pp->sn_prl_self)); + } + else + fprintf(fd, " "); + fprintf(fd, "%s", IObuff); + } + fclose(sfd); + } + fprintf(fd, "\n"); + } + } +} + +/* + * Return TRUE when a function defined in the current script should be + * profiled. + */ + int +prof_def_func() +{ + scriptitem_T *si = &SCRIPT_ITEM(current_SID); + + return si->sn_pr_force; +} + +# endif #endif /* @@ -2116,24 +2568,6 @@ source_level(cookie) static char_u *get_one_sourceline __ARGS((struct source_cookie *sp)); -#ifdef FEAT_EVAL -/* Growarray to store the names of sourced scripts. - * For Unix also store the dev/ino, so that we don't have to stat() each - * script when going through the list. */ -struct scriptstuff -{ - char_u *name; -# ifdef UNIX - int dev; - ino_t ino; -# endif -}; -static garray_T script_names = {0, 0, sizeof(struct scriptstuff), 4, NULL}; -#define SCRIPT_NAME(id) (((struct scriptstuff *)script_names.ga_data)[(id) - 1].name) -#define SCRIPT_DEV(id) (((struct scriptstuff *)script_names.ga_data)[(id) - 1].dev) -#define SCRIPT_INO(id) (((struct scriptstuff *)script_names.ga_data)[(id) - 1].ino) -#endif - #if defined(WIN32) && defined(FEAT_CSCOPE) static FILE *fopen_noinh_readbin __ARGS((char *filename)); @@ -2177,6 +2611,7 @@ do_source(fname, check_other, is_vimrc) static scid_T last_current_SID = 0; void *save_funccalp; int save_debug_break_level = debug_break_level; + scriptitem_T *si = NULL; # ifdef UNIX struct stat st; int stat_ok; @@ -2186,6 +2621,9 @@ do_source(fname, check_other, is_vimrc) struct timeval tv_rel; struct timeval tv_start; #endif +#ifdef FEAT_PROFILE + proftime_T wait_start; +#endif #ifdef RISCOS p = mch_munge_fname(fname); @@ -2327,6 +2765,15 @@ do_source(fname, check_other, is_vimrc) #endif #ifdef FEAT_EVAL +# ifdef FEAT_PROFILE + if (do_profiling) + prof_child_enter(&wait_start); /* entering a child now */ +# endif + + /* Don't use local function variables, if called from a function. + * Also starts profiling timer for nested script. */ + save_funccalp = save_funccal(); + /* * Check if this script was sourced before to finds its SID. * If it's new, generate a new SID. @@ -2335,48 +2782,72 @@ do_source(fname, check_other, is_vimrc) # ifdef UNIX stat_ok = (mch_stat((char *)fname_exp, &st) >= 0); # endif - for (current_SID = script_names.ga_len; current_SID > 0; --current_SID) - if (SCRIPT_NAME(current_SID) != NULL + for (current_SID = script_items.ga_len; current_SID > 0; --current_SID) + { + si = &SCRIPT_ITEM(current_SID); + if (si->sn_name != NULL && ( # ifdef UNIX /* Compare dev/ino when possible, it catches symbolic * links. Also compare file names, the inode may change * when the file was edited. */ - ((stat_ok && SCRIPT_DEV(current_SID) != -1) - && (SCRIPT_DEV(current_SID) == st.st_dev - && SCRIPT_INO(current_SID) == st.st_ino)) || + ((stat_ok && si->sn_dev != -1) + && (si->sn_dev == st.st_dev + && si->sn_ino == st.st_ino)) || # endif - fnamecmp(SCRIPT_NAME(current_SID), fname_exp) == 0)) + fnamecmp(si->sn_name, fname_exp) == 0)) break; + } if (current_SID == 0) { current_SID = ++last_current_SID; - if (ga_grow(&script_names, (int)(current_SID - script_names.ga_len)) - == OK) + if (ga_grow(&script_items, (int)(current_SID - script_items.ga_len)) + == FAIL) + goto almosttheend; + while (script_items.ga_len < current_SID) { - while (script_names.ga_len < current_SID) - { - SCRIPT_NAME(script_names.ga_len + 1) = NULL; - ++script_names.ga_len; - } - SCRIPT_NAME(current_SID) = fname_exp; -# ifdef UNIX - if (stat_ok) - { - SCRIPT_DEV(current_SID) = st.st_dev; - SCRIPT_INO(current_SID) = st.st_ino; - } - else - SCRIPT_DEV(current_SID) = -1; + ++script_items.ga_len; + SCRIPT_ITEM(script_items.ga_len).sn_name = NULL; +# ifdef FEAT_PROFILE + SCRIPT_ITEM(script_items.ga_len).sn_prof_on = FALSE; # endif - fname_exp = NULL; } + si = &SCRIPT_ITEM(current_SID); + si->sn_name = fname_exp; + fname_exp = NULL; +# ifdef UNIX + if (stat_ok) + { + si->sn_dev = st.st_dev; + si->sn_ino = st.st_ino; + } + else + si->sn_dev = -1; +# endif + /* Allocate the local script variables to use for this script. */ new_script_vars(current_SID); } - /* Don't use local function variables, if called from a function */ - save_funccalp = save_funccal(); +# ifdef FEAT_PROFILE + if (do_profiling) + { + int forceit; + + /* Check if we do profiling for this script. */ + if (!si->sn_prof_on && has_profiling(TRUE, si->sn_name, &forceit)) + { + script_do_profile(si); + si->sn_pr_force = forceit; + } + if (si->sn_prof_on) + { + ++si->sn_pr_count; + profile_start(&si->sn_pr_start); + profile_zero(&si->sn_pr_children); + } + } +# endif #endif /* @@ -2386,20 +2857,27 @@ do_source(fname, check_other, is_vimrc) DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT); retval = OK; - fclose(cookie.fp); - vim_free(cookie.nextline); -#ifdef FEAT_MBYTE - convert_setup(&cookie.conv, NULL, NULL); + +#ifdef FEAT_PROFILE + if (do_profiling) + { + /* Get "si" again, "script_items" may have been reallocated. */ + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on) + { + profile_end(&si->sn_pr_start); + profile_sub_wait(&wait_start, &si->sn_pr_start); + profile_add(&si->sn_pr_total, &si->sn_pr_start); + profile_add(&si->sn_pr_self, &si->sn_pr_start); + profile_sub(&si->sn_pr_self, &si->sn_pr_children); + } + } #endif if (got_int) EMSG(_(e_interr)); sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; -#ifdef FEAT_EVAL - current_SID = save_current_SID; - restore_funccal(save_funccalp); -#endif if (p_verbose > 1) { msg_str((char_u *)_("finished sourcing %s"), fname); @@ -2426,6 +2904,21 @@ do_source(fname, check_other, is_vimrc) ++debug_break_level; #endif +#ifdef FEAT_EVAL +almosttheend: + current_SID = save_current_SID; + restore_funccal(save_funccalp); +# ifdef FEAT_PROFILE + if (do_profiling) + prof_child_exit(&wait_start); /* leaving a child now */ +# endif +#endif + fclose(cookie.fp); + vim_free(cookie.nextline); +#ifdef FEAT_MBYTE + convert_setup(&cookie.conv, NULL, NULL); +#endif + theend: vim_free(fname_exp); return retval; @@ -2442,9 +2935,9 @@ ex_scriptnames(eap) { int i; - for (i = 1; i <= script_names.ga_len && !got_int; ++i) - if (SCRIPT_NAME(i) != NULL) - smsg((char_u *)"%3d: %s", i, SCRIPT_NAME(i)); + for (i = 1; i <= script_items.ga_len && !got_int; ++i) + if (SCRIPT_ITEM(i).sn_name != NULL) + smsg((char_u *)"%3d: %s", i, SCRIPT_ITEM(i).sn_name); } # if defined(BACKSLASH_IN_FILENAME) || defined(PROTO) @@ -2456,9 +2949,9 @@ scriptnames_slash_adjust() { int i; - for (i = 1; i <= script_names.ga_len; ++i) - if (SCRIPT_NAME(i) != NULL) - slash_adjust(SCRIPT_NAME(i)); + for (i = 1; i <= script_items.ga_len; ++i) + if (SCRIPT_ITEM(i).sn_name != NULL) + slash_adjust(SCRIPT_ITEM(i).sn_name); } # endif @@ -2477,8 +2970,9 @@ get_scriptname(id) return (char_u *)"-c argument"; if (id == SID_ENV) return (char_u *)"environment variable"; - return SCRIPT_NAME(id); + return SCRIPT_ITEM(id).sn_name; } + #endif #if defined(USE_CR) || defined(PROTO) @@ -2565,6 +3059,10 @@ getsourceline(c, cookie, indent) sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, sourcing_lnum); sp->dbg_tick = debug_tick; } +# ifdef FEAT_PROFILE + if (do_profiling) + script_line_end(); +# endif #endif /* * Get current line. If there is a read-ahead line, use it, otherwise get @@ -2579,6 +3077,10 @@ getsourceline(c, cookie, indent) line = sp->nextline; sp->nextline = NULL; ++sourcing_lnum; +#ifdef FEAT_PROFILE + if (do_profiling) + script_line_start(); +#endif } /* Only concatenate lines starting with a \ when 'cpoptions' doesn't @@ -2783,6 +3285,90 @@ get_one_sourceline(sp) return NULL; } +#if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Called when starting to read a script line. + * "sourcing_lnum" must be correct! + * When skipping lines it may not actually be executed, but we won't find out + * until later and we need to store the time now. + */ + void +script_line_start() +{ + scriptitem_T *si; + sn_prl_T *pp; + + if (current_SID <= 0 || current_SID > script_items.ga_len) + return; + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on && sourcing_lnum >= 1) + { + /* Grow the array before starting the timer, so that the time spend + * here isn't counted. */ + ga_grow(&si->sn_prl_ga, (int)(sourcing_lnum - si->sn_prl_ga.ga_len)); + si->sn_prl_idx = sourcing_lnum - 1; + while (si->sn_prl_ga.ga_len <= si->sn_prl_idx + && si->sn_prl_ga.ga_len < si->sn_prl_ga.ga_maxlen) + { + /* Zero counters for a line that was not used before. */ + pp = &PRL_ITEM(si, si->sn_prl_ga.ga_len); + pp->snp_count = 0; + profile_zero(&pp->sn_prl_total); + profile_zero(&pp->sn_prl_self); + ++si->sn_prl_ga.ga_len; + } + si->sn_prl_execed = FALSE; + profile_start(&si->sn_prl_start); + profile_zero(&si->sn_prl_children); + profile_get_wait(&si->sn_prl_wait); + } +} + +/* + * Called when actually executing a function line. + */ + void +script_line_exec() +{ + scriptitem_T *si; + + if (current_SID <= 0 || current_SID > script_items.ga_len) + return; + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on && si->sn_prl_idx >= 0) + si->sn_prl_execed = TRUE; +} + +/* + * Called when done with a function line. + */ + void +script_line_end() +{ + scriptitem_T *si; + sn_prl_T *pp; + + if (current_SID <= 0 || current_SID > script_items.ga_len) + return; + si = &SCRIPT_ITEM(current_SID); + if (si->sn_prof_on && si->sn_prl_idx >= 0 + && si->sn_prl_idx < si->sn_prl_ga.ga_len) + { + if (si->sn_prl_execed) + { + pp = &PRL_ITEM(si, si->sn_prl_idx); + ++pp->snp_count; + profile_end(&si->sn_prl_start); + profile_sub_wait(&si->sn_prl_wait, &si->sn_prl_start); + profile_add(&pp->sn_prl_self, &si->sn_prl_start); + profile_add(&pp->sn_prl_total, &si->sn_prl_start); + profile_sub(&pp->sn_prl_self, &si->sn_prl_children); + } + si->sn_prl_idx = -1; + } +} +#endif + /* * ":scriptencoding": Set encoding conversion for a sourced script. * Without the multi-byte feature it's simply ignored. diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 2bb5aeb2f..22e2018da 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -434,6 +434,10 @@ static void ex_folddo __ARGS((exarg_T *eap)); # define ex_changes ex_ni #endif +#ifndef FEAT_PROFILE +# define ex_profile ex_ni +#endif + /* * Declare cmdnames[]. */ @@ -728,6 +732,7 @@ do_cmdline(cmdline, getline, cookie, flags) void *cmd_cookie; struct loop_cookie cmd_loop_cookie; void *real_cookie; + int getline_is_func; #else # define cmd_getline getline # define cmd_cookie cookie @@ -772,13 +777,13 @@ do_cmdline(cmdline, getline, cookie, flags) real_cookie = getline_cookie(getline, cookie); /* Inside a function use a higher nesting level. */ - if (getline_equal(getline, cookie, get_func_line) - && ex_nesting_level == func_level(real_cookie)) + getline_is_func = getline_equal(getline, cookie, get_func_line); + if (getline_is_func && ex_nesting_level == func_level(real_cookie)) ++ex_nesting_level; /* Get the function or script name and the address where the next breakpoint * line and the debug tick for a function or script are stored. */ - if (getline_equal(getline, cookie, get_func_line)) + if (getline_is_func) { fname = func_name(real_cookie); breakpoint = func_breakpoint(real_cookie); @@ -837,13 +842,16 @@ do_cmdline(cmdline, getline, cookie, flags) next_cmdline = cmdline; do { +#ifdef FEAT_EVAL + getline_is_func = getline_equal(getline, cookie, get_func_line); +#endif + /* stop skipping cmds for an error msg after all endif/while/for */ if (next_cmdline == NULL #ifdef FEAT_EVAL && !force_abort && cstack.cs_idx < 0 - && !(getline_equal(getline, cookie, get_func_line) - && func_has_abort(real_cookie)) + && !(getline_is_func && func_has_abort(real_cookie)) #endif ) did_emsg = FALSE; @@ -865,12 +873,23 @@ do_cmdline(cmdline, getline, cookie, flags) /* Check if a function has returned or, unless it has an unclosed * try conditional, aborted. */ - if (getline_equal(getline, cookie, get_func_line) - && func_has_ended(real_cookie)) + if (getline_is_func) { - retval = FAIL; - break; +# ifdef FEAT_PROFILE + if (do_profiling) + func_line_end(real_cookie); +# endif + if (func_has_ended(real_cookie)) + { + retval = FAIL; + break; + } } +#ifdef FEAT_PROFILE + else if (do_profiling + && getline_equal(getline, cookie, getsourceline)) + script_line_end(); +#endif /* Check if a sourced file hit a ":finish" command. */ if (source_finished(getline, cookie)) @@ -903,6 +922,15 @@ do_cmdline(cmdline, getline, cookie, flags) fname, sourcing_lnum); *dbg_tick = debug_tick; } +# ifdef FEAT_PROFILE + if (do_profiling) + { + if (getline_is_func) + func_line_start(real_cookie); + else if (getline_equal(getline, cookie, getsourceline)) + script_line_start(); + } +# endif } if (cstack.cs_looplevel > 0) @@ -1839,6 +1867,17 @@ do_one_cmd(cmdlinep, sourcing, #endif #ifdef FEAT_EVAL +# ifdef FEAT_PROFILE + /* Count this line for profiling if ea.skip is FALSE. */ + if (do_profiling && !ea.skip) + { + if (getline_equal(getline, cookie, get_func_line)) + func_line_exec(getline_cookie(getline, cookie)); + else if (getline_equal(getline, cookie, getsourceline)) + script_line_exec(); + } +#endif + /* May go to debug mode. If this happens and the ">quit" debug command is * used, throw an interrupt exception and skip the next command. */ dbg_check_breakpoint(&ea); @@ -4006,11 +4045,9 @@ skip_grep_pat(eap) if (*p != NUL && (eap->cmdidx == CMD_vimgrep || eap->cmdidx == CMD_vimgrepadd || grep_internal(eap->cmdidx))) { - p = skip_vimgrep_pat(p, NULL); + p = skip_vimgrep_pat(p, NULL, NULL); if (p == NULL) p = eap->arg; - else if (*p != NUL && !vim_iswhite(*p)) - ++p; /* step past ending separator of /pat/ */ } return p; } diff --git a/src/feature.h b/src/feature.h index f82bf75ab..0383cdb84 100644 --- a/src/feature.h +++ b/src/feature.h @@ -379,6 +379,13 @@ # define FEAT_EVAL #endif +/* + * +profile Profiling for functions and scripts. + */ +#ifdef FEAT_HUGE +# define FEAT_PROFILE +#endif + /* * Insert mode completion with 'completefunc'. */ diff --git a/src/fileio.c b/src/fileio.c index 064468870..328431a07 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -7925,6 +7925,9 @@ apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) long save_cmdbang; #endif static int filechangeshell_busy = FALSE; +#ifdef FEAT_PROFILE + proftime_T wait_time; +#endif /* * Quickly return if there are no autocommands for this event or @@ -8097,6 +8100,11 @@ apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) #ifdef FEAT_EVAL save_current_SID = current_SID; +# ifdef FEAT_PROFILE + if (do_profiling) + prof_child_enter(&wait_time); /* doesn't count for the caller itself */ +# endif + /* Don't use local function variables, if called from a function */ save_funccalp = save_funccal(); #endif @@ -8188,6 +8196,10 @@ apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) #ifdef FEAT_EVAL current_SID = save_current_SID; restore_funccal(save_funccalp); +# ifdef FEAT_PROFILE + if (do_profiling) + prof_child_exit(&wait_time); +# endif #endif vim_free(fname); vim_free(sfname); diff --git a/src/globals.h b/src/globals.h index 2c1c53a3d..fdfb1f570 100644 --- a/src/globals.h +++ b/src/globals.h @@ -204,6 +204,9 @@ EXTERN int ex_nesting_level INIT(= 0); /* nesting level */ EXTERN int debug_break_level INIT(= -1); /* break below this level */ EXTERN int debug_did_msg INIT(= FALSE); /* did "debug mode" message */ EXTERN int debug_tick INIT(= 0); /* breakpoint change count */ +# ifdef FEAT_PROFILE +EXTERN int do_profiling INIT(= 0); /* ":profile start" used */ +# endif /* * The exception currently being thrown. Used to pass an exception to @@ -1406,7 +1409,9 @@ EXTERN char_u e_invexprmsg[] INIT(=N_("E449: Invalid expression received")); EXTERN char_u e_guarded[] INIT(=N_("E463: Region is guarded, cannot modify")); EXTERN char_u e_nbreadonly[] INIT(=N_("E744: NetBeans does not allow changes in read-only files")); #endif +#if defined(FEAT_EVAL) || defined(FEAT_SYN_HL) || defined(PROTO) EXTERN char_u e_intern2[] INIT(=N_("E685: Internal error: %s")); +#endif #if defined(HAVE_SETJMP_H) || defined(HAVE_TRY_EXCEPT) EXTERN char_u e_complex[] INIT(=N_("E361: Crash intercepted; regexp too complex?")); #endif diff --git a/src/gui.c b/src/gui.c index 572e330f3..2204cd5e7 100644 --- a/src/gui.c +++ b/src/gui.c @@ -555,7 +555,7 @@ gui_init() /* When 'cmdheight' was set during startup it may not have taken * effect yet. */ if (p_ch != 1L) - command_height(1L); + command_height(-1L); return; } diff --git a/src/gui_mac.c b/src/gui_mac.c index b43aec0e5..bbf329dfd 100644 --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -3808,7 +3808,7 @@ gui_mch_init_font(font_name, fontset) { /* TODO: Add support for bold italic underline proportional etc... */ Str255 suggestedFont = "\pMonaco"; - int suggestedSize = 9; + int suggestedSize = 10; FontInfo font_info; short font_id; GuiFont font; diff --git a/src/gui_w32.c b/src/gui_w32.c index 23feb6fb3..d6d37c4d1 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -4051,7 +4051,8 @@ gui_mch_enable_beval_area(beval) if (beval == NULL) return; TRACE0("gui_mch_enable_beval_area {{{"); - BevalTimerId = SetTimer(s_textArea, 0, p_bdlay / 2, (TIMERPROC)BevalTimerProc); + BevalTimerId = SetTimer(s_textArea, 0, p_bdlay / 2, + (TIMERPROC)BevalTimerProc); TRACE0("gui_mch_enable_beval_area }}}"); } diff --git a/src/main.c b/src/main.c index cfaaa41f6..8c2e73f90 100644 --- a/src/main.c +++ b/src/main.c @@ -2352,6 +2352,10 @@ getout(exitval) apply_autocmds(EVENT_VIMLEAVE, NULL, NULL, FALSE, curbuf); #endif +#ifdef FEAT_PROFILE + profile_dump(); +#endif + if (did_emsg #ifdef FEAT_GUI || (gui.in_use && msg_didany && p_verbose > 0) diff --git a/src/misc1.c b/src/misc1.c index 8ddc6f0c1..3125dfe34 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -3209,6 +3209,10 @@ init_homedir() { char_u *var; + /* In case we are called a second time (when 'encoding' changes). */ + vim_free(homedir); + homedir = NULL; + #ifdef VMS var = mch_getenv((char_u *)"SYS$LOGIN"); #else @@ -3270,6 +3274,23 @@ init_homedir() } } } + +# if defined(FEAT_MBYTE) + if (enc_utf8 && var != NULL) + { + int len; + char_u *pp; + + /* Convert from active codepage to UTF-8. Other conversions are + * not done, because they would fail for non-ASCII characters. */ + acp_to_enc(var, STRLEN(var), &pp, &len); + if (pp != NULL) + { + homedir = pp; + return; + } + } +# endif #endif #if defined(OS2) || defined(MSDOS) || defined(MSWIN) @@ -3594,7 +3615,25 @@ vim_getenv(name, mustfree) p = NULL; if (p != NULL) + { +#if defined(FEAT_MBYTE) && defined(WIN3264) + if (enc_utf8) + { + int len; + char_u *pp; + + /* Convert from active codepage to UTF-8. Other conversions are + * not done, because they would fail for non-ASCII characters. */ + acp_to_enc(p, STRLEN(p), &pp, &len); + if (pp != NULL) + { + p = pp; + *mustfree = TRUE; + } + } +#endif return p; + } vimruntime = (STRCMP(name, "VIMRUNTIME") == 0); if (!vimruntime && STRCMP(name, "VIM") != 0) @@ -3620,6 +3659,26 @@ vim_getenv(name, mustfree) *mustfree = TRUE; else p = mch_getenv((char_u *)"VIM"); + +#if defined(FEAT_MBYTE) && defined(WIN3264) + if (enc_utf8) + { + int len; + char_u *pp; + + /* Convert from active codepage to UTF-8. Other conversions + * are not done, because they would fail for non-ASCII + * characters. */ + acp_to_enc(p, STRLEN(p), &pp, &len); + if (pp != NULL) + { + if (mustfree) + vim_free(p); + p = pp; + *mustfree = TRUE; + } + } +#endif } } diff --git a/src/misc2.c b/src/misc2.c index d647fc7ac..d5a80929b 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -1374,8 +1374,8 @@ vim_stristr(s1, s2) /* * Version of strchr() and strrchr() that handle unsigned char strings - * with characters above 128 correctly. Also it doesn't return a pointer to - * the NUL at the end of the string. + * with characters from 128 to 255 correctly. It also doesn't return a + * pointer to the NUL at the end of the string. */ char_u * vim_strchr(string, c) @@ -1430,10 +1430,31 @@ vim_strchr(string, c) return NULL; } +/* + * Version of strchr() that only works for bytes and handles unsigned char + * strings with characters above 128 correctly. It also doesn't return a + * pointer to the NUL at the end of the string. + */ + char_u * +vim_strbyte(string, c) + char_u *string; + int c; +{ + char_u *p = string; + + while (*p != NUL) + { + if (*p == c) + return p; + ++p; + } + return NULL; +} + /* * Search for last occurrence of "c" in "string". * return NULL if not found. - * Does not handle multi-byte! + * Does not handle multi-byte char for "c"! */ char_u * vim_strrchr(string, c) @@ -1441,12 +1462,13 @@ vim_strrchr(string, c) int c; { char_u *retval = NULL; + char_u *p = string; - while (*string) + while (*p) { - if (*string == c) - retval = string; - mb_ptr_adv(string); + if (*p == c) + retval = p; + mb_ptr_adv(p); } return retval; } @@ -2549,6 +2571,9 @@ call_shell(cmd, opt) { char_u *ncmd; int retval; +#ifdef FEAT_PROFILE + proftime_T wait_time; +#endif if (p_verbose > 3) { @@ -2558,6 +2583,11 @@ call_shell(cmd, opt) cursor_on(); } +#ifdef FEAT_PROFILE + if (do_profiling) + prof_child_enter(&wait_time); +#endif + if (*p_sh == NUL) { EMSG(_(e_shellempty)); @@ -2603,6 +2633,10 @@ call_shell(cmd, opt) #ifdef FEAT_EVAL set_vim_var_nr(VV_SHELL_ERROR, (long)retval); +# ifdef FEAT_PROFILE + if (do_profiling) + prof_child_exit(&wait_time); +# endif #endif return retval; diff --git a/src/normal.c b/src/normal.c index 2ba3f74b7..2d2efc2f3 100644 --- a/src/normal.c +++ b/src/normal.c @@ -5472,14 +5472,14 @@ nv_down(cap) { #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) /* In a quickfix window a jumps to the error under the cursor. */ - if (bt_quickfix(curbuf) && cap->cmdchar == '\r') + if (bt_quickfix(curbuf) && cap->cmdchar == CAR) do_cmdline_cmd((char_u *)".cc"); else #endif { #ifdef FEAT_CMDWIN /* In the cmdline window a executes the command. */ - if (cmdwin_type != 0 && cap->cmdchar == '\r') + if (cmdwin_type != 0 && cap->cmdchar == CAR) cmdwin_result = CAR; else #endif diff --git a/src/option.c b/src/option.c index 4444b1f89..fd9f75f11 100644 --- a/src/option.c +++ b/src/option.c @@ -2629,18 +2629,20 @@ set_init_1() # else static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; # endif - int len; - garray_T ga; + int len; + garray_T ga; + int mustfree; ga_init2(&ga, 1, 100); for (n = 0; n < (long)(sizeof(names) / sizeof(char *)); ++n) { + mustfree = FALSE; # ifdef UNIX if (*names[n] == NUL) p = (char_u *)"/tmp"; else # endif - p = mch_getenv((char_u *)names[n]); + p = vim_getenv((char_u *)names[n], &mustfree); if (p != NULL && *p != NUL) { /* First time count the NUL, otherwise count the ','. */ @@ -2655,6 +2657,8 @@ set_init_1() ga.ga_len += len; } } + if (mustfree) + vim_free(p); } if (ga.ga_data != NULL) { @@ -2705,9 +2709,10 @@ set_init_1() char_u *buf; int i; int j; + int mustfree = FALSE; /* Initialize the 'cdpath' option's default value. */ - cdpath = mch_getenv((char_u *)"CDPATH"); + cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); if (cdpath != NULL) { buf = alloc((unsigned)((STRLEN(cdpath) << 1) + 2)); @@ -2731,6 +2736,8 @@ set_init_1() options[opt_idx].def_val[VI_DEFAULT] = buf; options[opt_idx].flags |= P_DEF_ALLOCED; } + if (mustfree) + vim_free(cdpath); } } #endif @@ -2961,6 +2968,10 @@ set_init_1() else p_tenc = empty_option; } +# endif +# if defined(WIN3264) && defined(FEAT_MBYTE) + /* $HOME may have characters in active code page. */ + init_homedir(); # endif } else @@ -5089,6 +5100,12 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf, convert_setup(&input_conv, p_tenc, p_enc); convert_setup(&output_conv, p_enc, p_tenc); } + +# if defined(WIN3264) && defined(FEAT_MBYTE) + /* $HOME may have characters in active code page. */ + if (varp == &p_enc) + init_homedir(); +# endif } } #endif diff --git a/src/os_mswin.c b/src/os_mswin.c index 5d45d7bfb..4f3a49bef 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -1346,22 +1346,16 @@ clip_mch_request_selection(VimClipboard *cbd) break; } -#if defined(FEAT_MBYTE) && defined(WIN3264) +# if defined(FEAT_MBYTE) && defined(WIN3264) /* The text is in the active codepage. Convert to 'encoding', * going through UCS-2. */ - MultiByteToWideChar_alloc(GetACP(), 0, str, str_size, - (LPWSTR *)&to_free, &maxlen); + acp_to_enc(str, str_size, &to_free, &maxlen); if (to_free != NULL) { str_size = maxlen; - str = ucs2_to_enc((short_u *)to_free, &str_size); - if (str != NULL) - { - vim_free(to_free); - to_free = str; - } + str = to_free; } -#endif +# endif } } #ifdef FEAT_MBYTE @@ -1398,6 +1392,31 @@ clip_mch_request_selection(VimClipboard *cbd) #endif } +#if (defined(FEAT_MBYTE) && defined(WIN3264)) || defined(PROTO) +/* + * Convert from the active codepage to 'encoding'. + * Input is "str[str_size]". + * The result is in allocated memory: "out[outlen]". With terminating NUL. + */ + void +acp_to_enc(str, str_size, out, outlen) + char_u *str; + int str_size; + char_u **out; + int *outlen; + +{ + LPWSTR widestr; + + MultiByteToWideChar_alloc(GetACP(), 0, str, str_size, &widestr, outlen); + if (widestr != NULL) + { + *out = ucs2_to_enc((short_u *)widestr, outlen); + vim_free(widestr); + } +} +#endif + /* * Send the current selection to the clipboard. */ diff --git a/src/po/Make_ming.mak b/src/po/Make_ming.mak index db42720b2..acd18e546 100644 --- a/src/po/Make_ming.mak +++ b/src/po/Make_ming.mak @@ -10,10 +10,10 @@ # language (xx) and add it to the next three lines. # -LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk zh_TW \ +LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk vi zh_TW \ zh_TW.UTF-8 zh_CN zh_CN.UTF-8 MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \ - ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \ + ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo vi.mo \ zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo PACKAGE = vim diff --git a/src/po/Make_mvc.mak b/src/po/Make_mvc.mak index c902614ac..607cf5e9e 100644 --- a/src/po/Make_mvc.mak +++ b/src/po/Make_mvc.mak @@ -6,10 +6,10 @@ # Please read README_mvc.txt before using this file. # -LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk zh_TW \ +LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk vi zh_TW \ zh_TW.UTF-8 zh_CN zh_CN.UTF-8 MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \ - ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \ + ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo vi.mo \ zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo PACKAGE = vim diff --git a/src/po/Makefile b/src/po/Makefile index dc94efd7a..4ff49db9d 100644 --- a/src/po/Makefile +++ b/src/po/Makefile @@ -4,10 +4,10 @@ # Note: ja.sjis, *.cp1250 and zh_CN.cp936 are only for MS-Windows, they are # not installed on Unix -LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk zh_TW \ +LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk vi zh_TW \ zh_TW.UTF-8 zh_CN zh_CN.UTF-8 MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \ - ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \ + ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo vi.mo \ zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo PACKAGE = vim diff --git a/src/po/vi.po b/src/po/vi.po new file mode 100644 index 000000000..bb033a011 --- /dev/null +++ b/src/po/vi.po @@ -0,0 +1,6625 @@ +# Vietnamese translation for Vim +# +# Về điều kiện sử dụng Vim hãy đọc trong trình soạn thảo Vim ":help uganda" +# Về tác giả của chương trình soạn thảo Vim hãy đọc trong Vim ":help credits" +# +# first translator(s): Phan Vinh Thinh "teppi" , 2005 +# +# Original translations. +# +msgid "" +msgstr "" +"Project-Id-Version: Vim 6.3 \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-05-10 21:37+0400\n" +"PO-Revision-Date: 2004-05-10 21:37+0400\n" +"Last-Translator: Phan Vinh Thinh \n" +"Language-Team: Phan Vinh Thinh \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: buffer.c:102 +msgid "E82: Cannot allocate any buffer, exiting..." +msgstr "E82: Không thể phân chia bộ nhớ thậm chí cho một bộ đệm, thoát..." + +#: buffer.c:105 +msgid "E83: Cannot allocate buffer, using other one..." +msgstr "E83: Không thể phân chia bộ nhớ cho bộ đệm, sử dụng bộ đệm khác..." + +#: buffer.c:805 +#, c-format +msgid "E515: No buffers were unloaded" +msgstr "E515: Không có bộ đệm nào được bỏ nạp từ bộ nhớ" + +#: buffer.c:807 +#, c-format +msgid "E516: No buffers were deleted" +msgstr "E516: Không có bộ đệm nào bị xóa" + +#: buffer.c:809 +#, c-format +msgid "E517: No buffers were wiped out" +msgstr "E517: Không có bộ đệm nào được làm sạch" + +#: buffer.c:817 +msgid "1 buffer unloaded" +msgstr "1 bộ đệm được bỏ nạp từ bộ nhớ" + +#: buffer.c:819 +#, c-format +msgid "%d buffers unloaded" +msgstr "%d bộ đệm được bỏ nạp từ bộ nhớ" + +#: buffer.c:824 +msgid "1 buffer deleted" +msgstr "1 bộ đệm bị xóa" + +#: buffer.c:826 +#, c-format +msgid "%d buffers deleted" +msgstr "%d bộ đệm được bỏ nạp" + +#: buffer.c:831 +msgid "1 buffer wiped out" +msgstr "1 bộ đệm được làm sạch" + +#: buffer.c:833 +#, c-format +msgid "%d buffers wiped out" +msgstr "%d bộ đệm được làm sạch" + +#: buffer.c:894 +msgid "E84: No modified buffer found" +msgstr "E84: Không tìm thấy bộ đệm có thay đổi" + +#. back where we started, didn't find anything. +#: buffer.c:933 +msgid "E85: There is no listed buffer" +msgstr "E85: Không có bộ đệm được liệt kê" + +#: buffer.c:945 +#, c-format +msgid "E86: Buffer %ld does not exist" +msgstr "E86: Bộ đệm %ld không tồn tại" + +#: buffer.c:948 +msgid "E87: Cannot go beyond last buffer" +msgstr "E87: Đây là bộ đệm cuối cùng" + +#: buffer.c:950 +msgid "E88: Cannot go before first buffer" +msgstr "E88: Đây là bộ đệm đầu tiên" + +#: buffer.c:988 +#, c-format +msgid "E89: No write since last change for buffer %ld (add ! to override)" +msgstr "E89: Thay đổi trong bộ đệm %ld chưa được ghi lại (thêm ! để thoát ra bằng mọi giá)" + +#: buffer.c:1005 +msgid "E90: Cannot unload last buffer" +msgstr "E90: Không thể bỏ nạp từ bộ nhớ bộ đệm cuối cùng" + +#: buffer.c:1538 +msgid "W14: Warning: List of file names overflow" +msgstr "W14: Cảnh báo: Danh sách tên tập tin quá đầy" + +#: buffer.c:1709 +#, c-format +msgid "E92: Buffer %ld not found" +msgstr "E92: Bộ đệm %ld không được tìm thấy" + +#: buffer.c:1940 +#, c-format +msgid "E93: More than one match for %s" +msgstr "E93: Tìm thấy vài tương ứng với %s" + +#: buffer.c:1942 +#, c-format +msgid "E94: No matching buffer for %s" +msgstr "E94: Không có bộ đệm tương ứng với %s" + +#: buffer.c:2337 +#, c-format +msgid "line %ld" +msgstr "dòng %ld" + +#: buffer.c:2420 +msgid "E95: Buffer with this name already exists" +msgstr "E95: Đã có bộ đệm với tên như vậy" + +#: buffer.c:2713 +msgid " [Modified]" +msgstr " [Đã thay đổi]" + +#: buffer.c:2718 +msgid "[Not edited]" +msgstr "[Chưa soạn thảo]" + +#: buffer.c:2723 +msgid "[New file]" +msgstr "[Tập tin mới]" + +#: buffer.c:2724 +msgid "[Read errors]" +msgstr "[Lỗi đọc]" + +#: buffer.c:2726 fileio.c:2112 +msgid "[readonly]" +msgstr "[chỉ đọc]" + +#: buffer.c:2747 +#, c-format +msgid "1 line --%d%%--" +msgstr "1 dòng --%d%%--" + +#: buffer.c:2749 +#, c-format +msgid "%ld lines --%d%%--" +msgstr "%ld dòng --%d%%--" + +#: buffer.c:2756 +#, c-format +msgid "line %ld of %ld --%d%%-- col " +msgstr "dòng %ld của %ld --%d%%-- cột " + +#: buffer.c:2864 +msgid "[No file]" +msgstr "[Không có tập tin]" + +#. must be a help buffer +#: buffer.c:2904 +msgid "help" +msgstr "trợ giúp" + +#: buffer.c:3463 screen.c:5075 +msgid "[help]" +msgstr "[trợ giúp]" + +#: buffer.c:3495 screen.c:5081 +msgid "[Preview]" +msgstr "[Xem trước]" + +#: buffer.c:3775 +msgid "All" +msgstr "Tất cả" + +#: buffer.c:3775 +msgid "Bot" +msgstr "Cuối" + +#: buffer.c:3777 +msgid "Top" +msgstr "Đầu" + +#: buffer.c:4523 +#, c-format +msgid "" +"\n" +"# Buffer list:\n" +msgstr "" +"\n" +"# Danh sách bộ đệm:\n" + +#: buffer.c:4556 +msgid "[Error List]" +msgstr "[Danh sách lỗi]" + +#: buffer.c:4569 memline.c:1520 +msgid "[No File]" +msgstr "[Không có tập tin]" + +#: buffer.c:4882 +msgid "" +"\n" +"--- Signs ---" +msgstr "" +"\n" +"--- Ký hiệu ---" + +#: buffer.c:4901 +#, c-format +msgid "Signs for %s:" +msgstr "Ký hiệu cho %s:" + +#: buffer.c:4907 +#, c-format +msgid " line=%ld id=%d name=%s" +msgstr " dòng=%ld id=%d tên=%s" + +#: diff.c:139 +#, c-format +msgid "E96: Can not diff more than %ld buffers" +msgstr "E96: Chỉ có thể theo dõi sự khác nhau trong nhiều nhất %ld bộ đệm" + +#: diff.c:713 +msgid "E97: Cannot create diffs" +msgstr "E97: Không thể tạo tập tin khác biệt (diff)" + +#: diff.c:818 +msgid "Patch file" +msgstr "Tập tin vá lỗi (patch)" + +#: diff.c:1069 +msgid "E98: Cannot read diff output" +msgstr "E98: Không thể đọc dữ liệu ra của lệnh diff" + +#: diff.c:1819 +msgid "E99: Current buffer is not in diff mode" +msgstr "E99: Bộ đệm hiện thời không nằm trong chế độ khác biệt (diff)" + +#: diff.c:1831 +msgid "E100: No other buffer in diff mode" +msgstr "E100: Không còn bộ đệm trong chế độ khác biệt (diff) nào nữa" + +#: diff.c:1839 +msgid "E101: More than two buffers in diff mode, don't know which one to use" +msgstr "E101: Có nhiều hơn hai bộ đệm trong chế độ khác biệt (diff), không biết chọn" + +#: diff.c:1862 +#, c-format +msgid "E102: Can't find buffer \"%s\"" +msgstr "E102: Không tìm thấy bộ đệm \"%s\"" + +#: diff.c:1868 +#, c-format +msgid "E103: Buffer \"%s\" is not in diff mode" +msgstr "E103: Bộ đệm \"%s\" không nằm trong chế độ khác biệt (diff)" + +#: digraph.c:2199 +msgid "E104: Escape not allowed in digraph" +msgstr "E104: Không cho phép dùng ký tự thoát Escape trong chữ ghép" + +#: digraph.c:2384 +msgid "E544: Keymap file not found" +msgstr "E544: Không tìm thấy tập tin sơ đồ bàn phím" + +#: digraph.c:2411 +msgid "E105: Using :loadkeymap not in a sourced file" +msgstr "E105: Câu lệnh :loadkeymap được sử dụng ngoài tập tin script" + +#: edit.c:40 +msgid " Keyword completion (^N^P)" +msgstr " Tự động kết thúc cho từ khóa (^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 " Chế độ ^X (^E^Y^L^]^F^I^K^D^V^N^P)" + +#. Scroll has it's own msgs, in it's place there is the msg for local +#. * ctrl_x_mode = 0 (eg continue_status & CONT_LOCAL) -- Acevedo +#: edit.c:44 +msgid " Keyword Local completion (^N^P)" +msgstr " Tự động kết thúc nội bộ cho từ khóa (^N^P)" + +#: edit.c:45 +msgid " Whole line completion (^L^N^P)" +msgstr " Tự động kết thúc cho cả dòng (^L^N^P)" + +#: edit.c:46 +msgid " File name completion (^F^N^P)" +msgstr " Tự động kết thúc tên tập tin (^F^N^P)" + +#: edit.c:47 +msgid " Tag completion (^]^N^P)" +msgstr " Tự động kết thúc thẻ đánh dấu (^]^N^P)" + +#: edit.c:48 +msgid " Path pattern completion (^N^P)" +msgstr " Tự động kết thúc mẫu đường dẫn (^N^P)" + +#: edit.c:49 +msgid " Definition completion (^D^N^P)" +msgstr " Tự động kết thúc định nghĩa (^D^N^P)" + +#: edit.c:51 +msgid " Dictionary completion (^K^N^P)" +msgstr " Tự động kết thúc theo từ điển (^K^N^P)" + +#: edit.c:52 +msgid " Thesaurus completion (^T^N^P)" +msgstr " Tự động kết thúc từ đồng âm (^T^N^P)" + +#: edit.c:53 +msgid " Command-line completion (^V^N^P)" +msgstr " Tự động kết thúc dòng lệnh (^V^N^P)" + +#: edit.c:56 +msgid "Hit end of paragraph" +msgstr "Kết thúc của đoạn văn" + +#: edit.c:962 +msgid "'thesaurus' option is empty" +msgstr "Không đưa ra giá trị của tùy chọn 'thesaurus'" + +#: edit.c:1166 +msgid "'dictionary' option is empty" +msgstr "Không đưa ra giá trị của tùy chọn 'dictionary'" + +#: edit.c:2162 +#, c-format +msgid "Scanning dictionary: %s" +msgstr "Quét từ điển: %s" + +#: edit.c:2368 +msgid " (insert) Scroll (^E/^Y)" +msgstr " (chèn) Cuộn (^E/^Y)" + +#: edit.c:2370 +msgid " (replace) Scroll (^E/^Y)" +msgstr " (thay thế) Cuộn (^E/^Y)" + +#: edit.c:2684 +#, c-format +msgid "Scanning: %s" +msgstr "Quét: %s" + +#: edit.c:2719 +#, c-format +msgid "Scanning tags." +msgstr "Tìm kiếm trong số thẻ đánh dấu." + +#: edit.c:3381 +msgid " Adding" +msgstr " Thêm" + +#. showmode might reset the internal line pointers, so it must +#. * be called before line = ml_get(), or when this address is no +#. * longer needed. -- Acevedo. +#. +#: edit.c:3430 +msgid "-- Searching..." +msgstr "-- Tìm kiếm..." + +#: edit.c:3486 +msgid "Back at original" +msgstr "Từ ban đầu" + +#: edit.c:3491 +msgid "Word from other line" +msgstr "Từ của dòng khác" + +#: edit.c:3496 +msgid "The only match" +msgstr "Tương ứng duy nhất" + +#: edit.c:3555 +#, c-format +msgid "match %d of %d" +msgstr "Tương ứng %d của %d" + +#: edit.c:3558 +#, c-format +msgid "match %d" +msgstr "Tương ứng %d" + +#. Skip further arguments but do continue to +#. * search for a trailing command. +#: eval.c:1024 +#, c-format +msgid "E106: Unknown variable: \"%s\"" +msgstr "E106: Biến không biết: \"%s\"" + +#: eval.c:1320 +#, c-format +msgid "E107: Missing braces: %s" +msgstr "E107: Thiếu dấu ngoặc: %s" + +#: eval.c:1435 eval.c:1449 +#, c-format +msgid "E108: No such variable: \"%s\"" +msgstr "E108: Không có biến như vậy: \"%s\"" + +#: eval.c:1705 +msgid "E109: Missing ':' after '?'" +msgstr "E109: Thiếu ':' sau '?'" + +#: eval.c:2327 +msgid "E110: Missing ')'" +msgstr "E110: Thiếu ')'" + +#: eval.c:2389 +msgid "E111: Missing ']'" +msgstr "E111: Thiếu ']'" + +#: eval.c:2466 +#, c-format +msgid "E112: Option name missing: %s" +msgstr "E112: Không đưa ra tên tùy chọn: %s" + +#: eval.c:2484 +#, c-format +msgid "E113: Unknown option: %s" +msgstr "E113: Tùy chọn không biết: %s" + +#: eval.c:2555 +#, c-format +msgid "E114: Missing quote: %s" +msgstr "E114: Thiếu ngoặc kép: %s" + +#: eval.c:2698 +#, c-format +msgid "E115: Missing quote: %s" +msgstr "E115: Thiếu ngoặc kép: %s" + +#: eval.c:3054 +#, c-format +msgid "E116: Invalid arguments for function %s" +msgstr "E116: Tham số cho hàm %s đưa ra không đúng" + +#: eval.c:3083 +#, c-format +msgid "E117: Unknown function: %s" +msgstr "E117: Hàm số không biết: %s" + +#: eval.c:3084 +#, c-format +msgid "E118: Too many arguments for function: %s" +msgstr "E118: Quá nhiều tham số cho hàm: %s" + +#: eval.c:3085 +#, c-format +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: Không đủ tham số cho hàm: %s" + +#: eval.c:3086 +#, c-format +msgid "E120: Using not in a script context: %s" +msgstr "E120: Sử dụng ngoài script: %s" + +#. +#. * Yes this is ugly, I don't particularly like it either. But doing it +#. * this way has the compelling advantage that translations need not to +#. * be touched at all. See below what 'ok' and 'ync' are used for. +#. +#: eval.c:3687 gui.c:4382 gui_gtk.c:2059 +msgid "&Ok" +msgstr "&Ok" + +#: eval.c:4226 +#, c-format +msgid "+-%s%3ld lines: " +msgstr "+-%s%3ld dòng: " + +#: eval.c:5477 +msgid "" +"&OK\n" +"&Cancel" +msgstr "" +"&OK\n" +"&Hủy bỏ" + +#: eval.c:5517 +msgid "called inputrestore() more often than inputsave()" +msgstr "Hàm số inputrestore() được gọi nhiều hơn hàm inputsave()" + +#: eval.c:5977 +msgid "E655: Too many symbolic links (cycle?)" +msgstr "E656: Quá nhiều liên kết tượng trưng (vòng lặp?)" + +#: eval.c:6609 +msgid "E240: No connection to Vim server" +msgstr "E240: Không có kết nối với máy chủ Vim" + +#: eval.c:6706 +msgid "E277: Unable to read a server reply" +msgstr "E227: Máy chủ không trả lời" + +#: eval.c:6734 +msgid "E258: Unable to send to client" +msgstr "E258: Không thể trả lời cho máy con" + +#: eval.c:6782 +#, c-format +msgid "E241: Unable to send to %s" +msgstr "E241: Không thể gửi tin nhắn tới %s" + +#: eval.c:6882 +msgid "(Invalid)" +msgstr "(Không đúng)" + +#: eval.c:8060 +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Biến không xác định: %s" + +#: eval.c:8492 +#, c-format +msgid "E461: Illegal variable name: %s" +msgstr "E461: Tên biến không cho phép: %s" + +#: eval.c:8784 +#, c-format +msgid "E122: Function %s already exists, add ! to replace it" +msgstr "E122: Hàm số %s đã có, hãy thêm ! để thay thế nó." + +#: eval.c:8857 +#, c-format +msgid "E123: Undefined function: %s" +msgstr "E123: Hàm số không xác định: %s" + +#: eval.c:8870 +#, c-format +msgid "E124: Missing '(': %s" +msgstr "E124: Thiếu '(': %s" + +#: eval.c:8903 +#, c-format +msgid "E125: Illegal argument: %s" +msgstr "E125: Tham số không cho phép: %s" + +#: eval.c:8982 +msgid "E126: Missing :endfunction" +msgstr "E126: Thiếu lệnh :endfunction" + +#: eval.c:9089 +#, c-format +msgid "E127: Cannot redefine function %s: It is in use" +msgstr "E127: Không thể định nghĩa lại hàm số %s: hàm đang được sử dụng" + +#: eval.c:9159 +msgid "E129: Function name required" +msgstr "E129: Cần tên hàm số" + +#: eval.c:9210 +#, c-format +msgid "E128: Function name must start with a capital: %s" +msgstr "E128: Tên hàm số phải bắt đầu với một chữ cái hoa: %s" + +#: eval.c:9402 +#, c-format +msgid "E130: Undefined function: %s" +msgstr "E130: Hàm số %s chưa xác định" + +#: eval.c:9407 +#, c-format +msgid "E131: Cannot delete function %s: It is in use" +msgstr "E131: Không thể xóa hàm số %s: Hàm đang được sử dụng" + +#: eval.c:9455 +msgid "E132: Function call depth is higher than 'maxfuncdepth'" +msgstr "E132: Độ sâu của lời gọi hàm số lớn hơn giá trị 'maxfuncdepth'" + +#. always scroll up, don't overwrite +#: eval.c:9508 +#, c-format +msgid "calling %s" +msgstr "lời gọi %s" + +#: eval.c:9570 +#, c-format +msgid "%s aborted" +msgstr "%s dừng" + +#: eval.c:9572 +#, c-format +msgid "%s returning #%ld" +msgstr "%s trả lại #%ld" + +#: eval.c:9579 +#, c-format +msgid "%s returning \"%s\"" +msgstr "%s trả lại \"%s\"" + +#. always scroll up, don't overwrite +#: eval.c:9595 ex_cmds2.c:2365 +#, c-format +msgid "continuing in %s" +msgstr "tiếp tục trong %s" + +#: eval.c:9621 +msgid "E133: :return not inside a function" +msgstr "E133: lệnh :return ở ngoài một hàm" + +#: eval.c:9952 +#, c-format +msgid "" +"\n" +"# global variables:\n" +msgstr "" +"\n" +"# biến toàn cầu:\n" + +#: ex_cmds.c:92 +#, c-format +msgid "<%s>%s%s %d, Hex %02x, Octal %03o" +msgstr "<%s>%s%s %d, Hex %02x, Octal %03o" + +#: ex_cmds.c:118 +#, c-format +msgid "> %d, Hex %04x, Octal %o" +msgstr "> %d, Hex %04x, Octal %o" + +#: ex_cmds.c:119 +#, c-format +msgid "> %d, Hex %08x, Octal %o" +msgstr "> %d, Hex %08x, Octal %o" + +#: ex_cmds.c:430 +msgid "E134: Move lines into themselves" +msgstr "E134: Di chuyển các dòng lên chính chúng" + +#: ex_cmds.c:499 +msgid "1 line moved" +msgstr "Đã di chuyển 1 dòng" + +#: ex_cmds.c:501 +#, c-format +msgid "%ld lines moved" +msgstr "Đã di chuyển %ld dòng" + +#: ex_cmds.c:924 +#, c-format +msgid "%ld lines filtered" +msgstr "Đã lọc %ld dòng" + +#: ex_cmds.c:952 +msgid "E135: *Filter* Autocommands must not change current buffer" +msgstr "E135: Các lệnh tự động *Filter* không được thay đổi bộ đệm hiện thời" + +#: ex_cmds.c:1037 +msgid "[No write since last change]\n" +msgstr "[Thay đổi chưa được ghi nhớ]\n" + +#: ex_cmds.c:1283 +#, c-format +msgid "%sviminfo: %s in line: " +msgstr "%sviminfo: %s trên dòng: " + +#: ex_cmds.c:1288 +msgid "E136: viminfo: Too many errors, skipping rest of file" +msgstr "E136: viminfo: Quá nhiều lỗi, phần còn lại của tập tin sẽ được bỏ qua" + +#: ex_cmds.c:1323 +#, c-format +msgid "Reading viminfo file \"%s\"%s%s%s" +msgstr "Đọc tập tin viminfo \"%s\"%s%s%s" + +#: ex_cmds.c:1324 +msgid " info" +msgstr " thông tin" + +#: ex_cmds.c:1325 +msgid " marks" +msgstr " dấu hiệu" + +#: ex_cmds.c:1326 +msgid " FAILED" +msgstr " KHÔNG THÀNH CÔNG" + +#: ex_cmds.c:1418 +#, c-format +msgid "E137: Viminfo file is not writable: %s" +msgstr "E137: Thiếu quyền ghi lên tập tin viminfo: %s" + +#: ex_cmds.c:1543 +#, c-format +msgid "E138: Can't write viminfo file %s!" +msgstr "E138: Không thể ghi tập tin viminfo %s!" + +#: ex_cmds.c:1551 +#, c-format +msgid "Writing viminfo file \"%s\"" +msgstr "Ghi tập tin viminfo \"%s\"" + +#. Write the info: +#: ex_cmds.c:1649 +#, c-format +msgid "# This viminfo file was generated by Vim %s.\n" +msgstr "# Tập tin viminfo này được tự động tạo bởi Vim %s.\n" + +#: ex_cmds.c:1651 +#, c-format +msgid "" +"# You may edit it if you're careful!\n" +"\n" +msgstr "" +"# Bạn có thể sửa tập tin này, nhưng hãy thận trọng!\n" +"\n" + +#: ex_cmds.c:1653 +#, c-format +msgid "# Value of 'encoding' when this file was written\n" +msgstr "# Giá trị của tùy chọn 'encoding' vào thời điểm ghi tập tin\n" + +#: ex_cmds.c:1752 +msgid "Illegal starting char" +msgstr "Ký tự đầu tiên không cho phép" + +#: ex_cmds.c:2097 ex_cmds.c:2362 ex_cmds2.c:763 +msgid "Save As" +msgstr "Ghi nhớ như" + +#. Overwriting a file that is loaded in another buffer is not a +#. * good idea. +#: ex_cmds.c:2140 +msgid "E139: File is loaded in another buffer" +msgstr "E139: Tập tin được nạp trong bộ đệm khác" + +#: ex_cmds.c:2174 +msgid "Write partial file?" +msgstr "Ghi nhớ một phần tập tin?" + +#: ex_cmds.c:2181 +msgid "E140: Use ! to write partial buffer" +msgstr "E140: Sử dụng ! để ghi nhớ một phần bộ đệm" + +#: ex_cmds.c:2296 +#, c-format +msgid "Overwrite existing file \"%.*s\"?" +msgstr "Ghi đè lên tập tin đã có \"%.*s\"?" + +#: ex_cmds.c:2367 +#, c-format +msgid "E141: No file name for buffer %ld" +msgstr "E141: Không có tên tập tin cho bộ đệm %ld" + +#: ex_cmds.c:2405 +msgid "E142: File not written: Writing is disabled by 'write' option" +msgstr "E142: Tập tin chưa được ghi nhớ: Ghi nhớ bị tắt bởi tùy chọn 'write'" + +#: ex_cmds.c:2425 +#, c-format +msgid "" +"'readonly' option is set for \"%.*s\".\n" +"Do you wish to write anyway?" +msgstr "" +"Tùy chọn 'readonly' được đặt cho \"%.*s\".\n" +"Ghi nhớ bằng mọi giá?" + +#: ex_cmds.c:2597 +msgid "Edit File" +msgstr "Soạn thảo tập tin" + +#: ex_cmds.c:3205 +#, c-format +msgid "E143: Autocommands unexpectedly deleted new buffer %s" +msgstr "E143: Các lệnh tự động xóa bộ đệm mới ngoài ý muốn %s" + +#: ex_cmds.c:3339 +msgid "E144: non-numeric argument to :z" +msgstr "E144: Tham số của lệnh :z phải là số" + +#: ex_cmds.c:3424 +msgid "E145: Shell commands not allowed in rvim" +msgstr "E145: Không cho phép sử dụng lệnh shell trong rvim." + +#: ex_cmds.c:3531 +msgid "E146: Regular expressions can't be delimited by letters" +msgstr "E146: Không thể phân cách biểu thức chính quy bằng chữ cái" + +#: ex_cmds.c:3877 +#, c-format +msgid "replace with %s (y/n/a/q/l/^E/^Y)?" +msgstr "thay thế bằng %s? (y/n/a/q/l/^E/^Y)" + +#: ex_cmds.c:4270 +msgid "(Interrupted) " +msgstr "(bị dừng)" + +#: ex_cmds.c:4274 +msgid "1 substitution" +msgstr "1 thay thế" + +#: ex_cmds.c:4276 +#, c-format +msgid "%ld substitutions" +msgstr "%ld thay thế" + +#: ex_cmds.c:4279 +msgid " on 1 line" +msgstr " trên 1 dòng" + +#: ex_cmds.c:4281 +#, c-format +msgid " on %ld lines" +msgstr " trên %ld dòng" + +#: ex_cmds.c:4332 +msgid "E147: Cannot do :global recursive" +msgstr "E147: Không thực hiện được lệnh :global đệ qui" + +#: ex_cmds.c:4367 +msgid "E148: Regular expression missing from global" +msgstr "E148: Thiếu biểu thức chính quy trong lệnh :global" + +#: ex_cmds.c:4416 +#, c-format +msgid "Pattern found in every line: %s" +msgstr "Tìm thấy tương ứng trên mọi dòng: %s" + +#: ex_cmds.c:4497 +#, c-format +msgid "" +"\n" +"# Last Substitute String:\n" +"$" +msgstr "" +"\n" +"# Chuỗi thay thế cuối cùng:\n" +"$" + +#: ex_cmds.c:4598 +msgid "E478: Don't panic!" +msgstr "E478: Hãy bình tĩnh, đừng hoảng hốt!" + +#: ex_cmds.c:4650 +#, c-format +msgid "E661: Sorry, no '%s' help for %s" +msgstr "E661: Rất tiếc, không có trợ giúp '%s' cho %s" + +#: ex_cmds.c:4653 +#, c-format +msgid "E149: Sorry, no help for %s" +msgstr "E149: Rất tiếc không có trợ giúp cho %s" + +#: ex_cmds.c:4687 +#, c-format +msgid "Sorry, help file \"%s\" not found" +msgstr "Xin lỗi, không tìm thấy tập tin trợ giúp \"%s\"" + +#: ex_cmds.c:5170 +#, c-format +msgid "E150: Not a directory: %s" +msgstr "E150: %s không phải là một thư mục" + +#: ex_cmds.c:5309 +#, c-format +msgid "E152: Cannot open %s for writing" +msgstr "E152: Không thể mở %s để ghi" + +#: ex_cmds.c:5345 +#, c-format +msgid "E153: Unable to open %s for reading" +msgstr "E153: Không thể mở %s để đọc" + +#: ex_cmds.c:5367 +#, c-format +msgid "E670: Mix of help file encodings within a language: %s" +msgstr "E670: Tập tin trợ giúp sử dụng nhiều bảng mã khác nhau cho một ngôn ngữ: %s" + +#: ex_cmds.c:5445 +#, c-format +msgid "E154: Duplicate tag \"%s\" in file %s" +msgstr "E154: Thẻ ghi lặp lại \"%s\" trong tập tin %s" + +#: ex_cmds.c:5557 +#, c-format +msgid "E160: Unknown sign command: %s" +msgstr "E160: Câu lệnh ký hiệu không biết: %s" + +#: ex_cmds.c:5577 +msgid "E156: Missing sign name" +msgstr "E156: Thiếu tên ký hiệu" + +#: ex_cmds.c:5623 +msgid "E612: Too many signs defined" +msgstr "E612: Định nghĩa quá nhiều ký hiệu" + +#: ex_cmds.c:5691 +#, c-format +msgid "E239: Invalid sign text: %s" +msgstr "E239: Văn bản ký hiệu không thích hợp: %s" + +#: ex_cmds.c:5722 ex_cmds.c:5913 +#, c-format +msgid "E155: Unknown sign: %s" +msgstr "E155: Ký hiệu không biết: %s" + +#: ex_cmds.c:5771 +msgid "E159: Missing sign number" +msgstr "E159: Thiếu số của ký hiệu" + +#: ex_cmds.c:5853 +#, c-format +msgid "E158: Invalid buffer name: %s" +msgstr "E158: Tên bộ đệm không đúng: %s" + +#: ex_cmds.c:5892 +#, c-format +msgid "E157: Invalid sign ID: %ld" +msgstr "E157: ID của ký hiệu không đúng: %ld" + +#: ex_cmds.c:5962 +msgid " (NOT FOUND)" +msgstr " (KHÔNG TÌM THẤY)" + +#: ex_cmds.c:5964 +msgid " (not supported)" +msgstr " (không được hỗ trợ)" + +#: ex_cmds.c:6063 +msgid "[Deleted]" +msgstr "[bị xóa]" + +#: ex_cmds2.c:92 +msgid "Entering Debug mode. Type \"cont\" to continue." +msgstr "Bật chế độ sửa lỗi (Debug). Gõ \"cont\" để tiếp tục." + +#: ex_cmds2.c:96 ex_docmd.c:966 +#, c-format +msgid "line %ld: %s" +msgstr "dòng %ld: %s" + +#: ex_cmds2.c:98 +#, c-format +msgid "cmd: %s" +msgstr "câu lệnh: %s" + +#: ex_cmds2.c:290 +#, c-format +msgid "Breakpoint in \"%s%s\" line %ld" +msgstr "Điểm dừng trên \"%s%s\" dòng %ld" + +#: ex_cmds2.c:540 +#, c-format +msgid "E161: Breakpoint not found: %s" +msgstr "E161: Không tìm thấy điểm dừng: %s" + +#: ex_cmds2.c:566 +msgid "No breakpoints defined" +msgstr "Điểm dừng không được xác định" + +#: ex_cmds2.c:571 +#, c-format +msgid "%3d %s %s line %ld" +msgstr "%3d %s %s dòng %ld" + +#: ex_cmds2.c:786 +#, c-format +msgid "Save changes to \"%.*s\"?" +msgstr "Ghi nhớ thay đổi vào \"%.*s\"?" + +#: ex_cmds2.c:788 ex_docmd.c:9378 +msgid "Untitled" +msgstr "Chưa đặt tên" + +#: ex_cmds2.c:915 +#, c-format +msgid "E162: No write since last change for buffer \"%s\"" +msgstr "E162: Thay đổi chưa được ghi nhớ trong bộ đệm \"%s\"" + +#: ex_cmds2.c:984 +msgid "Warning: Entered other buffer unexpectedly (check autocommands)" +msgstr "" +"Cảnh báo: Chuyển tới bộ đệm khác không theo ý muốn (hãy kiểm tra câu lệnh tự động)" + +#: ex_cmds2.c:1387 +msgid "E163: There is only one file to edit" +msgstr "E163: Chỉ có một tập tin để soạn thảo" + +#: ex_cmds2.c:1389 +msgid "E164: Cannot go before first file" +msgstr "E164: Đây là tập tin đầu tiên" + +#: ex_cmds2.c:1391 +msgid "E165: Cannot go beyond last file" +msgstr "E165: Đây là tập tin cuối cùng" + +#: ex_cmds2.c:1804 +#, c-format +msgid "E666: compiler not supported: %s" +msgstr "E666: trình biên dịch không được hỗ trợ: %s" + +#: ex_cmds2.c:1897 +#, c-format +msgid "Searching for \"%s\" in \"%s\"" +msgstr "Tìm kiếm \"%s\" trong \"%s\"" + +#: ex_cmds2.c:1919 +#, c-format +msgid "Searching for \"%s\"" +msgstr "Tìm kiếm \"%s\"" + +#: ex_cmds2.c:1940 +#, c-format +msgid "not found in 'runtimepath': \"%s\"" +msgstr "không tìm thấy trong 'runtimepath': \"%s\"" + +#: ex_cmds2.c:1974 +msgid "Source Vim script" +msgstr "Thực hiện script của Vim" + +#: ex_cmds2.c:2164 +#, c-format +msgid "Cannot source a directory: \"%s\"" +msgstr "Không thể thực hiện một thư mục: \"%s\"" + +#: ex_cmds2.c:2202 +#, c-format +msgid "could not source \"%s\"" +msgstr "không thực hiện được \"%s\"" + +#: ex_cmds2.c:2204 +#, c-format +msgid "line %ld: could not source \"%s\"" +msgstr "dòng %ld: không thực hiện được \"%s\"" + +#: ex_cmds2.c:2218 +#, c-format +msgid "sourcing \"%s\"" +msgstr "thực hiện \"%s\"" + +#: ex_cmds2.c:2220 +#, c-format +msgid "line %ld: sourcing \"%s\"" +msgstr "dòng %ld: thực hiện \"%s\"" + +#: ex_cmds2.c:2363 +#, c-format +msgid "finished sourcing %s" +msgstr "thực hiện xong %s" + +#: ex_cmds2.c:2707 +msgid "W15: Warning: Wrong line separator, ^M may be missing" +msgstr "" +"W15: Cảnh báo: Ký tự phân cách dòng không đúng. Rất có thể thiếu ^M" + +#: ex_cmds2.c:2756 +msgid "E167: :scriptencoding used outside of a sourced file" +msgstr "E167: Lệnh :scriptencoding sử dụng ngoài tập tin script" + +#: ex_cmds2.c:2789 +msgid "E168: :finish used outside of a sourced file" +msgstr "E168: Lệnh :finish sử dụng ngoài tập tin script" + +#: ex_cmds2.c:3238 +#, c-format +msgid "Page %d" +msgstr "Trang %d" + +#: ex_cmds2.c:3394 +msgid "No text to be printed" +msgstr "Không có gì để in" + +#: ex_cmds2.c:3472 +#, c-format +msgid "Printing page %d (%d%%)" +msgstr "In trang %d (%d%%)" + +#: ex_cmds2.c:3484 +#, c-format +msgid " Copy %d of %d" +msgstr " Sao chép %d của %d" + +#: ex_cmds2.c:3542 +#, c-format +msgid "Printed: %s" +msgstr "Đã in: %s" + +#: ex_cmds2.c:3549 +#, c-format +msgid "Printing aborted" +msgstr "In bị dừng" + +#: ex_cmds2.c:3914 +msgid "E455: Error writing to PostScript output file" +msgstr "E455: Lỗi ghi nhớ vào tập tin PostScript" + +#: ex_cmds2.c:4189 +#, c-format +msgid "E624: Can't open file \"%s\"" +msgstr "E624: Không thể mở tập tin \"%s\"" + +#: ex_cmds2.c:4199 ex_cmds2.c:4824 +#, c-format +msgid "E457: Can't read PostScript resource file \"%s\"" +msgstr "E457: Không thể đọc tập tin tài nguyên PostScript \"%s\"" + +#: ex_cmds2.c:4207 +#, c-format +msgid "E618: file \"%s\" is not a PostScript resource file" +msgstr "E618: \"%s\" không phải là tập tin tài nguyên PostScript" + +#: ex_cmds2.c:4222 ex_cmds2.c:4242 ex_cmds2.c:4257 ex_cmds2.c:4279 +#, c-format +msgid "E619: file \"%s\" is not a supported PostScript resource file" +msgstr "E619: \"%s\" không phải là tập tin tài nguyên PostScript được hỗ trợ" + +#: ex_cmds2.c:4309 +#, c-format +msgid "E621: \"%s\" resource file has wrong version" +msgstr "E621: tập tin tài nguyên \"%s\" có phiên bản không đúng" + +#: ex_cmds2.c:4776 +msgid "E324: Can't open PostScript output file" +msgstr "E324: Không thể mở tập tin PostScript" + +#: ex_cmds2.c:4809 +#, c-format +msgid "E456: Can't open file \"%s\"" +msgstr "E456: Không thể mở tập tin \"%s\"" + +#: ex_cmds2.c:4928 +msgid "E456: Can't find PostScript resource file \"prolog.ps\"" +msgstr "E456: Không tìm thấy tập tin tài nguyên PostScript \"prolog.ps\"" + +#: ex_cmds2.c:4959 +#, c-format +msgid "E456: Can't find PostScript resource file \"%s.ps\"" +msgstr "E456: Không tìm thấy tập tin tài nguyên PostScript \"%s.ps\"" + +#: ex_cmds2.c:4977 +#, c-format +msgid "E620: Unable to convert from multi-byte to \"%s\" encoding" +msgstr "" +"E620: Không thể chuyển từ các ký tự nhiều byte thành bảng mã \"%s\"" + +#: ex_cmds2.c:5102 +msgid "Sending to printer..." +msgstr "Gửi tới máy in..." + +#: ex_cmds2.c:5106 +msgid "E365: Failed to print PostScript file" +msgstr "E365: In tập tin PostScript không thành công" + +#: ex_cmds2.c:5108 +msgid "Print job sent." +msgstr "Đã gửi công việc in." + +#: ex_cmds2.c:5618 +#, c-format +msgid "Current %slanguage: \"%s\"" +msgstr "Ngôn ngữ %shiện thời: \"%s\"" + +#: ex_cmds2.c:5629 +#, c-format +msgid "E197: Cannot set language to \"%s\"" +msgstr "E197: Không thể thay đổi ngôn ngữ thành \"%s\"" + +#: ex_docmd.c:525 +msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." +msgstr "Chuyển vào chế độ Ex. Để chuyển về chế độ Thông thường hãy gõ \"visual\"" + +#. must be at EOF +#: ex_docmd.c:561 +msgid "E501: At end-of-file" +msgstr "E501: Ở cuối tập tin" + +#: ex_docmd.c:669 +msgid "E169: Command too recursive" +msgstr "E169: Câu lệnh quá đệ quy" + +#: ex_docmd.c:1229 +#, c-format +msgid "E605: Exception not caught: %s" +msgstr "E605: Trường hợp đặc biệt không được xử lý: %s" + +#: ex_docmd.c:1317 +msgid "End of sourced file" +msgstr "Kết thúc tập tin script" + +#: ex_docmd.c:1318 +msgid "End of function" +msgstr "Kết thúc của hàm số" + +#: ex_docmd.c:1907 +msgid "E464: Ambiguous use of user-defined command" +msgstr "E464: Sự sử dụng không rõ ràng câu lệnh do người dùng định nghĩa" + +#: ex_docmd.c:1921 +msgid "E492: Not an editor command" +msgstr "E492: Không phải là câu lệnh của trình soạn thảo" + +#: ex_docmd.c:2028 +msgid "E493: Backwards range given" +msgstr "E493: Đưa ra phạm vi ngược lại" + +#: ex_docmd.c:2037 +msgid "Backwards range given, OK to swap" +msgstr "Đưa ra phạm vi ngược lại, thay đổi vị trí hai giới hạn" + +#: ex_docmd.c:2160 +msgid "E494: Use w or w>>" +msgstr "E494: Hãy sử dụng w hoặc w>>" + +#: ex_docmd.c:3786 +msgid "E319: Sorry, the command is not available in this version" +msgstr "E319: Xin lỗi, câu lệnh này không có trong phiên bản này" + +#: ex_docmd.c:3989 +msgid "E172: Only one file name allowed" +msgstr "E172: Chỉ cho phép sử dụng một tên tập tin" + +#: ex_docmd.c:4569 +msgid "1 more file to edit. Quit anyway?" +msgstr "Còn 1 tập tin nữa cần soạn thảo. Thoát?" + +#: ex_docmd.c:4572 +#, c-format +msgid "%d more files to edit. Quit anyway?" +msgstr "Còn %d tập tin nữa chưa soạn thảo. Thoát?" + +#: ex_docmd.c:4579 +msgid "E173: 1 more file to edit" +msgstr "E173: 1 tập tin nữa chờ soạn thảo." + +#: ex_docmd.c:4581 +#, c-format +msgid "E173: %ld more files to edit" +msgstr "E173: %ld tập tin nữa chưa soạn thảo." + +#: ex_docmd.c:4676 +msgid "E174: Command already exists: add ! to replace it" +msgstr "E174: Đã có câu lệnh: Thêm ! để thay thế" + +#: ex_docmd.c:4787 +msgid "" +"\n" +" Name Args Range Complete Definition" +msgstr "" +"\n" +" Tên Tham_số Phạm_vi Phần_phụ Định_nghĩa" + +#: ex_docmd.c:4876 +msgid "No user-defined commands found" +msgstr "Không tìm thấy câu lệnh do người dùng định nghĩa" + +#: ex_docmd.c:4908 +msgid "E175: No attribute specified" +msgstr "E175: Không có tham số được chỉ ra" + +#: ex_docmd.c:4960 +msgid "E176: Invalid number of arguments" +msgstr "E176: Số lượng tham số không đúng" + +#: ex_docmd.c:4975 +msgid "E177: Count cannot be specified twice" +msgstr "E177: Số đếm không thể được chỉ ra hai lần" + +#: ex_docmd.c:4985 +msgid "E178: Invalid default value for count" +msgstr "E178: Giá trị của số đếm theo mặc định không đúng" + +#: ex_docmd.c:5016 +msgid "E179: argument required for complete" +msgstr "E179: yêu cầu đưa ra tham số để kết thúc" + +#: ex_docmd.c:5048 +#, c-format +msgid "E180: Invalid complete value: %s" +msgstr "E180: Giá trị phần phụ không đúng: %s" + +#: ex_docmd.c:5057 +msgid "E468: Completion argument only allowed for custom completion" +msgstr "" +"E468: Tham số tự động kết thúc chỉ cho phép sử dụng với phần phụ đặc biệt" + +#: ex_docmd.c:5063 +msgid "E467: Custom completion requires a function argument" +msgstr "E467: Phần phục đặc biệt yêu cầu một tham số của hàm" + +#: ex_docmd.c:5074 +#, c-format +msgid "E181: Invalid attribute: %s" +msgstr "E181: Thuộc tính không đúng: %s" + +#: ex_docmd.c:5117 +msgid "E182: Invalid command name" +msgstr "E182: Tên câu lệnh không đúng" + +#: ex_docmd.c:5132 +msgid "E183: User defined commands must start with an uppercase letter" +msgstr "E183: Câu lệnh người dùng định nghĩa phải bắt đầu với một ký tự hoa" + +#: ex_docmd.c:5203 +#, c-format +msgid "E184: No such user-defined command: %s" +msgstr "E184: Không có câu lệnh người dùng định nghĩa như vậy: %s" + +#: ex_docmd.c:5664 +#, c-format +msgid "E185: Cannot find color scheme %s" +msgstr "E185: Không tin thấy sơ đồ màu sắc %s" + +#: ex_docmd.c:5672 +msgid "Greetings, Vim user!" +msgstr "Xin chào, người dùng Vim!" + +#: ex_docmd.c:6389 +msgid "Edit File in new window" +msgstr "Soạn thảo tập tin trong cửa sổ mới" + +#: ex_docmd.c:6684 +msgid "No swap file" +msgstr "Không có tập tin swap" + +#: ex_docmd.c:6788 +msgid "Append File" +msgstr "Thêm tập tin" + +#: ex_docmd.c:6852 +msgid "E186: No previous directory" +msgstr "E186: Không có thư mục trước" + +#: ex_docmd.c:6934 +msgid "E187: Unknown" +msgstr "E187: Không rõ" + +#: ex_docmd.c:7019 +msgid "E465: :winsize requires two number arguments" +msgstr "E465: câu lệnh :winsize yêu cầu hai tham số bằng số" + +#: ex_docmd.c:7075 +#, c-format +msgid "Window position: X %d, Y %d" +msgstr "Vị trí cửa sổ: X %d, Y %d" + +#: ex_docmd.c:7080 +msgid "E188: Obtaining window position not implemented for this platform" +msgstr "E188: Trên hệ thống này việc xác định vị trí cửa sổ không làm việc" + +#: ex_docmd.c:7090 +msgid "E466: :winpos requires two number arguments" +msgstr "E466: câu lệnh :winpos yêu câu hai tham số bằng số" + +#: ex_docmd.c:7368 +msgid "Save Redirection" +msgstr "Chuyển hướng ghi nhớ" + +#: ex_docmd.c:7558 +msgid "Save View" +msgstr "Ghi nhớ vẻ ngoài" + +#: ex_docmd.c:7559 +msgid "Save Session" +msgstr "Ghi nhớ buổi làm việc" + +#: ex_docmd.c:7561 +msgid "Save Setup" +msgstr "Ghi nhớ cấu hình" + +#: ex_docmd.c:7713 +#, c-format +msgid "E189: \"%s\" exists (add ! to override)" +msgstr "E189: \"%s\" đã có (thêm !, để ghi đè)" + +#: ex_docmd.c:7718 +#, c-format +msgid "E190: Cannot open \"%s\" for writing" +msgstr "E190: Không mở được \"%s\" để ghi nhớ" + +#. set mark +#: ex_docmd.c:7742 +msgid "E191: Argument must be a letter or forward/backward quote" +msgstr "E191: Tham số phải là một chữ cái hoặc dấu ngoặc thẳng/ngược" + +#: ex_docmd.c:7784 +msgid "E192: Recursive use of :normal too deep" +msgstr "E192: Sử dụng đệ quy lệnh :normal quá sâu" + +#: ex_docmd.c:8302 +msgid "E194: No alternate file name to substitute for '#'" +msgstr "E194: Không có tên tập tin tương đương để thay thế '#'" + +#: ex_docmd.c:8333 +msgid "E495: no autocommand file name to substitute for \"\"" +msgstr "E495: Không có tên tập tin câu lệnh tự động để thay thế \"\"" + +#: ex_docmd.c:8341 +msgid "E496: no autocommand buffer number to substitute for \"\"" +msgstr "E496: Không có số thứ tự bộ đệm câu lệnh tự động để thay thế \"\"" + +#: ex_docmd.c:8352 +msgid "E497: no autocommand match name to substitute for \"\"" +msgstr "E497: Không có tên tương ứng câu lệnh tự động để thay thế \"\"" + +#: ex_docmd.c:8362 +msgid "E498: no :source file name to substitute for \"\"" +msgstr "E498: không có tên tập tin :source để thay thế \"\"" + +#: ex_docmd.c:8403 +#, no-c-format +msgid "E499: Empty file name for '%' or '#', only works with \":p:h\"" +msgstr "E499: Tên tập tin rỗng cho '%' hoặc '#', chỉ làm việc với \":p:h\"" + +#: ex_docmd.c:8405 +msgid "E500: Evaluates to an empty string" +msgstr "E500: Kết quả của biểu thức là một chuỗi rỗng" + +#: ex_docmd.c:9360 +msgid "E195: Cannot open viminfo file for reading" +msgstr "E195: Không thể mở tập tin viminfo để đọc" + +#: ex_docmd.c:9533 +msgid "E196: No digraphs in this version" +msgstr "E196: Trong phiên bản này chữ ghép không được hỗ trợ" + +#: ex_eval.c:440 +msgid "E608: Cannot :throw exceptions with 'Vim' prefix" +msgstr "" +"E608: Không thể thực hiện lệnh :throw cho những ngoại lệ với tiền tố 'Vim'" + +#. always scroll up, don't overwrite +#: ex_eval.c:529 +#, c-format +msgid "Exception thrown: %s" +msgstr "Trường hợp ngoại lệ: %s" + +#: ex_eval.c:576 +#, c-format +msgid "Exception finished: %s" +msgstr "Kết thúc việc xử lý trường hợp ngoại lệ: %s" + +#: ex_eval.c:577 +#, c-format +msgid "Exception discarded: %s" +msgstr "Trường hợp ngoại lệ bị bỏ qua: %s" + +#: ex_eval.c:620 ex_eval.c:664 +#, c-format +msgid "%s, line %ld" +msgstr "%s, dòng %ld" + +#. always scroll up, don't overwrite +#: ex_eval.c:638 +#, c-format +msgid "Exception caught: %s" +msgstr "Xử lý trường hợp ngoại lệ: %s" + +#: ex_eval.c:713 +#, c-format +msgid "%s made pending" +msgstr "%s thực hiện việc chờ đợi" + +#: ex_eval.c:716 +#, c-format +msgid "%s resumed" +msgstr "%s được phục hồi lại" + +#: ex_eval.c:720 +#, c-format +msgid "%s discarded" +msgstr "%s bị bỏ qua" + +#: ex_eval.c:746 +msgid "Exception" +msgstr "Trường hợp ngoại lệ" + +#: ex_eval.c:752 +msgid "Error and interrupt" +msgstr "Lỗi và sự gián đoạn" + +#: ex_eval.c:754 gui.c:4381 +msgid "Error" +msgstr "Lỗi" + +#. if (pending & CSTP_INTERRUPT) +#: ex_eval.c:756 +msgid "Interrupt" +msgstr "Sự gián đoạn" + +#: ex_eval.c:830 +msgid "E579: :if nesting too deep" +msgstr "E579: :if xếp lồng vào nhau quá sâu" + +#: ex_eval.c:867 +msgid "E580: :endif without :if" +msgstr "E580: :endif không có :if" + +#: ex_eval.c:911 +msgid "E581: :else without :if" +msgstr "E581: :else không có :if" + +#: ex_eval.c:914 +msgid "E582: :elseif without :if" +msgstr "E582: :elseif không có :if" + +#: ex_eval.c:921 +msgid "E583: multiple :else" +msgstr "E583: phát hiện vài :else" + +#: ex_eval.c:924 +msgid "E584: :elseif after :else" +msgstr "E584: :elseif sau :else" + +#: ex_eval.c:991 +msgid "E585: :while nesting too deep" +msgstr "E585: :while xếp lồng vào nhau quá sâu" + +#: ex_eval.c:1047 +msgid "E586: :continue without :while" +msgstr "E586: :continue không có :while" + +#: ex_eval.c:1087 +msgid "E587: :break without :while" +msgstr "E587: :break không có :while" + +#: ex_eval.c:1286 +msgid "E601: :try nesting too deep" +msgstr "E601: :try xếp lồng vào nhau quá sâu" + +#: ex_eval.c:1366 +msgid "E603: :catch without :try" +msgstr "E603: :catch không có :try" + +#. Give up for a ":catch" after ":finally" and ignore it. +#. * Just parse. +#: ex_eval.c:1388 +msgid "E604: :catch after :finally" +msgstr "E604: :catch đứng sau :finally" + +#: ex_eval.c:1521 +msgid "E606: :finally without :try" +msgstr "E606: :finally không có :try" + +#. Give up for a multiple ":finally" and ignore it. +#: ex_eval.c:1545 +msgid "E607: multiple :finally" +msgstr "E607: phát hiện vài :finally" + +#: ex_eval.c:1654 +msgid "E602: :endtry without :try" +msgstr "E602: :endtry không có :try" + +#: ex_eval.c:1986 +msgid "E193: :endfunction not inside a function" +msgstr "E193: lệnh :endfunction chỉ được sử dụng trong một hàm số" + +#: ex_getln.c:3296 +msgid "tagname" +msgstr "tên thẻ ghi" + +#: ex_getln.c:3299 +msgid " kind file\n" +msgstr " loại tập tin\n" + +#: ex_getln.c:4752 +msgid "'history' option is zero" +msgstr "giá trị của tùy chọn 'history' bằng không" + +#: ex_getln.c:5023 +#, c-format +msgid "" +"\n" +"# %s History (newest to oldest):\n" +msgstr "" +"\n" +"# %s, Lịch sử (bắt đầu từ mới nhất tới cũ nhất):\n" + +#: ex_getln.c:5024 +msgid "Command Line" +msgstr "Dòng lệnh" + +#: ex_getln.c:5025 +msgid "Search String" +msgstr "Chuỗi tìm kiếm" + +#: ex_getln.c:5026 +msgid "Expression" +msgstr "Biểu thức" + +#: ex_getln.c:5027 +msgid "Input Line" +msgstr "Dòng nhập" + +#: ex_getln.c:5065 +msgid "E198: cmd_pchar beyond the command length" +msgstr "E198: cmd_pchar lớn hơn chiều dài câu lệnh" + +#: ex_getln.c:5242 +msgid "E199: Active window or buffer deleted" +msgstr "E199: Cửa sổ hoặc bộ đệm hoạt động bị xóa" + +#: fileio.c:377 +msgid "Illegal file name" +msgstr "Tên tập tin không cho phép" + +#: fileio.c:401 fileio.c:535 fileio.c:2913 fileio.c:2954 +msgid "is a directory" +msgstr "là một thư mục" + +#: fileio.c:403 +msgid "is not a file" +msgstr "không phải là một tập tin" + +#: fileio.c:557 fileio.c:4131 +msgid "[New File]" +msgstr "[Tập tin mới]" + +#: fileio.c:590 +msgid "[Permission Denied]" +msgstr "[Truy cập bị từ chối]" + +#: fileio.c:694 +msgid "E200: *ReadPre autocommands made the file unreadable" +msgstr "E200: Câu lệnh tự động *ReadPre làm cho tập tin trở thành không thể đọc" + +#: fileio.c:696 +msgid "E201: *ReadPre autocommands must not change current buffer" +msgstr "E201: Câu lệnh tự động *ReadPre không được thay đổi bộ đệm hoạt động" + +#: fileio.c:717 +msgid "Vim: Reading from stdin...\n" +msgstr "Vim: Đọc từ đầu vào tiêu chuẩn stdin...\n" + +#: fileio.c:723 +msgid "Reading from stdin..." +msgstr "Đọc từ đầu vào tiêu chuẩn stdin..." + +#. Re-opening the original file failed! +#: fileio.c:1000 +msgid "E202: Conversion made file unreadable!" +msgstr "E202: Sự biến đổi làm cho tập tin trở thành không thể đọc!" + +#: fileio.c:2090 +msgid "[fifo/socket]" +msgstr "[fifo/socket]" + +#: fileio.c:2097 +msgid "[fifo]" +msgstr "[fifo]" + +#: fileio.c:2104 +msgid "[socket]" +msgstr "[socket]" + +#: fileio.c:2112 +msgid "[RO]" +msgstr "[Chỉ đọc]" + +#: fileio.c:2122 +msgid "[CR missing]" +msgstr "[thiếu ký tự CR]" + +#: fileio.c:2127 +msgid "[NL found]" +msgstr "[tìm thấy ký tự NL]" + +#: fileio.c:2132 +msgid "[long lines split]" +msgstr "[dòng dài được chia nhỏ]" + +#: fileio.c:2138 fileio.c:4115 +msgid "[NOT converted]" +msgstr "[KHÔNG được chuyển đổi]" + +#: fileio.c:2143 fileio.c:4120 +msgid "[converted]" +msgstr "[đã chuyển bảng mã]" + +#: fileio.c:2150 fileio.c:4145 +msgid "[crypted]" +msgstr "[đã mã hóa]" + +#: fileio.c:2157 +msgid "[CONVERSION ERROR]" +msgstr "[LỖI CHUYỂN BẢNG MÃ]" + +#: fileio.c:2163 +#, c-format +msgid "[ILLEGAL BYTE in line %ld]" +msgstr "[BYTE KHÔNG CHO PHÉP trên dòng %ld]" + +#: fileio.c:2170 +msgid "[READ ERRORS]" +msgstr "[LỖI ĐỌC]" + +#: fileio.c:2386 +msgid "Can't find temp file for conversion" +msgstr "Không tìm thấy tập tin tạm thời (temp) để chuyển bảng mã" + +#: fileio.c:2393 +msgid "Conversion with 'charconvert' failed" +msgstr "Chuyển đổi nhờ 'charconvert' không được thực hiện" + +#: fileio.c:2396 +msgid "can't read output of 'charconvert'" +msgstr "không đọc được đầu ra của 'charconvert'" + +#: fileio.c:2796 +msgid "E203: Autocommands deleted or unloaded buffer to be written" +msgstr "" +"E203: Câu lệnh tự động đã xóa hoặc bỏ nạp bộ đệm cần ghi nhớ" + +#: fileio.c:2819 +msgid "E204: Autocommand changed number of lines in unexpected way" +msgstr "E204: Câu lệnh tự động đã thay đổ số dòng theo cách không mong muốn" + +#: fileio.c:2857 +msgid "NetBeans dissallows writes of unmodified buffers" +msgstr "NetBeans không cho phép ghi nhớ bộ đệm chưa có thay đổi nào" + +#: fileio.c:2865 +msgid "Partial writes disallowed for NetBeans buffers" +msgstr "Ghi nhớ một phần bộ đệm NetBeans không được cho phép" + +#: fileio.c:2919 fileio.c:2937 +msgid "is not a file or writable device" +msgstr "không phải là một tập tin thay một thiết bị có thể ghi nhớ" + +#: fileio.c:2989 +msgid "is read-only (add ! to override)" +msgstr "là tập tin chỉ đọc (thêm ! để ghi nhớ bằng mọi giá)" + +#: fileio.c:3335 +msgid "E506: Can't write to backup file (add ! to override)" +msgstr "E506: Không thể ghi nhớ vào tập tin lưu trữ (thêm ! để ghi nhớ bằng mọi giá" + +#: fileio.c:3347 +msgid "E507: Close error for backup file (add ! to override)" +msgstr "E507: Lỗi đóng tập tin lưu trữ (thêm ! để bỏ qua việc kiểm tra lại)" + +#: fileio.c:3349 +msgid "E508: Can't read file for backup (add ! to override)" +msgstr "E508: Không đọc được tập tin lưu trữ (thêm ! để bỏ qua việc kiểm tra lại)" + +#: fileio.c:3365 +msgid "E509: Cannot create backup file (add ! to override)" +msgstr "E509: Không tạo được tập tin lưu trữ (thêm ! để bỏ qua việc kiểm tra lại)" + +#: fileio.c:3468 +msgid "E510: Can't make backup file (add ! to override)" +msgstr "E510: Không tạo được tập tin lưu trữ (thêm ! để bỏ qua việc kiểm tra lại)" + +#: fileio.c:3530 +msgid "E460: The resource fork would be lost (add ! to override)" +msgstr "E460: Nhánh tài nguyên sẽ bị mất (thêm ! để bỏ qua việc kiểm tra lại)" + +#: fileio.c:3640 +msgid "E214: Can't find temp file for writing" +msgstr "E214: Không tìm thấy tập tin tạm thời (temp) để ghi nhớ" + +#: fileio.c:3658 +msgid "E213: Cannot convert (add ! to write without conversion)" +msgstr "E213: Không thể chuyển đổi bảng mã (thêm ! để ghi nhớ mà không chuyển đổi)" + +#: fileio.c:3693 +msgid "E166: Can't open linked file for writing" +msgstr "E166: Không thể mở tập tin liên kết để ghi nhớ" + +#: fileio.c:3697 +msgid "E212: Can't open file for writing" +msgstr "E212: Không thể mở tập tin để ghi nhớ" + +#: fileio.c:3959 +msgid "E667: Fsync failed" +msgstr "E667: Không thực hiện thành công hàm số fsync()" + +#: fileio.c:3966 +msgid "E512: Close failed" +msgstr "E512: Thao tác đóng không thành công" + +#: fileio.c:4037 +msgid "E513: write error, conversion failed" +msgstr "E513: Lỗi ghi nhớ, biến đổi không thành công" + +#: fileio.c:4043 +msgid "E514: write error (file system full?)" +msgstr "E514: lỗi ghi nhớ (không còn chỗ trống?)" + +#: fileio.c:4110 +msgid " CONVERSION ERROR" +msgstr " LỖI BIẾN ĐỔI" + +#: fileio.c:4126 +msgid "[Device]" +msgstr "[Thiết bị]" + +#: fileio.c:4131 +msgid "[New]" +msgstr "[Mới]" + +#: fileio.c:4153 +msgid " [a]" +msgstr " [a]" + +#: fileio.c:4153 +msgid " appended" +msgstr " đã thêm" + +#: fileio.c:4155 +msgid " [w]" +msgstr " [w]" + +#: fileio.c:4155 +msgid " written" +msgstr " đã ghi" + +#: fileio.c:4205 +msgid "E205: Patchmode: can't save original file" +msgstr "E205: Chế độ vá lỗi (patch): không thể ghi nhớ tập tin gốc" + +#: fileio.c:4227 +msgid "E206: patchmode: can't touch empty original file" +msgstr "" +"E206: Chế độ vá lỗi (patch): không thể thay đổi tham số của tập tin gốc trống rỗng" + +#: fileio.c:4242 +msgid "E207: Can't delete backup file" +msgstr "E207: Không thể xóa tập tin lưu trữ (backup)" + +#: fileio.c:4306 +msgid "" +"\n" +"WARNING: Original file may be lost or damaged\n" +msgstr "" +"\n" +"CẢNH BÁO: Tập tin gốc có thể bị mất hoặc bị hỏng\n" + +#: fileio.c:4308 +msgid "don't quit the editor until the file is successfully written!" +msgstr "đừng thoát khởi trình soạn thảo, khi tập tin còn chưa được ghi nhớ thành cồng" + +#: fileio.c:4397 +msgid "[dos]" +msgstr "[dos]" + +#: fileio.c:4397 +msgid "[dos format]" +msgstr "[định dạng dos]" + +#: fileio.c:4404 +msgid "[mac]" +msgstr "[mac]" + +#: fileio.c:4404 +msgid "[mac format]" +msgstr "[định dạng mac]" + +#: fileio.c:4411 +msgid "[unix]" +msgstr "[unix]" + +#: fileio.c:4411 +msgid "[unix format]" +msgstr "[định dạng unix]" + +#: fileio.c:4438 +msgid "1 line, " +msgstr "1 dòng, " + +#: fileio.c:4440 +#, c-format +msgid "%ld lines, " +msgstr "%ld dòng, " + +#: fileio.c:4443 +msgid "1 character" +msgstr "1 ký tự" + +#: fileio.c:4445 +#, c-format +msgid "%ld characters" +msgstr "%ld ký tự" + +#: fileio.c:4455 +msgid "[noeol]" +msgstr "[noeol]" + +#: fileio.c:4455 +msgid "[Incomplete last line]" +msgstr "[Dòng cuối cùng không đầy đủ]" + +#. don't overwrite messages here +#. must give this prompt +#. don't use emsg() here, don't want to flush the buffers +#: fileio.c:4474 +msgid "WARNING: The file has been changed since reading it!!!" +msgstr "CẢNH BÁO: Tập tin đã thay đổi so với thời điểm đọc!!!" + +#: fileio.c:4476 +msgid "Do you really want to write to it" +msgstr "Bạn có chắc muốn ghi nhớ vào tập tin này" + +#: fileio.c:5726 +#, c-format +msgid "E208: Error writing to \"%s\"" +msgstr "E208: Lỗi ghi nhớ vào \"%s\"" + +#: fileio.c:5733 +#, c-format +msgid "E209: Error closing \"%s\"" +msgstr "E209: Lỗi đóng \"%s\"" + +#: fileio.c:5736 +#, c-format +msgid "E210: Error reading \"%s\"" +msgstr "E210: Lỗi đọc \"%s\"" + +#: fileio.c:5970 +msgid "E246: FileChangedShell autocommand deleted buffer" +msgstr "E246: Bộ đệm bị xóa khi thực hiện câu lệnh tự động FileChangedShell" + +#: fileio.c:5977 +#, c-format +msgid "E211: Warning: File \"%s\" no longer available" +msgstr "E211: Cảnh báo: Tập tin \"%s\" không còn truy cập được nữa" + +#: fileio.c:5991 +#, c-format +msgid "" +"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as " +"well" +msgstr "" +"W12: Cảnh báo: Tập tin \"%s\" và bộ đệm Vim đã thay đổi không phụ thuộc vào " +"nhau" + +#: fileio.c:5994 +#, c-format +msgid "W11: Warning: File \"%s\" has changed since editing started" +msgstr "" +"W11: Cảnh báo: Tập tin \"%s\" đã thay đổi sau khi việc soạn thảo bắt đầu" + +#: fileio.c:5996 +#, c-format +msgid "W16: Warning: Mode of file \"%s\" has changed since editing started" +msgstr "" +"W16: Cảnh báo: chế độ truy cập tới tập tin \"%s\" đã thay đổi sau khi bắt " +"đầu soạn thảo" + +#: fileio.c:6006 +#, c-format +msgid "W13: Warning: File \"%s\" has been created after editing started" +msgstr "" +"W13: Cảnh báo: tập tin \"%s\" được tạo ra sau khi việc soạn thảo bắt đầu" + +#: fileio.c:6019 +msgid "See \":help W11\" for more info." +msgstr "Hãy xem thông tin chi tiết trong \":help W11\"." + +#: fileio.c:6033 +msgid "Warning" +msgstr "Cảnh báo" + +#: fileio.c:6034 +msgid "" +"&OK\n" +"&Load File" +msgstr "" +"&OK\n" +"&Nạp tập tin" + +#: fileio.c:6140 +#, c-format +msgid "E462: Could not prepare for reloading \"%s\"" +msgstr "E462: Không thể chuẩn bị để nạp lại \"%s\"" + +#: fileio.c:6159 +#, c-format +msgid "E321: Could not reload \"%s\"" +msgstr "E321: Không thể nạp lại \"%s\"" + +#: fileio.c:6740 +msgid "--Deleted--" +msgstr "--Bị xóa--" + +#. the group doesn't exist +#: fileio.c:6900 +#, c-format +msgid "E367: No such group: \"%s\"" +msgstr "E367: Nhóm \"%s\" không tồn tại" + +#: fileio.c:7026 +#, c-format +msgid "E215: Illegal character after *: %s" +msgstr "E215: Ký tự không cho phép sau *: %s" + +#: fileio.c:7038 +#, c-format +msgid "E216: No such event: %s" +msgstr "E216: Sự kiện không có thật: %s" + +#: fileio.c:7040 +#, c-format +msgid "E216: No such group or event: %s" +msgstr "E216: Nhóm hoặc sự kiện không có thật: %s" + +#. Highlight title +#: fileio.c:7198 +msgid "" +"\n" +"--- Auto-Commands ---" +msgstr "" +"\n" +"--- Câu lệnh tự động ---" + +#: fileio.c:7469 +msgid "E217: Can't execute autocommands for ALL events" +msgstr "E217: Không thể thực hiện câu lệnh tự động cho MỌI sự kiện" + +#: fileio.c:7492 +msgid "No matching autocommands" +msgstr "Không có câu lệnh tự động tương ứng" + +#: fileio.c:7813 +msgid "E218: autocommand nesting too deep" +msgstr "E218: câu lệnh tự động xếp lồng vào nhau quá xâu" + +#: fileio.c:8088 +#, c-format +msgid "%s Auto commands for \"%s\"" +msgstr "%s câu lệnh tự động cho \"%s\"" + +#: fileio.c:8096 +#, c-format +msgid "Executing %s" +msgstr "Thực hiện %s" + +#. always scroll up, don't overwrite +#: fileio.c:8164 +#, c-format +msgid "autocommand %s" +msgstr "câu lệnh tự động %s" + +#: fileio.c:8731 +msgid "E219: Missing {." +msgstr "E219: Thiếu {." + +#: fileio.c:8733 +msgid "E220: Missing }." +msgstr "E220: Thiếu }." + +#: fold.c:68 +msgid "E490: No fold found" +msgstr "E490: Không tìm thấy nếp gấp" + +#: fold.c:593 +msgid "E350: Cannot create fold with current 'foldmethod'" +msgstr "" +"E350: Không thể tạo nếp gấp với giá trị hiện thời của tùy chọn 'foldmethod'" + +#: fold.c:595 +msgid "E351: Cannot delete fold with current 'foldmethod'" +msgstr "" +"E351: Không thể xóa nếp gấp với giá trị hiện thời của tùy chọn 'foldmethod'" + +#: getchar.c:248 +msgid "E222: Add to read buffer" +msgstr "E222: Thêm vào bộ đệm đang đọc" + +#: getchar.c:2198 +msgid "E223: recursive mapping" +msgstr "E223: ánh xạ đệ quy" + +#: getchar.c:3077 +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: đã có sự viết tắt toàn cầu cho %s" + +#: getchar.c:3080 +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: đã có ánh xạ toàn cầu cho %s" + +#: getchar.c:3212 +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: đã có sự viết tắt cho %s" + +#: getchar.c:3215 +#, c-format +msgid "E227: mapping already exists for %s" +msgstr "E227: đã có ánh xạ cho %s" + +#: getchar.c:3279 +msgid "No abbreviation found" +msgstr "Không tìm thấy viết tắt" + +#: getchar.c:3281 +msgid "No mapping found" +msgstr "Không tìm thấy ánh xạ" + +#: getchar.c:4173 +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap: Chế độ không cho phép" + +#: gui.c:220 +msgid "E229: Cannot start the GUI" +msgstr "E229: Không chạy được giao diện đồ họa GUI" + +#: gui.c:349 +#, c-format +msgid "E230: Cannot read from \"%s\"" +msgstr "E230: Không đọc được từ \"%s\"" + +#: gui.c:472 +msgid "E665: Cannot start GUI, no valid font found" +msgstr "" +"E665: Không chạy được giao diện đồ họa GUI, đưa ra phông chữ không đúng" + +#: gui.c:477 +msgid "E231: 'guifontwide' invalid" +msgstr "E231: 'guifontwide' có giá trị không đúng" + +#: gui.c:547 +msgid "E599: Value of 'imactivatekey' is invalid" +msgstr "E599: Giá trị của 'imactivatekey' không đúng" + +#: gui.c:4061 +#, c-format +msgid "E254: Cannot allocate color %s" +msgstr "E254: Không chỉ định được màu %s" + +#: gui_at_fs.c:300 +msgid " " +msgstr " " + +#: gui_at_fs.c:1136 +#, c-format +msgid "E616: vim_SelFile: can't get font %s" +msgstr "E616: vim_SelFile: không tìm thấy phông chữ %s" + +#: gui_at_fs.c:2781 +msgid "E614: vim_SelFile: can't return to current directory" +msgstr "E614: vim_SelFile: không trở lại được thư mục hiện thời" + +#: gui_at_fs.c:2801 +msgid "Pathname:" +msgstr "Đường dẫn tới tập tin:" + +#: gui_at_fs.c:2807 +msgid "E615: vim_SelFile: can't get current directory" +msgstr "E615: vim_SelFile: không tìm thấy thư mục hiện thời" + +#: gui_at_fs.c:2815 gui_motif.c:1623 +msgid "OK" +msgstr "Đồng ý" + +#: gui_at_fs.c:2815 gui_gtk.c:2731 gui_motif.c:1618 gui_motif.c:2849 +msgid "Cancel" +msgstr "Hủy bỏ" + +#: gui_at_sb.c:486 +msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." +msgstr "Thanh cuộn: Không thể xác định hình học của thanh cuộn." + +#: gui_athena.c:2047 gui_motif.c:1871 +msgid "Vim dialog" +msgstr "Hộp thoại Vim" + +#: gui_beval.c:101 gui_w32.c:3829 +msgid "E232: Cannot create BalloonEval with both message and callback" +msgstr "" +"E232: Không tạo được BalloonEval với cả thông báo và lời gọi ngược lại" + +#: gui_gtk.c:1607 +msgid "Vim dialog..." +msgstr "Hộp thoại Vim..." + +#: gui_gtk.c:2060 message.c:2993 +msgid "" +"&Yes\n" +"&No\n" +"&Cancel" +msgstr "" +"&Có\n" +"&Không\n" +"&Dừng" + +#: gui_gtk.c:2268 +msgid "Input _Methods" +msgstr "Cách nhập _dữ liệu" + +#: gui_gtk.c:2534 gui_motif.c:2768 +msgid "VIM - Search and Replace..." +msgstr "VIM - Tìm kiếm và thay thế..." + +#: gui_gtk.c:2542 gui_motif.c:2770 +msgid "VIM - Search..." +msgstr "VIM - Tìm kiếm..." + +#: gui_gtk.c:2574 gui_motif.c:2888 +msgid "Find what:" +msgstr "Tìm kiếm gì:" + +#: gui_gtk.c:2592 gui_motif.c:2920 +msgid "Replace with:" +msgstr "Thay thế bởi:" + +#. whole word only button +#: gui_gtk.c:2624 gui_motif.c:3036 +msgid "Match whole word only" +msgstr "Chỉ tìm tương ứng hoàn toàn với từ" + +#. match case button +#: gui_gtk.c:2635 gui_motif.c:3048 +msgid "Match case" +msgstr "Có tính kiểu chữ" + +#: gui_gtk.c:2645 gui_motif.c:2990 +msgid "Direction" +msgstr "Hướng" + +#. 'Up' and 'Down' buttons +#: gui_gtk.c:2657 gui_motif.c:3002 +msgid "Up" +msgstr "Lên" + +#: gui_gtk.c:2661 gui_motif.c:3010 +msgid "Down" +msgstr "Xuống" + +#: gui_gtk.c:2683 gui_gtk.c:2685 gui_motif.c:2792 +msgid "Find Next" +msgstr "Tìm tiếp" + +#: gui_gtk.c:2702 gui_gtk.c:2704 gui_motif.c:2809 +msgid "Replace" +msgstr "Thay thế" + +#: gui_gtk.c:2715 gui_gtk.c:2717 gui_motif.c:2822 +msgid "Replace All" +msgstr "Thay thế tất cả" + +#: gui_gtk_x11.c:2327 +msgid "Vim: Received \"die\" request from session manager\n" +msgstr "Vim: Nhận được yêu cầu \"chết\" (dừng) từ trình quản lý màn hình\n" + +#: gui_gtk_x11.c:3519 +msgid "Vim: Main window unexpectedly destroyed\n" +msgstr "Vim: Cửa sổ chính đã bị đóng đột ngột\n" + +#: gui_gtk_x11.c:4138 +msgid "Font Selection" +msgstr "Chọn phông chữ" + +#: gui_gtk_x11.c:6035 ui.c:2120 +msgid "Used CUT_BUFFER0 instead of empty selection" +msgstr "Sử dụng CUT_BUFFER0 thay cho lựa chọn trống rỗng" + +#: gui_motif.c:1617 gui_motif.c:1620 +msgid "Filter" +msgstr "Đầu lọc" + +#: gui_motif.c:1619 +msgid "Directories" +msgstr "Thư mục" + +#: gui_motif.c:1621 +msgid "Help" +msgstr "Trợ giúp" + +#: gui_motif.c:1622 +msgid "Files" +msgstr "Tập tin" + +#: gui_motif.c:1624 +msgid "Selection" +msgstr "Lựa chọn" + +#: gui_motif.c:2835 +msgid "Undo" +msgstr "Hủy thao tác" + +#: gui_riscos.c:952 +#, c-format +msgid "E610: Can't load Zap font '%s'" +msgstr "E610: Không nạp được phông chữ Zap '%s'" + +#: gui_riscos.c:1048 +#, c-format +msgid "E611: Can't use font %s" +msgstr "E611: Không sử dụng được phông chữ %s" + +#: gui_riscos.c:3270 +msgid "" +"\n" +"Sending message to terminate child process.\n" +msgstr "" +"\n" +"Gửi thông báo để \"hủy diệt\" (dừng) tiến trình con.\n" + +#: gui_w32.c:829 +#, c-format +msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." +msgstr "E243: Tham số không được hỗ trợ: \"-%s\"; Hãy sử dụng phiên bản OLE." + +#: gui_w48.c:2090 +msgid "Find string (use '\\\\' to find a '\\')" +msgstr "Tìm kiếm chuỗi (hãy sử dụng '\\\\' để tìm kiếm dấu '\\')" + +#: gui_w48.c:2115 +msgid "Find & Replace (use '\\\\' to find a '\\')" +msgstr "Tìm kiếm và Thay thế (hãy sử dụng '\\\\' để tìm kiếm dấu '\\')" + +#: gui_x11.c:1537 +msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect" +msgstr "" +"Vim E458: Không chỉ định được bản ghi trong bảng màu, một vài màu có thể " +"hiển thị không chính xác" + +#: gui_x11.c:2118 +#, c-format +msgid "E250: Fonts for the following charsets are missing in fontset %s:" +msgstr "E250: Trong bộ phông chữ %s thiếu phông cho các bảng mã sau:" + +#: gui_x11.c:2161 +#, c-format +msgid "E252: Fontset name: %s" +msgstr "E252: Bộ phông chữ: %s" + +#: gui_x11.c:2162 +#, c-format +msgid "Font '%s' is not fixed-width" +msgstr "Phông chữ '%s' không phải là phông có độ rộng cố định (fixed-width)" + +#: gui_x11.c:2181 +#, c-format +msgid "E253: Fontset name: %s\n" +msgstr "E253: Bộ phông chữ: %s\n" + +#: gui_x11.c:2182 +#, c-format +msgid "Font0: %s\n" +msgstr "Font0: %s\n" + +#: gui_x11.c:2183 +#, c-format +msgid "Font1: %s\n" +msgstr "Font1: %s\n" + +#: gui_x11.c:2184 +msgid "Font%ld width is not twice that of font0\n" +msgstr "Chiều rộng phông chữ font%ld phải lớn hơn hai lần so với chiều rộng font0\n" + +#: gui_x11.c:2185 +#, c-format +msgid "Font0 width: %ld\n" +msgstr "Chiều rộng font0: %ld\n" + +#: gui_x11.c:2186 +#, c-format +msgid "" +"Font1 width: %ld\n" +"\n" +msgstr "" +"Chiều rộng font1: %ld\n" +"\n" + +#: hangulin.c:610 +msgid "E256: Hangul automata ERROR" +msgstr "E256: LỖI máy tự động Hangual (tiếng Hàn)" + +#: if_cscope.c:77 +msgid "Add a new database" +msgstr "Thêm một cơ sở dữ liệu mới" + +#: if_cscope.c:79 +msgid "Query for a pattern" +msgstr "Yêu cầu theo một mẫu" + +#: if_cscope.c:81 +msgid "Show this message" +msgstr "Hiển thị thông báo này" + +#: if_cscope.c:83 +msgid "Kill a connection" +msgstr "Hủy kết nối" + +#: if_cscope.c:85 +msgid "Reinit all connections" +msgstr "Khởi đầu lại tất cả các kết nối" + +#: if_cscope.c:87 +msgid "Show connections" +msgstr "Hiển thị kết nối" + +#: if_cscope.c:95 +#, c-format +msgid "E560: Usage: cs[cope] %s" +msgstr "E560: Sử dụng: cs[cope] %s" + +#: if_cscope.c:124 +msgid "This cscope command does not support splitting the window.\n" +msgstr "Câu lệnh cscope này không hỗ trợ việc chia (split) cửa sổ.\n" + +#: if_cscope.c:175 +msgid "E562: Usage: cstag " +msgstr "E562: Sử dụng: cstag " + +#: if_cscope.c:231 +msgid "E257: cstag: tag not found" +msgstr "E257: cstag: không tìm thấy thẻ ghi" + +#: if_cscope.c:409 +#, c-format +msgid "E563: stat(%s) error: %d" +msgstr "E563: lỗi stat(%s): %d" + +#: if_cscope.c:419 +msgid "E563: stat error" +msgstr "E563: lỗi stat" + +#: if_cscope.c:516 +#, c-format +msgid "E564: %s is not a directory or a valid cscope database" +msgstr "E564: %s không phải là một thư mục hoặc một cơ sở dữ liệu cscope thích hợp" + +#: if_cscope.c:534 +#, c-format +msgid "Added cscope database %s" +msgstr "Đã thêm cơ sở dữ liệu cscope %s" + +#: if_cscope.c:589 +#, c-format +msgid "E262: error reading cscope connection %ld" +msgstr "E262: lỗi lấy thông tin từ kết nối cscope %ld" + +#: if_cscope.c:694 +msgid "E561: unknown cscope search type" +msgstr "E561: không rõ loại tìm kiếm cscope" + +#: if_cscope.c:736 +msgid "E566: Could not create cscope pipes" +msgstr "E566: Không tạo được đường ống (pipe) cho cscope" + +#: if_cscope.c:753 +msgid "E622: Could not fork for cscope" +msgstr "E622: Không thực hiện được fork() cho cscope" + +#: if_cscope.c:847 if_cscope.c:897 +msgid "cs_create_connection exec failed" +msgstr "thực hiện cs_create_connection không thành công" + +#: if_cscope.c:898 +msgid "E623: Could not spawn cscope process" +msgstr "E623: Chạy tiến trình cscope không thành công" + +#: if_cscope.c:911 +msgid "cs_create_connection: fdopen for to_fp failed" +msgstr "cs_create_connection: thực hiện fdopen cho to_fp không thành công" + +#: if_cscope.c:913 +msgid "cs_create_connection: fdopen for fr_fp failed" +msgstr "cs_create_connection: thực hiện fdopen cho fr_fp không thành công" + +#: if_cscope.c:951 +msgid "E567: no cscope connections" +msgstr "E567: không có kết nối với cscope" + +#: if_cscope.c:1025 +#, c-format +msgid "E259: no matches found for cscope query %s of %s" +msgstr "E259: không tìm thấy tương ứng với yêu cầu cscope %s cho %s" + +#: if_cscope.c:1082 +#, c-format +msgid "E469: invalid cscopequickfix flag %c for %c" +msgstr "E469: cờ cscopequickfix %c cho %c không chính xác" + +#: if_cscope.c:1152 +msgid "cscope commands:\n" +msgstr "các lệnh cscope:\n" + +#: if_cscope.c:1155 +#, c-format +msgid "%-5s: %-30s (Usage: %s)" +msgstr "%-5s: %-30s (Sử dụng: %s)" + +#: if_cscope.c:1253 +#, c-format +msgid "E625: cannot open cscope database: %s" +msgstr "E625: không mở được cơ sở dữ liệu cscope: %s" + +#: if_cscope.c:1271 +msgid "E626: cannot get cscope database information" +msgstr "E626: không lấy được thông tin về cơ sở dữ liệu cscope" + +#: if_cscope.c:1296 +msgid "E568: duplicate cscope database not added" +msgstr "E568: cơ sở dữ liệu này của cscope đã được gắn vào từ trước" + +#: if_cscope.c:1307 +msgid "E569: maximum number of cscope connections reached" +msgstr "E569: đã đạt tới số kết nối lớn nhất cho phép với cscope" + +#: if_cscope.c:1424 +#, c-format +msgid "E261: cscope connection %s not found" +msgstr "E261: kết nối với cscope %s không được tìm thấy" + +#: if_cscope.c:1458 +#, c-format +msgid "cscope connection %s closed" +msgstr "kết nối %s với cscope đã bị đóng" + +#. should not reach here +#: if_cscope.c:1598 +msgid "E570: fatal error in cs_manage_matches" +msgstr "E570: lỗi nặng trong cs_manage_matches" + +#: if_cscope.c:1848 +#, c-format +msgid "Cscope tag: %s" +msgstr "Thẻ ghi cscope: %s" + +#: if_cscope.c:1870 +msgid "" +"\n" +" # line" +msgstr "" +"\n" +" # dòng" + +#: if_cscope.c:1872 +msgid "filename / context / line\n" +msgstr "tên tập tin / nội dung / dòng\n" + +#: if_cscope.c:1990 +#, c-format +msgid "E609: Cscope error: %s" +msgstr "E609: Lỗi cscope: %s" + +#: if_cscope.c:2176 +msgid "All cscope databases reset" +msgstr "Khởi động lại tất cả cơ sở dữ liệu cscope" + +#: if_cscope.c:2244 +msgid "no cscope connections\n" +msgstr "không có kết nối với cscope\n" + +#: if_cscope.c:2248 +msgid " # pid database name prepend path\n" +msgstr " # pid tên cơ sở dữ liệu đường dẫn ban đầu\n" + +#: if_python.c:436 +msgid "" +"E263: Sorry, this command is disabled, the Python library could not be " +"loaded." +msgstr "" +"E263: Rất tiếc câu lệnh này không làm việc, vì thư viện Python chưa được nạp." + +#: if_python.c:500 +msgid "E659: Cannot invoke Python recursively" +msgstr "E659: Không thể gọi Python một cách đệ quy" + +#: if_python.c:701 +msgid "can't delete OutputObject attributes" +msgstr "Không xóa được thuộc tính OutputObject" + +#: if_python.c:708 +msgid "softspace must be an integer" +msgstr "giá trị softspace phải là một số nguyên" + +#: if_python.c:716 +msgid "invalid attribute" +msgstr "thuộc tính không đúng" + +#: if_python.c:755 if_python.c:769 +msgid "writelines() requires list of strings" +msgstr "writelines() yêu cầu một danh sách các chuỗi" + +#: if_python.c:895 +msgid "E264: Python: Error initialising I/O objects" +msgstr "E264: Python: Lỗi khi bắt đầu sử dụng vật thể I/O" + +#: if_python.c:1080 if_tcl.c:1402 +msgid "invalid expression" +msgstr "biểu thức không đúng" + +#: if_python.c:1094 if_tcl.c:1407 +msgid "expressions disabled at compile time" +msgstr "biểu thức bị tắt khi biên dịch" + +#: if_python.c:1107 +msgid "attempt to refer to deleted buffer" +msgstr "cố chỉ đến bộ đệm đã bị xóa" + +#: if_python.c:1122 if_python.c:1163 if_python.c:1227 if_tcl.c:1214 +msgid "line number out of range" +msgstr "số thứ tự của dòng vượt quá giới hạn" + +#: if_python.c:1362 +#, c-format +msgid "" +msgstr "" + +#: if_python.c:1453 if_tcl.c:836 +msgid "invalid mark name" +msgstr "tên dấu hiệu không đúng" + +#: if_python.c:1733 +msgid "no such buffer" +msgstr "không có bộ đệm như vậy" + +#: if_python.c:1821 +msgid "attempt to refer to deleted window" +msgstr "cố chỉ đến cửa sổ đã bị đóng" + +#: if_python.c:1866 +msgid "readonly attribute" +msgstr "thuộc tính chỉ đọc" + +#: if_python.c:1879 +msgid "cursor position outside buffer" +msgstr "vị trí con trỏ nằm ngoài bộ đệm" + +#: if_python.c:1956 +#, c-format +msgid "" +msgstr "" + +#: if_python.c:1968 +#, c-format +msgid "" +msgstr "" + +#: if_python.c:1970 +#, c-format +msgid "" +msgstr "" + +#: if_python.c:2046 +msgid "no such window" +msgstr "không có cửa sổ như vậy" + +#: if_python.c:2307 if_python.c:2341 if_python.c:2396 if_python.c:2464 +#: if_python.c:2586 if_python.c:2638 if_tcl.c:684 if_tcl.c:729 if_tcl.c:803 +#: if_tcl.c:873 if_tcl.c:1999 +msgid "cannot save undo information" +msgstr "không ghi được thông tin về việc hủy thao tác" + +#: if_python.c:2309 if_python.c:2403 if_python.c:2475 +msgid "cannot delete line" +msgstr "không xóa được dòng" + +#: if_python.c:2346 if_python.c:2491 if_tcl.c:690 if_tcl.c:2021 +msgid "cannot replace line" +msgstr "không thay thế được dòng" + +#: if_python.c:2509 if_python.c:2588 if_python.c:2646 +msgid "cannot insert line" +msgstr "không chèn được dòng" + +#: if_python.c:2750 +msgid "string cannot contain newlines" +msgstr "chuỗi không thể chứa ký tự dòng mới" + +#: if_ruby.c:422 +msgid "" +"E266: Sorry, this command is disabled, the Ruby library could not be loaded." +msgstr "" +"E266: Rất tiếc câu lệnh này không làm việc, vì thư viện Ruby chưa đượcnạp." + +#: if_ruby.c:485 +#, c-format +msgid "E273: unknown longjmp status %d" +msgstr "E273: không rõ trạng thái của longjmp %d" + +#: if_sniff.c:67 +msgid "Toggle implementation/definition" +msgstr "Bật tắt giữa thi hành/định nghĩa" + +#: if_sniff.c:68 +msgid "Show base class of" +msgstr "Hiển thị hạng cơ bản của" + +#: if_sniff.c:69 +msgid "Show overridden member function" +msgstr "Hiển thị hàm số bị nạp đè lên" + +#: if_sniff.c:70 +msgid "Retrieve from file" +msgstr "Nhận từ tập tin" + +#: if_sniff.c:71 +msgid "Retrieve from project" +msgstr "Nhận từ dự án" + +#: if_sniff.c:73 +msgid "Retrieve from all projects" +msgstr "Nhận từ tất cả các dự án" + +#: if_sniff.c:74 +msgid "Retrieve" +msgstr "Nhận" + +#: if_sniff.c:75 +msgid "Show source of" +msgstr "Hiển thị mã nguồn" + +#: if_sniff.c:76 +msgid "Find symbol" +msgstr "Tìm ký hiệu" + +#: if_sniff.c:77 +msgid "Browse class" +msgstr "Duyệt hạng" + +#: if_sniff.c:78 +msgid "Show class in hierarchy" +msgstr "Hiển thị hạng trong hệ thống cấp bậc" + +#: if_sniff.c:79 +msgid "Show class in restricted hierarchy" +msgstr "Hiển thị hạng trong hệ thống cấp bậc giới hạn" + +#: if_sniff.c:80 +msgid "Xref refers to" +msgstr "Xref chỉ đến" + +#: if_sniff.c:81 +msgid "Xref referred by" +msgstr "Liên kết đến xref từ" + +#: if_sniff.c:82 +msgid "Xref has a" +msgstr "Xref có một" + +#: if_sniff.c:83 +msgid "Xref used by" +msgstr "Xref được sử dụng bởi" + +#: if_sniff.c:84 +msgid "Show docu of" +msgstr "Hiển thị docu của" + +#: if_sniff.c:85 +msgid "Generate docu for" +msgstr "Tạo docu cho" + +#: if_sniff.c:97 +msgid "" +"Cannot connect to SNiFF+. Check environment (sniffemacs must be found in " +"$PATH).\n" +msgstr "" +"Không kết nối được tới SNiFF+. Hãy kiểm tra cấu hình môi trường." +"(sniffemacs phải được chỉ ra trong biến $PATH).\n" + +#: if_sniff.c:425 +msgid "E274: Sniff: Error during read. Disconnected" +msgstr "E274: Sniff: Lỗi trong thời gian đọc. Ngắt kết nối" + +#: if_sniff.c:553 +msgid "SNiFF+ is currently " +msgstr "Trong thời điểm hiện nay SNiFF+ " + +#: if_sniff.c:555 +msgid "not " +msgstr "không " + +#: if_sniff.c:556 +msgid "connected" +msgstr "được kết nối" + +#: if_sniff.c:592 +#, c-format +msgid "E275: Unknown SNiFF+ request: %s" +msgstr "E275: không rõ yêu cầu của SNiFF+: %s" + +#: if_sniff.c:605 +msgid "E276: Error connecting to SNiFF+" +msgstr "E276: Lỗi kết nối với SNiFF+" + +#: if_sniff.c:1009 +msgid "E278: SNiFF+ not connected" +msgstr "E278: SNiFF+ chưa được kết nối" + +#: if_sniff.c:1018 +msgid "E279: Not a SNiFF+ buffer" +msgstr "E279: Đây không phải là bộ đệm SNiFF+" + +#: if_sniff.c:1083 +msgid "Sniff: Error during write. Disconnected" +msgstr "Sniff: Lỗi trong thời gian ghi nhớ. Ngắt kết nối" + +#: if_tcl.c:418 +msgid "invalid buffer number" +msgstr "số của bộ đệm không đúng" + +#: if_tcl.c:464 if_tcl.c:931 if_tcl.c:1110 +msgid "not implemented yet" +msgstr "tạm thời chưa được thực thi" + +#: if_tcl.c:501 +msgid "unknown option" +msgstr "tùy chọn không rõ" + +#. ??? +#: if_tcl.c:774 +msgid "cannot set line(s)" +msgstr "không thể đặt (các) dòng" + +#: if_tcl.c:845 +msgid "mark not set" +msgstr "dấu hiệu chưa được đặt" + +#: if_tcl.c:851 if_tcl.c:1066 +#, c-format +msgid "row %d column %d" +msgstr "hàng %d cột %d" + +#: if_tcl.c:881 +msgid "cannot insert/append line" +msgstr "không thể chèn hoặc thêm dòng" + +#: if_tcl.c:1268 +msgid "unknown flag: " +msgstr "cờ không biết: " + +#: if_tcl.c:1338 +msgid "unknown vimOption" +msgstr "không rõ tùy chọn vimOption" + +#: if_tcl.c:1423 +msgid "keyboard interrupt" +msgstr "sự gián đoạn của bàn phím" + +#: if_tcl.c:1428 +msgid "vim error" +msgstr "lỗi của vim" + +#: if_tcl.c:1471 +msgid "cannot create buffer/window command: object is being deleted" +msgstr "không tạo được câu lệnh của bộ đệm hay của cửa sổ: vật thể đang bị xóa" + +#: if_tcl.c:1545 +msgid "" +"cannot register callback command: buffer/window is already being deleted" +msgstr "" +"không đăng ký được câu lệnh gọi ngược: bộ đệm hoặc cửa sổ đang bị xóa" + +#. This should never happen. Famous last word? +#: if_tcl.c:1562 +msgid "" +"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim." +"org" +msgstr "" +"E280: LỖI NẶNG CỦA TCL: bị hỏng danh sách liên kết!? Hãy thông báo việc này" +"đến danh sách thư (mailing list) vim-dev@vim.org" + +#: if_tcl.c:1563 +msgid "cannot register callback command: buffer/window reference not found" +msgstr "" +"không đăng ký được câu lệnh gọi ngược: không tìm thấy liên kết đến bộ đệm " +"hoặc cửa sổ" + +#: if_tcl.c:1724 +msgid "" +"E571: Sorry, this command is disabled: the Tcl library could not be loaded." +msgstr "" +"E571: Rất tiếc là câu lệnh này không làm việc, vì thư viện Tcl chưa được nạp" + +#: if_tcl.c:1886 +msgid "" +"E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim.org" +msgstr "" +"E281: LỖI TCL: mã thoát ra không phải là một số nguyên!? Hãy thông báo điều " +"này đến danh sách thư (mailing list) vim-dev@vim.org" + +#: if_tcl.c:2007 +msgid "cannot get line" +msgstr "không nhận được dòng" + +#: if_xcmdsrv.c:225 +msgid "Unable to register a command server name" +msgstr "Không đăng ký được một tên cho máy chủ câu lệnh" + +#: if_xcmdsrv.c:473 +msgid "E248: Failed to send command to the destination program" +msgstr "E248: Gửi câu lệnh vào chương trình khác không thành công" + +#: if_xcmdsrv.c:747 +#, c-format +msgid "E573: Invalid server id used: %s" +msgstr "E573: Sử dụng id máy chủ không đúng: %s" + +#: if_xcmdsrv.c:1110 +msgid "E251: VIM instance registry property is badly formed. Deleted!" +msgstr "E251: Thuộc tính đăng ký của Vim được định dạng không đúng. Xóa!" + +#: main.c:60 +msgid "Unknown option" +msgstr "Tùy chọn không biết" + +#: main.c:62 +msgid "Too many edit arguments" +msgstr "Có quá nhiều tham số soạn thảo" + +#: main.c:64 +msgid "Argument missing after" +msgstr "Thiếu tham số sau" + +#: main.c:66 +msgid "Garbage after option" +msgstr "Rác sau tùy chọn" + +#: main.c:68 +msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments" +msgstr "" +"Quá nhiều tham số \"+câu lệnh\", \"-c câu lệnh\" hoặc \"--cmd câu lệnh\"" + +#: main.c:70 +msgid "Invalid argument for" +msgstr "Tham số không được phép cho" + +#: main.c:466 +msgid "This Vim was not compiled with the diff feature." +msgstr "Vim không được biên dịch với tính năng hỗ trợ xem khác biệt (diff)." + +#: main.c:932 +msgid "Attempt to open script file again: \"" +msgstr "Thử mở tập tin script một lần nữa: \"" + +#: main.c:941 +msgid "Cannot open for reading: \"" +msgstr "Không mở để đọc được: \"" + +#: main.c:985 +msgid "Cannot open for script output: \"" +msgstr "Không mở cho đầu ra script được: \"" + +#: main.c:1132 +#, c-format +msgid "%d files to edit\n" +msgstr "%d tập tin để soạn thảo\n" + +#: main.c:1233 +msgid "Vim: Warning: Output is not to a terminal\n" +msgstr "Vim: Cảnh báo: Đầu ra không hướng tới một terminal\n" + +#: main.c:1235 +msgid "Vim: Warning: Input is not from a terminal\n" +msgstr "Vim: Cảnh báo: Đầu vào không phải đến từ một terminal\n" + +#. just in case.. +#: main.c:1297 +msgid "pre-vimrc command line" +msgstr "dòng lệnh trước khi thực hiện vimrc" + +#: main.c:1338 +#, c-format +msgid "E282: Cannot read from \"%s\"" +msgstr "E282: Không đọc được từ \"%s\"" + +#: main.c:2411 +msgid "" +"\n" +"More info with: \"vim -h\"\n" +msgstr "" +"\n" +"Xem thông tin chi tiết với: \"vim -h\"\n" + +#: main.c:2444 +msgid "[file ..] edit specified file(s)" +msgstr "[tập tin ..] soạn thảo (các) tập tin chỉ ra" + +#: main.c:2445 +msgid "- read text from stdin" +msgstr "- đọc văn bản từ đầu vào stdin" + +#: main.c:2446 +msgid "-t tag edit file where tag is defined" +msgstr "-t thẻ ghi soạn thảo tập tin từ chỗ thẻ ghi chỉ ra" + +#: main.c:2448 +msgid "-q [errorfile] edit file with first error" +msgstr "-q [tập tin lỗi] soạn thảo tập tin với lỗi đầu tiên" + +#: main.c:2457 +msgid "" +"\n" +"\n" +"usage:" +msgstr "" +"\n" +"\n" +"Sử dụng:" + +#: main.c:2460 +msgid " vim [arguments] " +msgstr " vim [các tham số] " + +#: main.c:2464 +msgid "" +"\n" +" or:" +msgstr "" +"\n" +" hoặc:" + +#: main.c:2467 +msgid "" +"\n" +"\n" +"Arguments:\n" +msgstr "" +"\n" +"\n" +"Tham số:\n" + +#: main.c:2468 +msgid "--\t\t\tOnly file names after this" +msgstr "--\t\t\tSau tham số chỉ đưa ra tên tập tin" + +#: main.c:2470 +msgid "--literal\t\tDon't expand wildcards" +msgstr "--literal\t\tKhông thực hiện việc mở rộng wildcard" + +#: main.c:2473 +msgid "-register\t\tRegister this gvim for OLE" +msgstr "-register\t\tĐăng ký gvim này cho OLE" + +#: main.c:2474 +msgid "-unregister\t\tUnregister gvim for OLE" +msgstr "-unregister\t\tBỏ đăng ký gvim này cho OLE" + +#: main.c:2477 +msgid "-g\t\t\tRun using GUI (like \"gvim\")" +msgstr "-g\t\t\tSử dụng giao diện đồ họa GUI (giống \"gvim\")" + +#: main.c:2478 +msgid "-f or --nofork\tForeground: Don't fork when starting GUI" +msgstr "-f hoặc --nofork\tTrong chương trình hoạt động: Không thực hiện fork khi chạy GUI" + +#: main.c:2480 +msgid "-v\t\t\tVi mode (like \"vi\")" +msgstr "-v\t\t\tChế độ Vi (giống \"vi\")" + +#: main.c:2481 +msgid "-e\t\t\tEx mode (like \"ex\")" +msgstr "-e\t\t\tChế độ Ex (giống \"ex\")" + +#: main.c:2482 +msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")" +msgstr "-s\t\t\tChế độ ít đưa thông báo (gói) (chỉ dành cho \"ex\")" + +#: main.c:2484 +msgid "-d\t\t\tDiff mode (like \"vimdiff\")" +msgstr "-d\t\t\tChế độ khác biệt, diff (giống \"vimdiff\")" + +#: main.c:2486 +msgid "-y\t\t\tEasy mode (like \"evim\", modeless)" +msgstr "-y\t\t\tChế độ đơn giản (giống \"evim\", không có chế độ)" + +#: main.c:2487 +msgid "-R\t\t\tReadonly mode (like \"view\")" +msgstr "-R\t\t\tChế độ chỉ đọc (giống \"view\")" + +#: main.c:2488 +msgid "-Z\t\t\tRestricted mode (like \"rvim\")" +msgstr "-Z\t\t\tChế độ hạn chế (giống \"rvim\")" + +#: main.c:2489 +msgid "-m\t\t\tModifications (writing files) not allowed" +msgstr "-m\t\t\tKhông có khả năng ghi nhớ thay đổi (ghi nhớ tập tin)" + +#: main.c:2490 +msgid "-M\t\t\tModifications in text not allowed" +msgstr "-M\t\t\tKhông có khả năng thay đổi văn bản" + +#: main.c:2491 +msgid "-b\t\t\tBinary mode" +msgstr "-b\t\t\tChế độ nhị phân (binary)" + +#: main.c:2493 +msgid "-l\t\t\tLisp mode" +msgstr "-l\t\t\tChế độ Lisp" + +#: main.c:2495 +msgid "-C\t\t\tCompatible with Vi: 'compatible'" +msgstr "-C\t\t\tChế độ tương thích với Vi: 'compatible'" + +#: main.c:2496 +msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'" +msgstr "-N\t\t\tChế độ không tương thích hoàn toàn với Vi: 'nocompatible'" + +#: main.c:2497 +msgid "-V[N]\t\tVerbose level" +msgstr "-V[N]\t\tMức độ chi tiết của thông báo" + +#: main.c:2498 +msgid "-D\t\t\tDebugging mode" +msgstr "-D\t\t\tChế độ sửa lỗi (debug)" + +#: main.c:2499 +msgid "-n\t\t\tNo swap file, use memory only" +msgstr "-n\t\t\tKhông sử dụng tập tin swap, chỉ sử dụng bộ nhớ" + +#: main.c:2500 +msgid "-r\t\t\tList swap files and exit" +msgstr "-r\t\t\tLiệt kê các tập tin swap rồi thoát" + +#: main.c:2501 +msgid "-r (with file name)\tRecover crashed session" +msgstr "-r (với tên tập tin)\tPhục hồi lần soạn thảo gặp sự cố" + +#: main.c:2502 +msgid "-L\t\t\tSame as -r" +msgstr "-L\t\t\tGiống với -r" + +#: main.c:2504 +msgid "-f\t\t\tDon't use newcli to open window" +msgstr "-f\t\t\tKhông sử dụng newcli để mở cửa sổ" + +#: main.c:2505 +msgid "-dev \t\tUse for I/O" +msgstr "-dev \t\tSử dụng cho I/O" + +#: main.c:2508 +msgid "-A\t\t\tstart in Arabic mode" +msgstr "-A\t\t\tKhởi động vào chế độ Ả Rập" + +#: main.c:2511 +msgid "-H\t\t\tStart in Hebrew mode" +msgstr "-H\t\t\tKhởi động vào chế độ Do thái" + +#: main.c:2514 +msgid "-F\t\t\tStart in Farsi mode" +msgstr "-F\t\t\tKhởi động vào chế độ Farsi" + +#: main.c:2516 +msgid "-T \tSet terminal type to " +msgstr "-T \tĐặt loại terminal thành " + +#: main.c:2517 +msgid "-u \t\tUse instead of any .vimrc" +msgstr "-u \t\tSử dụng thay thế cho mọi .vimrc" + +#: main.c:2519 +msgid "-U \t\tUse instead of any .gvimrc" +msgstr "-U \t\tSử dụng thay thế cho mọi .gvimrc" + +#: main.c:2521 +msgid "--noplugin\t\tDon't load plugin scripts" +msgstr "--noplugin\t\tKhông nạp bất kỳ script môđun nào" + +#: main.c:2522 +msgid "-o[N]\t\tOpen N windows (default: one for each file)" +msgstr "-o[N]\t\tMở N cửa sổ (theo mặc định: mỗi cửa sổ cho một tập tin)" + +#: main.c:2523 +msgid "-O[N]\t\tLike -o but split vertically" +msgstr "-O[N]\t\tGiống với -o nhưng phân chia theo đường thẳng đứng" + +#: main.c:2524 +msgid "+\t\t\tStart at end of file" +msgstr "+\t\t\tBắt đầu soạn thảo từ cuối tập tin" + +#: main.c:2525 +msgid "+\t\tStart at line " +msgstr "+\t\tBắt đầu soạn thảo từ dòng thứ (số thứ tự của dòng)" + +#: main.c:2527 +msgid "--cmd \tExecute before loading any vimrc file" +msgstr "--cmd \tThực hiện trước khi nạp tập tin vimrc" + +#: main.c:2529 +msgid "-c \t\tExecute after loading the first file" +msgstr "-c \t\tThực hiện sau khi nạp tập tin đầu tiên" + +#: main.c:2530 +msgid "-S \t\tSource file after loading the first file" +msgstr "-S \t\tThực hiện sau khi nạp tập tin đầu tiên" + +#: main.c:2531 +msgid "-s \tRead Normal mode commands from file " +msgstr "-s \tĐọc các lệnh của chế độ Thông thường từ tập tin " + +#: main.c:2532 +msgid "-w \tAppend all typed commands to file " +msgstr "-w \tThêm tất cả các lệnh đã gõ vào tập tin " + +#: main.c:2533 +msgid "-W \tWrite all typed commands to file " +msgstr "-W \tGhi nhớ tất cả các lệnh đã gõ vào tập tin " + +#: main.c:2535 +msgid "-x\t\t\tEdit encrypted files" +msgstr "-x\t\t\tSoạn thảo tập tin đã mã hóa" + +#: main.c:2539 +msgid "-display \tConnect vim to this particular X-server" +msgstr "-display \tKết nối vim tới máy chủ X đã chỉ ra" + +#: main.c:2541 +msgid "-X\t\t\tDo not connect to X server" +msgstr "-X\t\t\tKhông thực hiện việc kết nối tới máy chủ X" + +#: main.c:2544 +msgid "--remote \tEdit in a Vim server if possible" +msgstr "--remote \tSoạn thảo trên máy chủ Vim nếu có thể" + +#: main.c:2545 +msgid "--remote-silent Same, don't complain if there is no server" +msgstr "--remote-silent Cũng vậy, nhưng không kêu ca dù không có máy chủ" + +#: main.c:2546 +msgid "" +"--remote-wait As --remote but wait for files to have been edited" +msgstr "" +"--remote-wait Cũng như --remote, nhưng chờ sự kết thúc" + +#: main.c:2547 +msgid "" +"--remote-wait-silent Same, don't complain if there is no server" +msgstr "" +"--remote-wait-silent Cũng vậy, nhưng không kêu ca dù không có máy chủ" + +#: main.c:2548 +msgid "--remote-send \tSend to a Vim server and exit" +msgstr "--remote-send \tGửi lên máy chủ Vim và thoát" + +#: main.c:2549 +msgid "--remote-expr \tEvaluate in a Vim server and print result" +msgstr "--remote-expr \tTính trên máy chủ Vim và in ra kết quả" + +#: main.c:2550 +msgid "--serverlist\t\tList available Vim server names and exit" +msgstr "--serverlist\t\tHiển thị danh sách máy chủ Vim và thoát" + +#: main.c:2551 +msgid "--servername \tSend to/become the Vim server " +msgstr "" +"--servername \tGửi lên (hoặc trở thành) máy chủ Vim với " + +#: main.c:2554 +msgid "-i \t\tUse instead of .viminfo" +msgstr "-i \t\tSử dụng tập tin thay cho .viminfo" + +#: main.c:2556 +msgid "-h or --help\tPrint Help (this message) and exit" +msgstr "-h hoặc --help\tHiển thị Trợ giúp (thông tin này) và thoát" + +#: main.c:2557 +msgid "--version\t\tPrint version information and exit" +msgstr "--version\t\tĐưa ra thông tin về phiên bản Vim và thoát" + +#: main.c:2561 +msgid "" +"\n" +"Arguments recognised by gvim (Motif version):\n" +msgstr "" +"\n" +"Tham số cho gvim (phiên bản Motif):\n" + +#: main.c:2565 +msgid "" +"\n" +"Arguments recognised by gvim (neXtaw version):\n" +msgstr "" +"\n" +"Tham số cho gvim (phiên bản neXtaw):\n" + +#: main.c:2567 +msgid "" +"\n" +"Arguments recognised by gvim (Athena version):\n" +msgstr "" +"\n" +"Tham số cho gvim (phiên bản Athena):\n" + +#: main.c:2571 +msgid "-display \tRun vim on " +msgstr "-display \tChạy vim trong đã chỉ ra" + +#: main.c:2572 +msgid "-iconic\t\tStart vim iconified" +msgstr "-iconic\t\tChạy vim ở dạng thu nhỏ" + +#: main.c:2574 +msgid "-name \t\tUse resource as if vim was " +msgstr "-name \t\tSử dụng tài nguyên giống như khi vim có " + +#: main.c:2575 +msgid "\t\t\t (Unimplemented)\n" +msgstr "\t\t\t (Chưa được thực thi)\n" + +#: main.c:2577 +msgid "-background \tUse for the background (also: -bg)" +msgstr "-background \tSử dụng chỉ ra cho nền (cũng như: -bg)" + +#: main.c:2578 +msgid "-foreground \tUse for normal text (also: -fg)" +msgstr "-foreground \tSử dụng cho văn bản thông thường (cũng như: -fg)" + +#: main.c:2579 main.c:2599 +msgid "-font \t\tUse for normal text (also: -fn)" +msgstr "-font \t\tSử dụng chữ cho văn bản thông thường (cũng như: -fn)" + +#: main.c:2580 +msgid "-boldfont \tUse for bold text" +msgstr "-boldfont \tSử dụng chữ cho văn bản in đậm" + +#: main.c:2581 +msgid "-italicfont \tUse for italic text" +msgstr "-italicfont \tSử dụng chữ cho văn bản in nghiêng" + +#: main.c:2582 main.c:2600 +msgid "-geometry \tUse for initial geometry (also: -geom)" +msgstr "" +"-geometry \tSử dụng ban đầu (cũng như: -geom)" + +#: main.c:2583 +msgid "-borderwidth \tUse a border width of (also: -bw)" +msgstr "-borderwidth \tSử dụng đường viền có chiều (cũng như: -bw)" + +#: main.c:2584 +msgid "-scrollbarwidth Use a scrollbar width of (also: -sw)" +msgstr "" +"-scrollbarwidth Sử dụng thanh cuộn với chiều (cũng như: -sw)" + +#: main.c:2586 +msgid "-menuheight \tUse a menu bar height of (also: -mh)" +msgstr "-menuheight \tSử dụng thanh trình đơn với chiều (cũng như: -mh)" + +#: main.c:2588 main.c:2601 +msgid "-reverse\t\tUse reverse video (also: -rv)" +msgstr "-reverse\t\tSử dụng chế độ video đảo ngược (cũng như: -rv)" + +#: main.c:2589 +msgid "+reverse\t\tDon't use reverse video (also: +rv)" +msgstr "+reverse\t\tKhông sử dụng chế độ video đảo ngược (cũng như: +rv)" + +#: main.c:2590 +msgid "-xrm \tSet the specified resource" +msgstr "-xrm \tĐặt chỉ ra" + +#: main.c:2593 +msgid "" +"\n" +"Arguments recognised by gvim (RISC OS version):\n" +msgstr "" +"\n" +"Tham số cho gvim (phiên bản RISC OS):\n" + +#: main.c:2594 +msgid "--columns \tInitial width of window in columns" +msgstr "--columns \tChiều rộng ban đầu của cửa sổ tính theo số cột" + +#: main.c:2595 +msgid "--rows \tInitial height of window in rows" +msgstr "--rows \tChiều cao ban đầu của cửa sổ tính theo số dòng" + +#: main.c:2598 +msgid "" +"\n" +"Arguments recognised by gvim (GTK+ version):\n" +msgstr "" +"\n" +"Tham số cho gvim (phiên bản GTK+):\n" + +#: main.c:2602 +msgid "-display \tRun vim on (also: --display)" +msgstr "" +"-display \tChạy vim trên chỉ ra (cũng như: --display)" + +#: main.c:2604 +msgid "--role \tSet a unique role to identify the main window" +msgstr "--role \tĐặt duy nhất để nhận diện cửa sổ chính" + +#: main.c:2606 +msgid "--socketid \tOpen Vim inside another GTK widget" +msgstr "--socketid \tMở Vim bên trong thành phần GTK khác" + +#: main.c:2609 +msgid "-P \tOpen Vim inside parent application" +msgstr "-P \tMở Vim bên trong ứng dụng mẹ" + +#: main.c:2847 +msgid "No display" +msgstr "Không có màn hình" + +#. Failed to send, abort. +#: main.c:2862 +msgid ": Send failed.\n" +msgstr ": Gửi không thành công.\n" + +#. Let vim start normally. +#: main.c:2868 +msgid ": Send failed. Trying to execute locally\n" +msgstr ": Gửi không thành công. Thử thực hiện nội bộ\n" + +#: main.c:2906 main.c:2927 +#, c-format +msgid "%d of %d edited" +msgstr "đã soạn thảo %d từ %d" + +#: main.c:2949 +msgid "No display: Send expression failed.\n" +msgstr "Không có màn hình: gửi biểu thức không thành công.\n" + +#: main.c:2961 +msgid ": Send expression failed.\n" +msgstr ": Gửi biểu thức không thành công.\n" + +#: mark.c:709 +msgid "No marks set" +msgstr "Không có dấu hiệu nào được đặt." + +#: mark.c:711 +#, c-format +msgid "E283: No marks matching \"%s\"" +msgstr "E283: Không có dấu hiệu tương ứng với \"%s\"" + +#. Highlight title +#: mark.c:722 +msgid "" +"\n" +"mark line col file/text" +msgstr "" +"\n" +"nhãn dòng cột tập tin/văn bản" + +#. Highlight title +#: mark.c:760 +msgid "" +"\n" +" jump line col file/text" +msgstr "" +"\n" +"bước_nhảy dòng cột tập tin/văn bản" + +#. Highlight title +#: mark.c:805 +msgid "" +"\n" +"change line col text" +msgstr "" +"\n" +"thay đổi dòng cột văn bản" + +#: mark.c:1281 +#, c-format +msgid "" +"\n" +"# File marks:\n" +msgstr "" +"\n" +"# Nhãn của tập tin:\n" + +#. Write the jumplist with -' +#: mark.c:1316 +#, c-format +msgid "" +"\n" +"# Jumplist (newest first):\n" +msgstr "" +"\n" +"# Danh sách bước nhảy (mới hơn đứng trước):\n" + +#: mark.c:1412 +#, c-format +msgid "" +"\n" +"# History of marks within files (newest to oldest):\n" +msgstr "" +"\n" +"# Lịch sử các nhãn trong tập tin (từ mới nhất đến cũ nhất):\n" + +#: mark.c:1501 +msgid "Missing '>'" +msgstr "Thiếu '>'" + +#: mbyte.c:467 +msgid "E543: Not a valid codepage" +msgstr "E543: Bảng mã không cho phép" + +#: mbyte.c:4431 +msgid "E284: Cannot set IC values" +msgstr "E284: Không đặt được giá trị nội dung nhập vào (IC)" + +#: mbyte.c:4583 +msgid "E285: Failed to create input context" +msgstr "E285: Không tạo được nội dung nhập vào" + +#: mbyte.c:4741 +msgid "E286: Failed to open input method" +msgstr "E286: Việc thử mở phương pháp nhập không thành công" + +#: mbyte.c:4752 +msgid "E287: Warning: Could not set destroy callback to IM" +msgstr "" +"E287: Cảnh báo: không đặt được sự gọi ngược hủy diệt thành phương pháp nhập" + +#: mbyte.c:4758 +msgid "E288: input method doesn't support any style" +msgstr "E288: phương pháp nhập không hỗ trợ bất kỳ phong cách (style) nào" + +#: mbyte.c:4815 +msgid "E289: input method doesn't support my preedit type" +msgstr "E289: phương pháp nhập không hỗ trợ loại soạn thảo trước của Vim" + +#: mbyte.c:4889 +msgid "E290: over-the-spot style requires fontset" +msgstr "E290: phong cách over-the-spot yêu cầu một bộ phông chữ" + +#: mbyte.c:4925 +msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled" +msgstr "E291: GTK+ cũ hơn 1.2.3. Vùng chỉ trạng thái không làm việc" + +#: mbyte.c:5232 +msgid "E292: Input Method Server is not running" +msgstr "E292: Máy chủ phương pháp nhập liệu chưa được chạy" + +#: memfile.c:488 +msgid "E293: block was not locked" +msgstr "E293: khối chưa bị khóa" + +#: memfile.c:1005 +msgid "E294: Seek error in swap file read" +msgstr "E294: Lỗi tìm kiếm khi đọc tập tin trao đổi (swap)" + +#: memfile.c:1010 +msgid "E295: Read error in swap file" +msgstr "E295: Lỗi đọc tập tin trao đổi (swap)" + +#: memfile.c:1062 +msgid "E296: Seek error in swap file write" +msgstr "E296: Lỗi tìm kiếm khi ghi nhớ tập tin trao đổi (swap)" + +#: memfile.c:1080 +msgid "E297: Write error in swap file" +msgstr "E295: Lỗi ghi nhớ tập tin trao đổi (swap)" + +#: memfile.c:1277 +msgid "E300: Swap file already exists (symlink attack?)" +msgstr "" +"E300: Tập tin trao đổi (swap) đã tồn tại (sử dụng liên kết mềm tấn công?)" + +#: memline.c:275 +msgid "E298: Didn't get block nr 0?" +msgstr "E298: Chưa lấy khối số 0?" + +#: memline.c:315 +msgid "E298: Didn't get block nr 1?" +msgstr "E298: Chưa lấy khối số 12?" + +#: memline.c:333 +msgid "E298: Didn't get block nr 2?" +msgstr "E298: Chưa lấy khối số 2?" + +#. could not (re)open the swap file, what can we do???? +#: memline.c:443 +msgid "E301: Oops, lost the swap file!!!" +msgstr "E301: Ối, mất tập tin trao đổi (swap)!!!" + +#: memline.c:448 +msgid "E302: Could not rename swap file" +msgstr "E302: Không đổi được tên tập tin trao đổi (swap)" + +#: memline.c:518 +#, c-format +msgid "E303: Unable to open swap file for \"%s\", recovery impossible" +msgstr "" +"E303: Không mở được tập tin trao đổi (swap) cho \"%s\", nên không thể phục hồi" + +#: memline.c:617 +msgid "E304: ml_timestamp: Didn't get block 0??" +msgstr "E304: ml_timestamp: Chưa lấy khối số 0??" + +#: memline.c:757 +#, c-format +msgid "E305: No swap file found for %s" +msgstr "E305: Không tìm thấy tập tin trao đổi (swap) cho %s" + +#: memline.c:767 +msgid "Enter number of swap file to use (0 to quit): " +msgstr "Hãy nhập số của tập tin trao đổi (swap) muốn sử dụng (0 để thoát): " + +#: memline.c:812 +#, c-format +msgid "E306: Cannot open %s" +msgstr "E306: Không mở được %s" + +#: memline.c:834 +msgid "Unable to read block 0 from " +msgstr "Không thể đọc khối số 0 từ " + +#: memline.c:837 +msgid "" +"\n" +"Maybe no changes were made or Vim did not update the swap file." +msgstr "" +"\n" +"Chưa có thay đổi nào hoặc Vim không thể cập nhật tập tin trao đổi (swap)" + +#: memline.c:847 memline.c:864 +msgid " cannot be used with this version of Vim.\n" +msgstr " không thể sử dụng trong phiên bản Vim này.\n" + +#: memline.c:849 +msgid "Use Vim version 3.0.\n" +msgstr "Hãy sử dụng Vim phiên bản 3.0.\n" + +#: memline.c:855 +#, c-format +msgid "E307: %s does not look like a Vim swap file" +msgstr "E307: %s không phải là tập tin trao đổi (swap) của Vim" + +#: memline.c:868 +msgid " cannot be used on this computer.\n" +msgstr " không thể sử dụng trên máy tính này.\n" + +#: memline.c:870 +msgid "The file was created on " +msgstr "Tập tin đã được tạo trên " + +#: memline.c:874 +msgid "" +",\n" +"or the file has been damaged." +msgstr "" +",\n" +"hoặc tập tin đã bị hỏng." + +#: memline.c:903 +#, c-format +msgid "Using swap file \"%s\"" +msgstr "Đang sử dụng tập tin trao đổi (swap) \"%s\"" + +#: memline.c:909 +#, c-format +msgid "Original file \"%s\"" +msgstr "Tập tin gốc \"%s\"" + +#: memline.c:922 +msgid "E308: Warning: Original file may have been changed" +msgstr "E308: Cảnh báo: Tập tin gốc có thể đã bị thay đổi" + +#: memline.c:975 +#, c-format +msgid "E309: Unable to read block 1 from %s" +msgstr "E309: Không đọc được khối số 1 từ %s" + +#: memline.c:979 +msgid "???MANY LINES MISSING" +msgstr "???THIẾU NHIỀU DÒNG" + +#: memline.c:995 +msgid "???LINE COUNT WRONG" +msgstr "???GIÁ TRỊ CỦA SỐ ĐẾM DÒNG BỊ SAI" + +#: memline.c:1002 +msgid "???EMPTY BLOCK" +msgstr "???KHỐI RỖNG" + +#: memline.c:1028 +msgid "???LINES MISSING" +msgstr "???THIẾU DÒNG" + +#: memline.c:1060 +#, c-format +msgid "E310: Block 1 ID wrong (%s not a .swp file?)" +msgstr "E310: Khối 1 ID sai (%s không phải là tập tin .swp?)" + +#: memline.c:1065 +msgid "???BLOCK MISSING" +msgstr "???THIẾU KHỐI" + +#: memline.c:1081 +msgid "??? from here until ???END lines may be messed up" +msgstr "??? từ đây tới ???CUỐI, các dòng có thể đã bị hỏng" + +#: memline.c:1097 +msgid "??? from here until ???END lines may have been inserted/deleted" +msgstr "??? từ đây tới ???CUỐI, các dòng có thể đã bị chèn hoặc xóa" + +#: memline.c:1117 +msgid "???END" +msgstr "???CUỐI" + +#: memline.c:1143 +msgid "E311: Recovery Interrupted" +msgstr "E311: Việc phục hồi bị gián đoạn" + +#: memline.c:1148 +msgid "" +"E312: Errors detected while recovering; look for lines starting with ???" +msgstr "" +"E312: Phát hiện ra lỗi trong khi phục hồi; hãy xem những dòng bắt đầu với ???" + +#: memline.c:1150 +msgid "See \":help E312\" for more information." +msgstr "Hãy xem thông tin bổ sung trong trợ giúp \":help E312\"" + +#: memline.c:1155 +msgid "Recovery completed. You should check if everything is OK." +msgstr "Việc phục hồi đã hoàn thành. Nên kiểm tra xem mọi thứ có ổn không." + +#: memline.c:1156 +msgid "" +"\n" +"(You might want to write out this file under another name\n" +msgstr "" +"\n" +"(Có thể ghi nhớ tập tin với tên khác và so sánh với tập\n" + +#: memline.c:1157 +msgid "and run diff with the original file to check for changes)\n" +msgstr "gốc bằng chương trình diff).\n" + +#: memline.c:1158 +msgid "" +"Delete the .swp file afterwards.\n" +"\n" +msgstr "" +"Sau đó hãy xóa tập tin .swp.\n" +"\n" + +#. use msg() to start the scrolling properly +#: memline.c:1214 +msgid "Swap files found:" +msgstr "Tìm thấy tập tin trao đổi (swap):" + +#: memline.c:1392 +msgid " In current directory:\n" +msgstr " Trong thư mục hiện thời:\n" + +#: memline.c:1394 +msgid " Using specified name:\n" +msgstr " Với tên chỉ ra:\n" + +#: memline.c:1398 +msgid " In directory " +msgstr " Trong thư mục " + +#: memline.c:1416 +msgid " -- none --\n" +msgstr " -- không --\n" + +#: memline.c:1488 +msgid " owned by: " +msgstr " người sở hữu: " + +#: memline.c:1490 +msgid " dated: " +msgstr " ngày: " + +#: memline.c:1494 memline.c:3684 +msgid " dated: " +msgstr " ngày: " + +#: memline.c:1510 +msgid " [from Vim version 3.0]" +msgstr " [từ Vim phiên bản 3.0]" + +#: memline.c:1514 +msgid " [does not look like a Vim swap file]" +msgstr " [không phải là tập tin trao đổi (swap) của Vim]" + +#: memline.c:1518 +msgid " file name: " +msgstr " tên tập tin: " + +#: memline.c:1524 +msgid "" +"\n" +" modified: " +msgstr "" +"\n" +" thay đổi: " + +#: memline.c:1525 +msgid "YES" +msgstr "CÓ" + +#: memline.c:1525 +msgid "no" +msgstr "không" + +#: memline.c:1529 +msgid "" +"\n" +" user name: " +msgstr "" +"\n" +" tên người dùng: " + +#: memline.c:1536 +msgid " host name: " +msgstr " tên máy: " + +#: memline.c:1538 +msgid "" +"\n" +" host name: " +msgstr "" +"\n" +" tên máy: " + +#: memline.c:1544 +msgid "" +"\n" +" process ID: " +msgstr "" +"\n" +" ID tiến trình: " + +#: memline.c:1550 +msgid " (still running)" +msgstr " (vẫn đang chạy)" + +#: memline.c:1562 +msgid "" +"\n" +" [not usable with this version of Vim]" +msgstr "" +"\n" +" [không sử dụng được với phiên bản này của Vim]" + +#: memline.c:1565 +msgid "" +"\n" +" [not usable on this computer]" +msgstr "" +"\n" +" [không sử dụng được trên máy tính này]" + +#: memline.c:1570 +msgid " [cannot be read]" +msgstr " [không đọc được]" + +#: memline.c:1574 +msgid " [cannot be opened]" +msgstr " [không mở được]" + +#: memline.c:1764 +msgid "E313: Cannot preserve, there is no swap file" +msgstr "E313: Không cập nhật được tập tin trao đổi (swap) vì không tìm thấy nó" + +#: memline.c:1817 +msgid "File preserved" +msgstr "Đã cập nhật tập tin trao đổi (swap)" + +#: memline.c:1819 +msgid "E314: Preserve failed" +msgstr "E314: Cập nhật không thành công" + +#: memline.c:1890 +#, c-format +msgid "E315: ml_get: invalid lnum: %ld" +msgstr "E315: ml_get: giá trị lnum không đúng: %ld" + +#: memline.c:1916 +#, c-format +msgid "E316: ml_get: cannot find line %ld" +msgstr "E316: ml_get: không tìm được dòng %ld" + +#: memline.c:2306 +msgid "E317: pointer block id wrong 3" +msgstr "E317: Giá trị của pointer khối số 3 không đúng" + +#: memline.c:2386 +msgid "stack_idx should be 0" +msgstr "giá trị stack_idx phải bằng 0" + +#: memline.c:2448 +msgid "E318: Updated too many blocks?" +msgstr "E318: Đã cập nhật quá nhiều khối?" + +#: memline.c:2630 +msgid "E317: pointer block id wrong 4" +msgstr "E317: Giá trị của pointer khối số 4 không đúng" + +#: memline.c:2657 +msgid "deleted block 1?" +msgstr "đã xóa khối số 1?" + +#: memline.c:2857 +#, c-format +msgid "E320: Cannot find line %ld" +msgstr "E320: Không tìm được dòng %ld" + +#: memline.c:3100 +msgid "E317: pointer block id wrong" +msgstr "E317: giá trị của pointer khối không đúng" + +#: memline.c:3116 +msgid "pe_line_count is zero" +msgstr "giá trị pe_line_count bằng không" + +#: memline.c:3145 +#, c-format +msgid "E322: line number out of range: %ld past the end" +msgstr "E322: số thứ tự dòng vượt quá giới hạn : %ld" + +#: memline.c:3149 +#, c-format +msgid "E323: line count wrong in block %ld" +msgstr "E323: giá trị đếm dòng không đúng trong khối %ld" + +#: memline.c:3198 +msgid "Stack size increases" +msgstr "Kích thước của đống tăng lên" + +#: memline.c:3244 +msgid "E317: pointer block id wrong 2" +msgstr "E317: Giá trị của cái chỉ (pointer) khối số 2 không đúng" + +#: memline.c:3674 +msgid "E325: ATTENTION" +msgstr "E325: CHÚ Ý" + +#: memline.c:3675 +msgid "" +"\n" +"Found a swap file by the name \"" +msgstr "" +"\n" +"Tìm thấy một tập tin trao đổi (swap) với tên \"" + +#: memline.c:3679 +msgid "While opening file \"" +msgstr "Khi mở tập tin: \"" + +#: memline.c:3688 +msgid " NEWER than swap file!\n" +msgstr " MỚI hơn so với tập tin trao đổi (swap)\n" + +#. Some of these messages are long to allow translation to +#. * other languages. +#: memline.c:3692 +msgid "" +"\n" +"(1) Another program may be editing the same file.\n" +" If this is the case, be careful not to end up with two\n" +" different instances of the same file when making changes.\n" +msgstr "" +"\n" +"(1) Rất có thể một chương trình khác đang soạn thảo tập tin.\n" +" Nếu như vậy, hãy cẩn thận khi thay đổi, làm sao để không thu\n" +" được hai phương án khác nhau của cùng một tập tin.\n" + +#: memline.c:3693 +msgid " Quit, or continue with caution.\n" +msgstr " Thoát hoặc tiếp tục với sự cẩn thận.\n" + +#: memline.c:3694 +msgid "" +"\n" +"(2) An edit session for this file crashed.\n" +msgstr "" +"\n" +"(2) Lần soạn thảo trước của tập tin này gặp sự cố.\n" + +#: memline.c:3695 +msgid " If this is the case, use \":recover\" or \"vim -r " +msgstr " Trong trường hợp này, hãy sử dụng câu lệnh \":recover\" hoặc \"vim -r " + +#: memline.c:3697 +msgid "" +"\"\n" +" to recover the changes (see \":help recovery\").\n" +msgstr "" +"\"\n" +" để phục hồi những thay đổi (hãy xem \":help recovery\").\n" + +#: memline.c:3698 +msgid " If you did this already, delete the swap file \"" +msgstr " Nếu đã thực hiện thao tác này rồi, thì hãy xóa tập tin trao đổi (swap) \"" + +#: memline.c:3700 +msgid "" +"\"\n" +" to avoid this message.\n" +msgstr "" +"\"\n" +" để tránh sự xuất hiện của thông báo này trong tương lai.\n" + +#: memline.c:3714 memline.c:3718 +msgid "Swap file \"" +msgstr "Tập tin trao đổi (swap) \"" + +#: memline.c:3715 memline.c:3721 +msgid "\" already exists!" +msgstr "\" đã có rồi!" + +#: memline.c:3724 +msgid "VIM - ATTENTION" +msgstr "VIM - CHÚ Ý" + +#: memline.c:3726 +msgid "Swap file already exists!" +msgstr "Tập tin trao đổi (swap) đã rồi!" + +#: memline.c:3730 +msgid "" +"&Open Read-Only\n" +"&Edit anyway\n" +"&Recover\n" +"&Quit\n" +"&Abort" +msgstr "" +"&O Mở chỉ để đọc\n" +"&E Vẫn soạn thảo\n" +"&R Phục hồi\n" +"&Q Thoát\n" +"&A Gián đoạn" + +#: memline.c:3732 +msgid "" +"&Open Read-Only\n" +"&Edit anyway\n" +"&Recover\n" +"&Quit\n" +"&Abort\n" +"&Delete it" +msgstr "" +"&O Mở chỉ để đọc\n" +"&E Vẫn soạn thảo\n" +"&R Phục hồi\n" +"&Q Thoát\n" +"&A Gián đoạn" +"&D Xóa nó" + +#: memline.c:3789 +msgid "E326: Too many swap files found" +msgstr "E326: Tìm thấy quá nhiều tập tin trao đổi (swap)" + +#: menu.c:64 +msgid "E327: Part of menu-item path is not sub-menu" +msgstr "E327: Một phần của đường dẫn tới phần tử của trình đơn không phải là trình đơn con" + +#: menu.c:65 +msgid "E328: Menu only exists in another mode" +msgstr "E328: Trình đơn chỉ có trong chế độ khác" + +#: menu.c:66 +msgid "E329: No menu of that name" +msgstr "E329: Không có trình đơn với tên như vậy" + +#: menu.c:525 +msgid "E330: Menu path must not lead to a sub-menu" +msgstr "E330: Đường dẫn tới trình đơn không được đưa tới trình đơn con" + +#: menu.c:564 +msgid "E331: Must not add menu items directly to menu bar" +msgstr "E331: Các phần tử của trình đơn không thể thêm trực tiếp vào thanh trình đơn" + +#: menu.c:570 +msgid "E332: Separator cannot be part of a menu path" +msgstr "E332: Cái phân chia không thể là một phần của đường dẫn tới trình đơn" + +#. Now we have found the matching menu, and we list the mappings +#. Highlight title +#: menu.c:1097 +msgid "" +"\n" +"--- Menus ---" +msgstr "" +"\n" +"--- Trình đơn ---" + +#: menu.c:2019 +msgid "Tear off this menu" +msgstr "Chia cắt trình đơn này" + +#: menu.c:2084 +msgid "E333: Menu path must lead to a menu item" +msgstr "E333: Đường dẫn tới trình đơn phải đưa tới một phần tử cuả trình đơn" + +#: menu.c:2104 +#, c-format +msgid "E334: Menu not found: %s" +msgstr "E334: Không tìm thấy trình đơn: %s" + +#: menu.c:2173 +#, c-format +msgid "E335: Menu not defined for %s mode" +msgstr "E335: Trình đơn không được định nghĩa cho chế độ %s" + +#: menu.c:2211 +msgid "E336: Menu path must lead to a sub-menu" +msgstr "E336: Đường dẫn tới trình đơn phải đưa tới một trình đơn con" + +#: menu.c:2232 +msgid "E337: Menu not found - check menu names" +msgstr "E337: Không tìm thấy trình đơn - hãy kiểm tra tên trình đơn" + +#: message.c:414 +#, c-format +msgid "Error detected while processing %s:" +msgstr "Phát hiện lỗi khi xử lý %s:" + +#: message.c:440 +#, c-format +msgid "line %4ld:" +msgstr "dòng %4ld:" + +#: message.c:647 +msgid "[string too long]" +msgstr "[chuỗi quá dài]" + +#: message.c:797 +msgid "Messages maintainer: Bram Moolenaar " +msgstr "" +"Bản dịch các thông báo sang tiếng Việt: Phan Vĩnh Thịnh " + +#: message.c:1025 +msgid "Interrupt: " +msgstr "Gián đoạn: " + +#: message.c:1028 +msgid "Hit ENTER to continue" +msgstr "Nhấn phím ENTER để tiếp tục" + +#: message.c:1030 +msgid "Hit ENTER or type command to continue" +msgstr "Nhấn phím ENTER hoặc nhập câu lệnh để tiếp tục" + +#: message.c:2351 +msgid "-- More --" +msgstr "-- Còn nữa --" + +#: message.c:2354 +msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)" +msgstr " (RET/BS: dòng, SPACE/b: trang, d/u: nửa trang, q: thoát)" + +#: message.c:2355 +msgid " (RET: line, SPACE: page, d: half page, q: quit)" +msgstr " (RET: dòng, SPACE: trang, d: nửa trang, q: thoát)" + +#: message.c:2976 message.c:2991 +msgid "Question" +msgstr "Câu hỏi" + +#: message.c:2978 +msgid "" +"&Yes\n" +"&No" +msgstr "" +"&Có\n" +"&Không" + +#: message.c:3011 +msgid "" +"&Yes\n" +"&No\n" +"Save &All\n" +"&Discard All\n" +"&Cancel" +msgstr "" +"&Có\n" +"&Không" +"&Ghi nhớ tất cả\n" +"&Vứt bỏ tất cả\n" +"&Dừng lại" + +#: message.c:3052 +msgid "Save File dialog" +msgstr "Ghi nhớ tập tin" + +#: message.c:3054 +msgid "Open File dialog" +msgstr "Mở tập tin" + +#. TODO: non-GUI file selector here +#: message.c:3125 +msgid "E338: Sorry, no file browser in console mode" +msgstr "" +"E338: Xin lỗi nhưng không có trình duyệt tập tin trong chế độ kênh giao tác (console)" + +#: misc1.c:2773 +msgid "W10: Warning: Changing a readonly file" +msgstr "W10: Cảnh báo: Thay đổi một tập tin chỉ có quyền đọc" + +#: misc1.c:3021 +msgid "1 more line" +msgstr "Thêm 1 dòng" + +#: misc1.c:3023 +msgid "1 line less" +msgstr "Bớt 1 dòng" + +#: misc1.c:3028 +#, c-format +msgid "%ld more lines" +msgstr "Thêm %ld dòng" + +#: misc1.c:3030 +#, c-format +msgid "%ld fewer lines" +msgstr "Bớt %ld dòng" + +#: misc1.c:3033 +msgid " (Interrupted)" +msgstr " (Bị gián đoạn)" + +#: misc1.c:7588 +msgid "Vim: preserving files...\n" +msgstr "Vim: ghi nhớ các tập tin...\n" + +#. close all memfiles, without deleting +#: misc1.c:7598 +msgid "Vim: Finished.\n" +msgstr "Vim: Đã xong.\n" + +#: misc2.c:695 misc2.c:711 +#, c-format +msgid "ERROR: " +msgstr "LỖI: " + +#: misc2.c:715 +#, c-format +msgid "" +"\n" +"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n" +msgstr "" +"\n" +"[byte] tổng phân phối-còn trống %lu-%lu, sử dụng %lu, píc sử dụng %lu\n" + +#: misc2.c:717 +#, c-format +msgid "" +"[calls] total re/malloc()'s %lu, total free()'s %lu\n" +"\n" +msgstr "" +"[gọi] tổng re/malloc() %lu, tổng free() %lu\n" +"\n" + +#: misc2.c:772 +msgid "E340: Line is becoming too long" +msgstr "E340: Dòng đang trở thành quá dài" + +#: misc2.c:816 +#, c-format +msgid "E341: Internal error: lalloc(%ld, )" +msgstr "E341: Lỗi nội bộ: lalloc(%ld, )" + +#: misc2.c:924 +#, c-format +msgid "E342: Out of memory! (allocating %lu bytes)" +msgstr "E342: Không đủ bộ nhớ! (phân chia %lu byte)" + +#: misc2.c:2594 +#, c-format +msgid "Calling shell to execute: \"%s\"" +msgstr "Gọi shell để thực hiện: \"%s\"" + +#: misc2.c:2816 +msgid "E545: Missing colon" +msgstr "E545: Thiếu dấu hai chấm" + +#: misc2.c:2818 misc2.c:2845 +msgid "E546: Illegal mode" +msgstr "E546: Chế độ không cho phép" + +#: misc2.c:2884 +msgid "E547: Illegal mouseshape" +msgstr "E547: Dạng trỏ chuột không cho phép" + +#: misc2.c:2924 +msgid "E548: digit expected" +msgstr "E548: yêu cầu một số" + +#: misc2.c:2929 +msgid "E549: Illegal percentage" +msgstr "E549: Tỷ lệ phần trăm không cho phép" + +#: misc2.c:3239 +msgid "Enter encryption key: " +msgstr "Nhập mật khẩu để mã hóa: " + +#: misc2.c:3240 +msgid "Enter same key again: " +msgstr " Nhập lại mật khẩu:" + +#: misc2.c:3250 +msgid "Keys don't match!" +msgstr "Hai mật khẩu không trùng nhau!" + +#: misc2.c:3799 +#, c-format +msgid "" +"E343: Invalid path: '**[number]' must be at the end of the path or be " +"followed by '%s'." +msgstr "" +"E343: Đường dẫn đưa ra không đúng: '**[số]' phải ở cuối đường dẫn hoặc " +"theo sau bởi '%s'" + +#: misc2.c:5078 +#, c-format +msgid "E344: Can't find directory \"%s\" in cdpath" +msgstr "E344: Không tìm thấy thư mục \"%s\" để chuyển thư mục" + +#: misc2.c:5081 +#, c-format +msgid "E345: Can't find file \"%s\" in path" +msgstr "E345: Không tìm thấy tập tin \"%s\" trong đường dẫn" + +#: misc2.c:5087 +#, c-format +msgid "E346: No more directory \"%s\" found in cdpath" +msgstr "E346: Trong đường dẫn thay đổi thư mục không còn có thư mục \"%s\" nữa" + +#: misc2.c:5090 +#, c-format +msgid "E347: No more file \"%s\" found in path" +msgstr "E347: Trong đường dẫn path không còn có tập tin \"%s\" nữa" + +#: misc2.c:5324 +msgid "E550: Missing colon" +msgstr "E550: Thiếu dấu hai chấm" + +#: misc2.c:5336 +msgid "E551: Illegal component" +msgstr "E551: Thành phần không cho phép" + +#: misc2.c:5344 +msgid "E552: digit expected" +msgstr "E552: Cần chỉ ra một số" + +#. Get here when the server can't be found. +#: netbeans.c:396 +msgid "Cannot connect to Netbeans #2" +msgstr "Không kết nối được với Netbeans #2" + +#: netbeans.c:404 +msgid "Cannot connect to Netbeans" +msgstr "Không kết nối được với NetBeans" + +#: netbeans.c:450 +#, c-format +msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" +msgstr "" +"E668: Chế độ truy cập thông tin về liên kết với NetBeans không đúng: \"%s\"" + +#: netbeans.c:749 +msgid "read from Netbeans socket" +msgstr "đọc từ socket NetBeans" + +#: netbeans.c:1643 +#, c-format +msgid "E658: NetBeans connection lost for buffer %ld" +msgstr "E658: Bị mất liên kết với NetBeans cho bộ đệm %ld" + +#: normal.c:2980 +msgid "Warning: terminal cannot highlight" +msgstr "Cảnh báo: terminal không thực hiện được sự chiếu sáng" + +#: normal.c:3276 +msgid "E348: No string under cursor" +msgstr "E348: Không có chuỗi ở vị trí con trỏ" + +#: normal.c:3278 +msgid "E349: No identifier under cursor" +msgstr "E349: Không có tên ở vị trí con trỏ" + +#: normal.c:4519 +msgid "E352: Cannot erase folds with current 'foldmethod'" +msgstr "" +"E352: Không thể tẩy xóa nếp gấp với giá trị hiện thời của tùy chọn 'foldmethod'" + +#: normal.c:6740 +msgid "E664: changelist is empty" +msgstr "E664: danh sách những thay đổi trống rỗng" + +#: normal.c:6742 +msgid "E662: At start of changelist" +msgstr "E662: Ở đầu danh sách những thay đổi" + +#: normal.c:6744 +msgid "E663: At end of changelist" +msgstr "E662: Ở cuối danh sách những thay đổi" + +#: normal.c:8005 +msgid "Type :quit to exit Vim" +msgstr "Gõ :quit để thoát khỏi Vim" + +#: ops.c:294 +#, c-format +msgid "1 line %sed 1 time" +msgstr "Trên 1 dòng %s 1 lần" + +#: ops.c:296 +#, c-format +msgid "1 line %sed %d times" +msgstr "Trên 1 dòng %s %d lần" + +#: ops.c:301 +#, c-format +msgid "%ld lines %sed 1 time" +msgstr "Trên %ld dòng %s 1 lần" + +#: ops.c:304 +#, c-format +msgid "%ld lines %sed %d times" +msgstr "Trên %ld dòng %s %d lần" + +#: ops.c:662 +#, c-format +msgid "%ld lines to indent... " +msgstr "Thụt đầu %ld dòng..." + +#: ops.c:712 +msgid "1 line indented " +msgstr "Đã thụt đầu 1 dòng" + +#: ops.c:714 +#, c-format +msgid "%ld lines indented " +msgstr "%ld dòng đã thụt đầu" + +#. must display the prompt +#: ops.c:1675 +msgid "cannot yank; delete anyway" +msgstr "sao chép không thành công; đã xóa" + +#: ops.c:2261 +msgid "1 line changed" +msgstr "1 dòng đã thay đổi" + +#: ops.c:2263 +#, c-format +msgid "%ld lines changed" +msgstr "%ld đã thay đổi" + +#: ops.c:2647 +#, c-format +msgid "freeing %ld lines" +msgstr "đã làm sạch %ld dòng" + +#: ops.c:2928 +msgid "1 line yanked" +msgstr "đã sao chép 1 dòng" + +#: ops.c:2930 +#, c-format +msgid "%ld lines yanked" +msgstr "đã sao chép %ld dòng" + +#: ops.c:3215 +#, c-format +msgid "E353: Nothing in register %s" +msgstr "E353: Trong sổ đăng ký %s không có gì hết" + +#. Highlight title +#: ops.c:3766 +msgid "" +"\n" +"--- Registers ---" +msgstr "" +"\n" +"--- Sổ đăng ký ---" + +#: ops.c:5075 +msgid "Illegal register name" +msgstr "Tên sổ đăng ký không cho phép" + +#: ops.c:5163 +#, c-format +msgid "" +"\n" +"# Registers:\n" +msgstr "" +"\n" +"# Sổ đăng ký:\n" + +#: ops.c:5213 +#, c-format +msgid "E574: Unknown register type %d" +msgstr "E574: Loại sổ đăng ký không biết %d" + +#: ops.c:5698 +#, c-format +msgid "E354: Invalid register name: '%s'" +msgstr "E354: Tên sổ đăng ký không cho phép: '%s'" + +#: ops.c:6058 +#, c-format +msgid "%ld Cols; " +msgstr "%ld Cột; " + +#: ops.c:6065 +#, c-format +msgid "Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes" +msgstr "Chọn %s%ld của %ld Dòng; %ld của %ld Từ; %ld của %ld Byte" + +#: ops.c:6081 +#, c-format +msgid "Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld" +msgstr "Cột %s của %s; Dòng %ld của %ld; Từ %ld của %ld; Byte %ld của %ld" + +#: ops.c:6092 +#, c-format +msgid "(+%ld for BOM)" +msgstr "(+%ld cho BOM)" + +#: option.c:1643 +msgid "%<%f%h%m%=Page %N" +msgstr "%<%f%h%m%=Trang %N" + +#: option.c:2092 +msgid "Thanks for flying Vim" +msgstr "Xin cảm ơn đã sử dụng Vim" + +#: option.c:3419 option.c:3535 +msgid "E518: Unknown option" +msgstr "E518: Tùy chọn không biết" + +#: option.c:3432 +msgid "E519: Option not supported" +msgstr "E519: Tùy chọn không được hỗ trợ" + +#: option.c:3457 +msgid "E520: Not allowed in a modeline" +msgstr "E520: Không cho phép trên dòng chế độ (modeline)" + +#: option.c:3522 +msgid "" +"\n" +"\tLast set from " +msgstr "" +"\n" +"\tLần cuối cùng tùy chọn thay đổi vào " + +#: option.c:3661 +msgid "E521: Number required after =" +msgstr "E521: Sau dấu = cần đưa ra một số" + +#: option.c:3989 option.c:4619 +msgid "E522: Not found in termcap" +msgstr "E522: Không tìm thấy trong termcap" + +#: option.c:4064 +#, c-format +msgid "E539: Illegal character <%s>" +msgstr "E539: Ký tự không cho phép <%s>" + +#: option.c:4611 +msgid "E529: Cannot set 'term' to empty string" +msgstr "E529: Giá trị của tùy chọn 'term' không thể là một chuỗi trống rỗng" + +#: option.c:4614 +msgid "E530: Cannot change term in GUI" +msgstr "E530: Không thể thay đổi terminal trong giao diện đồ họa GUI" + +#: option.c:4616 +msgid "E531: Use \":gui\" to start the GUI" +msgstr "E531: Hãy sử dụng \":gui\" để chạy giao diện đồ họa GUI" + +#: option.c:4645 +msgid "E589: 'backupext' and 'patchmode' are equal" +msgstr "E589: giá trị của tùy chọn 'backupext' và 'patchmode' bằng nhau" + +#: option.c:4860 +msgid "E617: Cannot be changed in the GTK+ 2 GUI" +msgstr "E617: Không thể thay đổi trong giao diện đồ họa GTK+ 2" + +#: option.c:5016 +msgid "E524: Missing colon" +msgstr "E524: Thiếu dấu hai chấm" + +#: option.c:5018 +msgid "E525: Zero length string" +msgstr "E525: Chuỗi có độ dài bằng không" + +#: option.c:5086 +#, c-format +msgid "E526: Missing number after <%s>" +msgstr "E526: Thiếu một số sau <%s>" + +#: option.c:5100 +msgid "E527: Missing comma" +msgstr "E527: Thiếu dấu phẩy" + +#: option.c:5107 +msgid "E528: Must specify a ' value" +msgstr "E528: Cần đưa ra một giá trị cho '" + +#: option.c:5148 +msgid "E595: contains unprintable or wide character" +msgstr "E595: chứa ký tự không in ra hoặc ký tự với chiều rộng gấp đôi" + +#: option.c:5197 +msgid "E596: Invalid font(s)" +msgstr "E596: Phông chữ không đúng" + +#: option.c:5205 +msgid "E597: can't select fontset" +msgstr "E597: không chọn được bộ phông chữ" + +#: option.c:5207 +msgid "E598: Invalid fontset" +msgstr "E598: Bộ phông chữ không đúng" + +#: option.c:5214 +msgid "E533: can't select wide font" +msgstr "E533: không chọn được phông chữ với các ký tự có chiều rộng gấp đôi" + +#: option.c:5216 +msgid "E534: Invalid wide font" +msgstr "E534: Phông chữ, với ký tự có chiều rộng gấp đôi, không đúng" + +#: option.c:5486 +#, c-format +msgid "E535: Illegal character after <%c>" +msgstr "E535: Ký tự sau <%c> không chính xác" + +#: option.c:5597 +msgid "E536: comma required" +msgstr "E536: cầu có dấu phẩy" + +#: option.c:5607 +#, c-format +msgid "E537: 'commentstring' must be empty or contain %s" +msgstr "E537: Giá trị của tùy chọn 'commentstring' phải rỗng hoặc chứa %s" + +#: option.c:5679 +msgid "E538: No mouse support" +msgstr "E538: Chuột không được hỗ trợ" + +#: option.c:5947 +msgid "E540: Unclosed expression sequence" +msgstr "E540: Dãy các biểu thức không đóng" + +#: option.c:5951 +msgid "E541: too many items" +msgstr "E541: quá nhiều phần tử" + +#: option.c:5953 +msgid "E542: unbalanced groups" +msgstr "E542: các nhóm không cân bằng" + +#: option.c:6193 +msgid "E590: A preview window already exists" +msgstr "E590: Cửa sổ xem trước đã có" + +#: option.c:6450 +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "" +"W17: Tiếng Ả Rập yêu cầu sử dụng UTF-8, hãy nhập ':set encoding=utf-8'" + +#: option.c:6783 +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: Cần ít nhất %d dòng" + +#: option.c:6793 +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: Cần ít nhất %d cột" + +#: option.c:7100 +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: Tùy chọn không biết: %s" + +#: option.c:7220 +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- Mã terminal ---" + +#: option.c:7222 +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- Giá trị tùy chọn toàn cầu ---" + +#: option.c:7224 +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- Giá trị tùy chọn nội bộ ---" + +#: option.c:7226 +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- Tùy chọn ---" + +#: option.c:7932 +msgid "E356: get_varp ERROR" +msgstr "E356: LỖI get_varp" + +#: option.c:8903 +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap': Thiếu ký tự tương ứng cho %s" + +#: option.c:8937 +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap': Thừa ký tự sau dấu chấm phẩy: %s" + +#: os_amiga.c:280 +msgid "cannot open " +msgstr "không mở được " + +#: os_amiga.c:314 +msgid "VIM: Can't open window!\n" +msgstr "VIM: Không mở được cửa sổ!\n" + +#: os_amiga.c:338 +msgid "Need Amigados version 2.04 or later\n" +msgstr "Cần Amigados phiên bản 2.04 hoặc mới hơn\n" + +#: os_amiga.c:344 +#, c-format +msgid "Need %s version %ld\n" +msgstr "Cần %s phiên bản %ld\n" + +#: os_amiga.c:416 +msgid "Cannot open NIL:\n" +msgstr "Không mở được NIL:\n" + +#: os_amiga.c:427 +msgid "Cannot create " +msgstr "Không tạo được " + +#: os_amiga.c:905 +#, c-format +msgid "Vim exiting with %d\n" +msgstr "Thoát Vim với mã %d\n" + +#: os_amiga.c:937 +msgid "cannot change console mode ?!\n" +msgstr "không thay đổi được chế độ kênh giao tác (console)?!\n" + +#: os_amiga.c:1003 +msgid "mch_get_shellsize: not a console??\n" +msgstr "mch_get_shellsize: không phải là kênh giao tác (console)??\n" + +#. if Vim opened a window: Executing a shell may cause crashes +#: os_amiga.c:1152 +msgid "E360: Cannot execute shell with -f option" +msgstr "E360: Không chạy được shell với tùy chọn -f" + +#: os_amiga.c:1193 os_amiga.c:1283 +msgid "Cannot execute " +msgstr "Không chạy được " + +#: os_amiga.c:1196 os_amiga.c:1293 +msgid "shell " +msgstr "shell " + +#: os_amiga.c:1216 os_amiga.c:1318 +msgid " returned\n" +msgstr " thoát\n" + +#: os_amiga.c:1459 +msgid "ANCHOR_BUF_SIZE too small." +msgstr "Giá trị ANCHOR_BUF_SIZE quá nhỏ." + +#: os_amiga.c:1463 +msgid "I/O ERROR" +msgstr "LỖI I/O (NHẬP/XUẤT)" + +#: os_mswin.c:539 +msgid "...(truncated)" +msgstr "...(bị cắt bớt)" + +#: os_mswin.c:641 +msgid "'columns' is not 80, cannot execute external commands" +msgstr "Tùy chọn 'columns' khác 80, chương trình ngoại trú không thể thực hiện" + +#: os_mswin.c:1973 +msgid "E237: Printer selection failed" +msgstr "E327: Chọn máy in không thành công" + +#: os_mswin.c:2013 +#, c-format +msgid "to %s on %s" +msgstr "tới %s trên %s" + +#: os_mswin.c:2028 +#, c-format +msgid "E613: Unknown printer font: %s" +msgstr "E613: Không rõ phông chữ của máy in: %s" + +#: os_mswin.c:2077 os_mswin.c:2087 +#, c-format +msgid "E238: Print error: %s" +msgstr "E238: Lỗi in: %s" + +#: os_mswin.c:2088 +msgid "Unknown" +msgstr "Không rõ" + +#: os_mswin.c:2115 +#, c-format +msgid "Printing '%s'" +msgstr "Đang in '%s'" + +#: os_mswin.c:3204 +#, c-format +msgid "E244: Illegal charset name \"%s\" in font name \"%s\"" +msgstr "E244: Tên bảng mã không cho phép \"%s\" trong tên phông chữ \"%s\"" + +#: os_mswin.c:3212 +#, c-format +msgid "E245: Illegal char '%c' in font name \"%s\"" +msgstr "E245: Ký tự không cho phép '%c' trong tên phông chữ \"%s\"" + +#: os_riscos.c:1259 +msgid "E366: Invalid 'osfiletype' option - using Text" +msgstr "E366: Giá trị tùy chọn 'osfiletype' không cho phép - sử dụng Text" + +#: os_unix.c:927 +msgid "Vim: Double signal, exiting\n" +msgstr "Vim: Tín hiệu đôi, thoát\n" + +#: os_unix.c:933 +#, c-format +msgid "Vim: Caught deadly signal %s\n" +msgstr "Vim: Nhận được tín hiệu chết %s\n" + +#: os_unix.c:936 +#, c-format +msgid "Vim: Caught deadly signal\n" +msgstr "Vim: Nhận được tín hiệu chết\n" + +#: os_unix.c:1199 +#, c-format +msgid "Opening the X display took %ld msec" +msgstr "Mở màn hình X mất %ld mili giây" + +#: os_unix.c:1226 +msgid "" +"\n" +"Vim: Got X error\n" +msgstr "" +"\n" +"Vim: Lỗi X\n" + +#: os_unix.c:1334 +msgid "Testing the X display failed" +msgstr "Kiểm tra màn hình X không thành công" + +#: os_unix.c:1473 +msgid "Opening the X display timed out" +msgstr "Không mở được màn hình X trong thời gian cho phép (time out)" + +#: os_unix.c:3227 os_unix.c:3907 +msgid "" +"\n" +"Cannot execute shell " +msgstr "" +"\n" +"Không chạy được shell " + +#: os_unix.c:3275 +msgid "" +"\n" +"Cannot execute shell sh\n" +msgstr "" +"\n" +"Không chạy được shell sh\n" + +#: os_unix.c:3279 os_unix.c:3913 +msgid "" +"\n" +"shell returned " +msgstr "" +"\n" +"shell dừng làm việc " + +#: os_unix.c:3414 +msgid "" +"\n" +"Cannot create pipes\n" +msgstr "" +"\n" +"Không tạo được đường ống (pipe)\n" + +#: os_unix.c:3429 +msgid "" +"\n" +"Cannot fork\n" +msgstr "" +"\n" +"Không thực hiện được fork()\n" + +#: os_unix.c:3920 +msgid "" +"\n" +"Command terminated\n" +msgstr "" +"\n" +"Câu lệnh bị gián đoạn\n" + +#: os_unix.c:4184 os_unix.c:4309 os_unix.c:5975 +msgid "XSMP lost ICE connection" +msgstr "XSMP mất kết nối ICE" + +#: os_unix.c:5558 +msgid "Opening the X display failed" +msgstr "Mở màn hình X không thành công" + +#: os_unix.c:5880 +msgid "XSMP handling save-yourself request" +msgstr "XSMP xử lý yêu cầu tự động ghi nhớ" + +#: os_unix.c:5999 +msgid "XSMP opening connection" +msgstr "XSMP mở kết nối" + +#: os_unix.c:6018 +msgid "XSMP ICE connection watch failed" +msgstr "XSMP mất theo dõi kết nối ICE" + +#: os_unix.c:6038 +#, c-format +msgid "XSMP SmcOpenConnection failed: %s" +msgstr "XSMP thực hiện SmcOpenConnection không thành công: %s" + +#: os_vms_mms.c:59 +msgid "At line" +msgstr "Tại dòng" + +#: os_w32exe.c:65 +msgid "Could not allocate memory for command line." +msgstr "Không phân chia được bộ nhớ cho dòng lệnh." + +#: os_w32exe.c:66 os_w32exe.c:89 os_w32exe.c:100 +msgid "VIM Error" +msgstr "Lỗi VIM" + +#: os_w32exe.c:89 +msgid "Could not load vim32.dll!" +msgstr "Không nạp được vim32.dll!" + +#: os_w32exe.c:99 +msgid "Could not fix up function pointers to the DLL!" +msgstr "Không sửa được cái chỉ (pointer) hàm số tới DLL!" + +#: os_win16.c:342 os_win32.c:3216 +#, c-format +msgid "shell returned %d" +msgstr "thoát shell với mã %d" + +#: os_win32.c:2674 +#, c-format +msgid "Vim: Caught %s event\n" +msgstr "Vim: Nhận được sự kiện %s\n" + +#: os_win32.c:2676 +msgid "close" +msgstr "đóng" + +#: os_win32.c:2678 +msgid "logoff" +msgstr "thoát" + +#: os_win32.c:2679 +msgid "shutdown" +msgstr "tắt máy" + +#: os_win32.c:3169 +msgid "E371: Command not found" +msgstr "E371: Câu lệnh không tìm thấy" + +#: os_win32.c:3182 +msgid "" +"VIMRUN.EXE not found in your $PATH.\n" +"External commands will not pause after completion.\n" +"See :help win32-vimrun for more information." +msgstr "" +"Không tìm thấy VIMRUN.EXE trong $PATH.\n" +"Lệnh ngoại trú sẽ không dừng lại sau khi hoàn thành.\n" +"Thông tin chi tiết xem trong :help win32-vimrun" + +#: os_win32.c:3185 +msgid "Vim Warning" +msgstr "Cảnh báo Vim" + +#: quickfix.c:258 +#, c-format +msgid "E372: Too many %%%c in format string" +msgstr "E372: Quá nhiều %%%c trong chuỗi định dạng" + +#: quickfix.c:271 +#, c-format +msgid "E373: Unexpected %%%c in format string" +msgstr "E373: Không mong đợi %%%c trong chuỗi định dạng" + +#: quickfix.c:325 +msgid "E374: Missing ] in format string" +msgstr "E374: Thiếu ] trong chuỗi định dạng" + +#: quickfix.c:339 +#, c-format +msgid "E375: Unsupported %%%c in format string" +msgstr "E375: %%%c không được hỗ trợ trong chuỗi định dạng" + +#: quickfix.c:357 +#, c-format +msgid "E376: Invalid %%%c in format string prefix" +msgstr "E376: Không cho phép %%%c trong tiền tố của chuỗi định dạng" + +#: quickfix.c:365 +#, c-format +msgid "E377: Invalid %%%c in format string" +msgstr "E377: Không cho phép %%%c trong chuỗi định dạng" + +#: quickfix.c:391 +msgid "E378: 'errorformat' contains no pattern" +msgstr "E378: Trong giá trị 'errorformat' thiếu mẫu (pattern)" + +#: quickfix.c:501 +msgid "E379: Missing or empty directory name" +msgstr "E379: Tên thư mục không được đưa ra hoặc bằng một chuỗi rỗng" + +#: quickfix.c:990 +msgid "E553: No more items" +msgstr "E553: Không còn phần tử nào nữa" + +#: quickfix.c:1229 +#, c-format +msgid "(%d of %d)%s%s: " +msgstr "(%d của %d)%s%s: " + +#: quickfix.c:1231 +msgid " (line deleted)" +msgstr " (dòng bị xóa)" + +#: quickfix.c:1444 +msgid "E380: At bottom of quickfix stack" +msgstr "E380: Ở dưới của đống sửa nhanh" + +#: quickfix.c:1453 +msgid "E381: At top of quickfix stack" +msgstr "E381: Ở đầu của đống sửa nhanh" + +#: quickfix.c:1465 +#, c-format +msgid "error list %d of %d; %d errors" +msgstr "danh sách lỗi %d của %d; %d lỗi" + +#: quickfix.c:1943 +msgid "E382: Cannot write, 'buftype' option is set" +msgstr "E382: Không ghi nhớ được, giá trị 'buftype' không phải là chuỗi rỗng" + +#: regexp.c:319 +#, c-format +msgid "E369: invalid item in %s%%[]" +msgstr "E369: phần tử không cho phép trong %s%%[]" + +#: regexp.c:838 +msgid "E339: Pattern too long" +msgstr "E339: Mẫu (pattern) quá dài" + +#: regexp.c:1009 +msgid "E50: Too many \\z(" +msgstr "E50: Quá nhiều \\z(" + +#: regexp.c:1020 +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: Quá nhiều %s(" + +#: regexp.c:1077 +msgid "E52: Unmatched \\z(" +msgstr "E52: Không có cặp cho \\z(" + +#: regexp.c:1081 +#, c-format +msgid "E53: Unmatched %s%%(" +msgstr "E53: Không có cặp cho %s%%(" + +#: regexp.c:1083 +#, c-format +msgid "E54: Unmatched %s(" +msgstr "E54: Không có cặp cho %s(" + +#: regexp.c:1088 +#, c-format +msgid "E55: Unmatched %s)" +msgstr "E55: Không có cặp cho %s)" + +#: regexp.c:1258 +#, c-format +msgid "E56: %s* operand could be empty" +msgstr "E56: operand %s* không thể rỗng" + +#: regexp.c:1261 +#, c-format +msgid "E57: %s+ operand could be empty" +msgstr "E57: operand %s+ không thể rỗng" + +#: regexp.c:1316 +#, c-format +msgid "E59: invalid character after %s@" +msgstr "E59: ký tự không cho phép sau %s@" + +#: regexp.c:1344 +#, c-format +msgid "E58: %s{ operand could be empty" +msgstr "E58: operand %s{ không thể rỗng" + +#: regexp.c:1354 +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: Quá nhiều cấu trúc phức tạp %s{...}" + +#: regexp.c:1370 +#, c-format +msgid "E61: Nested %s*" +msgstr "E61: %s* lồng vào" + +#: regexp.c:1373 +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62: %s%c lồng vào" + +#: regexp.c:1491 +msgid "E63: invalid use of \\_" +msgstr "E63: không cho phép sử dụng \\_" + +#: regexp.c:1536 +#, c-format +msgid "E64: %s%c follows nothing" +msgstr "E64: %s%c không theo sau gì cả" + +#: regexp.c:1592 +msgid "E65: Illegal back reference" +msgstr "E65: Không cho phép liên kết ngược lại" + +#: regexp.c:1605 +msgid "E66: \\z( not allowed here" +msgstr "E66: \\z( không thể sử dụng ở đây" + +#: regexp.c:1624 +msgid "E67: \\z1 et al. not allowed here" +msgstr "E67: \\z1 và tương tự không được sử dụng ở đây" + +#: regexp.c:1635 +msgid "E68: Invalid character after \\z" +msgstr "E68: Ký tự không cho phép sau \\z" + +#: regexp.c:1684 +#, c-format +msgid "E69: Missing ] after %s%%[" +msgstr "E69: Thiếu ] sau %s%%[" + +#: regexp.c:1700 +#, c-format +msgid "E70: Empty %s%%[]" +msgstr "E70: %s%%[] rỗng" + +#: regexp.c:1760 +#, c-format +msgid "E71: Invalid character after %s%%" +msgstr "E71: Ký tự không cho phép sau %s%%" + +#: regexp.c:2557 +#, c-format +msgid "E554: Syntax error in %s{...}" +msgstr "E554: Lỗi cú pháp trong %s{...}" + +#: regexp.c:2863 regexp.c:3016 +msgid "E361: Crash intercepted; regexp too complex?" +msgstr "E361: Sự cố được ngăn chặn; biểu thức chính quy quá phức tạp?" + +#: regexp.c:3004 regexp.c:3013 +msgid "E363: pattern caused out-of-stack error" +msgstr "E363: sử dụng mẫu (pattern) gây ra lỗi out-of-stack" + +#: regexp.c:3258 +msgid "External submatches:\n" +msgstr "Sự tương ứng con ngoài:\n" + +#: screen.c:2184 +#, c-format +msgid "+--%3ld lines folded " +msgstr "+--%3ld dòng được gấp" + +#: screen.c:7996 +msgid " VREPLACE" +msgstr " THAY THẾ ẢO" + +#: screen.c:8000 +msgid " REPLACE" +msgstr " THAY THẾ" + +#: screen.c:8005 +msgid " REVERSE" +msgstr " NGƯỢC LẠI" + +#: screen.c:8007 +msgid " INSERT" +msgstr " CHÈN" + +#: screen.c:8010 +msgid " (insert)" +msgstr " (chèn)" + +#: screen.c:8012 +msgid " (replace)" +msgstr " (thay thế)" + +#: screen.c:8014 +msgid " (vreplace)" +msgstr " (thay thế ảo)" + +#: screen.c:8017 +msgid " Hebrew" +msgstr " Do thái" + +#: screen.c:8028 +msgid " Arabic" +msgstr " Ả rập" + +#: screen.c:8031 +msgid " (lang)" +msgstr " (ngôn ngữ)" + +#: screen.c:8035 +msgid " (paste)" +msgstr " (dán)" + +#: screen.c:8048 +msgid " VISUAL" +msgstr " CHẾ ĐỘ VISUAL" + +#: screen.c:8049 +msgid " VISUAL LINE" +msgstr " DÒNG VISUAL" + +#: screen.c:8050 +msgid " VISUAL BLOCK" +msgstr " KHỐI VISUAL" + +#: screen.c:8051 +msgid " SELECT" +msgstr " LỰA CHỌN" + +#: screen.c:8052 +msgid " SELECT LINE" +msgstr " LỰA CHỌN DÒNG" + +#: screen.c:8053 +msgid " SELECT BLOCK" +msgstr " LỰA CHỌN KHỐI" + +#: screen.c:8068 screen.c:8131 +msgid "recording" +msgstr "đang ghi" + +#: search.c:37 +msgid "search hit TOP, continuing at BOTTOM" +msgstr "tìm kiếm sẽ được tiếp tục từ CUỐI tài liệu" + +#: search.c:38 +msgid "search hit BOTTOM, continuing at TOP" +msgstr "tìm kiếm sẽ được tiếp tục từ ĐẦU tài liệu" + +#: search.c:526 +#, c-format +msgid "E383: Invalid search string: %s" +msgstr "E383: Chuỗi tìm kiếm không đúng: %s" + +#: search.c:853 +#, c-format +msgid "E384: search hit TOP without match for: %s" +msgstr "E384: tìm kiếm kết thúc ở ĐẦU tập tin; không tìm thấy %s" + +#: search.c:856 +#, c-format +msgid "E385: search hit BOTTOM without match for: %s" +msgstr "E385: tìm kiếm kết thúc ở CUỐI tập tin; không tìm thấy %s" + +#: search.c:1249 +msgid "E386: Expected '?' or '/' after ';'" +msgstr "E386: Mong đợi nhập '?' hoặc '/' sau ';'" + +#: search.c:3759 +msgid " (includes previously listed match)" +msgstr " (gồm cả những tương ứng đã liệt kê trước đây)" + +#. cursor at status line +#: search.c:3779 +msgid "--- Included files " +msgstr "--- Tập tin tính đến " + +#: search.c:3781 +msgid "not found " +msgstr "không tìm thấy " + +#: search.c:3782 +msgid "in path ---\n" +msgstr "trong đường dẫn ---\n" + +#: search.c:3839 +msgid " (Already listed)" +msgstr " (Đã liệt kê)" + +#: search.c:3841 +msgid " NOT FOUND" +msgstr " KHÔNG TÌM THẤY" + +#: search.c:3893 +#, c-format +msgid "Scanning included file: %s" +msgstr "Quét trong tập tin được tính đến: %s" + +#: search.c:4111 +msgid "E387: Match is on current line" +msgstr "E387: Tương ứng nằm trên dòng hiện tại" + +#: search.c:4254 +msgid "All included files were found" +msgstr "Tìm thấy tất cả các tập tin được tính đến" + +#: search.c:4256 +msgid "No included files" +msgstr "Không có tập tin được tính đến" + +#: search.c:4272 +msgid "E388: Couldn't find definition" +msgstr "E388: Không tìm thấy định nghĩa" + +#: search.c:4274 +msgid "E389: Couldn't find pattern" +msgstr "E389: Không tìm thấy mẫu (pattern)" + +#: syntax.c:3050 +#, c-format +msgid "E390: Illegal argument: %s" +msgstr "E390: Tham số không cho phép: %s" + +#: syntax.c:3230 +#, c-format +msgid "E391: No such syntax cluster: %s" +msgstr "E391: Không có cụm cú pháp như vậy: %s" + +#: syntax.c:3394 +msgid "No Syntax items defined for this buffer" +msgstr "Không có phần tử cú pháp nào được định nghĩa cho bộ đệm này" + +#: syntax.c:3402 +msgid "syncing on C-style comments" +msgstr "Đồng bộ hóa theo chú thích kiểu C" + +#: syntax.c:3410 +msgid "no syncing" +msgstr "không đồng bộ hóa" + +#: syntax.c:3413 +msgid "syncing starts " +msgstr "đồng bộ hóa bắt đầu " + +#: syntax.c:3415 syntax.c:3490 +msgid " lines before top line" +msgstr " dòng trước dòng đầu tiên" + +#: syntax.c:3420 +msgid "" +"\n" +"--- Syntax sync items ---" +msgstr "" +"\n" +"--- Phần tử đồng bộ hóa cú pháp ---" + +#: syntax.c:3425 +msgid "" +"\n" +"syncing on items" +msgstr "" +"\n" +"đồng bộ hóa theo phần tử" + +#: syntax.c:3431 +msgid "" +"\n" +"--- Syntax items ---" +msgstr "" +"\n" +"--- Phần tử cú pháp ---" + +#: syntax.c:3454 +#, c-format +msgid "E392: No such syntax cluster: %s" +msgstr "E392: Không có cụm cú pháp như vậy: %s" + +#: syntax.c:3480 +msgid "minimal " +msgstr "nhỏ nhất " + +#: syntax.c:3487 +msgid "maximal " +msgstr "lớn nhất " + +#: syntax.c:3499 +msgid "; match " +msgstr "; tương ứng " + +#: syntax.c:3501 +msgid " line breaks" +msgstr " chuyển dòng" + +#: syntax.c:4135 +msgid "E393: group[t]here not accepted here" +msgstr "E393: không được sử dụng group[t]here ở đây" + +#: syntax.c:4159 +#, c-format +msgid "E394: Didn't find region item for %s" +msgstr "E394: Phần tử vùng cho %s không tìm thấy" + +#: syntax.c:4187 +msgid "E395: contains argument not accepted here" +msgstr "E395: không được sử dụng tham số contains ở đây" + +#: syntax.c:4198 +msgid "E396: containedin argument not accepted here" +msgstr "E396: không được sử dụng tham số containedin ở đây" + +#: syntax.c:4276 +msgid "E397: Filename required" +msgstr "E397: Yêu cầu tên tập tin" + +#: syntax.c:4614 +#, c-format +msgid "E398: Missing '=': %s" +msgstr "E398: Thiếu '=': %s" + +#: syntax.c:4772 +#, c-format +msgid "E399: Not enough arguments: syntax region %s" +msgstr "E399: Không đủ tham số: vùng cú pháp %s" + +#: syntax.c:5103 +msgid "E400: No cluster specified" +msgstr "E400: Chưa chỉ ra cụm" + +#: syntax.c:5140 +#, c-format +msgid "E401: Pattern delimiter not found: %s" +msgstr "E401: Không tìm thấy ký tự phân chia mẫu (pattern): %s" + +#: syntax.c:5215 +#, c-format +msgid "E402: Garbage after pattern: %s" +msgstr "E402: Rác ở sau mẫu (pattern): %s" + +#: syntax.c:5305 +msgid "E403: syntax sync: line continuations pattern specified twice" +msgstr "E403: đồng bộ hóa cú pháp: mẫu tiếp tục của dòng chỉ ra hai lần" + +#: syntax.c:5362 +#, c-format +msgid "E404: Illegal arguments: %s" +msgstr "E404: Tham số không cho phép: %s" + +#: syntax.c:5412 +#, c-format +msgid "E405: Missing equal sign: %s" +msgstr "E405: Thiếu dấu bằng: %s" + +#: syntax.c:5418 +#, c-format +msgid "E406: Empty argument: %s" +msgstr "E406: Tham số trống rỗng: %s" + +#: syntax.c:5445 +#, c-format +msgid "E407: %s not allowed here" +msgstr "E407: %s không được cho phép ở đây" + +#: syntax.c:5452 +#, c-format +msgid "E408: %s must be first in contains list" +msgstr "E408: %s phải là đầu tiên trong danh sách contains" + +#: syntax.c:5522 +#, c-format +msgid "E409: Unknown group name: %s" +msgstr "E409: Tên nhóm không biết: %s" + +#: syntax.c:5755 +#, c-format +msgid "E410: Invalid :syntax subcommand: %s" +msgstr "E410: Câu lệnh con :syntax không đúng: %s" + +#: syntax.c:6136 +#, c-format +msgid "E411: highlight group not found: %s" +msgstr "E411: không tìm thấy nhóm chiếu sáng cú pháp: %s" + +#: syntax.c:6160 +#, c-format +msgid "E412: Not enough arguments: \":highlight link %s\"" +msgstr "E412: Không đủ tham số: \":highlight link %s\"" + +#: syntax.c:6167 +#, c-format +msgid "E413: Too many arguments: \":highlight link %s\"" +msgstr "E413: Quá nhiều tham số: \":highlight link %s\"" + +#: syntax.c:6187 +msgid "E414: group has settings, highlight link ignored" +msgstr "E414: nhóm có thiết lập riêng, chiếu sáng liên kết bị bỏ qua" + +#: syntax.c:6316 +#, c-format +msgid "E415: unexpected equal sign: %s" +msgstr "E415: dấu bằng không được mong đợi: %s" + +#: syntax.c:6352 +#, c-format +msgid "E416: missing equal sign: %s" +msgstr "E416: thiếu dấu bằng: %s" + +#: syntax.c:6380 +#, c-format +msgid "E417: missing argument: %s" +msgstr "E417: thiếu tham số: %s" + +#: syntax.c:6417 +#, c-format +msgid "E418: Illegal value: %s" +msgstr "E418: Giá trị không cho phép: %s" + +#: syntax.c:6536 +msgid "E419: FG color unknown" +msgstr "E419: Không rõ màu văn bản (FG)" + +#: syntax.c:6547 +msgid "E420: BG color unknown" +msgstr "E420: Không rõ màu nền sau (BG)" + +#: syntax.c:6608 +#, c-format +msgid "E421: Color name or number not recognized: %s" +msgstr "E421: Tên hoặc số của màu không được nhận ra: %s" + +#: syntax.c:6814 +#, c-format +msgid "E422: terminal code too long: %s" +msgstr "E422: mã terminal quá dài: %s" + +#: syntax.c:6861 +#, c-format +msgid "E423: Illegal argument: %s" +msgstr "E423: Tham số không cho phép: %s" + +#: syntax.c:7390 +msgid "E424: Too many different highlighting attributes in use" +msgstr "E424: Sử dụng quá nhiều thuộc tính chiếu sáng cú pháp" + +#: syntax.c:7911 +msgid "E669: Unprintable character in group name" +msgstr "E669: Ký tự không thể tin ra trong tên nhóm" + +#. This is an error, but since there previously was no check only +#. * give a warning. +#: syntax.c:7918 +msgid "W18: Invalid character in group name" +msgstr "W18: Ký tự không cho phép trong tên nhóm" + +#: tag.c:90 +msgid "E555: at bottom of tag stack" +msgstr "E555: ở cuối đống thẻ ghi" + +#: tag.c:91 +msgid "E556: at top of tag stack" +msgstr "E556: ở đầu đống thẻ ghi" + +#: tag.c:412 +msgid "E425: Cannot go before first matching tag" +msgstr "E425: Không chuyển được tới vị trí ở trước thẻ ghi tương ứng đầu tiên" + +#: tag.c:550 +#, c-format +msgid "E426: tag not found: %s" +msgstr "E426: không tìm thấy thẻ ghi: %s" + +#: tag.c:583 +msgid " # pri kind tag" +msgstr "" + +#: tag.c:586 +msgid "file\n" +msgstr "tập tin\n" + +#. +#. * Ask to select a tag from the list. +#. * When using ":silent" assume that was entered. +#. +#: tag.c:744 +msgid "Enter nr of choice ( to abort): " +msgstr "Hãy chọn số cần thiết ( để dừng):" + +#: tag.c:784 +msgid "E427: There is only one matching tag" +msgstr "E427: Chỉ có một thẻ ghi tương ứng" + +#: tag.c:786 +msgid "E428: Cannot go beyond last matching tag" +msgstr "E428: Không chuyển được tới vị trí ở sau thẻ ghi tương ứng cuối cùng" + +#: tag.c:810 +#, c-format +msgid "File \"%s\" does not exist" +msgstr "Tập tin \"%s\" không tồn tại" + +#. Give an indication of the number of matching tags +#: tag.c:823 +#, c-format +msgid "tag %d of %d%s" +msgstr "thẻ ghi %d của %d%s" + +#: tag.c:826 +msgid " or more" +msgstr " và hơn nữa" + +#: tag.c:828 +msgid " Using tag with different case!" +msgstr " Đang sử dụng thẻ ghi với kiểu chữ khác!" + +#: tag.c:872 +#, c-format +msgid "E429: File \"%s\" does not exist" +msgstr "E429: Tập tin \"%s\" không tồn tại" + +#. Highlight title +#: tag.c:941 +msgid "" +"\n" +" # TO tag FROM line in file/text" +msgstr "" +"\n" +" # TỚI thẻ ghi TỪ dòng trong tập tin/văn bản" + +#: tag.c:1363 +#, c-format +msgid "Searching tags file %s" +msgstr "Tìm kiếm tập tin thẻ ghi %s" + +#: tag.c:1550 +#, c-format +msgid "E430: Tag file path truncated for %s\n" +msgstr "E430: Đường dẫn tới tập tin thẻ ghi bị cắt bớt cho %s\n" + +#: tag.c:2203 +#, c-format +msgid "E431: Format error in tags file \"%s\"" +msgstr "E431: Lỗi định dạng trong tập tin thẻ ghi \"%s\"" + +#: tag.c:2207 +#, c-format +msgid "Before byte %ld" +msgstr "Trước byte %ld" + +#: tag.c:2240 +#, c-format +msgid "E432: Tags file not sorted: %s" +msgstr "E432: Tập tin thẻ ghi chưa được sắp xếp: %s" + +#. never opened any tags file +#: tag.c:2280 +msgid "E433: No tags file" +msgstr "E433: Không có tập tin thẻ ghi" + +#: tag.c:3016 +msgid "E434: Can't find tag pattern" +msgstr "E434: Không tìm thấy mẫu thẻ ghi" + +#: tag.c:3027 +msgid "E435: Couldn't find tag, just guessing!" +msgstr "E435: Không tìm thấy thẻ ghi, đang thử đoán!" + +#: term.c:1759 +msgid "' not known. Available builtin terminals are:" +msgstr "' không rõ. Có các terminal gắn sẵn (builtin) sau:" + +#: term.c:1783 +msgid "defaulting to '" +msgstr "theo mặc định '" + +#: term.c:2141 +msgid "E557: Cannot open termcap file" +msgstr "E557: Không thể mở tập tin termcap" + +#: term.c:2145 +msgid "E558: Terminal entry not found in terminfo" +msgstr "E558: Trong terminfo không có bản ghi nào về terminal này" + +#: term.c:2147 +msgid "E559: Terminal entry not found in termcap" +msgstr "E559: Trong termcap không có bản ghi nào về terminal này" + +#: term.c:2306 +#, c-format +msgid "E436: No \"%s\" entry in termcap" +msgstr "E436: Trong termcap không có bản ghi \"%s\"" + +#: term.c:2780 +msgid "E437: terminal capability \"cm\" required" +msgstr "E437: cần khả năng của terminal \"cm\"" + +#. Highlight title +#: term.c:4990 +msgid "" +"\n" +"--- Terminal keys ---" +msgstr "" +"\n" +"--- Phím terminal ---" + +#: ui.c:258 +msgid "new shell started\n" +msgstr "đã chạy shell mới\n" + +#: ui.c:1841 +msgid "Vim: Error reading input, exiting...\n" +msgstr "Vim: Lỗi đọc dữ liệu nhập, thoát...\n" + +#. must display the prompt +#: undo.c:405 +msgid "No undo possible; continue anyway" +msgstr "Không thể hủy thao tác; tiếp tục thực hiện" + +#: undo.c:561 +msgid "E438: u_undo: line numbers wrong" +msgstr "E438: u_undo: số thứ tự dòng không đúng" + +#: undo.c:757 +msgid "1 change" +msgstr "duy nhất 1 thay đổi" + +#: undo.c:759 +#, c-format +msgid "%ld changes" +msgstr "%ld thay đổi" + +#: undo.c:812 +msgid "E439: undo list corrupt" +msgstr "E439: danh sách hủy thao tác (undo) bị hỏng" + +#: undo.c:844 +msgid "E440: undo line missing" +msgstr "E440: bị mất dòng hủy thao tác" + +#. Only MS VC 4.1 and earlier can do Win32s +#: version.c:721 +msgid "" +"\n" +"MS-Windows 16/32 bit GUI version" +msgstr "" +"\n" +"Phiên bản với giao diện đồ họa GUI cho MS-Windows 16/32 bit" + +#: version.c:723 +msgid "" +"\n" +"MS-Windows 32 bit GUI version" +msgstr "" +"\n" +"Phiên bản với giao diện đồ họa GUI cho MS-Windows 32 bit" + +#: version.c:726 +msgid " in Win32s mode" +msgstr " trong chế độ Win32" + +#: version.c:728 +msgid " with OLE support" +msgstr " với hỗ trợ OLE" + +#: version.c:731 +msgid "" +"\n" +"MS-Windows 32 bit console version" +msgstr "" +"\n" +"Phiên bản console cho MS-Windows 32 bit" + +#: version.c:735 +msgid "" +"\n" +"MS-Windows 16 bit version" +msgstr "" +"\n" +"Phiên bản cho MS-Windows 16 bit" + +#: version.c:739 +msgid "" +"\n" +"32 bit MS-DOS version" +msgstr "" +"\n" +"Phiên bản cho MS-DOS 32 bit" + +#: version.c:741 +msgid "" +"\n" +"16 bit MS-DOS version" +msgstr "" +"\n" +"Phiên bản cho MS-DOS 16 bit" + +#: version.c:747 +msgid "" +"\n" +"MacOS X (unix) version" +msgstr "" +"\n" +"Phiên bản cho MacOS X (unix)" + +#: version.c:749 +msgid "" +"\n" +"MacOS X version" +msgstr "" +"\n" +"Phiên bản cho MacOS X" + +#: version.c:752 +msgid "" +"\n" +"MacOS version" +msgstr "" +"\n" +"Phiên bản cho MacOS" + +#: version.c:757 +msgid "" +"\n" +"RISC OS version" +msgstr "" +"\n" +"Phiên bản cho RISC OS" + +#: version.c:767 +msgid "" +"\n" +"Included patches: " +msgstr "" +"\n" +"Bao gồm các bản vá lỗi: " + +#: version.c:793 version.c:1161 +msgid "Modified by " +msgstr "Với các thay đổi bởi " + +#: version.c:800 +msgid "" +"\n" +"Compiled " +msgstr "" +"\n" +"Được biên dịch " + +#: version.c:803 +msgid "by " +msgstr "bởi " + +#: version.c:815 +msgid "" +"\n" +"Huge version " +msgstr "" +"\n" +"Phiên bản khổng lồ " + +#: version.c:818 +msgid "" +"\n" +"Big version " +msgstr "" +"\n" +"Phiên bản lớn " + +#: version.c:821 +msgid "" +"\n" +"Normal version " +msgstr "" +"\n" +"Phiên bản thông thường " + +#: version.c:824 +msgid "" +"\n" +"Small version " +msgstr "" +"\n" +"Phiên bản nhỏ " + +#: version.c:826 +msgid "" +"\n" +"Tiny version " +msgstr "" +"\n" +"Phiên bản \"tí hon\" " + +#: version.c:832 +msgid "without GUI." +msgstr "không có giao diện đồ họa GUI." + +#: version.c:837 +msgid "with GTK2-GNOME GUI." +msgstr "với giao diện đồ họa GUI GTK2-GNOME." + +#: version.c:839 +msgid "with GTK-GNOME GUI." +msgstr "với giao diện đồ họa GUI GTK-GNOME." + +#: version.c:843 +msgid "with GTK2 GUI." +msgstr "với giao diện đồ họa GUI GTK2." + +#: version.c:845 +msgid "with GTK GUI." +msgstr "với giao diện đồ họa GUI GTK." + +#: version.c:850 +msgid "with X11-Motif GUI." +msgstr "với giao diện đồ họa GUI X11-Motif." + +#: version.c:854 +msgid "with X11-neXtaw GUI." +msgstr "với giao diện đồ họa GUI X11-neXtaw." + +#: version.c:856 +msgid "with X11-Athena GUI." +msgstr "với giao diện đồ họa GUI X11-Athena." + +#: version.c:860 +msgid "with BeOS GUI." +msgstr "với giao diện đồ họa GUI BeOS." + +#: version.c:863 +msgid "with Photon GUI." +msgstr "với giao diện đồ họa GUI Photon." + +#: version.c:866 +msgid "with GUI." +msgstr "với giao diện đồ họa GUI." + +#: version.c:869 +msgid "with Carbon GUI." +msgstr "với giao diện đồ họa GUI Carbon." + +#: version.c:872 +msgid "with Cocoa GUI." +msgstr "với giao diện đồ họa GUI Cocoa." + +#: version.c:875 +msgid "with (classic) GUI." +msgstr "với giao diện đồ họa (cổ điển) GUI." + +#: version.c:886 +msgid " Features included (+) or not (-):\n" +msgstr " Tính năng có (+) hoặc không (-):\n" + +#: version.c:898 +msgid " system vimrc file: \"" +msgstr " tập tin vimrc chung cho hệ thống: \"" + +#: version.c:903 +msgid " user vimrc file: \"" +msgstr " tập tin vimrc của người dùng: \"" + +#: version.c:908 +msgid " 2nd user vimrc file: \"" +msgstr " tập tin vimrc thứ hai của người dùng: \"" + +#: version.c:913 +msgid " 3rd user vimrc file: \"" +msgstr " tập tin vimrc thứ ba của người dùng: \"" + +#: version.c:918 +msgid " user exrc file: \"" +msgstr " tập tin exrc của người dùng: \"" + +#: version.c:923 +msgid " 2nd user exrc file: \"" +msgstr " tập tin exrc thứ hai của người dùng: \"" + +#: version.c:929 +msgid " system gvimrc file: \"" +msgstr " tập tin gvimrc chung cho hệ thống: \"" + +#: version.c:933 +msgid " user gvimrc file: \"" +msgstr " tập tin gvimrc của người dùng: \"" + +#: version.c:937 +msgid "2nd user gvimrc file: \"" +msgstr " tập tin gvimrc thứ hai của người dùng: \"" + +#: version.c:942 +msgid "3rd user gvimrc file: \"" +msgstr " tập tin gvimrc thứ ba của người dùng: \"" + +#: version.c:949 +msgid " system menu file: \"" +msgstr " tập tin trình đơn chung cho hệ thống: \"" + +#: version.c:957 +msgid " fall-back for $VIM: \"" +msgstr " giá trị $VIM theo mặc định: \"" + +#: version.c:963 +msgid " f-b for $VIMRUNTIME: \"" +msgstr " giá trị $VIMRUNTIME theo mặc định: \"" + +#: version.c:967 +msgid "Compilation: " +msgstr "Tham số biên dịch: " + +#: version.c:973 +msgid "Compiler: " +msgstr "Trình biên dịch: " + +#: version.c:978 +msgid "Linking: " +msgstr "Liên kết: " + +#: version.c:983 +msgid " DEBUG BUILD" +msgstr " BIÊN DỊCH SỬA LỖI (DEBUG)" + +#: version.c:1022 +msgid "VIM - Vi IMproved" +msgstr "VIM ::: Vi IMproved (Vi cải tiến) ::: Phiên bản tiếng Việt" + +#: version.c:1024 +msgid "version " +msgstr "phiên bản " + +#: version.c:1025 +msgid "by Bram Moolenaar et al." +msgstr "do Bram Moolenaar và những người khác" + +#: version.c:1029 +msgid "Vim is open source and freely distributable" +msgstr "Vim là chương trình mã nguồn mở và phân phối tự do" + +#: version.c:1031 +msgid "Help poor children in Uganda!" +msgstr "Hãy giúp đỡ trẻ em nghèo Uganda!" + +#: version.c:1032 +msgid "type :help iccf for information " +msgstr "hãy gõ :help iccf để biết thêm thông tin" + +#: version.c:1034 +msgid "type :q to exit " +msgstr "hãy gõ :q để thoát khỏi chương trình " + +#: version.c:1035 +msgid "type :help or for on-line help" +msgstr "hãy gõ :help hoặc để có được trợ giúp " + +#: version.c:1036 +msgid "type :help version6 for version info" +msgstr "hãy gõ :help version6 để biết về phiên bản này " + +#: version.c:1039 +msgid "Running in Vi compatible mode" +msgstr "Làm việc trong chế độ tương thích với Vi" + +#: version.c:1040 +msgid "type :set nocp for Vim defaults" +msgstr "hãy gõ :set nocp để chuyển vào chế độ Vim " + +#: version.c:1041 +msgid "type :help cp-default for info on this" +msgstr "hãy gõ :help cp-default để có thêm thông tin về điều này" + +#: version.c:1056 +msgid "menu Help->Orphans for information " +msgstr "trình đơn Trợ giúp->Mồ côi để có thêm thông tin " + +#: version.c:1058 +msgid "Running modeless, typed text is inserted" +msgstr "Không chế độ, văn bản nhập vào sẽ được chèn" + +#: version.c:1059 +msgid "menu Edit->Global Settings->Toggle Insert Mode " +msgstr "trình đơn Soạn thảo->Thiết lập chung->Chế độ chèn " + +#: version.c:1060 +msgid " for two modes " +msgstr " cho hai chế độ " + +#: version.c:1064 +msgid "menu Edit->Global Settings->Toggle Vi Compatible" +msgstr "trình đơn Soạn thảo->Thiết lập chung->Tương thích với Vi " + +#: version.c:1065 +msgid " for Vim defaults " +msgstr " để chuyển vào chế độ Vim mặc định " + +#: version.c:1112 +msgid "Sponsor Vim development!" +msgstr "Hãy giúp đỡ phát triển Vim!" + +#: version.c:1113 +msgid "Become a registered Vim user!" +msgstr "Hãy trở thành người dùng đăng ký của Vim!" + +#: version.c:1116 +msgid "type :help sponsor for information " +msgstr "hãy gõ :help sponsor để biết thêm thông tin " + +#: version.c:1117 +msgid "type :help register for information " +msgstr "hãy gõ :help register để biết thêm thông tin " + +#: version.c:1119 +msgid "menu Help->Sponsor/Register for information " +msgstr "trình đơn Trợ giúp->Giúp đỡ/Đăng ký để biết thêm thông tin " + +#: version.c:1129 +msgid "WARNING: Windows 95/98/ME detected" +msgstr "CẢNH BÁO: nhận ra Windows 95/98/ME" + +#: version.c:1132 +msgid "type :help windows95 for info on this" +msgstr "hãy gõ :help windows95 để biết thêm thông tin " + +#: window.c:203 +msgid "E441: There is no preview window" +msgstr "E441: Không có cửa sổ xem trước" + +#: window.c:581 +msgid "E442: Can't split topleft and botright at the same time" +msgstr "E442: Cửa sổ không thể đồng thời ở bên trái phía trên và bên phải phía dưới" + +#: window.c:1340 +msgid "E443: Cannot rotate when another window is split" +msgstr "E443: Không đổi được chỗ khi cửa sổ khác được chia" + +#: window.c:1836 +msgid "E444: Cannot close last window" +msgstr "E444: Không được đóng cửa sổ cuối cùng" + +#: window.c:2567 +msgid "Already only one window" +msgstr "Chỉ có một cửa sổ" + +#: window.c:2614 +msgid "E445: Other window contains changes" +msgstr "E445: Cửa sổ khác có thay đổi chưa được ghi nhớ" + +#: window.c:4480 +msgid "E446: No file name under cursor" +msgstr "E446: Không có tên tập tin tại vị trí con trỏ" + +#: window.c:4599 +#, c-format +msgid "E447: Can't find file \"%s\" in path" +msgstr "E447: Không tìm thấy tập tin \"%s\" trong đường dẫn" + +#: if_perl.xs:326 globals.h:1232 +#, c-format +msgid "E370: Could not load library %s" +msgstr "E370: Không nạp được thư viện %s" + +#: if_perl.xs:554 +msgid "Sorry, this command is disabled: the Perl library could not be loaded." +msgstr "Xin lỗi, câu lệnh này bị tắt: không nạp được thư viện Perl." + +#: if_perl.xs:607 +msgid "E299: Perl evaluation forbidden in sandbox without the Safe module" +msgstr "" +"E299: Không cho phép sự tính toán Perl trong hộp cát mà không có môđun An toàn" + +#: GvimExt/gvimext.cpp:583 +msgid "Edit with &multiple Vims" +msgstr "Soạn thảo trong nhiều Vi&m" + +#: GvimExt/gvimext.cpp:589 +msgid "Edit with single &Vim" +msgstr "Soạn thảo trong một &Vim" + +#: GvimExt/gvimext.cpp:598 +msgid "&Diff with Vim" +msgstr "&So sánh (diff) qua Vim" + +#: GvimExt/gvimext.cpp:611 +msgid "Edit with &Vim" +msgstr "Soạn thảo trong &Vim" + +#. Now concatenate +#: GvimExt/gvimext.cpp:633 +msgid "Edit with existing Vim - &" +msgstr "Soạn thảo trong Vim đã chạy - &" + +#: GvimExt/gvimext.cpp:746 +msgid "Edits the selected file(s) with Vim" +msgstr "Soạn thảo (các) tập tin đã chọn trong Vim" + +#: GvimExt/gvimext.cpp:885 GvimExt/gvimext.cpp:966 +msgid "Error creating process: Check if gvim is in your path!" +msgstr "Lỗi tạo tiến trình: Hãy kiểm tra xem gvim có trong đường dẫn không!" + +#: GvimExt/gvimext.cpp:886 GvimExt/gvimext.cpp:900 GvimExt/gvimext.cpp:967 +msgid "gvimext.dll error" +msgstr "lỗi gvimext.dll" + +#: GvimExt/gvimext.cpp:899 +msgid "Path length too long!" +msgstr "Đường dẫn quá dài!" + +#: globals.h:1022 +msgid "--No lines in buffer--" +msgstr "-- Không có dòng nào trong bộ đệm --" + +#. +#. * The error messages that can be shared are included here. +#. * Excluded are errors that are only used once and debugging messages. +#. +#: globals.h:1185 +msgid "E470: Command aborted" +msgstr "E470: Câu lệnh bị dừng" + +#: globals.h:1186 +msgid "E471: Argument required" +msgstr "E471: Cần chỉ ra tham số" + +#: globals.h:1187 +msgid "E10: \\ should be followed by /, ? or &" +msgstr "E10: Sau \\ phải là các ký tự /, ? hoặc &" + +#: globals.h:1189 +msgid "E11: Invalid in command-line window; executes, CTRL-C quits" +msgstr "E11: Lỗi trong cửa sổ dòng lệnh; thực hiện, CTRL-C thoát" + +#: globals.h:1191 +msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" +msgstr "" +"E12: Câu lệnh không cho phép từ exrc/vimrc trong thư mục hiện thời hoặc trong" +"tìm kiếm thẻ ghi" + +#: globals.h:1193 +msgid "E171: Missing :endif" +msgstr "E171: Thiếu câu lệnh :endif" + +#: globals.h:1194 +msgid "E600: Missing :endtry" +msgstr "E600: Thiếu câu lệnh :endtry" + +#: globals.h:1195 +msgid "E170: Missing :endwhile" +msgstr "E170: Thiếu câu lệnh :endwhile" + +#: globals.h:1196 +msgid "E588: :endwhile without :while" +msgstr "E588: Câu lệnh :endwhile không có lệnh :while (1 cặp)" + +#: globals.h:1198 +msgid "E13: File exists (add ! to override)" +msgstr "E13: Tập tin đã tồn tại (thêm ! để ghi chèn)" + +#: globals.h:1199 +msgid "E472: Command failed" +msgstr "E472: Không thực hiện thành công câu lệnh" + +#: globals.h:1201 +#, c-format +msgid "E234: Unknown fontset: %s" +msgstr "E234: Không rõ bộ phông chữ: %s" + +#: globals.h:1205 +#, c-format +msgid "E235: Unknown font: %s" +msgstr "E235: Không rõ phông chữ: %s" + +#: globals.h:1208 +#, c-format +msgid "E236: Font \"%s\" is not fixed-width" +msgstr "E236: Phông chữ \"%s\" không có độ rộng cố định (fixed-width)" + +#: globals.h:1210 +msgid "E473: Internal error" +msgstr "E473: Lỗi nội bộ" + +#: globals.h:1211 +msgid "Interrupted" +msgstr "Bị gián đoạn" + +#: globals.h:1212 +msgid "E14: Invalid address" +msgstr "E14: Địa chỉ không cho phép" + +#: globals.h:1213 +msgid "E474: Invalid argument" +msgstr "E474: Tham số không cho phép" + +#: globals.h:1214 +#, c-format +msgid "E475: Invalid argument: %s" +msgstr "E475: Tham số không cho phép: %s" + +#: globals.h:1216 +#, c-format +msgid "E15: Invalid expression: %s" +msgstr "E15: Biểu thức không cho phép: %s" + +#: globals.h:1218 +msgid "E16: Invalid range" +msgstr "E16: Vùng không cho phép" + +#: globals.h:1219 +msgid "E476: Invalid command" +msgstr "E476: Câu lệnh không cho phép" + +#: globals.h:1221 +#, c-format +msgid "E17: \"%s\" is a directory" +msgstr "E17: \"%s\" là mộ thư mục" + +#: globals.h:1224 +msgid "E18: Unexpected characters before '='" +msgstr "E18: Ở trước '=' có các ký tự không mong đợi" + +#: globals.h:1227 +#, c-format +msgid "E364: Library call failed for \"%s()\"" +msgstr "E364: Gọi hàm số \"%s()\" của thư viện không thành công" + +#: globals.h:1233 +#, c-format +msgid "E448: Could not load library function %s" +msgstr "E448: Nạp hàm số %s của thư viện không thành công" + +#: globals.h:1235 +msgid "E19: Mark has invalid line number" +msgstr "E19: Dấu hiệu chỉ đến một số thứ tự dòng không đúng" + +#: globals.h:1236 +msgid "E20: Mark not set" +msgstr "E20: Dấu hiệu không được xác định" + +#: globals.h:1237 +msgid "E21: Cannot make changes, 'modifiable' is off" +msgstr "E21: Không thể thay đổi, vì tùy chọn 'modifiable' bị tắt" + +#: globals.h:1238 +msgid "E22: Scripts nested too deep" +msgstr "E22: Các script lồng vào nhau quá sâu" + +#: globals.h:1239 +msgid "E23: No alternate file" +msgstr "E23: Không có tập tin xen kẽ" + +#: globals.h:1240 +msgid "E24: No such abbreviation" +msgstr "E24: Không có chữ viết tắt như vậy" + +#: globals.h:1241 +msgid "E477: No ! allowed" +msgstr "E477: Không cho phép !" + +#: globals.h:1243 +msgid "E25: GUI cannot be used: Not enabled at compile time" +msgstr "E25: Không sử dụng được giao diện đồ họa vì không chọn khi biên dịch" + +#: globals.h:1246 +msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" +msgstr "E26: Tiếng Do thái không được chọn khi biên dịch\n" + +#: globals.h:1249 +msgid "E27: Farsi cannot be used: Not enabled at compile time\n" +msgstr "E27: Tiếng Farsi không được chọn khi biên dịch\n" + +#: globals.h:1252 +msgid "E800: Arabic cannot be used: Not enabled at compile time\n" +msgstr "E800: Tiếng Ả Rập không được chọn khi biên dịch\n" + +#: globals.h:1255 +#, c-format +msgid "E28: No such highlight group name: %s" +msgstr "E28: Nhóm chiếu sáng cú pháp %s không tồn tại" + +#: globals.h:1257 +msgid "E29: No inserted text yet" +msgstr "E29: Tạm thời chưa có văn bản được chèn" + +#: globals.h:1258 +msgid "E30: No previous command line" +msgstr "E30: Không có dòng lệnh trước" + +#: globals.h:1259 +msgid "E31: No such mapping" +msgstr "E31: Không có ánh xạ (mapping) như vậy" + +#: globals.h:1260 +msgid "E479: No match" +msgstr "E479: Không có tương ứng" + +#: globals.h:1261 +#, c-format +msgid "E480: No match: %s" +msgstr "E480: Không có tương ứng: %s" + +#: globals.h:1262 +msgid "E32: No file name" +msgstr "E32: Không có tên tập tin" + +#: globals.h:1263 +msgid "E33: No previous substitute regular expression" +msgstr "E33: Không có biểu thức chính quy trước để thay thế" + +#: globals.h:1264 +msgid "E34: No previous command" +msgstr "E34: Không có câu lệnh trước" + +#: globals.h:1265 +msgid "E35: No previous regular expression" +msgstr "E35: Không có biểu thức chính quy trước" + +#: globals.h:1266 +msgid "E481: No range allowed" +msgstr "E481: Không cho phép sử dụng phạm vi" + +#: globals.h:1268 +msgid "E36: Not enough room" +msgstr "E36: Không đủ chỗ trống" + +#: globals.h:1271 +#, c-format +msgid "E247: no registered server named \"%s\"" +msgstr "E247: máy chủ \"%s\" chưa đăng ký" + +#: globals.h:1273 +#, c-format +msgid "E482: Can't create file %s" +msgstr "E482: Không tạo được tập tin %s" + +#: globals.h:1274 +msgid "E483: Can't get temp file name" +msgstr "E483: Không nhận được tên tập tin tạm thời (temp)" + +#: globals.h:1275 +#, c-format +msgid "E484: Can't open file %s" +msgstr "E484: Không mở được tập tin %s" + +#: globals.h:1276 +#, c-format +msgid "E485: Can't read file %s" +msgstr "E485: Không đọc được tập tin %s" + +#: globals.h:1277 +msgid "E37: No write since last change (add ! to override)" +msgstr "E37: Thay đổi chưa được ghi nhớ (thêm ! để bỏ qua ghi nhớ)" + +#: globals.h:1278 +msgid "E38: Null argument" +msgstr "E38: Tham sô bằng 0" + +#: globals.h:1280 +msgid "E39: Number expected" +msgstr "E39: Yêu cầu một số" + +#: globals.h:1283 +#, c-format +msgid "E40: Can't open errorfile %s" +msgstr "E40: Không mở được tập tin lỗi %s" + +#: globals.h:1286 +msgid "E233: cannot open display" +msgstr "E233: không mở được màn hình" + +#: globals.h:1288 +msgid "E41: Out of memory!" +msgstr "E41: Không đủ bộ nhớ!" + +#: globals.h:1290 +msgid "Pattern not found" +msgstr "Không tìm thấy mẫu (pattern)" + +#: globals.h:1292 +#, c-format +msgid "E486: Pattern not found: %s" +msgstr "E486: Không tìm thấy mẫu (pattern): %s" + +#: globals.h:1293 +msgid "E487: Argument must be positive" +msgstr "E487: Tham số phải là một số dương" + +#: globals.h:1295 +msgid "E459: Cannot go back to previous directory" +msgstr "E459: Không quay lại được thư mục trước đó" + +#: globals.h:1299 +msgid "E42: No Errors" +msgstr "E42: Không có lỗi" + +#: globals.h:1301 +msgid "E43: Damaged match string" +msgstr "E43: Chuỗi tương ứng bị hỏng" + +#: globals.h:1302 +msgid "E44: Corrupted regexp program" +msgstr "E44: Chương trình xử lý biểu thức chính quy bị hỏng" + +#: globals.h:1303 +msgid "E45: 'readonly' option is set (add ! to override)" +msgstr "E45: Tùy chọn 'readonly' được bật (Hãy thêm ! để lờ đi)" + +#: globals.h:1305 +#, c-format +msgid "E46: Cannot set read-only variable \"%s\"" +msgstr "E46: Không thay đổi được biến chỉ đọc \"%s\"" + +#: globals.h:1308 +msgid "E47: Error while reading errorfile" +msgstr "E47: Lỗi khi đọc tập tin lỗi" + +#: globals.h:1311 +msgid "E48: Not allowed in sandbox" +msgstr "E48: Không cho phép trong hộp cát (sandbox)" + +#: globals.h:1313 +msgid "E523: Not allowed here" +msgstr "E523: Không cho phép ở đây" + +#: globals.h:1316 +msgid "E359: Screen mode setting not supported" +msgstr "E359: Chế độ màn hình không được hỗ trợ" + +#: globals.h:1318 +msgid "E49: Invalid scroll size" +msgstr "E49: Kích thước thanh cuộn không cho phép" + +#: globals.h:1319 +msgid "E91: 'shell' option is empty" +msgstr "E91: Tùy chọn 'shell' là một chuỗi rỗng" + +#: globals.h:1321 +msgid "E255: Couldn't read in sign data!" +msgstr "E255: Không đọc được dữ liệu về ký tự!" + +#: globals.h:1323 +msgid "E72: Close error on swap file" +msgstr "E72: Lỗi đóng tập tin trao đổi (swap)" + +#: globals.h:1324 +msgid "E73: tag stack empty" +msgstr "E73: đống thẻ ghi rỗng" + +#: globals.h:1325 +msgid "E74: Command too complex" +msgstr "E74: Câu lệnh quá phức tạp" + +#: globals.h:1326 +msgid "E75: Name too long" +msgstr "E75: Tên quá dài" + +#: globals.h:1327 +msgid "E76: Too many [" +msgstr "E76: Quá nhiều ký tự [" + +#: globals.h:1328 +msgid "E77: Too many file names" +msgstr "E77: Quá nhiều tên tập tin" + +#: globals.h:1329 +msgid "E488: Trailing characters" +msgstr "E488: Ký tự thừa ở đuôi" + +#: globals.h:1330 +msgid "E78: Unknown mark" +msgstr "E78: Dấu hiệu không biết" + +#: globals.h:1331 +msgid "E79: Cannot expand wildcards" +msgstr "E79: Không thực hiện được phép thế theo wildcard" + +#: globals.h:1333 +msgid "E591: 'winheight' cannot be smaller than 'winminheight'" +msgstr "E591: giá trị của 'winheight' không thể nhỏ hơn 'winminheight'" + +#: globals.h:1335 +msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" +msgstr "E592: giá trị của 'winwidth' không thể nhỏ hơn 'winminwidth'" + +#: globals.h:1338 +msgid "E80: Error while writing" +msgstr "E80: Lỗi khi ghi nhớ" + +#: globals.h:1339 +msgid "Zero count" +msgstr "Giá trị của bộ đếm bằng 0" + +#: globals.h:1341 +msgid "E81: Using not in a script context" +msgstr "E81: Sử dụng ngoài phạm vi script" + +#: globals.h:1344 +msgid "E449: Invalid expression received" +msgstr "E449: Nhận được một biểu thức không cho phép" + +#: globals.h:1347 +msgid "E463: Region is guarded, cannot modify" +msgstr "E463: Không thể thay đổi vùng đã được bảo vệ" diff --git a/src/proto/eval.pro b/src/proto/eval.pro index b43003967..2a6f12e27 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -21,7 +21,9 @@ char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd)); int eval_to_number __ARGS((char_u *expr)); char_u *call_vim_function __ARGS((char_u *func, int argc, char_u **argv, int safe)); void *save_funccal __ARGS((void)); -void restore_funccal __ARGS((void *fc)); +void restore_funccal __ARGS((void *vfc)); +void prof_child_enter __ARGS((proftime_T *tm)); +void prof_child_exit __ARGS((proftime_T *tm)); int eval_foldexpr __ARGS((char_u *arg, int *cp)); void ex_let __ARGS((exarg_T *eap)); void *eval_for_line __ARGS((char_u *arg, int *errp, char_u **nextcmdp, int skip)); @@ -34,6 +36,9 @@ void ex_lockvar __ARGS((exarg_T *eap)); int do_unlet __ARGS((char_u *name, int forceit)); void del_menutrans_vars __ARGS((void)); char_u *get_user_var_name __ARGS((expand_T *xp, int idx)); +int list_append_dict __ARGS((list_T *list, dict_T *dict)); +dict_T *dict_alloc __ARGS((void)); +int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str)); char_u *get_function_name __ARGS((expand_T *xp, int idx)); char_u *get_expr_name __ARGS((expand_T *xp, int idx)); void set_vim_var_nr __ARGS((int idx, long val)); @@ -52,6 +57,7 @@ void ex_echo __ARGS((exarg_T *eap)); void ex_echohl __ARGS((exarg_T *eap)); void ex_execute __ARGS((exarg_T *eap)); void ex_function __ARGS((exarg_T *eap)); +void func_dump_profile __ARGS((FILE *fd)); char_u *get_user_func_name __ARGS((expand_T *xp, int idx)); void ex_delfunction __ARGS((exarg_T *eap)); void ex_return __ARGS((exarg_T *eap)); @@ -59,6 +65,9 @@ int do_return __ARGS((exarg_T *eap, int reanimate, int is_cmd, void *rettv)); void discard_pending_return __ARGS((void *rettv)); char_u *get_return_cmd __ARGS((void *rettv)); char_u *get_func_line __ARGS((int c, void *cookie, int indent)); +void func_line_start __ARGS((void *cookie)); +void func_line_exec __ARGS((void *cookie)); +void func_line_end __ARGS((void *cookie)); int func_has_ended __ARGS((void *cookie)); int func_has_abort __ARGS((void *cookie)); int read_viminfo_varlist __ARGS((vir_T *virp, int writing)); diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro index 3fa692212..72d88dd74 100644 --- a/src/proto/ex_cmds2.pro +++ b/src/proto/ex_cmds2.pro @@ -8,7 +8,24 @@ void ex_debuggreedy __ARGS((exarg_T *eap)); void ex_breakdel __ARGS((exarg_T *eap)); void ex_breaklist __ARGS((exarg_T *eap)); linenr_T dbg_find_breakpoint __ARGS((int file, char_u *fname, linenr_T after)); +int has_profiling __ARGS((int file, char_u *fname, int *fp)); void dbg_breakpoint __ARGS((char_u *name, linenr_T lnum)); +void profile_zero __ARGS((proftime_T *tm)); +void profile_start __ARGS((proftime_T *tm)); +void profile_end __ARGS((proftime_T *tm)); +void profile_sub __ARGS((proftime_T *tm, proftime_T *tm2)); +void profile_add __ARGS((proftime_T *tm, proftime_T *tm2)); +void profile_get_wait __ARGS((proftime_T *tm)); +void profile_sub_wait __ARGS((proftime_T *tm, proftime_T *tma)); +int profile_equal __ARGS((proftime_T *tm1, proftime_T *tm2)); +char *profile_msg __ARGS((proftime_T *tm)); +void ex_profile __ARGS((exarg_T *eap)); +void profile_dump __ARGS((void)); +void script_prof_save __ARGS((proftime_T *tm)); +void script_prof_restore __ARGS((proftime_T *tm)); +void prof_inchar_enter __ARGS((void)); +void prof_inchar_exit __ARGS((void)); +int prof_def_func __ARGS((void)); int autowrite __ARGS((buf_T *buf, int forceit)); void autowrite_all __ARGS((void)); int check_changed __ARGS((buf_T *buf, int checkaw, int mult_win, int forceit, int allbuf)); @@ -43,11 +60,13 @@ int *source_dbg_tick __ARGS((void *cookie)); int source_level __ARGS((void *cookie)); int do_source __ARGS((char_u *fname, int check_other, int is_vimrc)); void ex_scriptnames __ARGS((exarg_T *eap)); -int has_scriptname __ARGS((char_u *name)); void scriptnames_slash_adjust __ARGS((void)); char_u *get_scriptname __ARGS((scid_T id)); char *fgets_cr __ARGS((char *s, int n, FILE *stream)); char_u *getsourceline __ARGS((int c, void *cookie, int indent)); +void script_line_start __ARGS((void)); +void script_line_exec __ARGS((void)); +void script_line_end __ARGS((void)); void ex_scriptencoding __ARGS((exarg_T *eap)); void ex_finish __ARGS((exarg_T *eap)); void do_finish __ARGS((exarg_T *eap, int reanimate)); diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro index eb042f047..5cbd27018 100644 --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -40,6 +40,7 @@ void vim_free __ARGS((void *x)); int vim_stricmp __ARGS((char *s1, char *s2)); int vim_strnicmp __ARGS((char *s1, char *s2, size_t len)); char_u *vim_strchr __ARGS((char_u *string, int c)); +char_u *vim_strbyte __ARGS((char_u *string, int c)); char_u *vim_strrchr __ARGS((char_u *string, int c)); int vim_isspace __ARGS((int x)); void ga_clear __ARGS((garray_T *gap)); diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro index de96a0477..966b0184d 100644 --- a/src/proto/os_mswin.pro +++ b/src/proto/os_mswin.pro @@ -31,6 +31,7 @@ void clip_mch_lose_selection __ARGS((VimClipboard *cbd)); short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp)); char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp)); void clip_mch_request_selection __ARGS((VimClipboard *cbd)); +void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen)); void clip_mch_set_selection __ARGS((VimClipboard *cbd)); void DumpPutS __ARGS((const char *psz)); int mch_get_winpos __ARGS((int *x, int *y)); diff --git a/src/proto/quickfix.pro b/src/proto/quickfix.pro index 4f61d5932..c73187668 100644 --- a/src/proto/quickfix.pro +++ b/src/proto/quickfix.pro @@ -19,7 +19,8 @@ void ex_cc __ARGS((exarg_T *eap)); void ex_cnext __ARGS((exarg_T *eap)); void ex_cfile __ARGS((exarg_T *eap)); void ex_vimgrep __ARGS((exarg_T *eap)); -char_u *skip_vimgrep_pat __ARGS((char_u *p, char_u **s)); +char_u *skip_vimgrep_pat __ARGS((char_u *p, char_u **s, int *flags)); +int get_errorlist __ARGS((list_T *list)); void ex_cbuffer __ARGS((exarg_T *eap)); void ex_helpgrep __ARGS((exarg_T *eap)); /* vim: set ft=c : */ diff --git a/src/quickfix.c b/src/quickfix.c index 079e6c981..38f7d95d0 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -35,7 +35,7 @@ struct qf_line int qf_col; /* column where the error occurred */ int qf_nr; /* error number */ char_u *qf_text; /* description of the error */ - char_u qf_virt_col; /* set to TRUE if qf_col is screen column */ + char_u qf_viscol; /* set to TRUE if qf_col is screen column */ char_u qf_cleared;/* set to TRUE if line has been deleted */ char_u qf_type; /* type of the error (mostly 'E'); 1 for :helpgrep */ @@ -88,7 +88,7 @@ struct eformat static int qf_init_ext __ARGS((char_u *efile, buf_T *buf, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast)); static void qf_new_list __ARGS((void)); -static int qf_add_entry __ARGS((struct qf_line **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int virt_col, int nr, int type, int valid)); +static int qf_add_entry __ARGS((struct qf_line **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int vis_col, int nr, int type, int valid)); static void qf_msg __ARGS((void)); static void qf_free __ARGS((int idx)); static char_u *qf_types __ARGS((int, int)); @@ -147,7 +147,7 @@ qf_init_ext(efile, buf, errorformat, newlist, lnumfirst, lnumlast) char_u *errmsg; char_u *fmtstr = NULL; int col = 0; - char_u use_virt_col = FALSE; + char_u use_viscol = FALSE; int type = 0; int valid; linenr_T buflnum = lnumfirst; @@ -467,7 +467,7 @@ restofline: errmsg[0] = NUL; lnum = 0; col = 0; - use_virt_col = FALSE; + use_viscol = FALSE; enr = -1; type = 0; tail = NULL; @@ -515,12 +515,12 @@ restofline: { col = (int)(regmatch.endp[i] - regmatch.startp[i] + 1); if (*((char_u *)regmatch.startp[i]) != TAB) - use_virt_col = TRUE; + use_viscol = TRUE; } if ((i = (int)fmt_ptr->addr[8]) > 0) /* %v */ { col = (int)atol((char *)regmatch.startp[i]); - use_virt_col = TRUE; + use_viscol = TRUE; } break; } @@ -578,7 +578,7 @@ restofline: qfprev->qf_lnum = lnum; if (!qfprev->qf_col) qfprev->qf_col = col; - qfprev->qf_virt_col = use_virt_col; + qfprev->qf_viscol = use_viscol; if (!qfprev->qf_fnum) qfprev->qf_fnum = qf_get_fnum(directory, *namebuf || directory ? namebuf @@ -623,7 +623,7 @@ restofline: errmsg, lnum, col, - use_virt_col, + use_viscol, enr, type, valid) == FAIL) @@ -714,14 +714,14 @@ qf_new_list() * Returns OK or FAIL. */ static int -qf_add_entry(prevp, dir, fname, mesg, lnum, col, virt_col, nr, type, valid) +qf_add_entry(prevp, dir, fname, mesg, lnum, col, vis_col, nr, type, valid) struct qf_line **prevp; /* pointer to previously added entry or NULL */ char_u *dir; /* optional directory name */ char_u *fname; /* file name or NULL */ char_u *mesg; /* message */ long lnum; /* line number */ int col; /* column */ - int virt_col; /* using virtual column */ + int vis_col; /* using visual column */ int nr; /* error number */ int type; /* type character */ int valid; /* valid entry */ @@ -739,7 +739,7 @@ qf_add_entry(prevp, dir, fname, mesg, lnum, col, virt_col, nr, type, valid) } qfp->qf_lnum = lnum; qfp->qf_col = col; - qfp->qf_virt_col = virt_col; + qfp->qf_viscol = vis_col; qfp->qf_nr = nr; if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */ type = 0; @@ -1285,7 +1285,7 @@ qf_jump(dir, errornr, forceit) if (qf_ptr->qf_col > 0) { curwin->w_cursor.col = qf_ptr->qf_col - 1; - if (qf_ptr->qf_virt_col == TRUE) + if (qf_ptr->qf_viscol == TRUE) { /* * Check each character from the beginning of the error @@ -2300,6 +2300,8 @@ ex_vimgrep(eap) #endif #ifdef FEAT_AUTOCMD char_u *au_name = NULL; + int flags = 0; + colnr_T col; switch (eap->cmdidx) { @@ -2318,14 +2320,12 @@ ex_vimgrep(eap) /* Get the search pattern: either white-separated or enclosed in // */ regmatch.regprog = NULL; - p = skip_vimgrep_pat(eap->arg, &s); + p = skip_vimgrep_pat(eap->arg, &s, &flags); if (p == NULL) { EMSG(_("E682: Invalid search pattern or delimiter")); goto theend; } - if (*p != NUL) - *p++ = NUL; regmatch.regprog = vim_regcomp(s, RE_MAGIC); if (regmatch.regprog == NULL) goto theend; @@ -2437,10 +2437,13 @@ ex_vimgrep(eap) goto jumpend; } #endif + /* Try for a match in all lines of the buffer. */ for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum) { - if (vim_regexec_multi(®match, curwin, buf, lnum, - (colnr_T)0) > 0) + /* For ":1vimgrep" look for multiple matches. */ + col = 0; + while (vim_regexec_multi(®match, curwin, buf, lnum, + col) > 0) { if (qf_add_entry(&prevp, NULL, /* dir */ @@ -2449,7 +2452,7 @@ ex_vimgrep(eap) regmatch.startpos[0].lnum + lnum, FALSE), regmatch.startpos[0].lnum + lnum, regmatch.startpos[0].col + 1, - FALSE, /* virt_col */ + FALSE, /* vis_col */ 0, /* nr */ 0, /* type */ TRUE /* valid */ @@ -2460,6 +2463,13 @@ ex_vimgrep(eap) } else found_match = TRUE; + if ((flags & VGR_GLOBAL) == 0 + || regmatch.endpos[0].lnum > 0) + break; + col = regmatch.endpos[0].col + + (col == regmatch.endpos[0].col); + if (col > STRLEN(ml_get_buf(buf, lnum, FALSE))) + break; } line_breakcheck(); if (got_int) @@ -2485,14 +2495,14 @@ jumpend: { /* When not hiding the buffer and no match was found we * don't need to remember the buffer, wipe it out. If - * there was a match and it wasn't the first one: only - * unload the buffer. */ + * there was a match and it wasn't the first one or we + * won't jump there: only unload the buffer. */ if (!found_match) { wipe_dummy_buffer(buf); buf = NULL; } - else if (buf != first_match_buf) + else if (buf != first_match_buf || (flags & VGR_NOJUMP)) { unload_dummy_buffer(buf); buf = NULL; @@ -2528,7 +2538,10 @@ jumpend: /* Jump to first match. */ if (qf_lists[qf_curlist].qf_count > 0) - qf_jump(0, 0, FALSE); + { + if ((flags & VGR_NOJUMP) == 0) + qf_jump(0, 0, eap->forceit); + } else EMSG2(_(e_nomatch2), s); @@ -2543,29 +2556,57 @@ theend: } /* - * Skip over the pattern argument of ":vimgrep /pat/". + * Skip over the pattern argument of ":vimgrep /pat/[g][j]". * Put the start of the pattern in "*s", unless "s" is NULL. - * Return a pointer to the char just past the pattern. + * If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP. + * If "s" is not NULL terminate the pattern with a NUL. + * Return a pointer to the char just past the pattern plus flags. */ char_u * -skip_vimgrep_pat(p, s) - char_u *p; - char_u **s; +skip_vimgrep_pat(p, s, flags) + char_u *p; + char_u **s; + int *flags; { int c; if (vim_isIDc(*p)) { + /* ":vimgrep pattern fname" */ if (s != NULL) *s = p; - return skiptowhite(p); + p = skiptowhite(p); + if (s != NULL && *p != NUL) + *p++ = NUL; + } + else + { + /* ":vimgrep /pattern/[g][j] fname" */ + if (s != NULL) + *s = p + 1; + c = *p; + p = skip_regexp(p + 1, c, TRUE, NULL); + if (*p != c) + return NULL; + + /* Truncate the pattern. */ + if (s != NULL) + *p = NUL; + ++p; + + /* Find the flags */ + while (*p == 'g' || *p == 'j') + { + if (flags != NULL) + { + if (*p == 'g') + *flags |= VGR_GLOBAL; + else + *flags |= VGR_NOJUMP; + } + ++p; + } } - if (s != NULL) - *s = p + 1; - c = *p; - p = skip_regexp(p + 1, c, TRUE, NULL); - if (*p != c) - return NULL; return p; } @@ -2667,6 +2708,51 @@ unload_dummy_buffer(buf) close_buffer(NULL, buf, DOBUF_UNLOAD); } +#if defined(FEAT_EVAL) || defined(PROTO) +/* + * Add each quickfix error to list "list" as a dictionary. + */ + int +get_errorlist(list) + list_T *list; +{ + dict_T *dict; + char_u buf[2]; + struct qf_line *qfp; + int i; + + if (qf_curlist >= qf_listcount || qf_lists[qf_curlist].qf_count == 0) + { + EMSG(_(e_quickfix)); + return FAIL; + } + + qfp = qf_lists[qf_curlist].qf_start; + for (i = 1; !got_int && i <= qf_lists[qf_curlist].qf_count; ++i) + { + if ((dict = dict_alloc()) == NULL) + return FAIL; + if (list_append_dict(list, dict) == FAIL) + return FAIL; + + buf[0] = qfp->qf_type; + buf[1] = NUL; + if ( dict_add_nr_str(dict, "bufnr", (long)qfp->qf_fnum, NULL) == FAIL + || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL + || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL + || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL + || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL + || dict_add_nr_str(dict, "text", 0L, qfp->qf_text) == FAIL + || dict_add_nr_str(dict, "type", 0L, buf) == FAIL + || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL) + return FAIL; + + qfp = qfp->qf_next; + } + return OK; +} +#endif + /* * ":[range]cbuffer [bufnr]" command. */ @@ -2781,7 +2867,7 @@ ex_helpgrep(eap) lnum, (int)(regmatch.startp[0] - IObuff) + 1, /* col */ - FALSE, /* virt_col */ + FALSE, /* vis_col */ 0, /* nr */ 1, /* type */ TRUE /* valid */ diff --git a/src/regexp.c b/src/regexp.c index c4f892078..6f15824df 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -3265,12 +3265,38 @@ vim_regexec_both(line, col) #endif c = *prog->regmust; s = line + col; - while ((s = cstrchr(s, c)) != NULL) - { - if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) - break; /* Found it. */ - mb_ptr_adv(s); - } + + /* + * This is used very often, esp. for ":global". Use three versions of + * the loop to avoid overhead of conditions. + */ + if (!ireg_ic +#ifdef FEAT_MBYTE + && !has_mbyte +#endif + ) + while ((s = vim_strbyte(s, c)) != NULL) + { + if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) + break; /* Found it. */ + ++s; + } +#ifdef FEAT_MBYTE + else if (!ireg_ic || (!enc_utf8 && mb_char2len(c) > 1)) + while ((s = vim_strchr(s, c)) != NULL) + { + if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) + break; /* Found it. */ + mb_ptr_adv(s); + } +#endif + else + while ((s = cstrchr(s, c)) != NULL) + { + if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) + break; /* Found it. */ + mb_ptr_adv(s); + } if (s == NULL) /* Not present. */ goto theend; } @@ -3339,8 +3365,16 @@ vim_regexec_both(line, col) { if (prog->regstart != NUL) { - /* Skip until the char we know it must start with. */ - s = cstrchr(regline + col, prog->regstart); + /* Skip until the char we know it must start with. + * Used often, do some work to avoid call overhead. */ + if (!ireg_ic +#ifdef FEAT_MBYTE + && !has_mbyte +#endif + ) + s = vim_strbyte(regline + col, prog->regstart); + else + s = cstrchr(regline + col, prog->regstart); if (s == NULL) { retval = 0; @@ -3375,7 +3409,8 @@ vim_regexec_both(line, col) #ifdef HAVE_SETJMP_H inner_end: - ; + if (did_mch_startjmp) + mch_endjmp(); #endif #ifdef HAVE_TRY_EXCEPT } @@ -3391,10 +3426,6 @@ inner_end: retval = 0L; } #endif -#ifdef HAVE_SETJMP_H - if (did_mch_startjmp) - mch_endjmp(); -#endif theend: /* Didn't find a match. */ diff --git a/src/ui.c b/src/ui.c index 6d100dcd4..0941a3799 100644 --- a/src/ui.c +++ b/src/ui.c @@ -138,6 +138,11 @@ ui_inchar(buf, maxlen, wtime, tb_change_cnt) } #endif +#ifdef FEAT_PROFILE + if (do_profiling && wtime != 0) + prof_inchar_enter(); +#endif + #ifdef NO_CONSOLE_INPUT /* Don't wait for character input when the window hasn't been opened yet. * Do try reading, this works when redirecting stdin from a file. @@ -150,12 +155,13 @@ ui_inchar(buf, maxlen, wtime, tb_change_cnt) # ifndef NO_CONSOLE retval = mch_inchar(buf, maxlen, 10L, tb_change_cnt); if (retval > 0 || typebuf_changed(tb_change_cnt)) - return retval; + goto theend; # endif if (wtime == -1 && ++count == 1000) read_error_exit(); buf[0] = CAR; - return 1; + retval = 1; + goto theend; } #endif @@ -186,6 +192,13 @@ ui_inchar(buf, maxlen, wtime, tb_change_cnt) ctrl_c_interrupts = TRUE; +#ifdef NO_CONSOLE_INPUT +theend: +#endif +#ifdef FEAT_PROFILE + if (do_profiling && wtime != 0) + prof_inchar_exit(); +#endif return retval; } diff --git a/src/version.c b/src/version.c index bb0f25b25..e879438f7 100644 --- a/src/version.c +++ b/src/version.c @@ -421,6 +421,11 @@ static char *(features[]) = #else "-printer", #endif +#ifdef FEAT_PROFILE + "+profile", +#else + "-profile", +#endif #ifdef FEAT_PYTHON # ifdef DYNAMIC_PYTHON "+python/dyn", diff --git a/src/version.h b/src/version.h index f73c68e4f..febf243a6 100644 --- a/src/version.h +++ b/src/version.h @@ -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 (2005 Feb 21)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 21, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 26)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 26, compiled " diff --git a/src/vim.h b/src/vim.h index fa554b026..36e5d67f0 100644 --- a/src/vim.h +++ b/src/vim.h @@ -1533,7 +1533,8 @@ int vim_memcmp __ARGS((void *, void *, size_t)); #define VV_INSERTMODE 33 #define VV_VAL 34 #define VV_KEY 35 -#define VV_LEN 36 /* number of v: vars */ +#define VV_PROFILING 36 +#define VV_LEN 37 /* number of v: vars */ #ifdef FEAT_CLIPBOARD @@ -1620,6 +1621,12 @@ typedef int VimClipboard; /* This is required for the prototypes. */ # endif #endif +#ifdef FEAT_PROFILE +typedef struct timeval proftime_T; +#else +typedef int proftime_T; /* dummy for function prototypes */ +#endif + #include "option.h" /* option variables and defines */ #include "ex_cmds.h" /* Ex command defines */ #include "proto.h" /* function prototypes */ @@ -1865,4 +1872,8 @@ typedef int VimClipboard; /* This is required for the prototypes. */ # define handle_signal(x) 0 #endif +/* flags for skip_vimgrep_pat() */ +#define VGR_GLOBAL 1 +#define VGR_NOJUMP 2 + #endif /* VIM__H */ diff --git a/src/window.c b/src/window.c index c96bb9755..7cd2f0224 100644 --- a/src/window.c +++ b/src/window.c @@ -74,6 +74,11 @@ static void win_new_height __ARGS((win_T *, int)); #define NOWIN (win_T *)-1 /* non-exisiting window */ +#ifdef FEAT_WINDOWS +static long p_ch_used = 1L; /* value of 'cmdheight' when frame + size was set */ +#endif + #if defined(FEAT_WINDOWS) || defined(PROTO) /* * all CTRL-W window commands are handled here, called from normal_cmd(). @@ -498,6 +503,23 @@ do_window(nchar, Prenum, xchar) break; #endif + case K_KENTER: + case CAR: +#if defined(FEAT_QUICKFIX) + /* + * In a quickfix window a jumps to the error under the + * cursor in a new window. + */ + if (bt_quickfix(curbuf)) + { + sprintf((char *)cbuf, "split +%ldcc", + (long)curwin->w_cursor.lnum); + do_cmdline_cmd(cbuf); + } +#endif + break; + + /* CTRL-W g extended commands */ case 'g': case Ctrl_G: @@ -2680,6 +2702,9 @@ win_alloc_first() topframe->fr_width = Columns; #endif topframe->fr_height = Rows - p_ch; +#ifdef FEAT_WINDOWS + p_ch_used = p_ch; +#endif topframe->fr_win = curwin; curwin->w_frame = topframe; } @@ -3308,6 +3333,10 @@ shell_new_rows() win_new_height(firstwin, h); #endif compute_cmdrow(); +#ifdef FEAT_WINDOWS + p_ch_used = p_ch; +#endif + #if 0 /* Disabled: don't want making the screen smaller make a window larger. */ if (p_ea) @@ -4315,6 +4344,13 @@ command_height(old_p_ch) int h; frame_T *frp; + /* When passed a negative value use the value of p_ch that we remembered. + * This is needed for when the GUI starts up, we can't be sure in what + * order things happen. */ + if (old_p_ch < 0) + old_p_ch = p_ch_used; + p_ch_used = p_ch; + /* Find bottom frame with width of screen. */ frp = lastwin->w_frame; # ifdef FEAT_VERTSPLIT -- cgit v1.2.1