summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2005-02-26 23:04:13 +0000
committerBram Moolenaar <Bram@vim.org>2005-02-26 23:04:13 +0000
commit05159a0c6a27a030c8497c5cf836977090f9e75d (patch)
tree9ccc167cf3e830e5d01aff4555f99d854cbb623b /src
parent5313dcb75ac76501f23d21ac94efdbeeabc860bc (diff)
downloadvim-git-05159a0c6a27a030c8497c5cf836977090f9e75d.tar.gz
updated for version 7.0052v7.0052
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c38
-rw-r--r--src/eval.c452
-rw-r--r--src/ex_cmds.c80
-rw-r--r--src/ex_cmds.h6
-rw-r--r--src/ex_cmds2.c750
-rw-r--r--src/ex_docmd.c61
-rw-r--r--src/feature.h7
-rw-r--r--src/fileio.c12
-rw-r--r--src/globals.h5
-rw-r--r--src/gui.c2
-rw-r--r--src/gui_mac.c2
-rw-r--r--src/gui_w32.c3
-rw-r--r--src/main.c4
-rw-r--r--src/misc1.c59
-rw-r--r--src/misc2.c48
-rw-r--r--src/normal.c4
-rw-r--r--src/option.c25
-rw-r--r--src/os_mswin.c39
-rw-r--r--src/po/Make_ming.mak4
-rw-r--r--src/po/Make_mvc.mak4
-rw-r--r--src/po/Makefile4
-rw-r--r--src/po/vi.po6625
-rw-r--r--src/proto/eval.pro11
-rw-r--r--src/proto/ex_cmds2.pro21
-rw-r--r--src/proto/misc2.pro1
-rw-r--r--src/proto/os_mswin.pro1
-rw-r--r--src/proto/quickfix.pro3
-rw-r--r--src/quickfix.c156
-rw-r--r--src/regexp.c57
-rw-r--r--src/ui.c17
-rw-r--r--src/version.c5
-rw-r--r--src/version.h4
-rw-r--r--src/vim.h13
-rw-r--r--src/window.c36
34 files changed, 8315 insertions, 244 deletions
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;
@@ -5470,6 +5557,42 @@ dict_add(d, item)
}
/*
+ * 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.
*/
static long
@@ -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},
@@ -7421,6 +7552,36 @@ f_empty(argvars, rettv)
}
/*
+ * "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
*/
static void
@@ -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 <SNR>%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)
@@ -605,6 +685,35 @@ dbg_find_breakpoint(file, fname, after)
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;
linenr_T lnum = 0;
@@ -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 "<SNR>". */
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(&regmatch, 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 <fname>"));
+ 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
@@ -380,6 +380,13 @@
#endif
/*
+ * +profile Profiling for functions and scripts.
+ */
+#ifdef FEAT_HUGE
+# define FEAT_PROFILE
+#endif
+
+/*
* Insert mode completion with 'completefunc'.
*/
#if defined(FEAT_INS_EXPAND) && defined(FEAT_EVAL)
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)
@@ -1431,9 +1431,30 @@ vim_strchr(string, c)
}
/*
+ * 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 <CR> 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 <CR> 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
@@ -2962,6 +2969,10 @@ set_init_1()
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" <teppi@vnlinux.org>, 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 <teppi@vnlinux.org>\n"
+"Language-Team: Phan Vinh Thinh <teppi@vnlinux.org>\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 <SID> not in a script context: %s"
+msgstr "E120: Sử dụng <SID> 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 \"<afile>\""
+msgstr "E495: Không có tên tập tin câu lệnh tự động để thay thế \"<afile>\""
+
+#: ex_docmd.c:8341
+msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
+msgstr "E496: Không có số thứ tự bộ đệm câu lệnh tự động để thay thế \"<abuf>\""
+
+#: ex_docmd.c:8352
+msgid "E497: no autocommand match name to substitute for \"<amatch>\""
+msgstr "E497: Không có tên tương ứng câu lệnh tự động để thay thế \"<amatch>\""
+
+#: ex_docmd.c:8362
+msgid "E498: no :source file name to substitute for \"<sfile>\""
+msgstr "E498: không có tên tập tin :source để thay thế \"<sfile>\""
+
+#: 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 "<cannot open> "
+msgstr "<không thể mở> "
+
+#: 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 <ident>"
+msgstr "E562: Sử dụng: cstag <tên>"
+
+#: 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 "<buffer object (deleted) at %8lX>"
+msgstr "<vật thể của bộ đệm (bị xóa) tại %8lX>"
+
+#: 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 "<window object (deleted) at %.8lX>"
+msgstr "<vật thể của cửa sổ (bị xóa) tại %.8lX>"
+
+#: if_python.c:1968
+#, c-format
+msgid "<window object (unknown) at %.8lX>"
+msgstr "<vật thể của cửa sổ (không rõ) tại %.8lX>"
+
+#: if_python.c:1970
+#, c-format
+msgid "<window %d>"
+msgstr "<cửa sổ %d>"
+
+#: 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 <device>\t\tUse <device> for I/O"
+msgstr "-dev <thiết bị>\t\tSử dụng <thiết bị> 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 <terminal>\tSet terminal type to <terminal>"
+msgstr "-T <terminal>\tĐặt loại terminal thành <terminal>"
+
+#: main.c:2517
+msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
+msgstr "-u <vimrc>\t\tSử dụng <vimrc> thay thế cho mọi .vimrc"
+
+#: main.c:2519
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\tSử dụng <gvimrc> 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 "+<lnum>\t\tStart at line <lnum>"
+msgstr "+<lnum>\t\tBắt đầu soạn thảo từ dòng thứ <lnum> (số thứ tự của dòng)"
+
+#: main.c:2527
+msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
+msgstr "--cmd <câu lệnh>\tThực hiện <câu lệnh> trước khi nạp tập tin vimrc"
+
+#: main.c:2529
+msgid "-c <command>\t\tExecute <command> after loading the first file"
+msgstr "-c <câu lệnh>\t\tThực hiện <câu lệnh> sau khi nạp tập tin đầu tiên"
+
+#: main.c:2530
+msgid "-S <session>\t\tSource file <session> after loading the first file"
+msgstr "-S <session>\t\tThực hiện <session> sau khi nạp tập tin đầu tiên"
+
+#: main.c:2531
+msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
+msgstr "-s <scriptin>\tĐọc các lệnh của chế độ Thông thường từ tập tin <scriptin>"
+
+#: main.c:2532
+msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
+msgstr "-w <scriptout>\tThêm tất cả các lệnh đã gõ vào tập tin <scriptout>"
+
+#: main.c:2533
+msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
+msgstr "-W <scriptout>\tGhi nhớ tất cả các lệnh đã gõ vào tập tin <scriptout>"
+
+#: 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 <display>\tConnect vim to this particular X-server"
+msgstr "-display <màn hình>\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 <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <tập tin>\tSoạn thảo <tập tin> trên máy chủ Vim nếu có thể"
+
+#: main.c:2545
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-silent <tập tin> Cũng vậy, nhưng không kêu ca dù không có máy chủ"
+
+#: main.c:2546
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <tập tin> Cũng như --remote, nhưng chờ sự kết thúc"
+
+#: main.c:2547
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <tập tin> Cũng vậy, nhưng không kêu ca dù không có máy chủ"
+
+#: main.c:2548
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <phím>\tGửi <phím> lên máy chủ Vim và thoát"
+
+#: main.c:2549
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr "--remote-expr <biểu thức>\tTính <biểu thức> 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 <name>\tSend to/become the Vim server <name>"
+msgstr ""
+"--servername <tên>\tGửi lên (hoặc trở thành) máy chủ Vim với <tên>"
+
+#: main.c:2554
+msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
+msgstr "-i <viminfo>\t\tSử dụng tập tin <viminfo> 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 <display>\tRun vim on <display>"
+msgstr "-display <màn hình>\tChạy vim trong <màn hình> đã 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 <name>\t\tUse resource as if vim was <name>"
+msgstr "-name <tên>\t\tSử dụng tài nguyên giống như khi vim có <tên>"
+
+#: 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 <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <màu>\tSử dụng <màu> chỉ ra cho nền (cũng như: -bg)"
+
+#: main.c:2578
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <màu>\tSử dụng <màu> cho văn bản thông thường (cũng như: -fg)"
+
+#: main.c:2579 main.c:2599
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <phông>\t\tSử dụng <phông> chữ cho văn bản thông thường (cũng như: -fn)"
+
+#: main.c:2580
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <phông>\tSử dụng <phông> chữ cho văn bản in đậm"
+
+#: main.c:2581
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <phông>\tSử dụng <phông> chữ cho văn bản in nghiêng"
+
+#: main.c:2582 main.c:2600
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr ""
+"-geometry <kích thước>\tSử dụng <kích thước> ban đầu (cũng như: -geom)"
+
+#: main.c:2583
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <rộng>\tSử dụng đường viền có chiều <rộng> (cũng như: -bw)"
+
+#: main.c:2584
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <rộng> Sử dụng thanh cuộn với chiều <rộng> (cũng như: -sw)"
+
+#: main.c:2586
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr "-menuheight <cao>\tSử dụng thanh trình đơn với chiều <cao> (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 <resource>\tSet the specified resource"
+msgstr "-xrm <tài nguyên>\tĐặt <tài nguyên> 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 <number>\tInitial width of window in columns"
+msgstr "--columns <số>\tChiều rộng ban đầu của cửa sổ tính theo số cột"
+
+#: main.c:2595
+msgid "--rows <number>\tInitial height of window in rows"
+msgstr "--rows <số>\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 <display>\tRun vim on <display> (also: --display)"
+msgstr ""
+"-display <màn hình>\tChạy vim trên <màn hình> chỉ ra (cũng như: --display)"
+
+#: main.c:2604
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <vai trò>\tĐặt <vai trò> duy nhất để nhận diện cửa sổ chính"
+
+#: main.c:2606
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tMở Vim bên trong thành phần GTK khác"
+
+#: main.c:2609
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <tiêu đề của mẹ>\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 <Bram@vim.org>"
+msgstr ""
+"Bản dịch các thông báo sang tiếng Việt: Phan Vĩnh Thịnh <teppi@vnlinux.org>"
+
+#: 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<Enter> to exit Vim"
+msgstr "Gõ :quit<Enter> để 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 <CR> was entered.
+#.
+#: tag.c:744
+msgid "Enter nr of choice (<CR> to abort): "
+msgstr "Hãy chọn số cần thiết (<CR> để 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<Enter> for information "
+msgstr "hãy gõ :help iccf<Enter> để biết thêm thông tin"
+
+#: version.c:1034
+msgid "type :q<Enter> to exit "
+msgstr "hãy gõ :q<Enter> để thoát khỏi chương trình "
+
+#: version.c:1035
+msgid "type :help<Enter> or <F1> for on-line help"
+msgstr "hãy gõ :help<Enter> hoặc <F1> để có được trợ giúp "
+
+#: version.c:1036
+msgid "type :help version6<Enter> for version info"
+msgstr "hãy gõ :help version6<Enter> để 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<Enter> for Vim defaults"
+msgstr "hãy gõ :set nocp<Enter> để chuyển vào chế độ Vim "
+
+#: version.c:1041
+msgid "type :help cp-default<Enter> for info on this"
+msgstr "hãy gõ :help cp-default<Enter> để 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<Enter> for information "
+msgstr "hãy gõ :help sponsor<Enter> để biết thêm thông tin "
+
+#: version.c:1117
+msgid "type :help register<Enter> for information "
+msgstr "hãy gõ :help register<Enter> để 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<Enter> for info on this"
+msgstr "hãy gõ :help windows95<Enter> để 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; <CR> executes, CTRL-C quits"
+msgstr "E11: Lỗi trong cửa sổ dòng lệnh; <CR> 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 <SID> not in a script context"
+msgstr "E81: Sử dụng <SID> 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(&regmatch, curwin, buf, lnum,
- (colnr_T)0) > 0)
+ /* For ":1vimgrep" look for multiple matches. */
+ col = 0;
+ while (vim_regexec_multi(&regmatch, 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 <CR> 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