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