Mercurial > vim
changeset 170:8c60f65311fa v7.0052
updated for version 7.0052
line wrap: on
line diff
--- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1,4 +1,4 @@ -*change.txt* For Vim version 7.0aa. Last change: 2005 Feb 21 +*change.txt* For Vim version 7.0aa. Last change: 2005 Feb 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -527,7 +527,7 @@ comment (starting with '"') after the ": 4.2 Substitute *:substitute* *:s* *:su* -:[range]s[ubstitute]/{pattern}/{string}/[&][#][c][e][g][p][r][i][I] [count] +:[range]s[ubstitute]/{pattern}/{string}/[flags] [count] For each line in [range] replace a match of {pattern} with {string}. For the {pattern} see |pattern|. @@ -539,31 +539,31 @@ 4.2 Substitute *:substitute* starting with the last line in [range]. When [range] is omitted start in the current line. Also see |cmdline-ranges|. - See |:s_flags| for the flags. + See |:s_flags| for [flags]. -:[range]s[ubstitute] [#][c][e][g][p][r][i][I] [count] -:[range]&[&][#][c][e][g][p][r][i][I] [count] *:&* +:[range]s[ubstitute] [flags] [count] +:[range]&[&][flags] [count] *:&* Repeat last :substitute with same search pattern and substitute string, but without the same flags. You - may add extra flags (see |:s_flags|). + may add [flags], see |:s_flags|. Note that after ":substitute" the '&' flag can't be used, it's recognized as a pattern separator. The space between ":substitute" and the 'c', 'g' and 'r' flags isn't required, but in scripts it's a good idea to keep it to avoid confusion. -:[range]~[&][#][c][e][g][p][r][i][I] [count] *:~* +:[range]~[&][flags] [count] *:~* Repeat last substitute with same substitute string but with last used search pattern. This is like - ":&r". See |:s_flags| for the flags. + ":&r". See |:s_flags| for [flags]. - *&* + *&* & Synonym for ":s//~/" (repeat last substitute). Note that the flags are not remembered, thus it might actually work differently. You can use ":&&" to keep the flags. - *g&* + *g&* g& Synonym for ":%s//~/&" (repeat last substitute on all lines with the same flags). Mnemonic: global substitute. {not in Vi} @@ -629,6 +629,10 @@ The flags that you can use for the subst options are not used. {not in Vi} +[n] Report the number of matches, do not actually substitute. The [c] + flag is ignored. The matches are reported as if 'report' is zero. + Useful to |count-items|. + [p] Print the line containing the last substitute. [#] Like [p] and prepend the line number.
--- a/runtime/doc/debugger.txt +++ b/runtime/doc/debugger.txt @@ -1,4 +1,4 @@ -*debugger.txt* For Vim version 7.0aa. Last change: 2005 Jan 29 +*debugger.txt* For Vim version 7.0aa. Last change: 2005 Feb 23 VIM REFERENCE MANUAL by Gordon Prieur @@ -90,8 +90,8 @@ was to allow Sun's Visual WorkShop debug However, the feature was implemented in as general a manner as possible and could be used for displaying other information as well. -The Balloon Evaluation has some settable parameters too. The font list and -colors can be set via X resources (XmNballoonEvalFontList, +The Balloon Evaluation has some settable parameters too. For Motif the font +list and colors can be set via X resources (XmNballoonEvalFontList, XmNballoonEvalBackground, and XmNballoonEvalForeground). The 'balloondelay' option sets the delay before an attempt is made to show a balloon.
--- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.0aa. Last change: 2005 Feb 21 +*eval.txt* For Vim version 7.0aa. Last change: 2005 Feb 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -961,7 +961,7 @@ variable internal variable See below |internal-variables|. -function call *expr-function* *E116* *E117* *E118* *E119* *E120* +function call *expr-function* *E116* *E118* *E119* *E120* ------------- function(expr1, ...) function call See below |functions|. @@ -1270,6 +1270,10 @@ v:prevcount The count given for the last :vmap % <Esc>:call MyFilter(v:prevcount)<CR> < Read-only. + *v:profiling* *profiling-variable* +v:profiling Normally zero. Set to one after using ":profile start". + See |profiling|. + *v:progname* *progname-variable* v:progname Contains the name (with path removed) with which Vim was invoked. Allows you to do special initialisations for "view", @@ -1396,6 +1400,7 @@ did_filetype() Number TRUE if FileType diff_filler( {lnum}) Number diff filler lines about {lnum} diff_hlID( {lnum}, {col}) Number diff highlighting at {lnum}/{col} empty( {expr}) Number TRUE if {expr} is empty +errorlist() List list of quickfix items escape( {string}, {chars}) String escape {chars} in {string} with '\' eval( {string}) any evaluate {string} into its value eventhandler( ) Number TRUE if inside an event handler @@ -1965,6 +1970,28 @@ empty({expr}) *empty()* For a long List this is much faster then comparing the length with zero. +errorlist() *errorlist()* + Returns a list with all the current quickfix errors. Each + list item is a dictionary with these entries: + bufnr number of buffer that has the file name, use + bufname() to get the name + lnum line number in the buffer (first line is 1) + col column number (first column is 1) + vcol non-zero: column number is visual column + zero: column number is byte index + nr error number + text description of the error + type type of the error, 'E', '1', etc. + valid non-zero: recognized error message + + Useful application: Find pattern matches in multiple files and + do something with them: > + :vimgrep /theword/jg *.c + :for d in errorlist() + : echo bufname(d.bufnr) ':' d.lnum '=' d.text + :endfor + + escape({string}, {chars}) *escape()* Escape the characters in {chars} that occur in {string} with a backslash. Example: > @@ -3031,7 +3058,14 @@ match({expr}, {pat}[, {start}[, {count}] :echo match("testing", "ing") " results in 4 :echo match([1, 'x'], '\a') " results in 2 < See |string-match| for how {pat} is used. - + *strpbrk()* + Vim doesn't have a strpbrk() function. But you can do: > + :let sepidx = match(line, '[.,;: \t]') +< *strcasestr()* + Vim doesn't have a strcasestr() function. But you can add + "\c" to the pattern to ignore case: > + :let idx = match(haystack, '\cneedle') +< When {count} is given use the {count}'th match. When a match is found in a String the search for the next one starts on character further. Thus this example results in 1: > @@ -3063,6 +3097,13 @@ matchend({expr}, {pat}[, {start}[, {coun the match. Example: > :echo matchend("testing", "ing") < results in "7". + *strspn()* *strcspn()* + Vim doesn't have a strspn() or strcspn() function, but you can + do it with matchend(): > + :let span = matchend(line, '[a-zA-Z]') + :let span = matchend(line, '[^a-zA-Z]') +< Except that -1 is returned when there are no matches. + The {start}, if given, has the same meaning as for match(). > :echo matchend("testing", "ing", 2) < results in "7". > @@ -3620,7 +3661,10 @@ stridx({haystack}, {needle} [, {start}]) :echo stridx("An Example", "Example") 3 :echo stridx("Starting point", "Start") 0 :echo stridx("Starting point", "start") -1 -< +< *strstr()* *strchr()* + stridx() works similar to the C function strstr(). When used + with a single character it works similar to strchr(). + *string()* string({expr}) Return {expr} converted to a String. If {expr} is a Number, String or a composition of them, then the result can be parsed @@ -3673,7 +3717,10 @@ strridx({haystack}, {needle} [, {start}] If the {needle} is empty the length of {haystack} is returned. See also |stridx()|. Examples: > :echo strridx("an angry armadillo", "an") 3 -< +< *strrchr()* + When used with a single character it works similar to the C + function strrchr(). + strtrans({expr}) *strtrans()* The result is a String, which is {expr} with all unprintable characters translated into printable characters |'isprint'|. @@ -3769,7 +3816,7 @@ system({expr} [, {input}]) *system()* When {input} is given, this string is written to a file and passed as stdin to the command. The string is written as-is, you need to take care of using the correct line separators - yourself. + yourself. Pipes are not used. Note: newlines in {expr} may cause the command to fail. The characters in 'shellquote' and 'shellxquote' may also cause trouble. @@ -4081,6 +4128,7 @@ path_extra Compiled with up/downwards s perl Compiled with Perl interface. postscript Compiled with PostScript file printing. printer Compiled with |:hardcopy| support. +profile Compiled with |:profile| support. python Compiled with Python interface. qnx QNX version of Vim. quickfix Compiled with |quickfix| support. @@ -4384,6 +4432,8 @@ the "autoload" directory in 'runtimepath Using an autocommand ~ +This is introduced in the user manual, section |41.14|. + The autocommand is useful if you have a plugin that is a long Vim script file. You can define the autocommand and quickly quit the script with |:finish|. That makes Vim startup faster. The autocommand should then load the same file @@ -4400,6 +4450,8 @@ The file "~/vim/bufnetfuncs.vim" should Using an autoload script ~ *autoload* *E746* +This is introduced in the user manual, section |41.15|. + Using a script in the "autoload" directory is simpler, but requires using exactly the right file name. A function that can be autoloaded has a name like this: >
--- a/runtime/doc/indent.txt +++ b/runtime/doc/indent.txt @@ -1,4 +1,4 @@ -*indent.txt* For Vim version 7.0aa. Last change: 2004 Sep 02 +*indent.txt* For Vim version 7.0aa. Last change: 2005 Feb 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -485,6 +485,20 @@ to get do loops indented in .f90 files a other extensions such as .for. +PYTHON *python-indent* + +The amount of indent can be set for the following situations. The examples +given are de the defaults. Note that the variables are set to an expression, +so that you can change the value of 'shiftwidth' later. + +Indent after an open paren: > + let g:pyindent_open_paren = '&sw * 2' +Indent after a nested paren: > + let g:pyindent_nested_paren = '&sw' +Indent for a continuation line: > + let g:pyindent_continue = '&sw * 2' + + VERILOG *verilog-indent* General block statements such as if, for, case, always, initial, function,
--- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1,4 +1,4 @@ -*index.txt* For Vim version 7.0aa. Last change: 2005 Jan 31 +*index.txt* For Vim version 7.0aa. Last change: 2005 Feb 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1258,10 +1258,13 @@ The commands are sorted on the non-optio |:options| :opt[ions] open the options-window |:ounmap| :ou[nmap] like ":unmap" but for Operator-pending mode |:ounmenu| :ounme[nu] remove menu for Operator-pending mode -|:print| :p[rint] print lines |:pclose| :pc[lose] close preview window |:pedit| :ped[it] edit file in the preview window |:perl| :pe[rl] execute Perl command +|:print| :p[rint] print lines +|:profile| :prof[ile] profiling functions and scripts +|:promptfind| :pro[mtfind] open GUI dialog for searching +|:promptrepl| :promtr[epl] open GUI dialog for search/replace |:perldo| :perld[o] execute Perl command for each line |:pop| :po[p] jump to older entry in tag stack |:popup| :pop[up] popup a menu by name
--- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 7.0aa. Last change: 2005 Feb 21 +*options.txt* For Vim version 7.0aa. Last change: 2005 Feb 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2986,7 +2986,8 @@ A jump table for the options with a shor font names a list can be specified, font names separated with commas. The first valid font is used. - When 'guifontset' is not empty, 'guifont' is not used. + On systems where 'guifontset' is supported (X11) and 'guifontset' is + not empty, then 'guifont' is not used. Spaces after a comma are ignored. To include a comma in a font name precede it with a backslash. Setting an option requires an extra @@ -3003,7 +3004,7 @@ A jump table for the options with a shor the case of X). The font names given should be "normal" fonts. Vim will try to find the related bold and italic fonts. - For Win32, GTK and Photon only: > + For Win32, GTK, Mac OS and Photon: > :set guifont=* < will bring up a font requester, where you can pick the font you want. @@ -3013,7 +3014,10 @@ A jump table for the options with a shor For the GTK+ 2 GUI the font name looks like this: > :set guifont=Andale\ Mono\ 11 < That's all. XLFDs are no longer accepted. - *E236* + + For Mac OSX you can use something like this: > + :set guifont=Monaco:h10 +< *E236* Note that the fonts must be mono-spaced (all characters have the same width). An exception is GTK 2: all fonts are accepted, but mono-spaced fonts look best.
--- a/runtime/doc/quickfix.txt +++ b/runtime/doc/quickfix.txt @@ -1,4 +1,4 @@ -*quickfix.txt* For Vim version 7.0aa. Last change: 2005 Feb 06 +*quickfix.txt* For Vim version 7.0aa. Last change: 2005 Feb 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,6 +30,11 @@ The idea is to save the error messages f to jump to the errors one by one. You can examine each problem and fix it, without having to remember all the error messages. +In Vim the quickfix commands are used more generally to find a list of +positions in files. For example, |:vimgrep| finds pattern matches. You can +use the positions in a script with the |errorlist()| function. Thus you can +do a lot more than the edit/compile/fix cycle! + If you are using Manx's Aztec C compiler on the Amiga look here for how to use it with Vim: |quickfix-manx|. If you are using another compiler you should save the error messages in a file and start Vim with "vim -q filename". An @@ -170,12 +175,14 @@ height manually (e.g., by dragging the s In the quickfix window, each line is one error. The line number is equal to the error number. You can use ":.cc" to jump to the error under the cursor. -Hitting the <CR> key or double-clicking the mouse on a line has the same +Hitting the <Enter> key or double-clicking the mouse on a line has the same effect. The file containing the error is opened in the window above the quickfix window. If there already is a window for that file, it is used instead. If the buffer in the used window has changed, and the error is in another file, jumping to the error will fail. You will first have to make sure the window contains a buffer which can be abandoned. + *CTRL-W_<Enter>* *CTRL-W_<CR>* +You can use CTRL-W <Enter> to open a new window and jump to the error there. When the quickfix window has been filled, two autocommand events are triggered. First the 'filetype' option is set to "qf", which triggers the @@ -303,16 +310,25 @@ advantages are: 5.1 using Vim's internal grep *:vim* *:vimgrep* *E682* *E683* -:vim[grep][!] /{pattern}/ {file} ... +:vim[grep][!] /{pattern}/[g][j] {file} ... Search for {pattern} in the files {file} ... and set the error list to the matches. - {pattern} if a Vim search pattern. Instead of - enclosing it in / any non-ID character |'isident'| - can be used, so long as it does not appear in - {pattern}. - 'ignorecase' applies. To overrule it use |/\c| to - ignore case or |/\C| to match case. 'smartcase' is - not used. + Without the 'g' flag each line is added only once. + With 'g' every match is added. + + {pattern} is a Vim search pattern. Instead of + enclosing it in / any non-ID character (see + |'isident'|) can be used, so long as it does not + appear in {pattern}. + 'ignorecase' applies. To overrule it put |/\c| in the + pattern to ignore case or |/\C| to match case. + 'smartcase' is not used. + + Without the 'j' flag Vim jumps to the first match. + With 'j' only the quickfix list is updated. + With the [!] any changes in the current buffer are + abandoned. + Every second or so the searched file name is displayed to give you an idea of the progress made. Examples: > @@ -327,7 +343,8 @@ 5.1 using Vim's internal grep :vimgrep Error *.c < *:vimgrepa* *:vimgrepadd* -:vimgrepa[dd][!] [/]{pattern}[/] {file} ... +:vimgrepa[dd][!] /{pattern}/[g][j] {file} ... +:vimgrepa[dd][!] {pattern} {file} ... Just like ":vimgrep", but instead of making a new list of errors the matches are appended to the current list. @@ -462,7 +479,7 @@ not "b:current_compiler". What the comm - Execute ":runtime! compiler/{name}.vim". The plugins are expected to set options with "CompilerSet" and set the "current_compiler" variable to the name of the compiler. -- Delete the "CompilerSet user command. +- Delete the "CompilerSet" user command. - Set "b:current_compiler" to the value of "current_compiler". - Without "!" the old value of "current_compiler" is restored.
--- a/runtime/doc/repeat.txt +++ b/runtime/doc/repeat.txt @@ -1,4 +1,4 @@ -*repeat.txt* For Vim version 7.0aa. Last change: 2005 Feb 19 +*repeat.txt* For Vim version 7.0aa. Last change: 2005 Feb 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -13,6 +13,7 @@ 2. Multiple repeats |multi-repeat| 3. Complex repeats |complex-repeat| 4. Using Vim scripts |using-scripts| 5. Debugging scripts |debug-scripts| +6. Profiling |profiling| ============================================================================== 1. Single repeats *single-repeat* @@ -483,6 +484,7 @@ DEFINING BREAKPOINTS The [lnum] is the line number of the breakpoint. Vim will stop at or after this line. When omitted line 1 is used. + *:debug-name* {name} is a pattern that is matched with the file or function name. The pattern is like what is used for autocommands. There must be a full match (as if the pattern starts with "^" and ends in "$"). A "*" matches any sequence @@ -547,4 +549,88 @@ OBSCURE Undo ":debuggreedy": get debug mode commands directly from the user, don't use typeahead for debug commands. +============================================================================== +6. Profiling *profile* *profiling* + +Profiling means that Vim measures the time that is spend on executing +functions and/or scripts. The |+profile| feature is required for this. +It is only included when Vim was compiled with "huge" features. +{Vi does not have profiling} + +:prof[ile] start {fname} *:prof* *:profile* *E750* + Start profiling, write the output in {fname} upon exit. + If {fname} already exists it will be overwritten. + The variable |v:profiling| is set to one. + +:prof[ile] func {pattern} + Profile function that matches the pattern {pattern}. + See |:debug-name| for how {pattern} is used. + +:prof[ile][!] file {pattern} + Profile script file that matches the pattern {pattern}. + See |:debug-name| for how {pattern} is used. + This only profiles the script itself, not the functions + defined in it. + When the [!] is added then all functions defined in the script + will also be profiled. + + +You must always start with a ":profile start fname" command. The resulting +file is written when Vim exits. Here is an example of the output, with line +numbers prepended for the explanation: + + 1 FUNCTION Test2() ~ + 2 Called 1 time ~ + 3 Total time: 0.155251 ~ + 4 Self time: 0.002006 ~ + 5 ~ + 6 count total (s) self (s) ~ + 7 9 0.000096 for i in range(8) ~ + 8 8 0.153655 0.000410 call Test3() ~ + 9 8 0.000070 endfor ~ + 10 " Ask a question ~ + 11 1 0.001341 echo input("give me an answer: ") ~ + +The header (lines 1-4) gives the time for the whole function. The "Total" +time is the time passed while the function was executing. The "Self" time is +the "Total" time reduced by time spent in: +- other user defined functions +- sourced scripts +- executed autocommands +- external (shell) commands + +Lines 7-11 show the time spent in each executed line. Lines that are not +executed do not count. Thus a comment line is never counted. + +The Count column shows how many times a line was executed. Note that the +"for" command in line 7 is executed one more time as the following lines. +That is because the line is also executed to detect the end of the loop. + +The time Vim spends waiting for user input isn't counted at all. Thus how +long you take to respond to the input() prompt is irrelevant. + +Profiling should give a good indication of where time is spent, but keep in +mind there are various things that may clobber the results: + +- The accuracy of the time measured depends on the gettimeofday() system + function. It may only be as accurate as 1/100 second, even though the times + are displayed in micro seconds. + +- Real elapsed time is measured, if other processes are busy they may cause + delays at unpredictable moments. You may want to run the profiling several + times and use the lowest results. + +- If you have several commands in one line you only get one time. Split the + line to see the time for the individual commands. + +- The time of the lines added up is mostly less than the time of the whole + function. There is some overhead in between. + +- Functions that are deleted before Vim exits will not produce profiling + information. You can check the |v:profiling| variable if needed: > + :if !v:profiling + : delfunc MyFunc + :endif +< + vim:tw=78:ts=8:ft=help:norl:
--- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -1539,6 +1539,8 @@ 41.10 usr_41.txt /*41.10* 41.11 usr_41.txt /*41.11* 41.12 usr_41.txt /*41.12* 41.13 usr_41.txt /*41.13* +41.14 usr_41.txt /*41.14* +41.15 usr_41.txt /*41.15* 41.2 usr_41.txt /*41.2* 41.3 usr_41.txt /*41.3* 41.4 usr_41.txt /*41.4* @@ -1824,6 +1826,7 @@ 90.5 usr_90.txt /*90.5* :d change.txt /*:d* :de change.txt /*:de* :debug repeat.txt /*:debug* +:debug-name repeat.txt /*:debug-name* :debugg repeat.txt /*:debugg* :debuggreedy repeat.txt /*:debuggreedy* :del change.txt /*:del* @@ -2207,6 +2210,8 @@ 90.5 usr_90.txt /*90.5* :previous editing.txt /*:previous* :print various.txt /*:print* :pro change.txt /*:pro* +:prof repeat.txt /*:prof* +:profile repeat.txt /*:profile* :promptfind change.txt /*:promptfind* :promptr change.txt /*:promptr* :promptrepl change.txt /*:promptrepl* @@ -2860,7 +2865,9 @@ CTRL-W_+ windows.txt /*CTRL-W_+* CTRL-W_- windows.txt /*CTRL-W_-* CTRL-W_< windows.txt /*CTRL-W_<* CTRL-W_<BS> windows.txt /*CTRL-W_<BS>* +CTRL-W_<CR> quickfix.txt /*CTRL-W_<CR>* CTRL-W_<Down> windows.txt /*CTRL-W_<Down>* +CTRL-W_<Enter> quickfix.txt /*CTRL-W_<Enter>* CTRL-W_<Left> windows.txt /*CTRL-W_<Left>* CTRL-W_<Right> windows.txt /*CTRL-W_<Right>* CTRL-W_<Up> windows.txt /*CTRL-W_<Up>* @@ -2977,7 +2984,6 @@ E113 eval.txt /*E113* E114 eval.txt /*E114* E115 eval.txt /*E115* E116 eval.txt /*E116* -E117 eval.txt /*E117* E118 eval.txt /*E118* E119 eval.txt /*E119* E12 message.txt /*E12* @@ -3667,6 +3673,7 @@ E747 syntax.txt /*E747* E748 repeat.txt /*E748* E749 eval.txt /*E749* E75 vi_diff.txt /*E75* +E750 repeat.txt /*E750* E76 pattern.txt /*E76* E77 message.txt /*E77* E78 motion.txt /*E78* @@ -4596,6 +4603,7 @@ docbkxml-syntax syntax.txt /*docbkxml-sy docbkxml.vim syntax.txt /*docbkxml.vim* docbook syntax.txt /*docbook* documentation-6 version6.txt /*documentation-6* +donate uganda.txt /*donate* dos os_dos.txt /*dos* dos-:cd os_dos.txt /*dos-:cd* dos-CTRL-Break os_dos.txt /*dos-CTRL-Break* @@ -4659,6 +4667,7 @@ errorformat-javac quickfix.txt /*errorfo errorformat-multi-line quickfix.txt /*errorformat-multi-line* errorformat-separate-filename quickfix.txt /*errorformat-separate-filename* errorformats quickfix.txt /*errorformats* +errorlist() eval.txt /*errorlist()* escape intro.txt /*escape* escape() eval.txt /*escape()* escape-bar version4.txt /*escape-bar* @@ -5890,6 +5899,8 @@ print.txt print.txt /*print.txt* printcap-syntax syntax.txt /*printcap-syntax* printing print.txt /*printing* printing-formfeed print.txt /*printing-formfeed* +profile repeat.txt /*profile* +profiling repeat.txt /*profiling* progname-variable eval.txt /*progname-variable* progress-syntax syntax.txt /*progress-syntax* progress.vim syntax.txt /*progress.vim* @@ -5907,6 +5918,7 @@ python-current if_pyth.txt /*python-curr python-error if_pyth.txt /*python-error* python-eval if_pyth.txt /*python-eval* python-examples if_pyth.txt /*python-examples* +python-indent indent.txt /*python-indent* python-input if_pyth.txt /*python-input* python-output if_pyth.txt /*python-output* python-range if_pyth.txt /*python-range* @@ -6200,13 +6212,20 @@ startup-terminal term.txt /*startup-term static-tag tagsrch.txt /*static-tag* status-line windows.txt /*status-line* statusmsg-variable eval.txt /*statusmsg-variable* +strcasestr() eval.txt /*strcasestr()* +strchr() eval.txt /*strchr()* +strcspn() eval.txt /*strcspn()* strftime() eval.txt /*strftime()* stridx() eval.txt /*stridx()* string() eval.txt /*string()* string-match eval.txt /*string-match* strlen() eval.txt /*strlen()* strpart() eval.txt /*strpart()* +strpbrk() eval.txt /*strpbrk()* +strrchr() eval.txt /*strrchr()* strridx() eval.txt /*strridx()* +strspn() eval.txt /*strspn()* +strstr() eval.txt /*strstr()* strtrans() eval.txt /*strtrans()* style-changes develop.txt /*style-changes* style-examples develop.txt /*style-examples* @@ -6902,8 +6921,10 @@ write-compiler-plugin usr_41.txt /*write write-device editing.txt /*write-device* write-fail editing.txt /*write-fail* write-filetype-plugin usr_41.txt /*write-filetype-plugin* +write-library-script usr_41.txt /*write-library-script* write-local-help usr_41.txt /*write-local-help* write-plugin usr_41.txt /*write-plugin* +write-plugin-quickload usr_41.txt /*write-plugin-quickload* write-quit editing.txt /*write-quit* write-readonly editing.txt /*write-readonly* writefile() eval.txt /*writefile()*
--- a/runtime/doc/tips.txt +++ b/runtime/doc/tips.txt @@ -1,4 +1,4 @@ -*tips.txt* For Vim version 7.0aa. Last change: 2004 Feb 17 +*tips.txt* For Vim version 7.0aa. Last change: 2005 Feb 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -201,21 +201,22 @@ abbreviations that correct them. For ex ============================================================================== Counting words, lines, etc. *count-items* -To count how often any pattern occurs in a buffer, set 'report' to 0, and use -the substitute command to replace the pattern with itself. The reported -number of substitutions is the number of items. Examples: > +To count how often any pattern occurs in the current buffer use the substitute +command and add the 'n' flag to avoid the substitution. The reported number +of substitutions is the number of items. Examples: > - :set report=0 - :%s/./&/g characters - :%s/\i\+/&/g words - :%s/^ lines - :%s/the/&/g "the" anywhere - :%s/\<the\>/&/g "the" as a word + :%s/./&/gn characters + :%s/\i\+/&/gn words + :%s/^//n lines + :%s/the/&/gn "the" anywhere + :%s/\<the\>/&/gn "the" as a word You might want to reset 'hlsearch' or do ":nohlsearch". +Add the 'e' flag if you don't want an error when there are no matches. -This does not work if the 'modifiable' option is off. An alternative is using -|v_g_CTRL-G| in Visual mode. +An alternative is using |v_g_CTRL-G| in Visual mode. + +If you want to find matches in multiple files use |:vimgrep|. *count-bytes* If you want to count bytes, you can use this:
--- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2005 Feb 21 +*todo.txt* For Vim version 7.0aa. Last change: 2005 Feb 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,14 +30,21 @@ be worked on, but only if you sponsor Vi *known-bugs* -------------------- Known bugs and current work ----------------------- +Test11 sometimes fails. Must be a problem with fork() and pipes. + +'sw' is sometimes 8 when using :vimgrep. + +Mingw can use setjmp()? Move code from os_unix.c to common file, adjust +#ifdefs. Try with example from Michaelis. + +Russian helpfile doesn't show up correctly when 'encoding' is koi8-r. +(Vassily Ragosin 2005 Feb 16) + Mac unicode patch (Da Woon Jung): -- default font is ugly - typing doesn't work - selecting proportional font breaks display autoload: -- Add docs in user manual: one for using one script and FuncUndefined and one - for using autoload with two scripts. - Add a Vim script in $VIMRUNTIME/tools that takes a file with a list of script names and a help file and produces a script that can be sourced to install the scripts in the user's directories. @@ -48,20 +55,13 @@ autoload: helpfile doc/myscript.txt For the "helpfile" item ":helptags" is run. +Patch for 'balloonexpr' option. Sergey Khorev, Feb 26. + Awaiting response: - Patch for mch_FullName() also in Vim 6.3? os_mswin.c - Win32: tearoff menu window should have a scrollbar when it's taller than the screen. -Improvements for Python indent script: Peter Wilson. - -Win32: when 'encoding' is "utf-8" getenv() should convert from the active -codepage to utf-8, putenv() the other way around. Or use _wgetenv() (but that -duplicates the environment). - -Russian helpfile doesn't show up correctly when 'encoding' is koi8-r. -(Vassily Ragosin 2005 Feb 16) - PLANNED FOR VERSION 7.0: @@ -309,9 +309,6 @@ Awaiting updated patches: layout and 'c' for console dialog. (Haegg) Flemming Madsen has a patch for the 'c' flag (2003 May 13) - system({cmd}, {expr}) Filter {expr} through the shell command - {cmd} and return the result. - (Patch from Yegappan Lakshmanan) raisewin() raise gvim window (see HierAssist patch for Tcl implementation ~/vim/HierAssist/ ) 7 Add patch from Benoit Cerrina to integrate Vim and Perl functions @@ -1594,11 +1591,12 @@ 8 Add functions: mapname({idx}, mode) return the name of the idx'th mapping. Patch by Ilya Sher, 2004 Mar 4. Return a list instead. - sprintf(format, arg, ..) How to prevent a crash??? + printf(format, arg, ..) How to prevent a crash??? + char2hex() convert char string to hex string. attributes() return file protection flags "drwxrwxrwx" - copy(from, to) Copy a file + filecopy(from, to) Copy a file + shorten(fname) shorten a file name, like home_replace() perl(cmd) call Perl and return string - shorten(fname) shorten a file name, like home_replace() input(prompt, complete) like input() but do specified completion inputrl() like input() but right-to-left virtualmode() add argument to obtain whether "$" was used in @@ -1608,14 +1606,10 @@ 8 Add functions: getbufline() get line from any buffer deletebufline() delete line in any buffer appendbufline() append line in any buffer - sort() Sort a newline-separated string. Also: - ":sort". libcall() Allow more than one argument. libcallext() Like libcall(), but using a callback function to allow the library to execute a command or evaluate an expression. - char2hex() convert char string to hex string. XX - hex2char() convert hex string to char string. XX 7 Make bufname("'0") return the buffer name from mark '0. How to get the column and line number? col("'0") currently returns zero. 8 argc() returns 0 when using "vim -t tag". How to detect that no file was @@ -2440,7 +2434,8 @@ 8 Add text object for part of a CamelH (Scott Graham) "ac" and "au"? 8 Add a text object for any kind of quoting, also with multi-byte characters. Option to specify what quotes are recognized (default: all) - use "aq" and "iq". + use "aq" and "iq". Use 'quotepairs' to define pairs of quotes, like + 'matchpairs'? 8 Add text object for any kind of parens, also multi-byte ones. 7 Add text object for current search pattern: "a/" and "i/". Makes it possible to turn text highlighted for 'hlsearch' into a Visual area.
--- a/runtime/doc/uganda.txt +++ b/runtime/doc/uganda.txt @@ -1,4 +1,4 @@ -*uganda.txt* For Vim version 7.0aa. Last change: 2004 Aug 29 +*uganda.txt* For Vim version 7.0aa. Last change: 2005 Feb 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -172,7 +172,7 @@ There is a small clinic at the project, family with medical help. When needed, transport to a hospital is offered. Immunization programs are carried out and help is provided when an epidemic is breaking out (measles and cholera have been a problem). - + *donate* Summer 1994 to summer 1995 I spent a whole year at the centre, working as a volunteer. I have helped to expand the centre and worked in the area of water and sanitation. I learned that the help that the KCC provides really helps.
--- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 7.0aa. Last change: 2005 Feb 08 +*usr_41.txt* For Vim version 7.0aa. Last change: 2005 Feb 23 VIM USER MANUAL - by Bram Moolenaar @@ -22,6 +22,8 @@ script. There are a lot of them, thus t |41.11| Writing a plugin |41.12| Writing a filetype plugin |41.13| Writing a compiler plugin +|41.14| Writing a plugin that loads quickly +|41.15| Writing library scripts Next chapter: |usr_42.txt| Add new menus Previous chapter: |usr_40.txt| Make new commands @@ -663,6 +665,7 @@ System functions and manipulation of fil executable() check if an executable program exists filereadable() check if a file can be read filewritable() check if a file can be written to + mkdir() create a new directory isdirectory() check if a directory exists getcwd() get the current working directory getfsize() get the size of a file @@ -742,6 +745,7 @@ Various: maparg() get rhs of a mapping exists() check if a variable, function, etc. exists has() check if a feature is supported in Vim + errorlist() list of quickfix errors cscope_connection() check if a cscope connection exists did_filetype() check if a FileType autocommand was used eventhandler() check if invoked by an event handler @@ -2129,6 +2133,143 @@ last, thus it should be in a directory a that could be ~/.vim/after/compiler. ============================================================================== +*41.14* Writing a plugin that loads quickly *write-plugin-quickload* + +A plugin may grow and become quite long. The startup delay may become +noticable, while you hardly every use the plugin. Then it's time for a +quickload plugin. + +The basic idea is that the plugin is loaded twice. The first time user +commands and mappings are defined that offer the functionality. The second +time the functions that implement the functionality are defined. + +It may sound surprising that quickload means loading a script twice. What we +mean is that it loads quickly the first time, postponing the bulk of the +script to the second time, which only happens when you actually use it. When +you always use the functionality it actually gets slower! + +The following example shows how it's done: > + + " Vim global plugin for demonstrating quick loading + " Last Change: 2005 Feb 25 + " Maintainer: Bram Moolenaar <Bram@vim.org> + " License: This file is placed in the public domain. + + if !exists("s:did_load") + command -nargs=* BNRead call BufNetRead(<f-args>) + map <F19> :call BufNetWrite('something')<CR> + + let s:did_load = 1 + exe 'au FuncUndefined BufNet* source ' . expand('<sfile>') + finish + endif + + function BufNetRead(...) + echo 'BufNetRead(' . string(a:000) . ')' + " read functionality here + endfunction + + function BufNetWrite(...) + echo 'BufNetWrite(' . string(a:000) . ')' + " write functionality here + endfunction + +When the script is first loaded "s:did_load" is not set. The commands between +the "if" and "endif" will be executed. This ends in a |:finish| command, thus +the rest of the script is not executed. + +The second time the script is loaded "s:did_load" exists and the commands +after the "endif" are executed. This defines the (possible long) +BufNetRead() and BufNetWrite() functions. + +If you drop this script in your plugin directory Vim will execute it on +startup. This is the sequence of events that happens: + +1. The "BNRead" command is defined and the <F19> key is mapped when the script + is sourced at startup. A |FuncUndefined| autocommand is defined. The + ":finish" command causes the script to terminate early. + +2. The user types the BNRead command or presses the <F19> key. The + BufNetRead() or BufNetWrite() function will be called. + +3. Vim can't find the function and triggers the |FuncUndefined| autocommand + event. Since the pattern "BufNet*" matches the invoked function, the + command "source fname" will be executed. "fname" will be equal to the name + of the script, no matter where it is located, because it comes from + expanding "<sfile>" (see |expand()|). + +4. The script is sourced again, the "s:did_load" variable exists and the + functions are defined. + +Notice that the functions that are loaded afterwards match the pattern in the +|FuncUndefined| autocommand. You must make sure that no other plugin defines +functions that match this pattern. + +============================================================================== +*41.15* Writing library scripts *write-library-script* + +Some functionality will be required in several places. When this becomes more +than a few lines you will want to put it in one script and use it from many +scripts. We will call that one script a library script. + +Manually loading a library script is possible, so long as you avoid loading it +when it's already done. You can do this with the |exists()| function. +Example: > + + if !exists('*MyLibFunction') + runtime library/mylibscript.vim + endif + call MyLibFunction(arg) + +Here you need to know that MyLibFunction() is defined in a script +"library/mylibscript.vim" in one of the directories in 'runtimepath'. + +To make this a bit simpler Vim offers the autoload mechanism. Then the +example looks like this: > + + call mylib:myfunction(arg) + +That's a lot simpler, isn't it? Vim will recognize the function name and when +it's not defined search for the script "autoload/mylib.vim" in 'runtimepath'. +That script must define the "mylib:myfunction()" function. + +You can put many other functions in the mylib.vim script, you are free to +organize your functions in library scripts. But you must use function names +where the part before the colon matches the script name. Otherwise Vim +would not know what script to load. + +If you get really enthousiastic and write lots of library scripts, you may +want to use subdirectories. Example: > + + call netlib:ftp:read('somefile') + +For Unix the library script used for this could be: + + ~/.vim/autoload/netlib/ftp.vim + +Where the function is defined like this: > + + function netlib:ftp:read(fname) + " Read the file fname through ftp + endfunction + +Notice that the name the function is defined with is exactly the same as the +name used for calling the function. And the part before the last colon +exactly matches the subdirectory and script name. + +You can use the same mechanism for variables: > + + let weekdays = dutch:weekdays + +This will load the script "autoload/dutch.vim", which should contain something +like: > + + let dutch:weekdays = ['zondag', 'maandag', 'dinsdag', 'woensdag', + \ 'donderdag', 'vrijdag', 'zaterdag'] + +Further reading: |autoload|. + +============================================================================== Next chapter: |usr_42.txt| Add new menus
--- a/runtime/doc/usr_toc.txt +++ b/runtime/doc/usr_toc.txt @@ -1,4 +1,4 @@ -*usr_toc.txt* For Vim version 7.0aa. Last change: 2005 Feb 06 +*usr_toc.txt* For Vim version 7.0aa. Last change: 2005 Feb 22 VIM USER MANUAL - by Bram Moolenaar @@ -292,6 +292,8 @@ Make Vim work as you like it. |41.11| Writing a plugin |41.12| Writing a filetype plugin |41.13| Writing a compiler plugin + |41.14| Writing a plugin that loads quickly + |41.15| Writing library scripts |usr_42.txt| Add new menus |42.1| Introduction
--- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2005 Feb 21 +*version7.txt* For Vim version 7.0aa. Last change: 2005 Feb 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -161,6 +161,9 @@ better portability, handling of differen patterns, this also allows grepping in compressed and remote files. |:vimgrep|. +If you want to use the search results in a script you can use the +|errorlist()| function. + POSIX compatibility *new-posix* ------------------- @@ -216,6 +219,9 @@ Normal mode commands: ~ a", a' and a` New text objects to select quoted strings. |a'| i", i' and i' (Taro Muraoka) +CTRL-W <Enter> In the quickfix window: opens a new window to show the + location of the error under the cursor. + Options: ~ 'completefunc' The name of a function used for user-specified Insert @@ -272,6 +278,7 @@ New functions: ~ |count()| count nr of times a value is in a List or Dictionary |deepcopy()| make a full copy of a List or Dictionary |empty()| check if List or Dictionary is empty +|errorlist()| list of quickfix errors |extend()| append one List to another or add items from one Dictionary to another |filter()| remove selected items from a List or Dictionary @@ -283,7 +290,7 @@ New functions: ~ |getfontname()| Get actual font name being used. |getfperm()| Get file permission string. (Nikolai Weibull) |getftype()| Get type of file. (Nikolai Weibull) -|getline()| get List with buffer lines +|getline()| With second argument: get List with buffer lines |has_key()| check whether a key appears in a Dictionary |insert()| insert an item somewhere in a List |items()| get List of Dictionary key-value pairs @@ -367,6 +374,8 @@ The Ukranian messages are now also avail Irish message translations. (Kevin Patrick Scannell) +Vietnamese message translations and menu. (Phan Vinh Thinh) + Others: ~ @@ -520,6 +529,12 @@ ignored. When "beep" is included in 'debug' a function or script that causes a beep will result in a message with the source of the error. +When completing buffer names, match with "\(^\|[\/]\)" instead of "^", so that +":buf stor<Tab>" finds both "include/storage.h" and "storage/main.c". + +To count items (pattern matches) without changing the buffer the 'n' flag has +been added to |:substitute|. See |count-items|. + ============================================================================== COMPILE TIME CHANGES *compile-changes-7* @@ -605,6 +620,9 @@ When 'comments' includes multi-byte char alignment may go wrong. 'cindent' also suffers from this for right-aligned items. +Win32: when 'encoding' is set to "utf-8" getenv() still returns strings in the +active codepage. Convert to utf-8. Also for $HOME. + The default for 'helplang' was "zh" for both "zh_cn" and "zh_tw". Now use "cn" or "tw" as intended. @@ -868,4 +886,9 @@ Lakshmanan) It was not possible to use a NL after a backslash in Ex mode. This is sometimes used to feed multiple lines to a shell command. +When 'cmdheight' is set to 2 in .vimrc and the GUI uses the number of lines +from the terminal we actually get 3 lines for the cmdline in gvim. + +When setting $HOME allocated memory would leak. + vim:tw=78:ts=8:ft=help:norl:
--- a/runtime/doc/vim.1 +++ b/runtime/doc/vim.1 @@ -492,9 +492,17 @@ System wide .B Vim initializations. .TP +~/.vimrc +Your personal +.B Vim +initializations. +.TP /usr/local/lib/vim/gvimrc System wide gvim initializations. .TP +~/.gvimrc +Your personal gvim initializations. +.TP /usr/local/lib/vim/optwin.vim Script used for the ":options" command, a nice way to view and set options. .TP
--- a/runtime/doc/vim.man +++ b/runtime/doc/vim.man @@ -370,9 +370,13 @@ FILES /usr/local/lib/vim/vimrc System wide Vim initializations. + ~/.vimrc Your personal Vim initializations. + /usr/local/lib/vim/gvimrc System wide gvim initializations. + ~/.gvimrc Your personal gvim initializations. + /usr/local/lib/vim/optwin.vim Script used for the ":options" command, a nice way to view and set options.
--- a/runtime/indent/python.vim +++ b/runtime/indent/python.vim @@ -2,7 +2,7 @@ " Language: Python " Maintainer: Bram Moolenaar <Bram@vim.org> " Original Author: David Bustos <bustos@caltech.edu> -" Last Change: 2005 Feb 08 +" Last Change: 2005 Feb 24 " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -22,16 +22,19 @@ if exists("*GetPythonIndent") finish endif +" Come here when loading the script the first time. + let s:maxoff = 50 " maximum number of lines to look backwards for () function GetPythonIndent(lnum) + " If this line is explicitly joined: If the previous line was also joined, " line it up with that one, otherwise add two 'shiftwidth' if getline(a:lnum - 1) =~ '\\$' if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$' return indent(a:lnum - 1) endif - return indent(a:lnum - 1) + (&sw * 2) + return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_continue) : (&sw * 2)) endif " If the start of the line is in a string don't change the indent. @@ -84,9 +87,9 @@ function GetPythonIndent(lnum) \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" \ . " =~ '\\(Comment\\|String\\)$'") if pp > 0 - return indent(plnum) + &sw + return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : &sw) endif - return indent(plnum) + (&sw * 2) + return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (&sw * 2)) endif if plnumstart == p return indent(plnum)
--- a/runtime/indent/vim.vim +++ b/runtime/indent/vim.vim @@ -1,7 +1,7 @@ " Vim indent file " Language: Vim script " Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2004 Sep 02 +" Last Change: 2005 Feb 25 " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -44,7 +44,7 @@ function GetVimIndent() else let ind = ind + &sw * 3 endif - elseif getline(lnum) =~ '\(^\||\)\s*\(if\|wh\%[ile]\|try\|cat\%[ch]\|fina\%[lly]\|fu\%[nction]\|el\%[seif]\)\>' + elseif getline(lnum) =~ '\(^\||\)\s*\(if\|wh\%[ile]\|for\|try\|cat\%[ch]\|fina\%[lly]\|fu\%[nction]\|el\%[seif]\)\>' let ind = ind + &sw elseif getline(lnum) =~ '^\s*aug\%[roup]' && getline(lnum) !~ '^\s*aug\%[roup]\s*!\=\s\+END' let ind = ind + &sw
new file mode 100644 --- /dev/null +++ b/runtime/lang/menu_vi_vn.vim @@ -0,0 +1,294 @@ +" Menu Translations: Vietnamese +" Maintainer: Phan Vinh Thinh <teppi@vnlinux.org> +" Last Change: 23 Feb 2005 +" URL: http://iatp.vspu.ac.ru/phan/vietvim/lang/menu_vi_VN.vim +" +" +" Adopted for VietVim project by Phan Vinh Thinh. +" First translation: Phan Vinh Thinh <teppi@vnlinux.org> +" +" +" Quit when menu translations have already been done. +" +if exists("did_menu_trans") + finish +endif +let did_menu_trans = 1 + +scriptencoding utf-8 + +" Top +menutrans &File &Tập\ tin +menutrans &Edit &Soạn\ thảo +menutrans &Tools &Công\ cụ +menutrans &Syntax Cú\ &pháp +menutrans &Buffers &Bộ\ đệm +menutrans &Window Cử&a\ sổ +menutrans &Help Trợ\ &giúp +" +" +" +" Help menu +menutrans &Overview<Tab><F1> &Tổng\ quan<Tab><F1> +menutrans &User\ Manual &Hướng\ dẫn\ sử\ dụng +menutrans &How-to\ links &Làm\ như\ thế\ nào +menutrans &Find\.\.\. Tìm\ &kiếm\.\.\. +"-------------------- +menutrans &Credits Lời\ &cảm\ ơn +menutrans Co&pying &Bản\ quyền +menutrans &Sponsor/Register &Giúp\ đỡ/Đăng\ ký +menutrans O&rphans Trẻ\ &mồ\ côi +"-------------------- +menutrans &Version &Phiên\ bản +menutrans &About &Về\ Vim +" +" +" File menu +menutrans &Open\.\.\.<Tab>:e &Mở\.\.\.<Tab>:e +menutrans Sp&lit-Open\.\.\.<Tab>:sp &Chia-Mở\.\.\.<Tab>:sp +menutrans &New<Tab>:enew Mớ&i<Tab>:enew +menutrans &Close<Tab>:close Đó&ng<Tab>:close +"-------------------- +menutrans &Save<Tab>:w &Ghi\ nhớ<Tab>:w +menutrans Save\ &As\.\.\.<Tab>:sav Ghi\ n&hư\.\.\.<Tab>:sav +"-------------------- +menutrans Split\ &Diff\ with\.\.\. &So\ sánh\ với\.\.\. +menutrans Split\ Patched\ &By\.\.\. So\ sánh\ đã\ vá\ lỗi\ &bởi\.\.\. +"-------------------- +menutrans &Print &In +menutrans Sa&ve-Exit<Tab>:wqa Ghi\ nhớ\ rồ&i\ thoát <Tab>:wqa +menutrans E&xit<Tab>:qa Th&oát<Tab>:qa +" +" +" Edit menu +menutrans &Undo<Tab>u &Hủy\ bước<Tab>u +menutrans &Redo<Tab>^R &Làm\ lại<Tab>^R +menutrans Rep&eat<Tab>\. Lặ&p lại<Tab>\. +"-------------------- +menutrans Cu&t<Tab>"+x &Cắt<Tab>"+x +menutrans &Copy<Tab>"+y &Sao chép<Tab>"+y +menutrans &Paste<Tab>"+gP &Dán<Tab>"+gP +menutrans Put\ &Before<Tab>[p Dán\ trướ&c<Tab>[p +menutrans Put\ &After<Tab>]p Dán\ sa&u<Tab>]p +menutrans &Delete<Tab>x &Xóa<Tab>x +menutrans &Select\ All<Tab>ggVG Chọ&n\ tất\ cả<Tab>ggVG +"-------------------- +menutrans &Find\.\.\.<Tab>/ &Tìm\ kiếm\.\.\.<Tab>/ +menutrans Find\ and\ Rep&lace\.\.\. Tìm\ &kiếm\ và\ thay\ thế\.\.\. +menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Tìm\ &kiếm\ và\ thay\ thế\.\.\.<Tab>:%s +menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Tìm\ &kiếm\ và\ thay\ thế\.\.\<Tab>:s +"-------------------- +menutrans Settings\ &Window &Cửa\ sổ\ thiết\ lập +menutrans &Global\ Settings Thiết\ &lập\ toàn\ cầu +menutrans F&ile\ Settings Thiết\ lập\ tập\ t&in +menutrans C&olor\ Scheme Phối\ hợp\ màu\ &sắc +menutrans &Keymap Sơ\ đồ\ &bàn\ phím +menutrans Select\ Fo&nt\.\.\. Chọn\ &phông\ chữ\.\.\. +">>>----------------- Edit/Global settings +menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Chiếu\ sáng\ từ\ tìm\ thấy <Tab>:set\ hls! +menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Lờ\ đi\ kiểu\ chữ<Tab>:set\ ic! +menutrans Toggle\ &Showmatch<Tab>:set\ sm! Cho\ &biết\ phần\ tử\ có\ cặp<Tab>:set\ sm! +menutrans &Context\ lines &Dòng\ quanh\ con\ trỏ +menutrans &Virtual\ Edit &Soạn\ thảo\ ảo +menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! C&hế\ độ\ chèn<Tab>:set\ im! +menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Tương\ thích\ với\ &Vi<Tab>:set\ cp! +menutrans Search\ &Path\.\.\. Đường\ dẫn\ tìm\ &kiếm\.\.\. +menutrans Ta&g\ Files\.\.\. Tập\ tin\ thẻ\ &ghi\.\.\. +" +menutrans Toggle\ &Toolbar Thanh\ côn&g\ cụ +menutrans Toggle\ &Bottom\ Scrollbar Thanh\ kéo\ ở\ &dưới +menutrans Toggle\ &Left\ Scrollbar Thanh\ kéo\ ở\ &bên trái +menutrans Toggle\ &Right\ Scrollbar Thanh\ kéo\ ở\ &bên phải +">>>->>>------------- Edit/Global settings/Virtual edit +menutrans Never Tắt +menutrans Block\ Selection Khi\ chọn\ khối +menutrans Insert\ mode Trong\ chế\ độ\ Chèn +menutrans Block\ and\ Insert Khi\ chọn\ khối\ và\ Chèn +menutrans Always Luôn\ luôn\ bật +">>>----------------- Edit/File settings +menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Đánh\ số\ &dòng<Tab>:set\ nu! +menutrans Toggle\ &List\ Mode<Tab>:set\ list! &Chế\ độ\ danh\ sách<Tab>:set\ list! +menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! &Ngắt\ những\ dòng\ dài<Tab>:set\ wrap! +menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Ngắt\ từ\ nguyên\ &vẹn<Tab>:set\ lbr! +menutrans Toggle\ &expand-tab<Tab>:set\ et! Dấ&u\ trắng\ thay\ cho\ tab<Tab>:set\ et! +menutrans Toggle\ &auto-indent<Tab>:set\ ai! Tự\ độn&g\ thụt\ dòng<Tab>:set\ ai! +menutrans Toggle\ &C-indenting<Tab>:set\ cin! T&hụt\ dòng\ kiểu\ C<Tab>:set\ cin! +">>>--- +menutrans &Shiftwidth Chiều\ &rộng\ thụt\ dòng +menutrans Soft\ &Tabstop Chiều\ rộng\ T&ab +menutrans Te&xt\ Width\.\.\. Chiều\ rộng\ &văn\ bản\.\.\. +menutrans &File\ Format\.\.\. Định\ dạng\ tập\ t&in\.\.\. +" +" +" +" Tools menu +menutrans &Jump\ to\ this\ tag<Tab>g^] &Nhảy\ tới\ thẻ\ ghi<Tab>g^] +menutrans Jump\ &back<Tab>^T &Quay\ lại<Tab>^T +menutrans Build\ &Tags\ File &Tạo\ tập\ tin\ thẻ\ ghi +"------------------- +menutrans &Folding Nếp\ &gấp +menutrans &Diff &Khác\ biệt (diff) +"------------------- +menutrans &Make<Tab>:make &Biên\ dịch<Tab>:make +menutrans &List\ Errors<Tab>:cl &Danh\ sách\ lỗi<Tab>:cl +menutrans L&ist\ Messages<Tab>:cl! Danh\ &sách\ thông\ báo<Tab>:cl! +menutrans &Next\ Error<Tab>:cn &Lỗi\ tiếp\ theo<Tab>:cn +menutrans &Previous\ Error<Tab>:cp Lỗi\ t&rước<Tab>:cp +menutrans &Older\ List<Tab>:cold Danh\ sách\ &cũ\ hơn<Tab>:cold +menutrans N&ewer\ List<Tab>:cnew Danh\ sách\ &mới\ hơn<Tab>:cnew +menutrans Error\ &Window Cửa\ sổ\ &lỗi +menutrans &Set\ Compiler Chọn\ trình\ biên\ &dịch +"------------------- +menutrans &Convert\ to\ HEX<Tab>:%!xxd &Chuyển\ thành\ HEX<Tab>:%!xxd +menutrans Conve&rt\ back<Tab>:%!xxd\ -r Chuyển\ từ\ HE&X<Tab>:%!xxd\ -r +">>>---------------- Folds +menutrans &Enable/Disable\ folds<Tab>zi Bật/tắt\ nếp\ &gấp<Tab>zi +menutrans &View\ Cursor\ Line<Tab>zv Xe&m\ dòng\ có\ con\ trỏ<Tab>zv +menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Chỉ\ &xem\ dòng\ có\ con\ trỏ<Tab>zMzx +menutrans C&lose\ more\ folds<Tab>zm Đóng\ &nhiều\ nếp\ gấp\ hơn<Tab>zm +menutrans &Close\ all\ folds<Tab>zM Đóng\ mọi\ nếp\ &gấp<Tab>zM +menutrans &Open\ all\ folds<Tab>zR &Mở\ mọi\ nếp\ gấp<Tab>zR +menutrans O&pen\ more\ folds<Tab>zr Отк&рыть\ больше\ складок<Tab>zr +menutrans Fold\ Met&hod &Phương\ pháp\ gấp +menutrans Create\ &Fold<Tab>zf &Tạo\ nếp\ gấp<Tab>zf +menutrans &Delete\ Fold<Tab>zd &Xóa\ nếp\ gấp<Tab>zd +menutrans Delete\ &All\ Folds<Tab>zD Xóa\ mọ&i\ nếp\ gấp<Tab>zD +menutrans Fold\ col&umn\ width &Chiều\ rộng\ cột\ nếp\ gấp +">>>->>>----------- Tools/Folds/Fold Method +menutrans M&anual &Thủ\ công +menutrans I&ndent Thụt\ &dòng +menutrans E&xpression &Biểu\ thức +menutrans S&yntax &Cú\ pháp +menutrans Ma&rker &Dấu\ hiệu +">>>--------------- Tools/Diff +menutrans &Update &Cập\ nhật +menutrans &Get\ Block &Thay\ đổi\ bộ\ đệm\ này +menutrans &Put\ Block T&hay\ đổi\ bộ\ đệm\ khác +">>>--------------- Tools/Diff/Error window +menutrans &Update<Tab>:cwin &Cập\ nhật<Tab>:cwin +menutrans &Close<Tab>:cclose Đón&g<Tab>:cclose +menutrans &Open<Tab>:copen &Mở<Tab>:copen +" +" +" Syntax menu +" +menutrans &Show\ filetypes\ in\ menu &Hiển\ thị\ loại\ tập\ tin\ trong\ trình\ đơn +menutrans Set\ '&syntax'\ only &Chỉ\ thay\ đổi\ giá\ trị\ 'syntax' +menutrans Set\ '&filetype'\ too Th&ay\ đổi\ cả\ giá\ trị\ 'filetype' +menutrans &Off &Tắt +menutrans &Manual &Bằng\ tay +menutrans A&utomatic Tự\ độ&ng +menutrans on/off\ for\ &This\ file Bật\ tắt\ &cho\ tập\ tin\ này +menutrans Co&lor\ test &Kiểm\ tra\ màu\ sắc +menutrans &Highlight\ test Kiểm\ tra\ c&hiếu\ sáng +menutrans &Convert\ to\ HTML &Chuyển\ thành\ HTML +" +" +" Buffers menu +" +menutrans &Refresh\ menu &Cập\ nhật\ trình\ đơn +menutrans Delete &Xóa +menutrans &Alternate Xen\ &kẽ +menutrans &Next Tiế&p\ theo +menutrans &Previous &Trước +menutrans [No\ File] [Không\ có\ tập\ tin] +" +" +" Window menu +" +menutrans &New<Tab>^Wn &Mới<Tab>^Wn +menutrans S&plit<Tab>^Ws &Chia\ đôi<Tab>^Ws +menutrans Sp&lit\ To\ #<Tab>^W^^ Chia &tới #<Tab>^W^^ +menutrans Split\ &Vertically<Tab>^Wv Chia\ &dọc<Tab>^Wv +menutrans Split\ File\ E&xplorer &Mở\ trình\ duyệt\ tập\ tin +" +menutrans &Close<Tab>^Wc Đó&ng<Tab>^Wc +menutrans Close\ &Other(s)<Tab>^Wo Đóng\ các\ cửa\ sổ\ &khác<Tab>^Wo +" +menutrans Move\ &To Ch&uyển tới +menutrans Rotate\ &Up<Tab>^WR &Lên\ trên<Tab>^WR +menutrans Rotate\ &Down<Tab>^Wr &Xuống\ dưới<Tab>^Wr +" +menutrans &Equal\ Size<Tab>^W= Cân\ bằng\ &kích\ thước<Tab>^W= +menutrans &Max\ Height<Tab>^W_ Chiều\ c&ao\ lớn\ nhất<Tab>^W_ +menutrans M&in\ Height<Tab>^W1_ Chiều\ ca&o\ nhỏ\ nhất<Tab>^W1_ +menutrans Max\ &Width<Tab>^W\| Chiều\ &rộng\ lớn\ nhất<Tab>^W\| +menutrans Min\ Widt&h<Tab>^W1\| Chiề&u\ rộng\ nhỏ\ nhất<Tab>^W1\| +">>>----------------- Window/Move To +menutrans &Top<Tab>^WK Đầ&u<Tab>^WK +menutrans &Bottom<Tab>^WJ &Cuối<Tab>^WJ +menutrans &Left\ side<Tab>^WH &Trái<Tab>^WH +menutrans &Right\ side<Tab>^WL &Phải<Tab>^WL +" +" +" The popup menu +" +" +menutrans &Undo &Hủy\ bước +menutrans Cu&t &Cắt +menutrans &Copy &Sao\ chép +menutrans &Paste &Dán +menutrans &Delete &Xóa +menutrans Select\ Blockwise Chọn\ &theo\ khối +menutrans Select\ &Word Chọ&n\ từ +menutrans Select\ &Line Chọn\ dòn&g +menutrans Select\ &Block Chọn\ &khối +menutrans Select\ &All Chọn\ tất\ &cả +" +" The GUI toolbar +" +if has("toolbar") + if exists("*Do_toolbar_tmenu") + delfun Do_toolbar_tmenu + endif + fun Do_toolbar_tmenu() + tmenu ToolBar.Open Mở tập tin + tmenu ToolBar.Save Ghi nhớ tập tin + tmenu ToolBar.SaveAll Ghi nhớ tất cả + tmenu ToolBar.Print In + tmenu ToolBar.Undo Hủy bước + tmenu ToolBar.Redo Làm lại + tmenu ToolBar.Cut Cắt + tmenu ToolBar.Copy Sao chép + tmenu ToolBar.Paste Dán + tmenu ToolBar.Find Tìm... + tmenu ToolBar.FindNext Tìm tiếp theo + tmenu ToolBar.FindPrev Tìm ngược lại + tmenu ToolBar.Replace Thay thế... + tmenu ToolBar.LoadSesn Nạp buổi làm việc + tmenu ToolBar.SaveSesn Ghi nhớ buổi làm việc + tmenu ToolBar.RunScript Chạy script của Vim + tmenu ToolBar.Make Biên dịch + tmenu ToolBar.Shell Shell + tmenu ToolBar.RunCtags Tạo tập tin thẻ ghi + tmenu ToolBar.TagJump Chuyển tới thẻ ghi + tmenu ToolBar.Help Trợ giúp + tmenu ToolBar.FindHelp Tìm trong trợ giúp + endfun +endif +" +" +" Dialog texts +" +" Find in help dialog +" +let g:menutrans_help_dialog = "Hãy nhập câu lệnh hoặc từ khóa tìm kiếm:\n\nThêm i_ để tìm kiếm câu lệnh của chế độ Nhập Input (Ví dụ, i_CTRL-X)\nThêm c_ để tìm kiếm câu lệnh của chế độ soạn thảo dòng lệnh (Ví dụ, с_<Del>)\nThêm ' để tìm kiếm trợ giúp cho một tùy chọn (ví dụ, 'shiftwidth')" +" +" Searh path dialog +" +let g:menutrans_path_dialog = "Hãy chỉ ra đường dẫn để tìm kiếm tập tin.\nTên của thư mục phân cách nhau bởi dấu phẩy." +" +" Tag files dialog +" +let g:menutrans_tags_dialog = "Nhập tên tập tin thẻ ghi (phân cách bởi dấu phẩy).\n" +" +" Text width dialog +" +let g:menutrans_textwidth_dialog = "Hãy nhập chiều rộng văn bản mới.\nNhập 0 để hủy bỏ." +" +" File format dialog +" +let g:menutrans_fileformat_dialog = "Hãy chọn định dạng tập tin." +let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Hủy bỏ" +" +let menutrans_no_file = "[không có tập tin]"
--- a/runtime/menu.vim +++ b/runtime/menu.vim @@ -2,7 +2,7 @@ " You can also use this as a start for your own set of menus. " " Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2005 Feb 03 +" Last Change: 2005 Feb 24 " Note that ":an" (short for ":anoremenu") is often used to make a menu work " in all modes and avoid side effects from mappings defined by the user. @@ -54,7 +54,7 @@ if exists("v:lang") || &langmenu != "" " There is no exact match, try matching with a wildcard added " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE). let s:lang = substitute(s:lang, '\.[^.]*', "", "") - exe "runtime! lang/menu_" . s:lang . "[^a-z]*.vim" + exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim" if !exists("did_menu_trans") && strlen($LANG) > 1 " On windows locale names are complicated, try using $LANG, it might
--- a/runtime/syntax/2html.vim +++ b/runtime/syntax/2html.vim @@ -1,6 +1,6 @@ " Vim syntax support file " Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2004 Dec 14 +" Last Change: 2005 Feb 26 " (modified by David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>) " (XHTML support by Panagiotis Issaris <takis@lumumba.luc.ac.be>) @@ -400,7 +400,6 @@ while s:lnum <= s:end exe "normal! a" . s:new . s:HtmlEndline . "\n\e" exe s:orgwin . "wincmd w" let s:lnum = s:lnum + 1 - + endwhile " Finish with the last line exe s:newwin . "wincmd w" @@ -515,11 +514,13 @@ unlet s:old_et s:old_paste s:old_icon s: unlet s:whatterm s:idlist s:lnum s:end s:fgc s:bgc s:old_magic unlet! s:col s:id s:attr s:len s:line s:new s:expandedtab s:numblines unlet s:orgwin s:newwin s:orgbufnr -delfunc s:HtmlColor -delfunc s:HtmlFormat -delfunc s:CSS1 -if !exists("html_use_css") - delfunc s:HtmlOpening - delfunc s:HtmlClosing +if !v:profiling + delfunc s:HtmlColor + delfunc s:HtmlFormat + delfunc s:CSS1 + if !exists("html_use_css") + delfunc s:HtmlOpening + delfunc s:HtmlClosing + endif endif silent! unlet s:diffattr s:difffillchar s:foldfillchar s:HtmlSpace s:HtmlEndline
--- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -1,8 +1,8 @@ " Vim syntax file " Language: Vim 7.0 script " Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz> -" Last Change: Feb 14, 2005 -" Version: 7.0-05 +" Last Change: February 22, 2005 +" Version: 7.0-07 " Automatically generated keyword lists: {{{1 " Quit when a syntax file was already loaded {{{2 @@ -16,7 +16,7 @@ syn keyword vimTodo contained COMBAK NOT syn cluster vimCommentGroup contains=vimTodo " regular vim commands {{{2 -syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cf[ile] cfir[st] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] DeleteFirst delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] g[lobal] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] I ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] lan[guage] la[st] lc[d] lch[dir] le[ft] lefta[bove] l[ist] lm[ap] lmapc[lear] ln[oremap] lo[adview] loc[kmarks] lockv[ar] ls lu[nmap] mak[e] ma[rk] marks mat[ch] menut[ranslate] mk[exrc] mks[ession] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] Nread nu[mber] nun[map] Nw omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] prompt promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] sandbox sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st] sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sn[ext] sN[ext] sni[ff] sno[magic] so[urce] sp[lit] spr[evious] sre[wind] sta[g] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sus[pend] sv[iew] syncbind t ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] the th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] v[global] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] winpos* win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] y[ank] +syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cf[ile] cfir[st] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] DeleteFirst delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] g[lobal] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] I ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] lan[guage] la[st] lc[d] lch[dir] le[ft] lefta[bove] l[ist] lm[ap] lmapc[lear] ln[oremap] lo[adview] loc[kmarks] lockv[ar] ls lu[nmap] mak[e] ma[rk] marks mat[ch] menut[ranslate] mk[exrc] mks[ession] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] Nread nu[mber] nun[map] Nw omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] prompt promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] sandbox sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st] sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sn[ext] sN[ext] sni[ff] sno[magic] so[urce] sp[lit] spr[evious] sre[wind] sta[g] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sus[pend] sv[iew] syncbind t ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] the th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] v[global] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] y[ank] syn match vimCommand contained "\<z[-+^.=]" " vimOptions are caught only when contained in a vimSet {{{2 @@ -316,6 +316,11 @@ syn match vimFunc "\%([sS]:\|<[sS][iI][ syn match vimUserFunc contained "\%([sS]:\|<[sS][iI][dD]>\)\i\+\|\<\u\i*\>\|\<if\>" contains=vimNotation,vimCommand syn match vimNotFunc contained "\<[aiAIrR](" +" Norm +" ==== +syn match vimNorm "\<norm\%[al]!\=" skipwhite nextgroup=vimNormCmds +syn match vimNormCmds contained ".*$" + " Syntax {{{2 "======= syn match vimGroupList contained "@\=[^ \t,]*" contains=vimGroupSpecial,vimPatSep @@ -592,6 +597,7 @@ hi def link vimMarkNumber vimNumber hi def link vimMenuMod vimMapMod hi def link vimMenuNameMore vimMenuName hi def link vimMtchComment vimComment +hi def link vimNorm vimCommand hi def link vimNotFunc vimCommand hi def link vimNotPatSep vimString hi def link vimPatSepR vimPatSep
--- a/src/buffer.c +++ b/src/buffer.c @@ -2082,25 +2082,38 @@ ExpandBufnames(pat, num_file, file, opti 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 (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 (*pat != '^') /* there's no '^', no need to try again */ - break; - ++pat; /* skip the '^' */ + if (patc != pat) + vim_free(patc); + return FAIL; } - prog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); - if (prog == NULL) - return FAIL; /* * round == 1: Count the matches. @@ -2136,6 +2149,8 @@ ExpandBufnames(pat, num_file, file, opti if (*file == NULL) { vim_free(prog); + if (patc != pat) + vim_free(patc); return FAIL; } } @@ -2145,6 +2160,9 @@ ExpandBufnames(pat, num_file, file, opti break; } + if (patc != pat) + vim_free(patc); + *num_file = count; return (count == 0 ? FAIL : OK); }
--- a/src/eval.c +++ b/src/eval.c @@ -106,6 +106,7 @@ static char *e_funcdict = N_("E717: Dict 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 * 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((typva 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 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; - - fc = current_funccal; + funccall_T *fc = current_funccal; + current_funccal = NULL; return (void *)fc; } void -restore_funccal(fc) - void *fc; -{ - current_funccal = (funccall_T *)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 */ +{ + 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(); - - if (ni == NULL) + listitem_T *li = listitem_alloc(); + + 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); - else - { + { + 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 (argvars[2].v_type != VAR_UNKNOWN) + { + /* 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; + } + } + else + end_idx = haystack_len; + if (*needle == NUL) + { /* Empty string matches past the end. */ - lastmatch = haystack + haystack_len; - else - { - if (argvars[2].v_type != VAR_UNKNOWN) - { - /* 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; - } - } - else - end_idx = haystack_len; - + 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, re 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, re --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, re 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, re 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; } - - gap = &fcp->func->uf_lines; - if ((fcp->func->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try()) +#ifdef FEAT_PROFILE + if (do_profiling) + func_line_end(cookie); +#endif + + 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".
--- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -30,7 +30,7 @@ static int check_readonly __ARGS((int *f #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); }
--- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -609,6 +609,8 @@ EX(CMD_promptfind, "promptfind", gui_mch 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,
--- 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; - - if (dbg_parsearg(eap->arg) == OK) - { - bp = &BREAKP(dbg_breakp.ga_len); + garray_T *gap; + + gap = &dbg_breakp; +#ifdef FEAT_PROFILE + if (eap->cmdidx == CMD_profile) + gap = &prof_ga; +#endif + + if (dbg_parsearg(eap->arg, gap) == OK) + { + 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) - { - /* 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)) + 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 = &DEBUGGY(gap, i); + if (((bp->dbg_type == DBG_FILE) == file && ( +#ifdef FEAT_PROFILE + gap == &prof_ga || +#endif + (bp->dbg_lnum > after && (lnum == 0 || bp->dbg_lnum < lnum))))) { regmatch.regprog = bp->dbg_prog; regmatch.rm_ic = FALSE; /* - * Save the value of got_int and reset it. We don't want a previous - * interruption cancel matching, only hitting CTRL-C while matching - * should abort it. + * Save the value of got_int and reset it. We don't want a + * previous interruption cancel matching, only hitting CTRL-C + * while matching should abort it. */ prev_got_int = got_int; got_int = FALSE; if (vim_regexec(®match, name, (colnr_T)0)) + { lnum = bp->dbg_lnum; + if (fp != NULL) + *fp = bp->dbg_forceit; + } got_int |= prev_got_int; } } @@ -666,6 +785,339 @@ dbg_breakpoint(name, lnum) debug_breakpoint_name = name; debug_breakpoint_lnum = lnum; } + + +# if defined(FEAT_PROFILE) || defined(PROTO) +/* + * Functions for profiling. + */ +static void script_do_profile __ARGS((scriptitem_T *si)); +static void script_dump_profile __ARGS((FILE *fd)); +static proftime_T prof_wait_time; + +/* + * Set the time in "tm" to zero. + */ + void +profile_zero(tm) + proftime_T *tm; +{ + tm->tv_usec = 0; + tm->tv_sec = 0; +} + +/* + * Store the current time in "tm". + */ + void +profile_start(tm) + proftime_T *tm; +{ + gettimeofday(tm, NULL); +} + +/* + * Compute the elapsed time from "tm" till now and store in "tm". + */ + void +profile_end(tm) + proftime_T *tm; +{ + proftime_T now; + + gettimeofday(&now, NULL); + tm->tv_usec = now.tv_usec - tm->tv_usec; + tm->tv_sec = now.tv_sec - tm->tv_sec; + if (tm->tv_usec < 0) + { + tm->tv_usec += 1000000; + --tm->tv_sec; + } +} + +/* + * Subtract the time "tm2" from "tm". + */ + void +profile_sub(tm, tm2) + proftime_T *tm, *tm2; +{ + tm->tv_usec -= tm2->tv_usec; + tm->tv_sec -= tm2->tv_sec; + if (tm->tv_usec < 0) + { + tm->tv_usec += 1000000; + --tm->tv_sec; + } +} + +/* + * Add the time "tm2" to "tm". + */ + void +profile_add(tm, tm2) + proftime_T *tm, *tm2; +{ + tm->tv_usec += tm2->tv_usec; + tm->tv_sec += tm2->tv_sec; + if (tm->tv_usec >= 1000000) + { + tm->tv_usec -= 1000000; + ++tm->tv_sec; + } +} + +/* + * Get the current waittime. + */ + void +profile_get_wait(tm) + proftime_T *tm; +{ + *tm = prof_wait_time; +} + +/* + * Subtract the passed waittime since "tm" from "tma". + */ + void +profile_sub_wait(tm, tma) + proftime_T *tm, *tma; +{ + proftime_T tm3 = prof_wait_time; + + profile_sub(&tm3, tm); + profile_sub(tma, &tm3); +} + +/* + * Return TRUE if "tm1" and "tm2" are equal. + */ + int +profile_equal(tm1, tm2) + proftime_T *tm1, *tm2; +{ + return (tm1->tv_usec == tm2->tv_usec && tm1->tv_sec == tm2->tv_sec); +} + +/* + * Return a string that represents a time. + * Uses a static buffer! + */ + char * +profile_msg(tm) + proftime_T *tm; +{ + static char buf[50]; + + sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec); + return buf; +} + +static char_u *profile_fname = NULL; + +/* + * ":profile cmd args" + */ + void +ex_profile(eap) + exarg_T *eap; +{ + char_u *e; + int len; + + e = skiptowhite(eap->arg); + len = e - eap->arg; + e = skipwhite(e); + + if (len == 5 && STRNCMP(eap->arg, "start", 5) == 0 && *e != NUL) + { + vim_free(profile_fname); + profile_fname = vim_strsave(e); + do_profiling = TRUE; + profile_zero(&prof_wait_time); + set_vim_var_nr(VV_PROFILING, 1L); + } + else if (!do_profiling) + EMSG(_("E750: First use :profile start <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; + ++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 + } + si = &SCRIPT_ITEM(current_SID); + si->sn_name = fname_exp; + fname_exp = NULL; # 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; + if (stat_ok) + { + si->sn_dev = st.st_dev; + si->sn_ino = st.st_ino; + } + else + si->sn_dev = -1; # endif - fname_exp = NULL; - } + /* 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.
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -434,6 +434,10 @@ static void ex_folddo __ARGS((exarg_T *e # 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, fla 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, fla 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, fla 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, fla /* 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)) - { - retval = FAIL; - break; - } + if (getline_is_func) + { +# 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, fla 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; }
--- 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)
--- a/src/fileio.c +++ b/src/fileio.c @@ -7925,6 +7925,9 @@ apply_autocmds_group(event, fname, fname 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 #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 #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);
--- a/src/globals.h +++ b/src/globals.h @@ -204,6 +204,9 @@ EXTERN int ex_nesting_level INIT(= 0); / 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_("E 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
--- 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; }
--- 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;
--- 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 }}}"); }
--- 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)
--- 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 } }
--- 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; - - while (*string) + char_u *p = 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;
--- 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
--- 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 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
--- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -1346,22 +1346,16 @@ clip_mch_request_selection(VimClipboard 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 #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. */
--- 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
--- 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
--- 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
new file mode 100644 --- /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ệ"
--- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -21,7 +21,9 @@ char_u *eval_to_string_safe __ARGS((char 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 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));
--- 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 *cooki 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));
--- 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));
--- a/src/proto/os_mswin.pro +++ b/src/proto/os_mswin.pro @@ -31,6 +31,7 @@ void clip_mch_lose_selection __ARGS((Vim 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));
--- 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 : */
--- 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, new 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, ln } qfp->qf_lnum = lnum; qfp->qf_col = col; - qfp->qf_virt_col = virt_col; + qfp->qf_viscol = vis_col; qfp->qf_nr = nr; if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */ type = 0; @@ -1285,7 +1285,7 @@ qf_jump(dir, errornr, forceit) if (qf_ptr->qf_col > 0) { curwin->w_cursor.col = qf_ptr->qf_col - 1; - if (qf_ptr->qf_virt_col == TRUE) + if (qf_ptr->qf_viscol == TRUE) { /* * Check each character from the beginning of the error @@ -2300,6 +2300,8 @@ ex_vimgrep(eap) #endif #ifdef FEAT_AUTOCMD char_u *au_name = NULL; + int flags = 0; + colnr_T col; switch (eap->cmdidx) { @@ -2318,14 +2320,12 @@ ex_vimgrep(eap) /* Get the search pattern: either white-separated or enclosed in // */ regmatch.regprog = NULL; - p = skip_vimgrep_pat(eap->arg, &s); + p = skip_vimgrep_pat(eap->arg, &s, &flags); if (p == NULL) { EMSG(_("E682: Invalid search pattern or delimiter")); goto theend; } - if (*p != NUL) - *p++ = NUL; regmatch.regprog = vim_regcomp(s, RE_MAGIC); if (regmatch.regprog == NULL) goto theend; @@ -2437,10 +2437,13 @@ ex_vimgrep(eap) goto jumpend; } #endif + /* Try for a match in all lines of the buffer. */ for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum) { - if (vim_regexec_multi(®match, curwin, buf, lnum, - (colnr_T)0) > 0) + /* For ":1vimgrep" look for multiple matches. */ + col = 0; + while (vim_regexec_multi(®match, curwin, buf, lnum, + col) > 0) { if (qf_add_entry(&prevp, NULL, /* dir */ @@ -2449,7 +2452,7 @@ ex_vimgrep(eap) regmatch.startpos[0].lnum + lnum, FALSE), regmatch.startpos[0].lnum + lnum, regmatch.startpos[0].col + 1, - FALSE, /* virt_col */ + FALSE, /* vis_col */ 0, /* nr */ 0, /* type */ TRUE /* valid */ @@ -2460,6 +2463,13 @@ ex_vimgrep(eap) } else found_match = TRUE; + if ((flags & VGR_GLOBAL) == 0 + || regmatch.endpos[0].lnum > 0) + break; + col = regmatch.endpos[0].col + + (col == regmatch.endpos[0].col); + if (col > STRLEN(ml_get_buf(buf, lnum, FALSE))) + break; } line_breakcheck(); if (got_int) @@ -2485,14 +2495,14 @@ jumpend: { /* When not hiding the buffer and no match was found we * don't need to remember the buffer, wipe it out. If - * there was a match and it wasn't the first one: only - * unload the buffer. */ + * there was a match and it wasn't the first one or we + * won't jump there: only unload the buffer. */ if (!found_match) { wipe_dummy_buffer(buf); buf = NULL; } - else if (buf != first_match_buf) + else if (buf != first_match_buf || (flags & VGR_NOJUMP)) { unload_dummy_buffer(buf); buf = NULL; @@ -2528,7 +2538,10 @@ jumpend: /* Jump to first match. */ if (qf_lists[qf_curlist].qf_count > 0) - qf_jump(0, 0, FALSE); + { + if ((flags & VGR_NOJUMP) == 0) + qf_jump(0, 0, eap->forceit); + } else EMSG2(_(e_nomatch2), s); @@ -2543,29 +2556,57 @@ theend: } /* - * Skip over the pattern argument of ":vimgrep /pat/". + * Skip over the pattern argument of ":vimgrep /pat/[g][j]". * Put the start of the pattern in "*s", unless "s" is NULL. - * Return a pointer to the char just past the pattern. + * If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP. + * If "s" is not NULL terminate the pattern with a NUL. + * Return a pointer to the char just past the pattern plus flags. */ char_u * -skip_vimgrep_pat(p, s) - char_u *p; - char_u **s; +skip_vimgrep_pat(p, s, flags) + char_u *p; + char_u **s; + int *flags; { int c; if (vim_isIDc(*p)) { + /* ":vimgrep pattern fname" */ if (s != NULL) *s = p; - return skiptowhite(p); + p = skiptowhite(p); + if (s != NULL && *p != NUL) + *p++ = NUL; } - if (s != NULL) - *s = p + 1; - c = *p; - p = skip_regexp(p + 1, c, TRUE, NULL); - if (*p != c) - return NULL; + 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; + } + } 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 */
--- 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. */
--- a/src/ui.c +++ b/src/ui.c @@ -138,6 +138,11 @@ ui_inchar(buf, maxlen, wtime, tb_change_ } #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_ # 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_ ctrl_c_interrupts = TRUE; +#ifdef NO_CONSOLE_INPUT +theend: +#endif +#ifdef FEAT_PROFILE + if (do_profiling && wtime != 0) + prof_inchar_exit(); +#endif return retval; }
--- 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",
--- 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 "
--- a/src/vim.h +++ b/src/vim.h @@ -1533,7 +1533,8 @@ int vim_memcmp __ARGS((void *, void *, s #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 req # 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 req # define handle_signal(x) 0 #endif +/* flags for skip_vimgrep_pat() */ +#define VGR_GLOBAL 1 +#define VGR_NOJUMP 2 + #endif /* VIM__H */
--- a/src/window.c +++ b/src/window.c @@ -74,6 +74,11 @@ static void win_new_height __ARGS((win_T #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