# HG changeset patch # User vimboss # Date 1097182967 0 # Node ID 404aac550f357223e7bab3656343827f641d9f74 # Parent 8cde1a064c7cde42146bfd94cc327a0dbbda2f27 updated for version 7.0017 diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 7.0aa. Last change: 2004 Aug 30 +*autocmd.txt* For Vim version 7.0aa. Last change: 2004 Sep 17 VIM REFERENCE MANUAL by Bram Moolenaar @@ -234,22 +234,26 @@ BufWriteCmd Before writing the whole b should not be changed. |Cmd-event| *FileWritePre* FileWritePre Before writing to a file, when not writing the - whole buffer. + whole buffer. Use the '[ and '] marks for the + range of lines. *FileWritePost* FileWritePost After writing to a file, when not writing the whole buffer. *FileWriteCmd* FileWriteCmd Before writing to a file, when not writing the whole buffer. Should do the writing to the - file. Should not change the buffer. + file. Should not change the buffer. Use the + '[ and '] marks for the range of lines. |Cmd-event| *FileAppendPre* -FileAppendPre Before appending to a file. +FileAppendPre Before appending to a file. Use the '[ and '] + marks for the range of lines. *FileAppendPost* FileAppendPost After appending to a file. *FileAppendCmd* FileAppendCmd Before appending to a file. Should do the - appending to the file. |Cmd-event| + appending to the file. Use the '[ and '] + marks for the range of lines.|Cmd-event| *FilterWritePre* FilterWritePre Before writing a file for a filter command or making a diff. @@ -738,8 +742,9 @@ The '[ and '] marks have a special posit the new lines will be inserted. - Before the *ReadPost event the '[ mark is set to the first line that was just read, the '] mark to the last line. -- Before executing the *WritePre and *AppendPre autocommands the '[ mark is - set to the first line that will be written, the '] mark to the last line. +- Before executing the *WriteCmd, *WritePre and *AppendPre autocommands the '[ + mark is set to the first line that will be written, the '] mark to the last + line. Careful: '[ and '] change when using commands that change the buffer. In commands which expect a file name, you can use "" for the file name diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -1,4 +1,4 @@ -*change.txt* For Vim version 7.0aa. Last change: 2004 Jun 16 +*change.txt* For Vim version 7.0aa. Last change: 2004 Sep 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -659,7 +659,7 @@ magic nomagic action ~ \0 replaced with the whole matched pattern *\0* *s/\0* \1 replaced with the matched pattern in the first pair of () *s/\1* - \2 replaced with the matched pattern in the first + \2 replaced with the matched pattern in the second pair of () *s/\2* .. .. *s/\3* \9 replaced with the matched pattern in the ninth diff --git a/runtime/doc/digraph.txt b/runtime/doc/digraph.txt --- a/runtime/doc/digraph.txt +++ b/runtime/doc/digraph.txt @@ -1,4 +1,4 @@ -*digraph.txt* For Vim version 7.0aa. Last change: 2001 Sep 03 +*digraph.txt* For Vim version 7.0aa. Last change: 2004 Oct 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -28,7 +28,8 @@ 1. Defining digraphs *digraphs-defin *E104* *E39* :dig[raphs] {char1}{char2} {number} ... Add digraph {char1}{char2} to the list. {number} is - the decimal representation of the character. + the decimal representation of the character. Normally + it is the Unicode character, see |digraph-encoding|. Example: > :digr e: 235 a: 228 < Avoid defining a digraph with '_' (underscore) as the @@ -48,7 +49,24 @@ In the middle of each column is the resu if you look at it on a system that does not support digraphs or if you print this file. -The decimal number is the number of the character. + *digraph-encoding* +The decimal number normally is the Unicode number of the character. Note that +the meaning doesn't change when 'encoding' changes. The character will be +converted from Unicode to 'encoding' when needed. This does require the +conversion to be available, it might fail. + +When Vim was compiled without the +multi_byte feature, you need to specify the +character in the encoding given with 'encoding'. You might want to use +something like this: > + + if has("multi_byte") + digraph oe 339 + elseif &encoding == "iso-8859-15" + digraph oe 189 + endif + +This defines the "oe" digraph for a character that is number 339 in Unicode +and 189 in latin9 (iso-8859-15). ============================================================================== 2. Using digraphs *digraphs-use* @@ -142,6 +160,9 @@ Example: a: is ä and o: is ö These are the RFC1345 digraphs for the one-byte characters. See the output of ":digraphs" for the others. The characters above 255 are only available when Vim was compiled with the |+multi_byte| feature. + +Exception: RFC1345 doesn't specify the euro sign. In Vim the digraph =e was +added for this. *digraph-table* char digraph hex dec official name ~ ^@ NU 0x00 0 NULL (NUL) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.0aa. Last change: 2004 Sep 13 +*eval.txt* For Vim version 7.0aa. Last change: 2004 Oct 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -125,8 +125,8 @@ Expression syntax summary, from least to |expr8| expr9[expr1] index in String |expr9| number number constant - "string" string constant - 'string' literal string constant + "string" string constant, backslash is special + 'string' string constant &option option value (expr1) nested expression variable internal variable @@ -355,13 +355,18 @@ Note that "\000" and "\x00" force the en literal-string *literal-string* *E115* --------------- -'string' literal string constant *expr-'* +'string' string constant *expr-'* Note that single quotes are used. -This string is taken literally. No backslashes are removed or have a special -meaning. A literal-string cannot contain a single quote. Use a normal string -for that. +This string is taken as it is. No backslashes are removed or have a special +meaning. A literal-string cannot contain a single quote. Use a normal, +double-quoted string for that. + +Single quoted strings are useful for patterns, so that backslashes do not need +to be doubled. These two commands are equivalent: > + if a =~ "\\s*" + if a =~ '\s*' option *expr-option* *E112* *E113* diff --git a/runtime/doc/if_mzsch.txt b/runtime/doc/if_mzsch.txt --- a/runtime/doc/if_mzsch.txt +++ b/runtime/doc/if_mzsch.txt @@ -79,9 +79,33 @@ All the examples below assume this namin this again for every buffer. The auto-instantiation can be achieved with autocommands, e.g. you can put -something like this in your .vimrc: > - au VimEnter,BufNew,BufNewFile,BufAdd,BufReadPre * - \:mz (require (prefix vim- vimext) +something like this in your .vimrc (EOFs should not have indentation): > + function s:MzRequire() + if has("mzscheme") + :mz << EOF + (require (prefix vim- vimext)) + (let ((buf (vim-get-buff-by-name (vim-eval "expand(\"\")")))) + (when (and buf (not (eq? buf (vim-curr-buff)))) + (parameterize ((current-namespace (vim-get-buff-namespace buf))) + (namespace-attach-module vim-global-namespace 'vimext) + (namespace-require '(prefix vim vimext))))) + EOF + endif + endfunction + + function s:MzStartup() + if has("mzscheme") + au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire() + :mz << EOF + (current-library-collection-paths + (cons + (build-path (find-system-path 'addon-dir) (version) "collects") + (current-library-collection-paths))) + EOF + endif + endfunction + + call s:MzStartup() < The global namespace just instantiated this module with the prefix "vimext:". diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 7.0aa. Last change: 2004 Sep 04 +*options.txt* For Vim version 7.0aa. Last change: 2004 Oct 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -954,6 +954,12 @@ A jump table for the options with a shor prefer using ".bak", but make sure that you don't have files with ".bak" that you want to keep. + If you like to keep a lot of backups, you could use a BufWritePre + autocommand to change 'backupext' just before writing the file to + include a timestamp. > + :au BufWritePre * let &bex = '-' . strftime("%Y%b%d%X") . '~' +< Use 'backupdir' to put the backup in a different directory. + *'backupskip'* *'bsk'* 'backupskip' 'bsk' string (default: "/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*") global diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt --- a/runtime/doc/pi_netrw.txt +++ b/runtime/doc/pi_netrw.txt @@ -1,4 +1,4 @@ -*pi_netrw.txt For Vim version 6.2. Last change: Sep 10, 2004 +*pi_netrw.txt For Vim version 6.2. Last change: Sep 13, 2004 VIM REFERENCE MANUAL by Charles E. Campbell, Jr. @@ -587,10 +587,14 @@ NETRW BROWSER VARIABLES *netrw-brows "directories" and "files" in the listing. This pattern is used to remove such embedded messages. - g:netrw_keepdir keep current directory immune from the - browsing directory. The browsing - directory is contained in b:netrw_curdir + g:netrw_keepdir =1 (default) keep current directory + immune from the browsing directory. + =0 keep the current directory the + same as the browsing directory. + The browsing directory is contained in + b:netrw_curdir g:netrw_list_cmd command for listing remote directories + g:netrw_longlist if =1, then long listing will be default g:netrw_ftp_list_cmd options for passing along to ftp for directory listing. Defaults: unix or g:netrw_cygwin set: : "ls -lF" @@ -601,6 +605,12 @@ NETRW BROWSER VARIABLES *netrw-brows g:netrw_local_rmdir remove directory command (rmdir) g:netrw_local_rename rename file/directory command unix-default: rm win32-default: ren + g:netrw_maxfilenamelen =32 by default, selected so as to make + long listings fit on 80 column displays. + If your screen is wider, and you have + file/directory names longer than 32 bytes, + you may set this option to keep listings + columnar. g:netrw_mkdir_cmd command for making a remote directory g:netrw_rm_cmd command for removing files g:netrw_rmdir_cmd command for removing directories @@ -825,22 +835,26 @@ See the f file with mozilla. -MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-c* +MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-c* *netrw-curdir* -By default, g:netrw_keepdir is 0. This setting means that the current -directory will track the browsing directory. However, setting g:netrw_keepdir -to 1 (say, in your <.vimrc>) will keep the current directory independent -of the browsing directory. In that case, in order to make the two -directories the same, use the "c" map (just type c). +By default, g:netrw_keepdir is 1. This setting means that the current +directory will not track the browsing directory. However, setting +g:netrw_keepdir to 0 (say, in your <.vimrc>) will tell netrw to have the +currently browsed directory be the current directory. + +With the default setting for g:netrw_keepdir, in order to make the two +directories the same, use the "c" map (just type c). That map will set +the current directory to the current browsing directory. -BOOKMARKING A DIRECTORY *netrw-b* +BOOKMARKING A DIRECTORY *netrw-b* *netrw-bookmark* *netrw-bookmarks* One may easily "bookmark" a directory by using {cnt}b -Any count may be used. +Any count may be used. One may use viminfo's "!" option to retain bookmarks +between vim sessions. CHANGING TO A BOOKMARKED DIRECTORY *netrw-B* @@ -913,7 +927,10 @@ 8. Problems and Fixes *netrw-proble P4. I would like long listings to be the default. - let g:netrw_longlist=1 + let g:netrw_longlist=1 + + Check out |netrw-browse-var| for more customizations that + you can set. P5. My times come up oddly in local browsing @@ -923,10 +940,10 @@ 8. Problems and Fixes *netrw-proble your <.vimrc>: let g:netrw_timefmt= "%X" (where X is the option) - P6. I don't want my current directory changing just because I'm - browsing somewhere. + P6. I want my current directory to track my browsing. + How do I do that? - let g:netrw_keepdir= 1 + let g:netrw_keepdir= 0 ============================================================================== @@ -979,60 +996,65 @@ which is loaded automatically at startup ============================================================================== 10. History *netrw-history* - v48: * One may use ftp to do remote host file browsing + v50: * directories now displayed using buftype=nofile; should keep the + directory names as-is + * attempts to remove empty "[No File]" buffers leftover + from :file ..name.. commands + * bugfix: a "caps-lock" editing difficulty left in v49 was fixed + * syntax highlighting for "Showing:" the hiding list included + * bookmarks can now be retained if "!" is in the viminfo option + v49: * will use ftp for http://.../ browsing v48: * One may use ftp to + do remote host file browsing * (windows and !cygwin) remote browsing with ftp can now use the "dir" command internally to provide listings * g:netrw_keepdir now allows one to keep the initial current - directory as the current directory (normally the local - file browser makes the currently viewed directory the - current directory) + directory as the current directory (normally the local file + browser makes the currently viewed directory the current + directory) * g:netrw_alto and g:netrw_altv now support alternate placement of windows started with o or v * Nread ? and Nwrite ? now uses echomsg (instead of echo) so :messages can repeat showing the help * bugfix: avoids problems with partial matches of directory names to prior buffers with longer names - * one can suppress error messages with g:netrw_quiet - * ctrl-h used instead of h for editing hiding list - * one may edit the sorting sequence with the S map - * now allows confirmation of deletion with [y(es) n(o) a(ll) q(uit)] - * the "x" map now handles special file viewing with: - (windows) rundll32 url.dll - (gnome) gnome-open - (kde) kfmclient - If none of these are on the executable path, then + * one can suppress error messages with g:netrw_quiet ctrl-h used + * instead of h for editing hiding list one may edit the + * sorting sequence with the S map now allows confirmation of + * deletion with [y(es) n(o) a(ll) q(uit)] the "x" map now handles + * special file viewing with: + (windows) rundll32 url.dll (gnome) gnome-open (kde) + kfmclient If none of these are on the executable path, then NetrwFileHandlers.vim is used. * directory bookmarking during both local and remote browsing implemented * one may view all, use the hiding list to suppress, or use the - hiding list to show-only remote and local file/directory listings - * improved unusual file and directory name handling - * preview window support - v47: * now handles local directory browsing. - v46: * now handles remote directory browsing + hiding list to show-only remote and local file/directory + listings + * improved unusual file and directory name handling preview + * window support + v47: * now handles local directory browsing. v46: * now handles + remote directory browsing * g:netrw_silent (if 1) will cause all transfers to be silent'd - v45: * made the [user@]hostname:path form a bit more restrictive - to better handle errors in using protocols - (e.g. scp:usr@host:file was being recognized as an rcp request) - v44: * changed from "rsync -a" to just "rsync" + v45: * made the [user@]hostname:path form a bit more restrictive to + better handle errors in using protocols (e.g. scp:usr@host:file + was being recognized as an rcp request) v44: * changed from + "rsync -a" to just "rsync" * somehow an editing error messed up the test to recognize use of the fetch method for NetRead. * more debugging statements included - v43: * moved "Explanation" comments to help file - as "Network Reference" (|netrw-ref|) + v43: * moved "Explanation" comments to help file as + "Network Reference" (|netrw-ref|) * now uses Dfunc() Decho() and Dret() for debugging * removed superfluous NetRestorePosn() calls - v42: * now does BufReadPre and BufReadPost events on file:///* - and file://localhost/* - v41: * installed file:///* and file://localhost/* handling - v40: * prevents redraw when a protocol error occurs so that the - user may see it - v39: * sftp support - v38: * Now uses NetRestorePosn() calls with Nread/Nwrite commands + v42: * now does BufReadPre and BufReadPost events on file:///* and + file://localhost/* v41: * installed file:///* and + file://localhost/* handling v40: * prevents redraw when a + protocol error occurs so that the user may see it v39: * sftp + support v38: * Now uses NetRestorePosn() calls with + Nread/Nwrite commands * Temporary files now removed via bwipe! instead of bwipe - (thanks to Dave Roberts) - v37: * Claar's modifications which test if ftp is successful, otherwise - give an error message + (thanks to Dave Roberts) v37: * Claar's modifications which + test if ftp is successful, otherwise give an error message * After a read, the alternate file was pointing to the temp file. The temp file buffer is now wiped out. * removed silent from transfer methods so user can see what's diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 7.0aa. Last change: 2004 Sep 13 +*syntax.txt* For Vim version 7.0aa. Last change: 2004 Sep 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1799,7 +1799,7 @@ If you do not want complex things like ' :let perl_no_extended_vars = 1 -{In Vim 6.x it was the other way around: "perl_extended_vars" enabled it.) +(In Vim 6.x it was the other way around: "perl_extended_vars" enabled it.) The coloring strings can be changed. By default strings and qq friends will be highlighted like the first line. If you set the variable diff --git a/runtime/doc/tags b/runtime/doc/tags --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -3542,6 +3542,7 @@ E675 print.txt /*E675* E676 options.txt /*E676* E677 eval.txt /*E677* E678 pattern.txt /*E678* +E679 syntax.txt /*E679* E68 pattern.txt /*E68* E69 pattern.txt /*E69* E70 pattern.txt /*E70* @@ -4414,6 +4415,7 @@ diff-options diff.txt /*diff-options* diff-patchexpr diff.txt /*diff-patchexpr* diff.txt diff.txt /*diff.txt* digraph-arg change.txt /*digraph-arg* +digraph-encoding digraph.txt /*digraph-encoding* digraph-table digraph.txt /*digraph-table* digraph.txt digraph.txt /*digraph.txt* digraphs digraph.txt /*digraphs* @@ -4920,7 +4922,6 @@ hebrew hebrew.txt /*hebrew* hebrew.txt hebrew.txt /*hebrew.txt* help various.txt /*help* help-context help.txt /*help-context* -help-tags tags 1 help-translated various.txt /*help-translated* help-xterm-window various.txt /*help-xterm-window* help.txt help.txt /*help.txt* @@ -5454,6 +5455,8 @@ netrw-R pi_netrw.txt /*netrw-R* netrw-S pi_netrw.txt /*netrw-S* netrw-activate pi_netrw.txt /*netrw-activate* netrw-b pi_netrw.txt /*netrw-b* +netrw-bookmark pi_netrw.txt /*netrw-bookmark* +netrw-bookmarks pi_netrw.txt /*netrw-bookmarks* netrw-browse pi_netrw.txt /*netrw-browse* netrw-browse-cmds pi_netrw.txt /*netrw-browse-cmds* netrw-browse-var pi_netrw.txt /*netrw-browse-var* @@ -5463,6 +5466,7 @@ netrw-contents pi_netrw.txt /*netrw-cont netrw-cr pi_netrw.txt /*netrw-cr* netrw-credits pi_netrw.txt /*netrw-credits* netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l* +netrw-curdir pi_netrw.txt /*netrw-curdir* netrw-d pi_netrw.txt /*netrw-d* netrw-debug pi_netrw.txt /*netrw-debug* netrw-delete pi_netrw.txt /*netrw-delete* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2004 Sep 13 +*todo.txt* For Vim version 7.0aa. Last change: 2004 Oct 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,18 +30,15 @@ be worked on, but only if you sponsor Vi *known-bugs* -------------------- Known bugs and current work ----------------------- -Endless loop when "syntax reset" in ~/.vim/after/syntax/syncolor.vim. -Crash when using ":set background=dark". Solved! -Limit init_highlight() to five recursive calls? - patch for Vim 6.3 for free_oldval and init_highlight()? +Add browsedir(): like browse() but for directories. + For GTK it already sort-of works when the default name is empty. -Crash with long line. (Walter Briscoe, Sep 13) - -Add fix for appending BOM to 6.3? Reported by Alex Jakushev. +When ":file" sets the alternate file name and it's empty this doesn't make +sense. Could skip it, but would that break scripts that rely on the buffer to +exist? -Win32 console doesn't compile. Does GetCommandLineW() work for non-GUI? -(Dave Roberts) If yes, then move the functions to another file. -link with kernel32.lib? +Folding support for 2html. (Carl Osterwisch, Oct 4) +How to evaluate an expression in the sandbox? Aborting at the ATTENTION prompt causes trouble: buffer remains active, nwindows isn't closed (fixed in buffer.c) @@ -59,7 +56,44 @@ Win32: When the path to a file has Russi work. (Valery Kondakoff) Solved in os_mswin.c. Add to 6.3? +Patch for Win32 textdomain: NAKADAIRA Yukihiro, Sept 17. + +GTK 2 error message with this sequence (Namsh Oct 7): + - start gvim with French locale + - set enc=utf-8 + - :aunmenu * + - :unlet did_install_default_menus + - :source $VIMRUNTIME/menu.vim + Valencia: executable("xxd.exe") returns true while "!xxd" doesn't work. +Works fine for me. Only in specific environment? + +netrw plugin: When coming back to the same directory a scratch buffer appears. +Only on Win32. (Charles Campbell, Sept 15) + +New Eiffel indent script from Jocelyn Fiat. OK with David Clarke. + +Win32: not using 'tenc' in GUI causes problems on Win 98? (Jiri Jezdinsky) +Try out with Russian input method. + +After "Y" '[ and '] are not at start/end of the yanked text. (Ken Clark) + +Patch for adding 'fsync' option: disable using fsync() on file write. (Sept. +26, Ciaran McCreesh) + +Folding for C syntax: (Olaf Dabrunz 27 sept 2004) + +Add remark about using Vim with VS .net to Visvim docs. (David Fishburn, Sept +27) + +Vim icon for documents associated with Vim? (Rahul Kulkarni, sept 28) + +Add a function to test if a font name actually works. + +When using "set laststatus=2 cmdheight=2" in the .gvimrc you only get one line +for the cmdline. (Christian Robinson) When the Vim window is resized (e.g., +xterm with many lines) it's OK. + For version 7.0: @@ -70,6 +104,7 @@ For version 7.0: 7 For Visual mode: Command to do a search for the string in the marked area. Only when fewer than two lines. Use "g/" and "gb". Patch from Yegappan Lakshmanan. 2004 Jul 11 + When more than two lines: perform a search in the Visual area only. 8 Make 'statusline' local, so that each window can have a different value. But should it also be local to a buffer? (Yegappan Lakshmanan has a patch, 2004 Jul 11) @@ -168,6 +203,12 @@ For version 7.0: - findmatch() should be adjusted for Lisp. See remark at get_lisp_indent(). Esp. \( and \) should be skipped. (Dorai Sitaram, incomplete patch Mar 18) + - Set user variables to the names of the actually used user vimrc file, + the first directory looked for user plugins/syntax files. + $MYVIMRC for .vimrc, $MYGVIMRC for .gvimrc, $MYRUNTIME/plugin for + runtime files? + Also: when the environment variable exists, use it. If it doesn't + exist, set it. Requires good names: $VIM_USER_VIMRC $VIM_USER_DIR - In the kvim/KDE source files fix the formatting. @@ -192,6 +233,8 @@ For version 7.0: the contains list directly for matching syntax items. - Keep wordlist in syntax group, load it only once and use it several times later. Sort of global syntax items. + - Use wordlists from openoffice (myspell). Work together with them to + update the wordlist. (Adri Verhoef, Aad Nales) - REFACTORING: The main() function is very long. Move parts to separate functions, especially loops. Ideas from Walter Briscoe (2003 Apr 3, 2004 Feb 9). @@ -205,9 +248,33 @@ For version 7.0: http://sourceforge.net/projects/insenvim http://cedet.sourceforge.net/intellisense.shtml (for Emacs) Ivan Villanueva has something for Java. + Can't call it Intellisense, it is a trademark by Microsoft. + Ideas from the Vim 7 BOF at SANE: + - It's not possible to have one solution for all languages. Design an + interface for completion plugins. The matches can be done in a + Vim-script list. + - For interpreted languages, use the interpreter to obtain information. + Should work for Java (Eclipse does this), Python, Tcl, etc. + - Check Readline for its completion interface. + - Use ctags for other languages. Writing a file could trigger running + ctags, merging the tags of the changed file. +- UNDO TREE: keep all states of the text, don't delete undo info. + When making a change, instead of clearing any future undo (thus redo) + info, make a new branch. + To navigate through the undo tree number the states of the text + sequentially and make it possible to go through the tree in that order. + Could also use timestamps (to show the time and/or jump to a state five + minutes ago). (David Schweikert) + To go from one state to another: backtrack to a common state, then forward + again. + Only difficult thing: When going back in time, how to find the previous + text state in the tree? + Show the list of changes in a window to be able to select a version? - PERSISTENT UNDO: store undo in a file. - Support multiple threads. Show the list of changes in a window to be able - to select a version. + Use timestamps, so that a version a certain time ago can be found and info + before some time/date can be flushed. 'undopersist' gives maximum time to + keep undo: "3h", "1d", "2w", "1y", etc. For the file use dot and + extension: ".filename.un~" (like swapfile but "un~" instead of "swp"). 7 SWAP FILE CHANGE: When a dos format file was edited with ":e ++ff=unix", Vim is killed and trying to recover the file, 'ff' will be dos. Same for non-default fileencoding. (Miroslaw Dobrzanski-Neumann, Jul 17) @@ -235,8 +302,12 @@ 7 Support WINDOW TABS. Works like sev - STICKY CURSOR: Add a way of scrolling that leaves the cursor where it is. Especially when using the scrollbar. Typing a cursor-movement command scrolls back to where the cursor is. +- Execute a function with standard option values. No need to save and + restore option values. Especially useful for new options. Problem: how + to avoid a performance penalty (esp. for string options)? 8 Support four composing/combining characters, needed for Hebrew. (Ron Aaron) Add the 'maxcombining' option to set the nr. of composing characters. + At the same time support more colors (use two bytes when necessary). - Add a few more things to 'diffopt': "horizontal", "vertical", "foldcolumn". (Benji Fisher, 2004 Jun 21) - FileChangedShellPost autocommand event: after (not) reloading a changed @@ -265,6 +336,9 @@ 7 Make ":startinsert" command work dir - "onemore" flag in 'virtualedit': move cursor past end of line. Patch by Mattias Flodin (2004 Jul 30) +The fsync() in buf_write() causes laptop harddisk spinup. Add an option to +avoid it? + Support ":set syntax=cpp.doxygen"? Suggested patch by Michael Geddes (9 Aug 2004). Should also work for 'filetype'. @@ -274,6 +348,9 @@ Smilauer, 2004 Sep 13) Win32: In 'fileencodings' allow using "acp" for the active codepage. Useful value: "ucs-bom,utf-8,acp,latin1" +Win32: Cannot edit a file starting with # with --remote. (Giuseppe Bilotta, +Oct 6 2004) + For manipulating buffers without opening a new window, support Virtual windows. Example: :virtwin let l = GetBufLine(4, 10) @@ -291,6 +368,10 @@ Win32: In the generated batch files, use Mathias Michaelis (2004 Sep 6) Also place vimtutor.bat in %windir%? +Support ":enew filename" to edit a new buffer with a name. It's like "enew | +file filename" but without setting the alternate file to a buffer without a +name. (Charles Campbell) + Vi incompatibility: 9 In Ex mode, "u" undoes all changes, not just the last one. (John Cowan) @@ -386,6 +467,7 @@ 7 DND doesn't work with KDE (also with KDE GUI known bugs: - The default font is ugly. bold text isn't displayed correctly. + (bold characters are half the width of normal characters) - Error messages when starting up. The "tip of the day" box is empty. - Encoding of menu items needs to be converted. (Yasuhiro Matsumoto) @@ -2041,6 +2123,7 @@ 8 When editing "tt.gz", which is in DO *Leave - Leaving a mode (in pair with the above *Enter) VimLeaveCheck - Before Vim decides to exit, so that it can be cancelled when exiting isn't a good idea. + WinMoved - when windows have been moved around, e.g, ":wincmd J" CmdUndefined - Like FuncUndefined but for user commands. SearchPost - After doing a search command (e.g. to do "M") PreDirChanged/PostDirChanged @@ -2511,8 +2594,6 @@ 6 Context-sensitive abbreviations: Spe - Add command to repeat a whole mapping ("." only repeats the last change in a mapping). Also: Repeat a whole insert command, including any mappings that it included. Sort-of automatic recording? -- Make it possible to undo all the commands from a mapping, including a - trailing unfinished command, e.g. for ":map K iX^[r". - Add an option to ":map" that makes it display the special keys in <> notation (e.g. instead of ^M). Or just always do this? - Include an option (or flag to 'cpoptions') that makes errors in mappings @@ -2663,6 +2744,8 @@ 7 Add ":iselect", a combination of ":i Undo: +- Make it possible to undo all the commands from a mapping, including a + trailing unfinished command, e.g. for ":map K iX^[r". - When accidentally hitting "R" instead of Ctrl-R, further Ctrl-R is not possible, even when typing immediately. (Grahn) Also for "i", "a", etc. Postpone saving for undo until something is really inserted? @@ -2676,9 +2759,6 @@ 7 Add undo for a range of lines. Can version without changing the rest of the file. Stop doing this when a change includes only some of these lines and changes the line count. Need to store these undo actions as a separate change that can be undone. -7 Add an undo tree: When making a change, instead of clearing any future - undo (thus redo) info, make a new branch. How to navigate through the - undo tree? - For u_save() include the column number. This can be used to set '[ and ']. And in the future the undo can be made more efficient (Webb). - In out-of-memory situations: Free allocated space in undo, and reduce the @@ -2897,7 +2977,7 @@ 7 Make "ga" show the digraph for a cha below/above). - Use digraph table to tell Vim about the collating sequence of special characters? -8 Add command to remove (all) digraphs. (Brown) +8 Add command to remove one or more (all) digraphs. (Brown) 7 Support different sets of digraphs (depending on the character set?). At least Latin1/Unicode, Latin-2, MS-DOS (esp. for Win32). diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt --- 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: 2004 Aug 28 +*usr_41.txt* For Vim version 7.0aa. Last change: 2004 Oct 06 VIM USER MANUAL - by Bram Moolenaar @@ -218,9 +218,9 @@ To avoid the need for a backslash, you c :echo name < "peter" ~ -Inside a single-quote string all the characters are taken literally. The -drawback is that it's impossible to include a single quote. A backslash is -taken literally as well, thus you can't use it to change the meaning of the +Inside a single-quote string all the characters are as they are. The drawback +is that it's impossible to include a single quote. A backslash is taken +literally as well, thus you can't use it to change the meaning of the character after it. In double-quote strings it is possible to use special characters. Here are a few useful ones: diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2004 Sep 13 +*version7.txt* For Vim version 7.0aa. Last change: 2004 Oct 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -243,6 +243,12 @@ upper case. Add color support to the bu For the '%' item in 'viminfo', allow a number to set a maximum for the number of buffers. +When a file looks like a shell script, check for an "exec" command that starts +the tcl interpreter. (suggested by Alexios Zavras) + +Support conversion between utf-8 and latin9 (iso-8859-15) internally, so that +digraphs still work when iconv is not available. + ============================================================================== COMPILE TIME CHANGES *compile-changes-7* @@ -373,4 +379,21 @@ When an error message is given while wai xterm reports the number of colors), the hit-enter prompt overwrote the last line. Don't reset msg_didout in normal_cmd() for K_IGNORE. +Mac GUI: Shift-Tab didn't work. + +When defining tooltip text, don't translate terminal codes, since it's not +going to be used like a command. + +GTK 2: Check the tooltip text for valid utf-8 characters to avoid getting a +GTK error. Invalid characters may appear when 'encoding' is changed. + +GTK 2: Add a safety check for invalid utf-8 sequences, they can crash pango. + +Win32: When 'encoding' is changed while starting up, use the Unicode command +line to convert the file arguments to 'encoding'. Both for the GUI and the +console version. + +Win32 GUI: latin9 text (iso-8859-15) was not displayed correctly, because +there is no codepage for latin9. Do our own conversion from latin9 to UCS2. + vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/filetype.vim b/runtime/filetype.vim --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: Bram Moolenaar -" Last Change: 2004 Sep 11 +" Last Change: 2004 Oct 02 " Listen very carefully, I will say this only once if exists("did_load_filetypes") @@ -1339,22 +1339,41 @@ fun! SetFileTypeSH(name) unlet b:is_bash endif endif - setf sh + call SetFileTypeShell("sh") +endfun + +" For shell-like file types, check for an "exec" command hidden in a comment, +" as used for Tcl. +fun! SetFileTypeShell(name) + let l = 2 + while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)' + " Skip empty and comment lines. + let l = l + 1 + endwhile + if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$' + " Found an "exec" line after a comment with continuation + let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '') + if n =~ '\ +" Maintainer: Jocelyn Fiat +" Previous-Maintainer: David Clarke " $Date$ " $Revision$ -" URL: http://gadicath.webhop.net/other/eiffel.vim +" URL: http://www.djoce.net/page/vim/ +" Last Change: 2004 Sep 14 " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -20,8 +22,6 @@ setlocal comments=:-- setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant setlocal indentkeys+==invariant,=do,=local,=export -setlocal sw=3 -setlocal tw=78 " Define some stuff " keywords grouped by indenting @@ -96,7 +96,7 @@ function GetEiffelIndent() " set indent of zero end statements that are at an indent of 3, this should " only ever be the class's end. - if getline(v:lnum) =~ '^\s*end\>' && ind == 3 + if getline(v:lnum) =~ '^\s*end\>' && ind == &sw let ind = 0 endif diff --git a/runtime/indent/java.vim b/runtime/indent/java.vim --- a/runtime/indent/java.vim +++ b/runtime/indent/java.vim @@ -1,7 +1,7 @@ " Vim indent file " Language: Java -" Maintainer: Toby Allsopp -" Last Change: 2003 Oct 21 +" Maintainer: Toby Allsopp (resigned) +" Last Change: 2004 Oct 05 " Only load this indent file when no other was loaded. if exists("b:did_indent") diff --git a/runtime/menu.vim b/runtime/menu.vim --- 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 -" Last Change: 2004 May 26 +" Last Change: 2004 Sep 16 " 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. @@ -382,7 +382,7 @@ if has("keymap") endif unlet s:n endif -if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_photon") +if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac") an 20.470 &Edit.Select\ Fo&nt\.\.\. :set guifont=* endif diff --git a/runtime/plugin/netrw.vim b/runtime/plugin/netrw.vim --- a/runtime/plugin/netrw.vim +++ b/runtime/plugin/netrw.vim @@ -1,7 +1,7 @@ " netrw.vim: Handles file transfer and remote directory listing across a network -" Last Change: Sep 10, 2004 +" Last Change: Sep 14, 2004 " Maintainer: Charles E. Campbell, Jr. PhD -" Version: 48 +" Version: 51a NOT RELEASED " License: Vim License (see vim's :help license) " " But be doers of the Word, and not only hearers, deluding your own selves @@ -14,7 +14,7 @@ if exists("g:loaded_netrw") || &cp finish endif -let g:loaded_netrw = "v48" +let g:loaded_netrw = "v51a" let s:save_cpo = &cpo let loaded_explorer = 1 set cpo&vim @@ -115,7 +115,7 @@ if !exists("g:netrw_hide") let g:netrw_hide= 1 endif if !exists("g:netrw_ftp_browse_reject") - let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not' + let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$' endif if !exists("g:netrw_keepdir") let g:netrw_keepdir= 1 @@ -140,6 +140,9 @@ endif if !exists("g:netrw_altv") let g:netrw_altv= 0 endif +if !exists("g:netrw_maxfilenamelen") + let g:netrw_maxfilenamelen= 32 +endif " BufEnter event ignored by decho when following variable is true " Has a side effect that doau BufReadPost doesn't work, so @@ -211,9 +214,11 @@ if version >= 600 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("")|exe 'e /'.substitute(expand(""),"file:/*","","")|exe "silent doau BufReadPost ".expand("") au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".expand("")|exe 'e /'.substitute(expand(""),"file:/*","","")|exe "silent doau BufReadPost ".expand("") endif - au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("")|exe "Nread 0r ".expand("")|exe "silent doau BufReadPost ".expand("") - au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("")|exe "Nread " .expand("")|exe "silent doau BufReadPost ".expand("") - au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("")|exe "Nwrite " .expand("")|exe "silent doau BufWritePost ".expand("") + au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("")|exe "Nread 0r ".expand("")|exe "silent doau BufReadPost ".expand("") + au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("")|exe "Nread " .expand("")|exe "silent doau BufReadPost ".expand("") + au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("")|exe "Nwrite " .expand("")|exe "silent doau BufWritePost ".expand("") + au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("")|exe "'[,']Nwrite " .expand("")|exe "silent doau BufWritePost ".expand("") +" au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* if exists("vcount")|call Decho("vcount=".vcount)|else|call Decho("no vcount")|endif augroup END endif @@ -1025,7 +1030,8 @@ fun! NetBrowse(dirname) " call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist) " sanity check - if exists("b:netrw_method") && b:netrw_method =~ '[23]' + if exists("b:netrw_method") && b:netrw_method =~ '[235]' +" call Decho("b:netrw_method=".b:netrw_method) if !executable("ftp") if !exists("g:netrw_quiet") echoerr "***netrw*** this system doesn't support remote directory listing via ftp" @@ -1066,11 +1072,13 @@ fun! NetBrowse(dirname) " call Decho("set up path <".path .">") " call Decho("set up fname <".fname .">") - if method == "ftp" + if method == "ftp" || method == "http" + let method = "ftp" let listcmd = g:netrw_ftp_list_cmd else let listcmd = substitute(g:netrw_list_cmd,'\',user.machine,'') endif + if exists("b:netrw_method") " call Decho("setting s:netrw_method<".b:netrw_method.">") let s:netrw_method= b:netrw_method @@ -1144,11 +1152,12 @@ fun! NetBrowse(dirname) endif " rename file to reflect where its from - setlocal ts=32 bt=nofile bh=wipe nobl + setlocal bt=nofile bh=wipe nobl noswf + exe "setlocal ts=".g:netrw_maxfilenamelen " call Decho("exe file ".escape(bufname,s:netrw_cd_escape)) exe 'file '.escape(bufname,s:netrw_cd_escape) " call Decho("renaming file to bufname<".bufname.">") - setlocal bt=nowrite bh=hide nobl + setlocal bh=hide nobl " set up buffer-local mappings " call Decho("set up buffer-local mappings") @@ -1338,7 +1347,6 @@ fun! NetBrowseChgDir(dirname,newdir else " strip off a directory name from dirname let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','') - exe "silent! keepjumps ".curline.",$d" endif " call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">") @@ -1573,7 +1581,7 @@ fun! NetBrowseX(fname,remote) if a:remote == 1 let eikeep= &ei - set ei=all bh=delete bt=nofile + set ei=all bh=delete bt=nofile noswf exe "norm! \" let &ei= eikeep redraw! @@ -1601,15 +1609,13 @@ fun! NetBrowseFtpCmd(path,cmd) exe "silent! keepjumps ".curline.",$d" "......................................... - if s:netrw_method == 2 + if s:netrw_method == 2 || s:netrw_method == 5 " ftp + <.netrc>: Method #2 if a:path != "" put ='cd '.a:path endif exe "put ='".a:cmd."'" - - -" redraw!|call inputsave()|call input("Pausing...")|call inputrestore() "Decho +" redraw!|call inputsave()|call input("Pausing...")|call inputrestore() if exists("g:netrw_port") && g:netrw_port != "" " call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port @@ -1875,29 +1881,29 @@ fun! NetBookmarkDir(chg,curdir) if a:chg == 0 " bookmark the current directory - let s:netrw_bookmarkdir_{v:count}= a:curdir - if !exists("s:bookmarkmax") - let s:bookmarkmax= v:count - elseif v:count > s:bookmarkmax - let s:bookmarkmax= v:count + let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir + if !exists("g:NETRW_BOOKMARKMAX") + let g:NETRW_BOOKMARKMAX= v:count + elseif v:count > g:NETRW_BOOKMARKMAX + let g:NETRW_BOOKMARKMAX= v:count endif elseif a:chg == 1 " change to the bookmarked directory - if exists("s:netrw_bookmarkdir_{v:count}") - exe "e ".s:netrw_bookmarkdir_{v:count} + if exists("g:NETRW_BOOKMARKDIR_{v:count}") + exe "e ".g:NETRW_BOOKMARKDIR_{v:count} else echomsg "Sorry, bookmark#".v:count." doesn't exist!" endif - elseif exists("s:bookmarkmax") + elseif exists("g:NETRW_BOOKMARKMAX") " list bookmarks -" call Decho("list bookmarks [0,".s:bookmarkmax."]") +" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]") let cnt= 0 - while cnt <= s:bookmarkmax - if exists("s:netrw_bookmarkdir_{cnt}") - echo "Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt} -" call Decho("Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt}) + while cnt <= g:NETRW_BOOKMARKMAX + if exists("g:NETRW_BOOKMARKDIR_{cnt}") + echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt} +" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}) endif let cnt= cnt + 1 endwhile @@ -1905,7 +1911,6 @@ fun! NetBookmarkDir(chg,curdir) " call Dret("NetBookmarkDir") endfun - " --------------------------------------------------------------------- " Browsing Support For Local Directories And Files: {{{1 @@ -1972,20 +1977,32 @@ fun! LocalBrowse(dirname) endif endif " call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")") +" call Decho("buffer name<".bufname("%")."> dirname<".dirname.">") setlocal ma keepjumps %d - if expand("%:p") != dirname + if expand("%") != dirname + " set standard browser options on buffer + setlocal bt=nofile bh=hide nobl noswf + exe "setlocal ts=".g:netrw_maxfilenamelen exe 'silent! file '.escape(dirname,s:netrw_cd_escape) -" call Decho("renamed file to<".escape(dirname,' #').">") +" call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">") +" call Decho("yielding actual bufname<".bufname("%").">") endif else " call Decho("generate new buffer named<".escape(dirname,' #').">") silent! enew! + " set standard browser options on buffer + setlocal bt=nofile bh=hide nobl noswf + exe "setlocal ts=".g:netrw_maxfilenamelen exe 'silent! file '.substitute(escape(dirname,s:netrw_cd_escape),'/$','','e') -" call Decho("renamed file to<".escape(dirname,s:netrw_cd_escape).">") +" call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'/$','','e').">") +" call Decho("yielding actual bufname<".bufname("%").">") endif - " set standard browser options on buffer - setlocal ts=32 bt=nowrite bh=hide nobl + if bufname("#") == "" && bufnr("#") != -1 + " the file command produces a lot of [No File] buffers +" call Decho("wiping out nofile buffer#".bufnr("#")) + exe bufnr("#")."bwipe" + endif " set up all the maps " call Decho("Setting up local browser maps") @@ -2076,7 +2093,7 @@ fun! LocalBrowse(dirname) setlocal noma nomod if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif -" call Dret("LocalBrowse : file<".expand("%:p").">") +" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">") endfun " --------------------------------------------------------------------- @@ -2123,7 +2140,7 @@ fun! LocalBrowseList(dirname) let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') else let file = filelist - let filelist= "" + let filelist = "" endif let pfile= file if isdirectory(file) diff --git a/runtime/scripts.vim b/runtime/scripts.vim --- a/runtime/scripts.vim +++ b/runtime/scripts.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types in scripts " " Maintainer: Bram Moolenaar -" Last change: 2004 Sep 02 +" Last change: 2004 Oct 02 " This file is called by an autocommand for every file that has just been " loaded into a buffer. It checks if the type of file can be recognized by @@ -57,14 +57,14 @@ if s:line1 =~ "^#!" " csh scripts elseif s:name =~ '^csh\>' if exists("g:filetype_csh") - let &ft = g:filetype_csh + call SetFileTypeShell(g:filetype_csh) else - set ft=csh + call SetFileTypeShell("csh") endif " tcsh scripts elseif s:name =~ '^tcsh\>' - set ft=tcsh + call SetFileTypeShell("tcsh") " Z shell scripts elseif s:name =~ '^zsh\>' diff --git a/runtime/syntax/lss.vim b/runtime/syntax/lss.vim --- a/runtime/syntax/lss.vim +++ b/runtime/syntax/lss.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: Lynx 2.7.1 style file -" Maintainer: Scott Bigham -" Last Change: 2001 May 09 +" Maintainer: Scott Bigham +" Last Change: 2004 Oct 06 " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded diff --git a/runtime/syntax/pccts.vim b/runtime/syntax/pccts.vim --- a/runtime/syntax/pccts.vim +++ b/runtime/syntax/pccts.vim @@ -1,6 +1,6 @@ " Vim syntax file " Language: PCCTS -" Maintainer: Scott Bigham +" Maintainer: Scott Bigham " Last Change: 10 Aug 1999 " For version 5.x: Clear all syntax items diff --git a/runtime/syntax/pod.vim b/runtime/syntax/pod.vim --- a/runtime/syntax/pod.vim +++ b/runtime/syntax/pod.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: Perl POD format -" Maintainer: Scott Bigham -" Last Change: 2001 May 09 +" Maintainer: Scott Bigham +" Last Change: 2004 Oct 05 " To add embedded POD documentation highlighting to your syntax file, add " the commands: @@ -25,7 +25,7 @@ elseif exists("b:current_syntax") endif " POD commands -syn match podCommand "^=head[12]" nextgroup=podCmdText +syn match podCommand "^=head[1234]" nextgroup=podCmdText syn match podCommand "^=item" nextgroup=podCmdText syn match podCommand "^=over" nextgroup=podOverIndent skipwhite syn match podCommand "^=back" @@ -52,7 +52,11 @@ syn match podSpecial "\(\<\|&\)\I\i*\(:: syn match podSpecial "[$@%]\I\i*\(::\I\i*\)*\>" " Special formatting sequences -syn region podFormat start="[IBSCLFXEZ]<" end=">" oneline contains=podFormat +syn region podFormat start="[IBSCLFX]<[^<]"me=e-1 end=">" oneline contains=podFormat +syn match podFormat "Z<>" +syn match podFormat "E<\(\d\+\|\I\i*\)>" contains=podEscape,podEscape2 +syn match podEscape "\I\i*>"me=e-1 contained +syn match podEscape2 "\d\+>"me=e-1 contained " Define the default highlighting. " For version 5.7 and earlier: only when not done already @@ -72,6 +76,8 @@ if version >= 508 || !exists("did_pod_sy HiLink podFormat Identifier HiLink podVerbatimLine PreProc HiLink podSpecial Identifier + HiLink podEscape String + HiLink podEscape2 Number delcommand HiLink endif diff --git a/runtime/syntax/samba.vim b/runtime/syntax/samba.vim --- a/runtime/syntax/samba.vim +++ b/runtime/syntax/samba.vim @@ -2,7 +2,7 @@ " Language: samba configuration files (smb.conf) " Maintainer: Rafael Garcia-Suarez " URL: http://rgarciasuarez.free.fr/vim/syntax/samba.vim -" Last change: 2002 May 06 +" Last change: 2004 September 21 " Don't forget to run your config file through testparm(1)! @@ -17,8 +17,8 @@ endif syn case ignore syn match sambaParameter /^[a-zA-Z \t]\+=/ contains=sambaKeyword -syn match sambaSection /^\s*\[[a-zA-Z0-9_\-. ]\+\]/ -syn match sambaMacro /%[SPugUGHvhmLMNpRdaIT]/ +syn match sambaSection /^\s*\[[a-zA-Z0-9_\-.$ ]\+\]/ +syn match sambaMacro /%[SPugUGHvhmLMNpRdaITD]/ syn match sambaMacro /%$([a-zA-Z0-9_]\+)/ syn match sambaComment /^\s*[;#].*/ syn match sambaContinue /\\$/ @@ -92,6 +92,18 @@ syn keyword sambaKeyword contained acls syn keyword sambaKeyword contained disable dn egd entropy enum extensions mmap syn keyword sambaKeyword contained policy spin spoolss +" Since Samba 3.0.2 +syn keyword sambaKeyword contained abort afs algorithmic backend +syn keyword sambaKeyword contained charset cups defer display +syn keyword sambaKeyword contained enable idmap kerberos lookups +syn keyword sambaKeyword contained methods modules nested NIS ntlm NTLMv2 +syn keyword sambaKeyword contained objects paranoid partners passdb +syn keyword sambaKeyword contained plaintext prefix primary private +syn keyword sambaKeyword contained profile quota realm replication +syn keyword sambaKeyword contained reported rid schannel sendfile sharing +syn keyword sambaKeyword contained shutdown signing special spnego +syn keyword sambaKeyword contained store unknown unwriteable + " Define the default highlighting. " For version 5.7 and earlier: only when not done already " For version 5.8 and later: only when an item doesn't have highlighting yet diff --git a/runtime/syntax/scheme.vim b/runtime/syntax/scheme.vim --- a/runtime/syntax/scheme.vim +++ b/runtime/syntax/scheme.vim @@ -194,7 +194,6 @@ if exists("b:is_mzscheme") || exists("is syn keyword schemeExtSyntax error raise opt-lambda define-values unit unit/sig define-signature syn keyword schemeExtSyntax invoke-unit/sig define-values/invoke-unit/sig compound-unit/sig import export syn keyword schemeExtSyntax link syntax quasisyntax unsyntax with-syntax - hi def link schemeExtSyntax Type syn keyword schemeExtFunc format system-type current-extension-compiler current-extension-linker syn keyword schemeExtFunc use-standard-linker use-standard-compiler @@ -217,7 +216,6 @@ if exists("b:is_mzscheme") || exists("is syn keyword schemeExtFunc exn:special-comment? exn:syntax? exn:thread? exn:user? exn:variable? exn:application:mismatch? " Command-line parsing syn keyword schemeExtFunc command-line current-command-line-arguments once-any help-labels multi once-each - hi def link schemeExtFunc PreProc " syntax quoting, unquoting and quasiquotation syn region schemeUnquote matchgroup=Delimiter start="#," end=![ \t\[\]()";]!me=e-1 contains=ALL @@ -230,6 +228,37 @@ if exists("b:is_mzscheme") || exists("is syn region schemeQuoted matchgroup=Delimiter start="#['`](" matchgroup=Delimiter end=")" contains=ALL endif + +if exists("b:is_chicken") || exists("is_chicken") + syn match schemeOther oneline "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+" + syn match schemeExtSyntax oneline "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+" + + syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec + syn keyword schemeExtSyntax foreign-lambda foreign-lambda* + syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable + syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno + + " here-string + syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+ + + if filereadable(expand(":p:h")."/cpp.vim") + unlet! b:current_syntax + syn include @ChickenC :p:h/cpp.vim + syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC + syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC + syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC + syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC + endif + +endif + " Synchronization and the wrapping up... syn sync match matchPlace grouphere NONE "^[^ \t]" @@ -255,12 +284,14 @@ if version >= 508 || !exists("did_scheme HiLink schemeBoolean Boolean HiLink schemeDelimiter Delimiter - HiLink schemeConstant Constant + HiLink schemeConstant Constant HiLink schemeComment Comment HiLink schemeMultilineComment Comment HiLink schemeError Error + HiLink schemeExtSyntax Type + HiLink schemeExtFunc PreProc delcommand HiLink endif diff --git a/src/GvimExt/gvimext.cpp b/src/GvimExt/gvimext.cpp --- a/src/GvimExt/gvimext.cpp +++ b/src/GvimExt/gvimext.cpp @@ -630,7 +630,7 @@ STDMETHODIMP CShellExt::QueryContextMenu *pos = 0; } // Now concatenate - strncpy(temp, _("Edit with existing Vim - &"), MAX_PATH - 1); + strncpy(temp, _("Edit with existing Vim - "), MAX_PATH - 1); strncat(temp, title, MAX_PATH - 1); InsertMenu(hMenu, indexMenu++, diff --git a/src/Makefile b/src/Makefile --- a/src/Makefile +++ b/src/Makefile @@ -1202,7 +1202,7 @@ CARBONGUI_TESTARG = VIMPROG=../$(CARBONG # All GUI files ALL_GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_motif.c gui_athena.c gui_gtk_x11.c gui_x11.c gui_at_sb.c gui_at_fs.c pty.c gui_kde.cc gui_kde_wid.cc gui_kde_x11.cc gui_kde_wid_moc.cc -ALL_GUI_PRO = gui.pro gui_gtk.pro gui_motif.pro gui_athena.pro gui_gtk_x11.pro gui_x11.pro gui_w16.pro gui_w32.pro gui_amiga.pro gui_photon.pro gui_kde.pro gui_kde_x11.pro +ALL_GUI_PRO = gui.pro gui_gtk.pro gui_motif.pro gui_athena.pro gui_gtk_x11.pro gui_x11.pro gui_w16.pro gui_w32.pro gui_amiga.pro gui_photon.pro # }}} diff --git a/src/digraph.c b/src/digraph.c --- a/src/digraph.c +++ b/src/digraph.c @@ -1428,6 +1428,7 @@ digr_T digraphdefault[] = {'L', 'i', 0x20a4}, {'P', 't', 0x20a7}, {'W', '=', 0x20a9}, + {'=', 'e', 0x20ac}, /* euro */ {'o', 'C', 0x2103}, {'c', 'o', 0x2105}, {'o', 'F', 0x2109}, diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -8526,46 +8526,46 @@ set_cmdarg(eap, oldarg) unsigned len; oldval = vimvars[VV_CMDARG].val; - if (eap != NULL) - { - if (eap->force_bin == FORCE_BIN) - len = 6; - else if (eap->force_bin == FORCE_NOBIN) - len = 8; - else - len = 0; - if (eap->force_ff != 0) - len += (unsigned)STRLEN(eap->cmd + eap->force_ff) + 6; + if (eap == NULL) + { + vim_free(oldval); + vimvars[VV_CMDARG].val = oldarg; + return NULL; + } + + if (eap->force_bin == FORCE_BIN) + len = 6; + else if (eap->force_bin == FORCE_NOBIN) + len = 8; + else + len = 0; + if (eap->force_ff != 0) + len += (unsigned)STRLEN(eap->cmd + eap->force_ff) + 6; # ifdef FEAT_MBYTE - if (eap->force_enc != 0) - len += (unsigned)STRLEN(eap->cmd + eap->force_enc) + 7; + if (eap->force_enc != 0) + len += (unsigned)STRLEN(eap->cmd + eap->force_enc) + 7; # endif - newval = alloc(len + 1); - if (newval == NULL) - return NULL; - - if (eap->force_bin == FORCE_BIN) - sprintf((char *)newval, " ++bin"); - else if (eap->force_bin == FORCE_NOBIN) - sprintf((char *)newval, " ++nobin"); - else - *newval = NUL; - if (eap->force_ff != 0) - sprintf((char *)newval + STRLEN(newval), " ++ff=%s", - eap->cmd + eap->force_ff); + newval = alloc(len + 1); + if (newval == NULL) + return NULL; + + if (eap->force_bin == FORCE_BIN) + sprintf((char *)newval, " ++bin"); + else if (eap->force_bin == FORCE_NOBIN) + sprintf((char *)newval, " ++nobin"); + else + *newval = NUL; + if (eap->force_ff != 0) + sprintf((char *)newval + STRLEN(newval), " ++ff=%s", + eap->cmd + eap->force_ff); # ifdef FEAT_MBYTE - if (eap->force_enc != 0) - sprintf((char *)newval + STRLEN(newval), " ++enc=%s", - eap->cmd + eap->force_enc); + if (eap->force_enc != 0) + sprintf((char *)newval + STRLEN(newval), " ++enc=%s", + eap->cmd + eap->force_enc); # endif - vimvars[VV_CMDARG].val = newval; - return oldval; - } - - vim_free(oldval); - vimvars[VV_CMDARG].val = oldarg; - return NULL; + vimvars[VV_CMDARG].val = newval; + return oldval; } #endif diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -4066,7 +4066,7 @@ restore_backup: { #ifdef FEAT_MBYTE if (write_info.bw_conv_error) - errmsg = (char_u *)_("E513: write error, conversion failed"); + errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)"); else #endif if (got_int) diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -677,6 +677,7 @@ EXTERN int enc_utf8 INIT(= FALSE); /* U /* Codepage nr of 'encoding'. Negative means it's not been set yet, zero * means 'encoding' is not a valid codepage. */ EXTERN int enc_codepage INIT(= -1); +EXTERN int enc_latin9 INIT(= FALSE); /* 'encoding' is latin9 */ # endif EXTERN int has_mbyte INIT(= 0); /* any multi-byte encoding */ diff --git a/src/gui_gtk.c b/src/gui_gtk.c --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -749,6 +749,10 @@ gui_mch_add_menu_item(vimmenu_T *menu, i text = CONVERT_TO_UTF8(menu->dname); tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]); + if (tooltip != NULL && !utf_valid_string(tooltip, NULL)) + /* Invalid text, can happen when 'encoding' is changed. Avoid + * a nasty GTK error message, skip the tooltip. */ + CONVERT_TO_UTF8_FREE(tooltip); menu->id = gtk_toolbar_insert_item( toolbar, @@ -993,6 +997,8 @@ gui_mch_menu_set_tip(vimmenu_T *menu) # ifdef HAVE_GTK2 tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]); + if (tooltip == NULL || utf_valid_string(tooltip, NULL)) + /* Only set the tooltip when it's valid utf-8. */ # else tooltip = menu->strings[MENU_INDEX_TIP]; # endif diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -5239,6 +5239,14 @@ not_ascii: int last_glyph_rbearing; int cells = 0; /* cells occupied by current cluster */ + /* Safety check: pango crashes when invoked with invalid utf-8 + * characters. */ + if (!utf_valid_string(s, s + len)) + { + column_offset = len; + goto skipitall; + } + /* original width of the current cluster */ cluster_width = PANGO_SCALE * gui.char_width; @@ -5372,6 +5380,7 @@ not_ascii: pango_attr_list_unref(attr_list); } +skipitall: if (flags & DRAW_UNDERL) gdk_draw_line(gui.drawarea->window, gui.text_gc, diff --git a/src/gui_mac.c b/src/gui_mac.c --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -2200,6 +2200,7 @@ gui_mac_doKeyEvent(EventRecord *theEvent KeySym key_sym; int key_char; int modifiers; + int simplify = FALSE; /* Mask the mouse (as per user setting) */ if (p_mh) @@ -2253,7 +2254,7 @@ gui_mac_doKeyEvent(EventRecord *theEvent /* Handle special keys. */ #if 0 - /* Why have this been removed? */ + /* Why has this been removed? */ if (!(theEvent->modifiers & (cmdKey | controlKey | rightControlKey))) #endif { @@ -2270,11 +2271,14 @@ gui_mac_doKeyEvent(EventRecord *theEvent # endif key_char = TO_SPECIAL(special_keys[i].vim_code0, special_keys[i].vim_code1); - key_char = simplify_key(key_char,&modifiers); + simplify = TRUE; break; } } + /* For some keys the modifier is included in the char itself. */ + if (simplify || key_char == TAB || key_char == ' ') + key_char = simplify_key(key_char, &modifiers); /* Add the modifier to the input bu if needed */ /* Do not want SHIFT-A or CTRL-A with modifier */ diff --git a/src/gui_w32.c b/src/gui_w32.c --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -1709,6 +1709,33 @@ im_get_status() } #endif +#ifdef FEAT_MBYTE +/* + * Convert latin9 text to ucs-2. + */ + static void +latin9_to_ucs(char_u *text, int len, WCHAR *unicodebuf) +{ + int c; + + while (len-- >= 0) + { + c = *text++; + switch (c) + { + case 0xa4: c = 0x20ac; break; /* euro */ + case 0xa6: c = 0x0160; break; /* S hat */ + case 0xa8: c = 0x0161; break; /* S -hat */ + case 0xb4: c = 0x017d; break; /* Z hat */ + case 0xb8: c = 0x017e; break; /* Z -hat */ + case 0xbc: c = 0x0152; break; /* OE */ + case 0xbd: c = 0x0153; break; /* oe */ + case 0xbe: c = 0x0178; break; /* Y */ + } + *unicodebuf++ = c; + } +} +#endif #ifdef FEAT_RIGHTLEFT /* @@ -1907,7 +1934,9 @@ gui_mch_draw_string( /* Check if the Unicode buffer exists and is big enough. Create it * with the same lengt as the multi-byte string, the number of wide * characters is always equal or smaller. */ - if ((enc_utf8 || (enc_codepage > 0 && (int)GetACP() != enc_codepage)) + if ((enc_utf8 + || (enc_codepage > 0 && (int)GetACP() != enc_codepage) + || enc_latin9) && (unicodebuf == NULL || len > unibuflen)) { vim_free(unicodebuf); @@ -1950,13 +1979,16 @@ gui_mch_draw_string( foptions, pcliprect, unicodebuf, clen, unicodepdy); len = cells; /* used for underlining */ } - else if (enc_codepage > 0 && (int)GetACP() != enc_codepage) + else if ((enc_codepage > 0 && (int)GetACP() != enc_codepage) || enc_latin9) { /* If we want to display codepage data, and the current CP is not the * ANSI one, we need to go via Unicode. */ if (unicodebuf != NULL) { - len = MultiByteToWideChar(enc_codepage, + if (enc_latin9) + latin9_to_ucs(text, len, unicodebuf); + else + len = MultiByteToWideChar(enc_codepage, MB_PRECOMPOSED, (char *)text, len, (LPWSTR)unicodebuf, unibuflen); diff --git a/src/gui_w48.c b/src/gui_w48.c --- a/src/gui_w48.c +++ b/src/gui_w48.c @@ -3277,6 +3277,7 @@ gui_mch_browse( return 0; } + /* * Get command line arguments. * Use "prog" as the name of the program and "cmdline" as the arguments. @@ -3299,6 +3300,14 @@ get_cmd_args(char *prog, char *cmdline, char **argv = NULL; int round; +#ifdef FEAT_MBYTE + /* Try using the Unicode version first, it takes care of conversion when + * 'encoding' is changed. */ + argc = get_cmd_argsW(&argv); + if (argc != 0) + goto done; +#endif + /* Handle the program name. Remove the ".exe" extension, and find the 1st * non-space. */ p = strrchr(prog, '.'); @@ -3405,8 +3414,9 @@ get_cmd_args(char *prog, char *cmdline, } } +done: + argv[argc] = NULL; /* NULL-terminated list */ - *argvp = argv; return argc; } diff --git a/src/mbyte.c b/src/mbyte.c --- a/src/mbyte.c +++ b/src/mbyte.c @@ -216,7 +216,7 @@ enc_canon_table[] = #define IDX_ISO_14 13 {"iso-8859-14", ENC_8BIT, 0}, #define IDX_ISO_15 14 - {"iso-8859-15", ENC_8BIT, 0}, + {"iso-8859-15", ENC_8BIT + ENC_LATIN9, 0}, #define IDX_KOI8_R 15 {"koi8-r", ENC_8BIT, 0}, #define IDX_KOI8_U 16 @@ -534,6 +534,7 @@ codepage_invalid: #ifdef WIN3264 enc_codepage = encname2codepage(p_enc); + enc_latin9 = (STRCMP(p_enc, "iso-8859-15") == 0); #endif /* @@ -2486,6 +2487,36 @@ mb_tail_off(base, p) return 1 - dbcs_head_off(base, p); } +#if defined(HAVE_GTK2) || defined(PROTO) +/* + * Return TRUE if string "s" is a valid utf-8 string. + * When "end" is NULL stop at the first NUL. + * When "end" is positive stop there. + */ + int +utf_valid_string(s, end) + char_u *s; + char_u *end; +{ + int l; + char_u *p = s; + + while (end == NULL ? *p != NUL : p < end) + { + if ((*p & 0xc0) == 0x80) + return FALSE; /* invalid lead byte */ + l = utf8len_tab[*p]; + if (end != NULL && p + l > end) + return FALSE; /* incomplete byte sequence */ + ++p; + while (--l > 0) + if ((*p++ & 0xc0) != 0x80) + return FALSE; /* invalid trail byte */ + } + return TRUE; +} +#endif + #if defined(FEAT_GUI) || defined(PROTO) /* * Special version of mb_tail_off() for use in ScreenLines[]. @@ -5453,11 +5484,22 @@ convert_setup(vcp, from, to) vcp->vc_type = CONV_TO_UTF8; vcp->vc_factor = 2; /* up to twice as long */ } + else if ((from_prop & ENC_LATIN9) && (to_prop & ENC_UNICODE)) + { + /* Internal latin9 -> utf-8 conversion. */ + vcp->vc_type = CONV_9_TO_UTF8; + vcp->vc_factor = 3; /* up to three as long (euro sign) */ + } else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN1)) { /* Internal utf-8 -> latin1 conversion. */ vcp->vc_type = CONV_TO_LATIN1; } + else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN9)) + { + /* Internal utf-8 -> latin9 conversion. */ + vcp->vc_type = CONV_TO_LATIN9; + } #ifdef WIN3264 /* Win32-specific codepage <-> codepage conversion without iconv. */ else if (((from_prop & ENC_UNICODE) || encname2codepage(from) > 0) @@ -5622,12 +5664,13 @@ string_convert_ext(vcp, ptr, lenp, uncon d = retval; for (i = 0; i < len; ++i) { - if (ptr[i] < 0x80) - *d++ = ptr[i]; + c = ptr[i]; + if (c < 0x80) + *d++ = c; else { - *d++ = 0xc0 + ((unsigned)ptr[i] >> 6); - *d++ = 0x80 + (ptr[i] & 0x3f); + *d++ = 0xc0 + ((unsigned)c >> 6); + *d++ = 0x80 + (c & 0x3f); } } *d = NUL; @@ -5635,7 +5678,34 @@ string_convert_ext(vcp, ptr, lenp, uncon *lenp = (int)(d - retval); break; + case CONV_9_TO_UTF8: /* latin9 to utf-8 conversion */ + retval = alloc(len * 3 + 1); + if (retval == NULL) + break; + d = retval; + for (i = 0; i < len; ++i) + { + c = ptr[i]; + switch (c) + { + case 0xa4: c = 0x20ac; break; /* euro */ + case 0xa6: c = 0x0160; break; /* S hat */ + case 0xa8: c = 0x0161; break; /* S -hat */ + case 0xb4: c = 0x017d; break; /* Z hat */ + case 0xb8: c = 0x017e; break; /* Z -hat */ + case 0xbc: c = 0x0152; break; /* OE */ + case 0xbd: c = 0x0153; break; /* oe */ + case 0xbe: c = 0x0178; break; /* Y */ + } + d += utf_char2bytes(c, d); + } + *d = NUL; + if (lenp != NULL) + *lenp = (int)(d - retval); + break; + case CONV_TO_LATIN1: /* utf-8 to latin1 conversion */ + case CONV_TO_LATIN9: /* utf-8 to latin9 conversion */ retval = alloc(len + 1); if (retval == NULL) break; @@ -5658,6 +5728,26 @@ string_convert_ext(vcp, ptr, lenp, uncon else { c = utf_ptr2char(ptr + i); + if (vcp->vc_type == CONV_TO_LATIN9) + switch (c) + { + case 0x20ac: c = 0xa4; break; /* euro */ + case 0x0160: c = 0xa6; break; /* S hat */ + case 0x0161: c = 0xa8; break; /* S -hat */ + case 0x017d: c = 0xb4; break; /* Z hat */ + case 0x017e: c = 0xb8; break; /* Z -hat */ + case 0x0152: c = 0xbc; break; /* OE */ + case 0x0153: c = 0xbd; break; /* oe */ + case 0x0178: c = 0xbe; break; /* Y */ + case 0xa4: + case 0xa6: + case 0xa8: + case 0xb4: + case 0xb8: + case 0xbc: + case 0xbd: + case 0xbe: c = 0x100; break; /* not in latin9 */ + } if (!utf_iscomposing(c)) /* skip composing chars */ { if (c < 0x100) diff --git a/src/menu.c b/src/menu.c --- a/src/menu.c +++ b/src/menu.c @@ -392,6 +392,8 @@ ex_menu(eap) map_to = (char_u *)""; map_buf = NULL; } + else if (modes & MENU_TIP_MODE) + map_buf = NULL; /* Menu tips are plain text. */ else map_to = replace_termcodes(map_to, &map_buf, FALSE, TRUE); menuarg.modes = modes; diff --git a/src/os_mswin.c b/src/os_mswin.c --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -267,6 +267,10 @@ mch_early_init(void) AnsiUpperBuff(toupper_tab, 256); AnsiLowerBuff(tolower_tab, 256); #endif + +#if defined(FEAT_MBYTE) && !defined(FEAT_GUI) + (void)get_cmd_argsW(NULL); +#endif } @@ -298,7 +302,25 @@ mch_settitle( gui_mch_settitle(title, icon); # else if (title != NULL) + { +# ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + /* Convert the title from 'encoding' to the active codepage. */ + WCHAR *wp = enc_to_ucs2(title, NULL); + int n; + + if (wp != NULL) + { + n = SetConsoleTitleW(wp); + vim_free(wp); + if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return; + } + } +# endif SetConsoleTitle(title); + } # endif } diff --git a/src/os_w32exe.c b/src/os_w32exe.c --- a/src/os_w32exe.c +++ b/src/os_w32exe.c @@ -30,24 +30,6 @@ VimMain __ARGS((int argc, char **argv)); int (_cdecl *pmain)(int, char **); -#ifdef FEAT_MBYTE -/* The commandline arguments in UCS2. */ -static DWORD nArgsW = 0; -static LPWSTR *ArglistW = NULL; -static int global_argc; -static char **global_argv; - -static int used_file_argc = 0; /* last argument in global_argv[] used - for the argument list. */ -static int *used_file_indexes = NULL; /* indexes in global_argv[] for - command line arguments added to - the argument list */ -static int used_file_count = 0; /* nr of entries in used_file_indexes */ -static int used_file_literal = FALSE; /* take file names literally */ -static int used_file_full_path = FALSE; /* file name was full path */ -static int used_alist_count = 0; -#endif - #ifndef PROTO #ifdef FEAT_GUI #ifndef VIMDLL @@ -76,56 +58,14 @@ WinMain( * startup path (so the .vimrc file can be found w/o a VIM env. var.) */ GetModuleFileName(NULL, prog, 255); - /* Separate the command line into arguments. Use the Unicode functions - * when possible. When 'encoding' is later changed these are used to - * recode the arguments. */ -#ifdef FEAT_MBYTE - ArglistW = CommandLineToArgvW(GetCommandLineW(), &nArgsW); - if (ArglistW != NULL) + argc = get_cmd_args(prog, (char *)lpszCmdLine, &argv, &tofree); + if (argc == 0) { - argv = malloc((nArgsW + 1) * sizeof(char *)); - if (argv != NULL) - { - int i; - - argv[argc] = NULL; - argc = nArgsW; - for (i = 0; i < argc; ++i) - { - int len; - - WideCharToMultiByte_alloc(GetACP(), 0, - ArglistW[i], wcslen(ArglistW[i]) + 1, - (LPSTR *)&argv[i], &len, 0, 0); - if (argv[i] == NULL) - { - while (i > 0) - free(argv[--i]); - free(argv); - argc = 0; - } - } - } + MessageBox(0, "Could not allocate memory for command line.", + "VIM Error", 0); + return 0; } - if (argc == 0) -#endif - { - argc = get_cmd_args(prog, (char *)lpszCmdLine, &argv, &tofree); - if (argc == 0) - { - MessageBox(0, "Could not allocate memory for command line.", - "VIM Error", 0); - return 0; - } - } - -#ifdef FEAT_MBYTE - global_argc = argc; - global_argv = argv; - used_file_indexes = malloc(argc * sizeof(int)); -#endif - #ifdef DYNAMIC_GETTEXT /* Initialize gettext library */ dyn_libintl_init(NULL); @@ -190,108 +130,9 @@ errout: free(argv); free(tofree); #ifdef FEAT_MBYTE - if (ArglistW != NULL) - GlobalFree(ArglistW); + free_cmd_argsW(); #endif return 0; } #endif - -#ifdef FEAT_MBYTE -/* - * Remember "name" is an argument that was added to the argument list. - * This avoids that we have to re-parse the argument list when fix_arg_enc() - * is called. - */ - void -used_file_arg(name, literal, full_path) - char *name; - int literal; - int full_path; -{ - int i; - - if (used_file_indexes == NULL) - return; - for (i = used_file_argc + 1; i < global_argc; ++i) - if (STRCMP(global_argv[i], name) == 0) - { - used_file_argc = i; - used_file_indexes[used_file_count++] = i; - break; - } - used_file_literal = literal; - used_file_full_path = full_path; -} - -/* - * Remember the length of the argument list as it was. If it changes then we - * leave it alone when 'encoding' is set. - */ - void -set_alist_count(void) -{ - used_alist_count = GARGCOUNT; -} - -/* - * Fix the encoding of the command line arguments. Invoked when 'encoding' - * has been changed while starting up. Use the UCS-2 command line arguments - * and convert them to 'encoding'. - */ - void -fix_arg_enc() -{ - int i; - int idx; - char_u *str; - - /* Safety checks: - * - if argument count differs between the wide and non-wide argument - * list, something must be wrong. - * - the file name arguments must have been located. - * - the length of the argument list wasn't changed by the user. - */ - if (global_argc != (int)nArgsW - || ArglistW == NULL - || used_file_indexes == NULL - || used_file_count == 0 - || used_alist_count != GARGCOUNT) - return; - - /* Clear the argument list. Make room for the new arguments. */ - alist_clear(&global_alist); - if (ga_grow(&global_alist.al_ga, used_file_count) == FAIL) - return; /* out of memory */ - - for (i = 0; i < used_file_count; ++i) - { - idx = used_file_indexes[i]; - str = ucs2_to_enc(ArglistW[idx], NULL); - if (str != NULL) - alist_add(&global_alist, str, used_file_literal ? 2 : 0); - } - - if (!used_file_literal) - { - /* Now expand wildcards in the arguments. */ - /* Temporarily add '(' and ')' to 'isfname'. These are valid - * filename characters but are excluded from 'isfname' to make - * "gf" work on a file name in parenthesis (e.g.: see vim.h). */ - do_cmdline_cmd((char_u *)":let SaVe_ISF = &isf|set isf+=(,)"); - alist_expand(); - do_cmdline_cmd((char_u *)":let &isf = SaVe_ISF|unlet SaVe_ISF"); - } - - /* If wildcard expansion failed, we are editing the first file of the - * arglist and there is no file name: Edit the first argument now. */ - if (curwin->w_arg_idx == 0 && curbuf->b_fname == NULL) - { - do_cmdline_cmd((char_u *)":rewind"); - if (GARGCOUNT == 1 && used_file_full_path) - (void)vim_chdirfile(alist_name(&GARGLIST[0])); - } -} -#endif - diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -92,6 +92,7 @@ FILE* fdDump = NULL; #define WINAPI #define WINBASEAPI typedef char * LPCSTR; +typedef char * LPWSTR; typedef int ACCESS_MASK; typedef int BOOL; typedef int COLORREF; @@ -301,19 +302,19 @@ dyn_libintl_end() } static char * -null_libintl_gettext(const char* msgid) +null_libintl_gettext(const char *msgid) { return (char*)msgid; } static char * -null_libintl_bindtextdomain(const char* domainname, const char* dirname) +null_libintl_bindtextdomain(const char *domainname, const char *dirname) { return NULL; } static char * -null_libintl_textdomain(const char* domainname) +null_libintl_textdomain(const char *domainname) { return NULL; } @@ -530,7 +531,7 @@ const static struct __stdcall #endif win32_kbd_patch_key( - KEY_EVENT_RECORD* pker) + KEY_EVENT_RECORD *pker) { UINT uMods = pker->dwControlKeyState; static int s_iIsDead = 0; @@ -734,8 +735,7 @@ decode_key_event( */ # ifdef FEAT_GUI_W32 void -mch_setmouse( - int on) +mch_setmouse(int on) { } # else @@ -749,8 +749,7 @@ static int g_yMouse; /* mouse y coo * Enable or disable mouse input */ void -mch_setmouse( - int on) +mch_setmouse(int on) { DWORD cmodein; @@ -798,7 +797,7 @@ mch_setmouse( */ static BOOL decode_mouse_event( - MOUSE_EVENT_RECORD* pmer) + MOUSE_EVENT_RECORD *pmer) { static int s_nOldButton = -1; static int s_nOldMouseClick = -1; @@ -1214,7 +1213,7 @@ WaitForChar(long msec) * return non-zero if a character is available */ int -mch_char_avail() +mch_char_avail(void) { return WaitForChar(0L); } @@ -1579,7 +1578,7 @@ executable_exists(char *name) * GUI version of mch_init(). */ void -mch_init() +mch_init(void) { #ifndef __MINGW32__ extern int _fmode; @@ -1746,10 +1745,10 @@ FitConsoleWindow( typedef struct ConsoleBufferStruct { - BOOL IsValid; - CONSOLE_SCREEN_BUFFER_INFO Info; - PCHAR_INFO Buffer; - COORD BufferSize; + BOOL IsValid; + CONSOLE_SCREEN_BUFFER_INFO Info; + PCHAR_INFO Buffer; + COORD BufferSize; } ConsoleBuffer; /* @@ -1853,8 +1852,8 @@ SaveConsoleBuffer( */ static BOOL RestoreConsoleBuffer( - ConsoleBuffer *cb, - BOOL RestoreScreen) + ConsoleBuffer *cb, + BOOL RestoreScreen) { COORD BufferCoord; SMALL_RECT WriteRegion; @@ -1949,23 +1948,19 @@ static BOOL g_fCanChangeIcon = FALSE; */ static BOOL GetConsoleIcon( - HWND hWnd, - HICON *phIconSmall, - HICON *phIcon) + HWND hWnd, + HICON *phIconSmall, + HICON *phIcon) { if (hWnd == NULL) return FALSE; if (phIconSmall != NULL) - { - *phIconSmall = (HICON) SendMessage(hWnd, WM_GETICON, - (WPARAM) ICON_SMALL, (LPARAM) 0); - } + *phIconSmall = (HICON)SendMessage(hWnd, WM_GETICON, + (WPARAM)ICON_SMALL, (LPARAM)0); if (phIcon != NULL) - { - *phIcon = (HICON) SendMessage(hWnd, WM_GETICON, - (WPARAM) ICON_BIG, (LPARAM) 0); - } + *phIcon = (HICON)SendMessage(hWnd, WM_GETICON, + (WPARAM)ICON_BIG, (LPARAM)0); return TRUE; } @@ -1979,26 +1974,22 @@ GetConsoleIcon( */ static BOOL SetConsoleIcon( - HWND hWnd, - HICON hIconSmall, - HICON hIcon) + HWND hWnd, + HICON hIconSmall, + HICON hIcon) { - HICON hPrevIconSmall; - HICON hPrevIcon; + HICON hPrevIconSmall; + HICON hPrevIcon; if (hWnd == NULL) return FALSE; if (hIconSmall != NULL) - { - hPrevIconSmall = (HICON) SendMessage(hWnd, WM_SETICON, - (WPARAM) ICON_SMALL, (LPARAM) hIconSmall); - } + hPrevIconSmall = (HICON)SendMessage(hWnd, WM_SETICON, + (WPARAM)ICON_SMALL, (LPARAM)hIconSmall); if (hIcon != NULL) - { - hPrevIcon = (HICON) SendMessage(hWnd, WM_SETICON, - (WPARAM) ICON_BIG, (LPARAM) hIcon); - } + hPrevIcon = (HICON)SendMessage(hWnd, WM_SETICON, + (WPARAM)ICON_BIG,(LPARAM) hIcon); return TRUE; } @@ -2059,7 +2050,7 @@ static DWORD g_cmodeout = 0; * non-GUI version of mch_init(). */ void -mch_init() +mch_init(void) { #ifndef FEAT_RESTORE_ORIG_SCREEN CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -2341,8 +2332,8 @@ fname_case( */ int mch_get_user_name( - char_u *s, - int len) + char_u *s, + int len) { char szUserName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD cch = sizeof szUserName; @@ -2379,7 +2370,7 @@ mch_get_host_name( * return process ID */ long -mch_get_pid() +mch_get_pid(void) { return (long)GetCurrentProcessId(); } @@ -2429,8 +2420,7 @@ mch_dirname( * else FILE_ATTRIBUTE_* defined in winnt.h */ long -mch_getperm( - char_u *name) +mch_getperm(char_u *name) { #ifdef FEAT_MBYTE if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) @@ -2457,8 +2447,8 @@ mch_getperm( */ int mch_setperm( - char_u *name, - long perm) + char_u *name, + long perm) { perm |= FILE_ATTRIBUTE_ARCHIVE; /* file has changed, set archive bit */ #ifdef FEAT_MBYTE @@ -2656,8 +2646,7 @@ struct my_acl * Return NULL if the ACL is not available for whatever reason. */ vim_acl_T -mch_get_acl(fname) - char_u *fname; +mch_get_acl(char_u *fname) { #ifndef HAVE_ACL return (vim_acl_T)NULL; @@ -2701,9 +2690,7 @@ mch_get_acl(fname) * This must only be called with "acl" equal to what mch_get_acl() returned. */ void -mch_set_acl(fname, acl) - char_u *fname; - vim_acl_T acl; +mch_set_acl(char_u *fname, vim_acl_T acl) { #ifdef HAVE_ACL struct my_acl *p = (struct my_acl *)acl; @@ -2726,8 +2713,7 @@ mch_set_acl(fname, acl) } void -mch_free_acl(acl) - vim_acl_T acl; +mch_free_acl(vim_acl_T acl) { #ifdef HAVE_ACL struct my_acl *p = (struct my_acl *)acl; @@ -2791,8 +2777,7 @@ handler_routine( * set the tty in (raw) ? "raw" : "cooked" mode */ void -mch_settmode( - int tmode) +mch_settmode(int tmode) { DWORD cmodein; DWORD cmodeout; @@ -2840,7 +2825,7 @@ mch_settmode( * Return OK when size could be determined, FAIL otherwise. */ int -mch_get_shellsize() +mch_get_shellsize(void) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -2873,9 +2858,9 @@ mch_get_shellsize() */ static void ResizeConBufAndWindow( - HANDLE hConsole, - int xSize, - int ySize) + HANDLE hConsole, + int xSize, + int ySize) { CONSOLE_SCREEN_BUFFER_INFO csbi; /* hold current console buffer info */ SMALL_RECT srWindowRect; /* hold the new console size */ @@ -2955,7 +2940,7 @@ ResizeConBufAndWindow( * Set the console window to `Rows' * `Columns' */ void -mch_set_shellsize() +mch_set_shellsize(void) { COORD coordScreen; @@ -2984,7 +2969,7 @@ mch_set_shellsize() * Rows and/or Columns has changed. */ void -mch_new_shellsize() +mch_new_shellsize(void) { set_scroll_region(0, 0, Columns - 1, Rows - 1); } @@ -2994,7 +2979,7 @@ mch_new_shellsize() * Called when started up, to set the winsize that was delayed. */ void -mch_set_winsize_now() +mch_set_winsize_now(void) { if (suppress_winsize == 2) { @@ -3134,8 +3119,8 @@ mch_system(char *cmd, int options) */ int mch_call_shell( - char_u *cmd, - int options) /* SHELL_*, see vim.h */ + char_u *cmd, + int options) /* SHELL_*, see vim.h */ { int x = 0; int tmode = cur_tmode; @@ -3510,8 +3495,7 @@ clear_to_end_of_line(void) * Scroll the scroll region up by `cLines' lines */ static void -scroll( - unsigned cLines) +scroll(unsigned cLines) { COORD oldcoord = g_coord; @@ -3549,8 +3533,7 @@ set_scroll_region( * Insert `cLines' lines at the current cursor position */ static void -insert_lines( - unsigned cLines) +insert_lines(unsigned cLines) { SMALL_RECT source; COORD dest; @@ -3591,8 +3574,7 @@ insert_lines( * Delete `cLines' lines at the current cursor position */ static void -delete_lines( - unsigned cLines) +delete_lines(unsigned cLines) { SMALL_RECT source; COORD dest; @@ -3655,8 +3637,7 @@ gotoxy( * See ../doc/os_win32.txt for the numbers. */ static void -textattr( - WORD wAttr) +textattr(WORD wAttr) { g_attrCurrent = wAttr; @@ -3665,8 +3646,7 @@ textattr( static void -textcolor( - WORD wAttr) +textcolor(WORD wAttr) { g_attrCurrent = (g_attrCurrent & 0xf0) + wAttr; @@ -3675,8 +3655,7 @@ textcolor( static void -textbackground( - WORD wAttr) +textbackground(WORD wAttr) { g_attrCurrent = (g_attrCurrent & 0x0f) + (wAttr << 4); @@ -3688,7 +3667,7 @@ textbackground( * restore the default text attribute (whatever we started with) */ static void -normvideo() +normvideo(void) { textattr(g_attrDefault); } @@ -3711,7 +3690,7 @@ standout(void) * Turn off standout mode */ static void -standend() +standend(void) { if (g_attrPreStandout) { @@ -3725,7 +3704,7 @@ standend() * Set normal fg/bg color, based on T_ME. Called whem t_me has been set. */ void -mch_set_normal_colors() +mch_set_normal_colors(void) { char_u *p; int n; @@ -3749,7 +3728,7 @@ mch_set_normal_colors() * visual bell: flash the screen */ static void -visual_bell() +visual_bell(void) { COORD coordOrigin = {0, 0}; WORD attrFlash = ~g_attrCurrent & 0xff; @@ -3775,8 +3754,7 @@ visual_bell() * Make the cursor visible or invisible */ static void -cursor_visible( - BOOL fVisible) +cursor_visible(BOOL fVisible) { s_cursor_visible = fVisible; #ifdef MCH_CURSOR_SHAPE @@ -4178,7 +4156,7 @@ mch_remove(char_u *name) * check for an "interrupt signal": CTRL-break or CTRL-C */ void -mch_breakcheck() +mch_breakcheck(void) { #ifndef FEAT_GUI_W32 /* never used */ if (g_fCtrlCPressed || g_fCBrkPressed) @@ -4195,8 +4173,7 @@ mch_breakcheck() * Return sum of available physical and page file memory. */ long_u -mch_avail_mem( - int special) +mch_avail_mem(int special) { MEMORYSTATUS ms; @@ -4382,7 +4359,7 @@ mch_rename( * Get the default shell for the current hardware platform */ char * -default_shell() +default_shell(void) { char* psz = NULL; @@ -4867,5 +4844,177 @@ myresetstkoflw(void) return 1; } - #endif + + +#if defined(FEAT_MBYTE) || defined(PROTO) +/* + * The command line arguments in UCS2 + */ +static DWORD nArgsW = 0; +static LPWSTR *ArglistW = NULL; +static int global_argc = 0; +static char **global_argv; + +static int used_file_argc = 0; /* last argument in global_argv[] used + for the argument list. */ +static int *used_file_indexes = NULL; /* indexes in global_argv[] for + command line arguments added to + the argument list */ +static int used_file_count = 0; /* nr of entries in used_file_indexes */ +static int used_file_literal = FALSE; /* take file names literally */ +static int used_file_full_path = FALSE; /* file name was full path */ +static int used_alist_count = 0; + + +/* + * Get the command line arguments. Unicode version. + * Returns argc. Zero when something fails. + */ + int +get_cmd_argsW(char ***argvp) +{ + char **argv = NULL; + int argc = 0; + int i; + + ArglistW = CommandLineToArgvW(GetCommandLineW(), &nArgsW); + if (ArglistW != NULL) + { + argv = malloc((nArgsW + 1) * sizeof(char *)); + if (argv != NULL) + { + argc = nArgsW; + argv[argc] = NULL; + for (i = 0; i < argc; ++i) + { + int len; + + /* Convert each Unicode argument to the current codepage. */ + WideCharToMultiByte_alloc(GetACP(), 0, + ArglistW[i], wcslen(ArglistW[i]) + 1, + (LPSTR *)&argv[i], &len, 0, 0); + if (argv[i] == NULL) + { + /* Out of memory, clear everything. */ + while (i > 0) + free(argv[--i]); + free(argv); + argc = 0; + } + } + } + } + + global_argc = argc; + global_argv = argv; + if (argc > 0) + used_file_indexes = malloc(argc * sizeof(int)); + + if (argvp != NULL) + *argvp = argv; + return argc; +} + + void +free_cmd_argsW(void) +{ + if (ArglistW != NULL) + { + GlobalFree(ArglistW); + ArglistW = NULL; + } +} + +/* + * Remember "name" is an argument that was added to the argument list. + * This avoids that we have to re-parse the argument list when fix_arg_enc() + * is called. + */ + void +used_file_arg(char *name, int literal, int full_path) +{ + int i; + + if (used_file_indexes == NULL) + return; + for (i = used_file_argc + 1; i < global_argc; ++i) + if (STRCMP(global_argv[i], name) == 0) + { + used_file_argc = i; + used_file_indexes[used_file_count++] = i; + break; + } + used_file_literal = literal; + used_file_full_path = full_path; +} + +/* + * Remember the length of the argument list as it was. If it changes then we + * leave it alone when 'encoding' is set. + */ + void +set_alist_count(void) +{ + used_alist_count = GARGCOUNT; +} + +/* + * Fix the encoding of the command line arguments. Invoked when 'encoding' + * has been changed while starting up. Use the UCS-2 command line arguments + * and convert them to 'encoding'. + */ + void +fix_arg_enc(void) +{ + int i; + int idx; + char_u *str; + + /* Safety checks: + * - if argument count differs between the wide and non-wide argument + * list, something must be wrong. + * - the file name arguments must have been located. + * - the length of the argument list wasn't changed by the user. + */ + if (global_argc != (int)nArgsW + || ArglistW == NULL + || used_file_indexes == NULL + || used_file_count == 0 + || used_alist_count != GARGCOUNT) + return; + + /* Clear the argument list. Make room for the new arguments. */ + alist_clear(&global_alist); + if (ga_grow(&global_alist.al_ga, used_file_count) == FAIL) + return; /* out of memory */ + + for (i = 0; i < used_file_count; ++i) + { + idx = used_file_indexes[i]; + str = ucs2_to_enc(ArglistW[idx], NULL); + if (str != NULL) + alist_add(&global_alist, str, used_file_literal ? 2 : 0); + } + + if (!used_file_literal) + { + /* Now expand wildcards in the arguments. */ + /* Temporarily add '(' and ')' to 'isfname'. These are valid + * filename characters but are excluded from 'isfname' to make + * "gf" work on a file name in parenthesis (e.g.: see vim.h). */ + do_cmdline_cmd((char_u *)":let SaVe_ISF = &isf|set isf+=(,)"); + alist_expand(); + do_cmdline_cmd((char_u *)":let &isf = SaVe_ISF|unlet SaVe_ISF"); + } + + /* If wildcard expansion failed, we are editing the first file of the + * arglist and there is no file name: Edit the first argument now. */ + if (curwin->w_arg_idx == 0 && curbuf->b_fname == NULL) + { + do_cmdline_cmd((char_u *)":rewind"); + if (GARGCOUNT == 1 && used_file_full_path) + (void)vim_chdirfile(alist_name(&GARGLIST[0])); + } +} +#endif diff --git a/src/proto/gui_kde.pro b/src/proto/gui_kde.pro --- a/src/proto/gui_kde.pro +++ b/src/proto/gui_kde.pro @@ -1,4 +1,4 @@ -/* gui_kde.c */ +/* gui_kde.cc */ void gui_mch_add_menu __ARGS((vimmenu_T *menu, int idx)); void gui_mch_add_menu_item __ARGS((vimmenu_T *menu, int idx)); void gui_mch_set_text_area_pos __ARGS((int x, int y, int w, int h)); @@ -16,4 +16,4 @@ void gui_mch_find_dialog __ARGS((exarg_T void gui_mch_replace_dialog __ARGS((exarg_T *eap)); void ex_helpfind __ARGS((exarg_T *eap)); void gui_make_popup __ARGS((char_u *path_name)); -/* vim: set ft=c : */ +/* vim: set ft=cpp : */ diff --git a/src/proto/gui_kde_x11.pro b/src/proto/gui_kde_x11.pro --- a/src/proto/gui_kde_x11.pro +++ b/src/proto/gui_kde_x11.pro @@ -1,4 +1,4 @@ -/* gui_kde_x11.c */ +/* gui_kde_x11.cc */ void gui_mch_prepare __ARGS((int *argc, char **argv)); void gui_mch_set_blinking __ARGS((long waittime, long on, long off)); void gui_mch_stop_blink __ARGS((void)); @@ -59,4 +59,4 @@ void mch_set_mouse_shape __ARGS((int sha char_u *gui_mch_font_dialog __ARGS((char_u *oldval)); void gui_mch_settitle __ARGS((char_u *title,char_u *icon)); void gui_mch_update_codec __ARGS((void)); -/* vim: set ft=c : */ +/* vim: set ft=cpp : */ diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro --- a/src/proto/mbyte.pro +++ b/src/proto/mbyte.pro @@ -47,6 +47,7 @@ int dbcs_screen_head_off __ARGS((char_u int utf_head_off __ARGS((char_u *base, char_u *p)); int mb_off_next __ARGS((char_u *base, char_u *p)); int mb_tail_off __ARGS((char_u *base, char_u *p)); +int utf_valid_string __ARGS((char_u *s, char_u *end)); int dbcs_screen_tail_off __ARGS((char_u *base, char_u *p)); void mb_adjust_cursor __ARGS((void)); void mb_adjustpos __ARGS((pos_T *lp)); diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -45,4 +45,9 @@ int mch_open __ARGS((char *name, int fla FILE *mch_fopen __ARGS((char *name, char *mode)); int mch_copy_file_attribute __ARGS((char_u *from, char_u *to)); int myresetstkoflw __ARGS((void)); +int get_cmd_argsW __ARGS((char ***argvp)); +void free_cmd_argsW __ARGS((void)); +void used_file_arg __ARGS((char *name, int literal, int full_path)); +void set_alist_count __ARGS((void)); +void fix_arg_enc __ARGS((void)); /* vim: set ft=c : */ diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro --- a/src/proto/syntax.pro +++ b/src/proto/syntax.pro @@ -13,7 +13,7 @@ char_u *get_syntax_name __ARGS((expand_T int syn_get_id __ARGS((long lnum, long col, int trans)); int syn_get_foldlevel __ARGS((win_T *wp, long lnum)); void init_highlight __ARGS((int both, int reset)); -int load_colors __ARGS((char_u *p)); +int load_colors __ARGS((char_u *name)); void do_highlight __ARGS((char_u *line, int forceit, int init)); void restore_cterm_colors __ARGS((void)); void set_normal_colors __ARGS((void)); diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -1124,6 +1124,7 @@ qf_jump(dir, errornr, forceit) # endif if (win_split(0, n) == FAIL) goto theend; + opened_window = TRUE; /* close it when fail */ if (curwin->w_height < p_hh) win_setheight((int)p_hh); @@ -1137,7 +1138,7 @@ qf_jump(dir, errornr, forceit) * If currently in the quickfix window, find another window to show the * file in. */ - if (bt_quickfix(curbuf)) + if (bt_quickfix(curbuf) && !opened_window) { /* * If there is no file specified, we don't know where to go. diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -6651,9 +6651,14 @@ screenalloc(clear) len = screen_Columns; else len = Columns; - mch_memmove(new_ScreenLines + new_LineOffset[new_row], - ScreenLines + LineOffset[old_row], - (size_t)len * sizeof(schar_T)); +#ifdef FEAT_MBYTE + /* When switching to utf-8 dont copy characters, they + * may be invalid now. */ + if (!(enc_utf8 && ScreenLinesUC == NULL)) +#endif + mch_memmove(new_ScreenLines + new_LineOffset[new_row], + ScreenLines + LineOffset[old_row], + (size_t)len * sizeof(schar_T)); #ifdef FEAT_MBYTE if (enc_utf8 && ScreenLinesUC != NULL) { diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -854,16 +854,18 @@ typedef struct #define CONV_NONE 0 #define CONV_TO_UTF8 1 -#define CONV_TO_LATIN1 2 -#define CONV_ICONV 3 +#define CONV_9_TO_UTF8 2 +#define CONV_TO_LATIN1 3 +#define CONV_TO_LATIN9 4 +#define CONV_ICONV 5 #ifdef WIN3264 -# define CONV_CODEPAGE 4 /* codepage -> codepage */ +# define CONV_CODEPAGE 10 /* codepage -> codepage */ #endif #ifdef MACOS_X -# define CONV_MAC_LATIN1 5 -# define CONV_LATIN1_MAC 6 -# define CONV_MAC_UTF8 7 -# define CONV_UTF8_MAC 8 +# define CONV_MAC_LATIN1 20 +# define CONV_LATIN1_MAC 21 +# define CONV_MAC_UTF8 22 +# define CONV_UTF8_MAC 23 #endif /* diff --git a/src/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -437,17 +437,21 @@ syntax_start(wp, lnum) linenr_T parsed_lnum; linenr_T first_stored; int dist; + static int changedtick = 0; /* remember the last change ID */ reg_syn = TRUE; /* let vim_regexec() know we're using syntax */ /* * After switching buffers, invalidate current_state. + * Also do this when a change was made, the current state may be invalid + * then. */ - if (syn_buf != wp->w_buffer) + if (syn_buf != wp->w_buffer || changedtick != syn_buf->b_changedtick) { invalidate_current_state(); syn_buf = wp->w_buffer; } + changedtick = syn_buf->b_changedtick; syn_win = wp; /* @@ -7392,7 +7396,7 @@ get_attr_entry(table, aep) return i + ATTR_OFF; } - if (table->ga_len + ATTR_OFF == 256) + if (table->ga_len + ATTR_OFF >= 256) { /* * Running out of attribute entries! remove all attributes, and diff --git a/src/testdir/test.ok b/src/testdir/test.ok deleted file mode 100644 --- a/src/testdir/test.ok +++ /dev/null @@ -1,92 +0,0 @@ -Results of test49.vim: -*** Test 1: OK (34695) -*** Test 2: OK (34695) -*** Test 3: OK (1384648195) -*** Test 4: OK (32883) -*** Test 5: OK (32883) -*** Test 6: OK (603978947) -*** Test 7: OK (90563) -*** Test 8: OK (562493431) -*** Test 9: OK (363) -*** Test 10: OK (559615) -*** Test 11: OK (2049) -*** Test 12: OK (352256) -*** Test 13: OK (145) -*** Test 14: OK (42413) -*** Test 15: OK (42413) -*** Test 16: OK (8722) -*** Test 17: OK (285127993) -*** Test 18: OK (67224583) -*** Test 19: OK (69275973) -*** Test 20: OK (1874575085) -*** Test 21: OK (147932225) -*** Test 22: OK (4161) -*** Test 23: OK (49) -*** Test 24: OK (41) -*** Test 25: OK (260177811) -*** Test 26: OK (1681500476) -*** Test 27: OK (1996459) -*** Test 28: OK (1996459) -*** Test 29: OK (170428555) -*** Test 30: OK (190905173) -*** Test 31: OK (190905173) -*** Test 32: OK (354833067) ---- Test 33: sum = 178275600 (ok) -*** Test 33: OK (1216907538) -*** Test 34: OK (2146584868) -*** Test 35: OK (2146584868) -*** Test 36: OK (1071644672) -*** Test 37: OK (1071644672) -*** Test 38: OK (357908480) -*** Test 39: OK (357908480) -*** Test 40: OK (357908480) -*** Test 41: OK (3076095) -*** Test 42: OK (1505155949) -*** Test 43: OK (1157763329) -*** Test 44: OK (1031761407) -*** Test 45: OK (1157763329) -*** Test 46: OK (739407) -*** Test 47: OK (371213935) -*** Test 48: OK (756255461) -*** Test 49: OK (179000669) -*** Test 50: OK (363550045) -*** Test 51: OK (40744667) -*** Test 52: OK (1247112011) -*** Test 53: OK (131071) -*** Test 54: OK (2047) -*** Test 55: OK (1023) -*** Test 56: OK (511) -*** Test 57: OK (2147450880) -*** Test 58: OK (624945) -*** Test 59: OK (2038431743) -*** Test 60: OK (311511339) -*** Test 61: OK (374889517) -*** Test 62: OK (286331153) -*** Test 63: OK (236978127) -*** Test 64: OK (1499645335) -*** Test 65: OK (70187) -*** Test 66: OK (5464) -*** Test 67: OK (212514423) -*** Test 68: OK (212514423) -*** Test 69: OK (8995471) -*** Test 70: OK (69544277) -*** Test 71: OK (34886997) -*** Test 72: OK (1789569365) -*** Test 73: OK (9032615) -*** Test 74: OK (224907669) -*** Test 75: OK (2000403408) -*** Test 76: OK (1610087935) -*** Test 77: OK (1388671) -*** Test 78: OK (134217728) -*** Test 79: OK (70288929) -*** Test 80: OK (17895765) -*** Test 81: OK (387) -*** Test 82: OK (8454401) -*** Test 83: OK (2835) -*** Test 84: OK (934782101) -*** Test 85: OK (198689) ---- Test 86: All tests were run with throwing exceptions on error. - The $VIMNOERRTHROW control is not configured. ---- Test 86: All tests were run with throwing exceptions on interrupt. - The $VIMNOINTTHROW control is not configured. -*** Test 86: OK (50443995) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -17,6 +17,7 @@ * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred) * It has been changed beyond recognition since then. * + * Differences between version 6.x and 7.x can be found with ":help version7". * Differences between version 5.x and 6.x can be found with ":help version6". * Differences between version 4.x and 5.x can be found with ":help version5". * Differences between version 3.0 and 4.x can be found with ":help version4". @@ -1028,7 +1029,7 @@ intro_message(colon) "", N_("type :q to exit "), N_("type :help or for on-line help"), - N_("type :help version6 for version info"), + N_("type :help version7 for version info"), NULL, "", N_("Running in Vi compatible mode"), diff --git a/src/version.h b/src/version.h --- 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 (2004 June 30)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2004 June 30, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2004 Oct 4)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2004 Oct 4, compiled " diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -1715,7 +1715,8 @@ typedef int VimClipboard; /* This is req # define ENC_2WORD 0x100 /* Unicode: UTF-16 */ # define ENC_LATIN1 0x200 /* Latin1 */ -# define ENC_MACROMAN 0x400 /* Mac Roman (not Macro Man! :-) */ +# define ENC_LATIN9 0x400 /* Latin9 */ +# define ENC_MACROMAN 0x800 /* Mac Roman (not Macro Man! :-) */ #endif #ifdef FEAT_MBYTE