Mercurial > vim
changeset 674:4b8583e82cb8 v7.0201
updated for version 7.0201
author | vimboss |
---|---|
date | Sat, 18 Feb 2006 22:14:51 +0000 |
parents | 513866ffe6af |
children | 51794dc170f7 |
files | runtime/autoload/htmlcomplete.vim runtime/autoload/xmlcomplete.vim runtime/doc/Makefile runtime/doc/autocmd.txt runtime/doc/diff.txt runtime/doc/editing.txt runtime/doc/eval.txt runtime/doc/help.txt runtime/doc/index.txt runtime/doc/options.txt runtime/doc/starting.txt runtime/doc/tabpage.txt runtime/doc/tags runtime/doc/tips.txt runtime/doc/todo.txt runtime/doc/version7.txt runtime/doc/windows.txt src/INSTALLmac.txt src/Makefile src/edit.c src/eval.c src/ex_cmds.h src/ex_docmd.c src/fileio.c src/gui.c src/main.c src/misc1.c src/proto/edit.pro src/screen.c src/version.h src/vim.h src/window.c |
diffstat | 32 files changed, 471 insertions(+), 176 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/autoload/htmlcomplete.vim +++ b/runtime/autoload/htmlcomplete.vim @@ -1,7 +1,7 @@ " Vim completion script " Language: XHTML 1.0 Strict " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) -" Last Change: 2006 Feb 6 +" Last Change: 2006 Feb 18 function! htmlcomplete#CompleteTags(findstart, base) if a:findstart @@ -540,24 +540,26 @@ function! htmlcomplete#CompleteTags(find let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack") return [opentag.">"] endif + " Load data {{{ + if !exists("g:xmldata_xhtml10s") + runtime! autoload/xml/xhtml10s.vim + endif + " }}} + " Tag completion {{{ " Deal with tag completion. let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack") if opentag == '' " Hack for sometimes failing GetLastOpenTag. " As far as I tested fail isn't GLOT fault but problem " of invalid document - not properly closed tags and other mish-mash. - " If returns empty string assume <body>. Safe bet. - let opentag = 'body' + " Also when document is empty. Return list of *all* tags. + let tags = keys(g:xmldata_xhtml10s) + call filter(tags, 'v:val !~ "^vimxml"') + else + let tags = g:xmldata_xhtml10s[opentag][0] endif " }}} - " Load data {{{ - if !exists("g:xmldata_xhtml10s") - runtime! autoload/xml/xhtml10s.vim - endif - " }}} - " Tag completion {{{ - let tags = g:xmldata_xhtml10s[opentag][0] for m in sort(tags) if m =~ '^'.context
--- a/runtime/autoload/xmlcomplete.vim +++ b/runtime/autoload/xmlcomplete.vim @@ -1,7 +1,7 @@ " Vim completion script " Language: XML " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) -" Last Change: 2006 Feb 6 +" Last Change: 2006 Feb 18 " This function will create Dictionary with users namespace strings and values " canonical (system) names of data files. Names should be lowercase, @@ -319,10 +319,13 @@ function! xmlcomplete#CompleteTags(finds let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack") let opentag = substitute(opentag, '^\k*:', '', '') if opentag == '' - return [] + "return [] + let tags = keys(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}) + call filter(tags, 'v:val !~ "^vimxml"') + else + let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0] endif - let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0] let context = substitute(context, '^\k*:', '', '') for m in tags
--- a/runtime/doc/Makefile +++ b/runtime/doc/Makefile @@ -89,6 +89,7 @@ DOCS = \ starting.txt \ spell.txt \ syntax.txt \ + tabpage.txt \ tagsrch.txt \ term.txt \ tips.txt \ @@ -211,6 +212,7 @@ HTMLS = \ starting.html \ spell.html \ syntax.html \ + tabpage.html \ tagsrch.html \ tags.html \ term.html \
--- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 13 +*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -284,6 +284,8 @@ Name triggered by ~ |WinEnter| after entering another window |WinLeave| before leaving a window +|TabEnterPost| after entering another tab page +|TabLeavePre| before leaving a tab page |CmdwinEnter| after entering the command-line window |CmdwinLeave| before leaving the command-line window @@ -704,6 +706,14 @@ Syntax When the 'syntax' option has b where this option was set, and <amatch> for the new value of 'syntax'. See |:syn-on|. + *TabEnterPost* +TabEnterPost Just after entering a tab page. |tab-page| + Before triggering the WinEnter and BufEnter + events. + *TabLeavePre* +TabLeavePre Just before leaving a tab page. |tab-page| + BufLeave and WinLeave events will have been + triggered first. *TermChanged* TermChanged After the value of 'term' has changed. Useful for re-loading the syntax file to update the
--- a/runtime/doc/diff.txt +++ b/runtime/doc/diff.txt @@ -1,4 +1,4 @@ -*diff.txt* For Vim version 7.0aa. Last change: 2006 Jan 22 +*diff.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -41,6 +41,10 @@ the file. This only works when a standard "diff" command is available. See 'diffexpr'. +Diffs are local to the current tab page |tab-page|. You can't see diffs with +a window in another tab page. This does make it possible to have several +diffs at the same time, each in their own tab page. + What happens is that Vim opens a window for each of the files. This is like using the |-O| argument. This uses vertical splits. If you prefer horizontal splits add the |-o| argument: > @@ -113,7 +117,7 @@ file for a moment and come back to the s *:diffo* *:diffoff* :diffoff Switch off diff mode for the current window. -:diffoff! Switch off diff mode for all windows. +:diffoff! Switch off diff mode for all windows in the current tab page. The ":diffoff" command resets the relevant options to their default value. This may be different from what the values were before diff mode was started,
--- a/runtime/doc/editing.txt +++ b/runtime/doc/editing.txt @@ -1,4 +1,4 @@ -*editing.txt* For Vim version 7.0aa. Last change: 2006 Jan 20 +*editing.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1014,6 +1014,9 @@ 5. Writing and quitting *write-quit* Vim refuses to |abandon| the current buffer, and when the last file in the argument list has not been edited. + If there are other tab pages and quitting the last + window in the current tab page the current tab page is + closed |tab-page|. :conf[irm] q[uit] Quit, but give prompt when changes have been made, or the last file in the argument list has not been
--- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 14 +*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1690,6 +1690,7 @@ synIDattr( {synID}, {what} [, {mode}]) String attribute {what} of syntax ID {synID} synIDtrans( {synID}) Number translated syntax ID of {synID} system( {expr} [, {input}]) String output of shell command/filter {expr} +tabpage( [{expr}]) Number number of current tab page taglist( {expr}) List list of tags matching {expr} tagfiles() List tags files used tempname() String name for a temporary file @@ -1705,7 +1706,7 @@ winbufnr( {nr}) Number buffer number o wincol() Number window column of the cursor winheight( {nr}) Number height of window {nr} winline() Number window line of the cursor -winnr() Number number of current window +winnr( [{expr}]) Number number of current window winrestcmd() String returns command to restore window sizes winwidth( {nr}) Number width of window {nr} writefile({list}, {fname} [, {binary}]) @@ -4447,6 +4448,14 @@ system({expr} [, {input}]) *system()* Use |:checktime| to force a check. +tabpagenr([{arg}]) *tabpagenr()* + The result is a Number, which is the number of the current + tab page. The first tab page has number 1. + When the optional argument is "$", the number of the last tab + page is returned (the tab page count). + The number can be used with the |:tab| command. + + taglist({expr}) *taglist()* Returns a list of tags matching the regular expression {expr}. Each list item is a dictionary with at least the following @@ -4618,7 +4627,7 @@ winline() The result is a Number, which winnr([{arg}]) The result is a Number, which is the number of the current window. The top window has number 1. When the optional argument is "$", the number of the - last window is returnd (the window count). + last window is returned (the window count). When the optional argument is "#", the number of the last accessed window is returned (where |CTRL-W_p| goes to). If there is no previous window 0 is returned.
--- a/runtime/doc/help.txt +++ b/runtime/doc/help.txt @@ -1,4 +1,4 @@ -*help.txt* For Vim version 7.0aa. Last change: 2005 Nov 30 +*help.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM - main help file k @@ -122,6 +122,7 @@ Advanced editing ~ |tagsrch.txt| tags and special searches |quickfix.txt| commands for a quick edit-compile-fix cycle |windows.txt| commands for using multiple windows and buffers +|tabpage.txt| commands for using multiple tab pages |syntax.txt| syntax highlighting |spell.txt| spell checking |diff.txt| working with two or three versions of the same file
--- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1,4 +1,4 @@ -*index.txt* For Vim version 7.0aa. Last change: 2006 Jan 26 +*index.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1305,7 +1305,7 @@ The commands are sorted on the non-optio |:omap| :om[ap] like ":map" but for Operator-pending mode |:omapclear| :omapc[lear] remove all mappings for Operator-pending mode |:omenu| :ome[nu] add menu for Operator-pending mode -|:only| :on[ly] close all windows except current one +|:only| :on[ly] close all windows except the current one |:onoremap| :ono[remap] like ":noremap" but for Operator-pending mode |:onoremenu| :onoreme[nu] like ":noremenu" but for Operator-pending mode |:options| :opt[ions] open the options-window @@ -1436,6 +1436,13 @@ The commands are sorted on the non-optio |:syncbind| :sync[bind] sync scroll binding |:t| :t same as ":copy" |:tNext| :tN[ext] jump to previous matching tag +|:tabclose| :tabc[lose] close current tab page +|:tabedit| :tabe[dit] edit a file in a new tab page +|:tabfind| :tabf[ind] find file in 'path', edit it in a new tab page +|:tabnew| :tabn[ew] edit a file in a new tab page +|:tabonly| :tabo[nly] close all tab pages except the current one +|:tabs| :tabs list the tab pages and what they contain +|:tab| :tab jump to another tab page |:tag| :ta[g] jump to tag |:tags| :tags show the contents of the tag stack |:tcl| :tc[l] execute Tcl command
--- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 14 +*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -5336,6 +5336,8 @@ A jump table for the options with a shor winsize window sizes Don't include both "curdir" and "sesdir". + There is no option to include tab pages yet, only the current tab page + is stored in the session. |tab-page| When "curdir" nor "sesdir" is included, file names are stored with absolute paths. "slash" and "unix" are useful on Windows when sharing session files @@ -6232,6 +6234,19 @@ A jump table for the options with a shor 'S' flag in 'cpoptions'. Only normal file name characters can be used, "/\*?[|<>" are illegal. + *'tabline'* *'tal'* +'tabline' 'tal' number (default 1) + global + {not in Vi} + {not available when compiled without the +windows + feature} + The value of this option specifies when the line with tab page labels + will be displayed: + 0: never + 1: only if there are at least two tab pages + 2: always + |tab-page| + *'tabstop'* *'ts'* 'tabstop' 'ts' number (default 8) local to buffer
--- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 7.0aa. Last change: 2006 Feb 14 +*starting.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -374,6 +374,13 @@ a slash. Thus "-R" means recovery and " the command line determines how the windows will be split. {not in Vi} + *-p* +-p[N] Open N tab pages. If [N] is not given, one tab page is opened + for every file given as argument. The maximum is 10 tab + pages. If there are more tab pages than arguments, the last + few tab pages will be editing an empty file. + {not in Vi} + *-T* -T {terminal} Set the terminal type to "terminal". This influences the codes that Vim will send to your terminal. This is normally @@ -831,6 +838,8 @@ 10. Read the quickfix file 11. Open all windows When the |-o| flag was given, windows will be opened (but not displayed yet). + When the |-p| flag was given, tab pages will be created (but not + displayed yet). When switching screens, it happens now. Redrawing starts. If the "-q" flag was given to Vim, the first error is jumped to. Buffers for all windows will be loaded. @@ -1203,6 +1212,9 @@ An example mapping: > :nmap <F2> :wa<Bar>exe "mksession! " . v:this_session<CR>:so ~/sessions/ This saves the current Session, and starts off the command to load another. +A session only includes the current tab page. There currently is no option to +store all tab pages. |tab-page| + The |SessionLoadPost| autocmd event is triggered after a session file is loaded/sourced. *SessionLoad-variable*
new file mode 100644 --- /dev/null +++ b/runtime/doc/tabpage.txt @@ -0,0 +1,125 @@ +*tabpage.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 + + + VIM REFERENCE MANUAL by Bram Moolenaar + + +Editing with windows in multuple tab pages. *tab-page* *tabpage* + +The commands which have been added to use multiple tab pages are explained +here. Additionally, there are explanations for commands that work differently +when used in combination with more than one tab page. + +1. Introduction |tab-page-intro| +2. Commands |tab-page-commands| +3. Other items |tab-page-other| + +{Vi does not have any of these commands} +{not able to use multiple tab pages when the |+windows| feature was disabled +at compile time} + +============================================================================== +1. Introduction *tab-page-intro* + +A tab page holds one or more windows. You can easily switch between tab +pages, so that you have several collections of windows to work on different +things. + +Usually you will see a list of labels at the top of the Vim window, one for +each tab page. With the mouse you can click on the label to jump to that tab +page. There are other ways to move between tab pages, see below. + +Most commands work only in the current tab page. That includes the |CTRL-W| +commands, |:windo|, |:all| and |:ball|. The commands that are aware of +other tab pages than the current one are mentioned below. + +Tabs are also a nice way to edit a buffer temporarily without changing the +current window layout. Open a new tab page, do whatever you want to do and +close the tab page. + +============================================================================== +2. Commands *tab-page-commands* + +OPENING A NEW TAB PAGE: + +When starting Vim "vim -p filename ..." opens each file argument in a separate +tab page (up to 10). |-p| + +:tabe[dit] *:tabe* *:tabedit* +:tabn[ew] Open a new tab page with an empty window. + +:tabe[dit] [++opt] [+cmd] {file} +:tabn[ew] [++opt] [+cmd] {file} + Open a new tab page and edit {file}, like with |:edit|. + +:tabf[ind] [++opt] [+cmd] {file} + Open a new tab page and edit {file} in 'path', like with + |:find|. + {not available when the |+file_in_path| feature was disabled + at compile time} + + +CLOSING A TAB PAGE: + +Using |:close| in the last window of a tab page closes it. + +Using the mouse: If the tab page line is displayed you can click in the "X" at +the top right to close the current tab page. |'tabline'| + + *:tabc* *:tabclose* +:tabc[lose][!] Close current tab page. + This command fails when: + - There is only one tab page on the screen. *E784* + - When 'hidden' is not set, [!] is not used, a buffer has + changes, and there is no other window on this buffer. + Changes to the buffer are not written and won't get lost, so + this is a "safe" command. + +:tabc[lose][!] {count} + Close tab page {count}. Fails in the same way as ':tabclose" + above. + + *:tabo* *:tabonly* +:tabo[nly][!] Close all other tab pages. + When the 'hidden' option is set, all buffers in closed windows + become hidden. + When 'hidden' is not set, and the 'autowrite' option is set, + modified buffers are written. Otherwise, windows that have + buffers that are modified are not removed, unless the [!] is + given, then they become hidden. But modified buffers are + never abandoned, so changes cannot get lost. + + +SWITCHING TO ANOTHER TAB PAGE: + +Using the mouse: If the tab page line is displayed you can click in a tab page +label to switch to that tab page. |'tabline'| + +:tab *:tab* *gt* +gt Go to the next tab page. Wraps around from the last to the + first one. + +:tab {count} +{count}gt Go to tab page {count}. The first tab page has number one. + + +Other commands: + *:tabs* +:tabs List the tab pages and the windows they contain. Shows a "+" + for modified buffers. + +============================================================================== +3. Other items *tab-page-other* + +You can use the 'tabline' option to specify when you want the line with tab +page labels to appear: never, when there is more than one tab page or always. + +Diff mode works per tab page. You can see the diffs between several files +within one tab page. Other tab pages can show differences between other +files. + +The TabLeavePre and TabEnterPost autocommand events can be used to do +something when switching from one tab page to another. + + + vim:tw=78:ts=8:ft=help:norl:
--- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -892,6 +892,7 @@ 't_vs' term.txt /*'t_vs'* 't_xs' term.txt /*'t_xs'* 'ta' options.txt /*'ta'* +'tabline' options.txt /*'tabline'* 'tabstop' options.txt /*'tabstop'* 'tag' options.txt /*'tag'* 'tagbsearch' options.txt /*'tagbsearch'* @@ -899,6 +900,7 @@ 'tagrelative' options.txt /*'tagrelative'* 'tags' options.txt /*'tags'* 'tagstack' options.txt /*'tagstack'* +'tal' options.txt /*'tal'* 'tb' options.txt /*'tb'* 'tbi' options.txt /*'tbi'* 'tbidi' options.txt /*'tbidi'* @@ -1224,6 +1226,7 @@ -n starting.txt /*-n* -nb starting.txt /*-nb* -o starting.txt /*-o* +-p starting.txt /*-p* -q starting.txt /*-q* -qf starting.txt /*-qf* -r starting.txt /*-r* @@ -2638,6 +2641,14 @@ 90.5 usr_90.txt /*90.5* :tN tagsrch.txt /*:tN* :tNext tagsrch.txt /*:tNext* :ta tagsrch.txt /*:ta* +:tab tabpage.txt /*:tab* +:tabc tabpage.txt /*:tabc* +:tabclose tabpage.txt /*:tabclose* +:tabe tabpage.txt /*:tabe* +:tabedit tabpage.txt /*:tabedit* +:tabo tabpage.txt /*:tabo* +:tabonly tabpage.txt /*:tabonly* +:tabs tabpage.txt /*:tabs* :tag tagsrch.txt /*:tag* :tags tagsrch.txt /*:tags* :tc if_tcl.txt /*:tc* @@ -3875,6 +3886,7 @@ E780 spell.txt /*E780* E781 spell.txt /*E781* E782 spell.txt /*E782* E783 spell.txt /*E783* +E784 tabpage.txt /*E784* E79 message.txt /*E79* E80 message.txt /*E80* E800 arabic.txt /*E800* @@ -4086,6 +4098,8 @@ TCL if_tcl.txt /*TCL* TERM starting.txt /*TERM* TTpro-telnet syntax.txt /*TTpro-telnet* Tab intro.txt /*Tab* +TabEnterPost autocmd.txt /*TabEnterPost* +TabLeavePre autocmd.txt /*TabLeavePre* Tcl if_tcl.txt /*Tcl* TermChanged autocmd.txt /*TermChanged* TermResponse autocmd.txt /*TermResponse* @@ -5340,6 +5354,7 @@ group-name syntax.txt /*group-name* gs various.txt /*gs* gsp.vim syntax.txt /*gsp.vim* gstar pattern.txt /*gstar* +gt tabpage.txt /*gt* gtk-tooltip-colors gui_x11.txt /*gtk-tooltip-colors* gu change.txt /*gu* gugu change.txt /*gugu* @@ -5429,6 +5444,7 @@ 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* @@ -6927,6 +6943,13 @@ t_vi term.txt /*t_vi* t_vs term.txt /*t_vs* t_xs term.txt /*t_xs* tab intro.txt /*tab* +tab-page tabpage.txt /*tab-page* +tab-page-commands tabpage.txt /*tab-page-commands* +tab-page-intro tabpage.txt /*tab-page-intro* +tab-page-other tabpage.txt /*tab-page-other* +tabpage tabpage.txt /*tabpage* +tabpage.txt tabpage.txt /*tabpage.txt* +tabpagenr() eval.txt /*tabpagenr()* tag tagsrch.txt /*tag* tag-! tagsrch.txt /*tag-!* tag-any-white tagsrch.txt /*tag-any-white*
--- a/runtime/doc/tips.txt +++ b/runtime/doc/tips.txt @@ -1,4 +1,4 @@ -*tips.txt* For Vim version 7.0aa. Last change: 2006 Feb 16 +*tips.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -450,11 +450,13 @@ Highlighting matching parens *match- This example shows the use of a few advanced tricks: - using the |CursorMoved| autocommand event - using |searchpairpos()| to find a matching paren +- using |synID()| to detect whether the cursor is in a string or comment - using |:match| to highlight something - using a |pattern| to match a specific position in the file. This should be put in a Vim script file, since it uses script-local variables. -Note that it doesn't recognize strings or comments in the text. +It skips matches in strings or comments, unless the cursor started in string +or comment. This requires syntax highlighting. > let s:paren_hl_on = 0 function s:Highlight_Matching_Paren() @@ -484,8 +486,11 @@ Note that it doesn't recognize strings o let c = '\[' let c2 = '\]' endif + let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' . + \ '=~? "string\\|comment"' + execute 'if' s_skip '| let s_skip = 0 | endif' - let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags) + let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip) if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$') exe 'match Search /\(\%' . c_lnum . 'l\%' . c_col .
--- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 17 +*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -32,52 +32,15 @@ be worked on, but only if you sponsor Vi Support WINDOW TABS. Works like several pages, each with their own split windows. Let's call them "tab pages". - - Add tabpage(): returns current tab page number. - - ":tabsplit" makes a copy of the current tab page. - - Add TabLeavePre and TabEnterPost autocommands - line at top of frame with tabs. Add 'tabtext' option, like 'statusline'. - - check for E999 + - Need to be able to search the windows in inactive tabs, e.g. for the + quickfix window? - docs: - General remark: commands that work on windows only work on the windows - in the current tab page. Including :windo. - Session file only contains the current tab page. - :tabedit - :tabfind - :tab N - :tabs - {count}gt - :close may close current tab page if there is one window. - :tabclose - :tabclose N - close tab N - :tabonly - close all other tabs. - :close and :quit (last window in tab) - "gt": Use "1gt" - "99gt" to switch to another tab. "gt" goes to the - next one. Hint in docs: To mess with another buffer, without - changing the window layout, do this in another tab. - 'tabline' values 0/1/2 - mouse click in tabline: - select a tab page - X closes current tab page - :argall and :ball only opens window for buffers that are not in any - window in any tab page - :diffoff only works in the current tab page - diff works per tab page - "vim -p *" opens each file in a separate tab page (up to 10). - - add GUI Tabs for some systems. - Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6. - Simple patch for GTK by Luis M (nov 7). - - Need to be able to search the windows in inactive tabs, e.g. for the - quickfix window. -Future enhancements: - tab page local variables? - tab page local options? 'diffopt' could differ between tab pages. - tab page local colors? + Add info to the user manual somewhere. Crash with X command server (Ciaran McCreesh). -Motif: in diff mode dragging one scrollbar doesn't update the other one. - Ctags still hasn't included the patch. Darren is looking for someone to do maintanance. @@ -494,6 +457,16 @@ Patch for "paranoid mode" by Kevin Colli Check if file explorer can handle directory names and links with a single quote. (Nieko Maatjes, 2005 Jan 4) +Future enhancements for tab pages: + - Add GUI Tabs for all systems. + Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6. + Simple patch for GTK by Luis M (nov 7). + - ":tabsplit" makes a copy of the current tab page. + - Add local variables for each tab page? + - Add local options for each tab page? E.g., 'diffopt' could differ + between tab pages. + - Add local highlighting for a tab page? + Vi incompatibility: 8 With undo/redo only marks in the changed lines should be changed. Other
--- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 17 +*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1707,4 +1707,7 @@ event that removed the balloon again. I When "umask" is set such that nothing is writable then the viminfo file would be written without write permission. (Julian Bridle) +Motif: In diff mode dragging one scrollbar didn't update the scrollbar of the +other diff'ed window. + vim:tw=78:ts=8:ft=help:norl:
--- a/runtime/doc/windows.txt +++ b/runtime/doc/windows.txt @@ -1,4 +1,4 @@ -*windows.txt* For Vim version 7.0aa. Last change: 2006 Jan 27 +*windows.txt* For Vim version 7.0aa. Last change: 2006 Feb 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -68,6 +68,9 @@ inactive no no ' ' Note: All CTRL-W commands can also be executed with |:wincmd|, for those places where a Normal mode command can't be used or is inconvenient. +The main Vim window can hold several split windows. There are also tab pages +|tab-page|, each of which can hold multiple windows. + ============================================================================== 2. Starting Vim *windows-starting* @@ -255,6 +258,9 @@ CTRL-W c *CTRL-W_c* *:clo* *:close* :clo[se][!] Close current window. When the 'hidden' option is set, or when the buffer was changed and the [!] is used, the buffer becomes hidden (unless there is another window editing it). + When there is only one window in the current tab page and + there is another tab page, this closes the current tab page. + |tab-page|. This command fails when: *E444* - There is only one window on the screen. - When 'hidden' is not set, [!] is not used, the buffer has @@ -271,6 +277,8 @@ CTRL-W CTRL-C *CTRL-W_CTRL-C* :hid[e] Quit current window, unless it is the last window on the screen. The buffer becomes hidden (unless there is another window editing it or 'bufhidden' is "unload" or "delete"). + If the window is the last one in the current tab page the tab + page is closed. |tab-page| The value of 'hidden' is irrelevant for this command. Changes to the buffer are not written and won't get lost, so this is a "safe" command. @@ -551,6 +559,7 @@ can also get to them with the buffer lis Rearrange the screen to open one window for each argument. All other windows are closed. When a count is given, this is the maximum number of windows to open. + Only uses the current tab page |tab-page|. When the 'hidden' option is set, all buffers in closed windows become hidden. When 'hidden' is not set, and the 'autowrite' option is set, @@ -620,7 +629,8 @@ 8. Do a command in all buffers or window CTRL-W w :{cmd} etc. -< When an error is detected on one window, further +< This only works in the current tab page. + When an error is detected on one window, further windows will not be visited. The last window (or where an error occurred) becomes the current window. @@ -1073,6 +1083,7 @@ list of buffers. |unlisted-buffer| of windows opened ('winwidth' if |:vertical| was prepended). Buf/Win Enter/Leave autocommands are not executed for the new windows here, that's only done when they are really entered. + Only uses the current tab page |tab-page|. Note: All the commands above that start editing another buffer, keep the 'readonly' flag as it was. This differs from the ":edit" command, which sets
--- a/src/INSTALLmac.txt +++ b/src/INSTALLmac.txt @@ -36,13 +36,16 @@ 1.1 Carbon interface (default) directory. You can move this bundle (the Vim.app directory) anywhere you want, for example, /Applications. + You need at least Xcode 1.5 to compile Vim 7.0. + + 1.2 X-Windows or Plain Text If you do not want the Carbon interface, you must explicitly tell configure to use a different GUI. cd .. - ./configure --enable-gui=gtk2 + ./configure --disable-darwin --enable-gui=gtk2 make; make install NOTE: The following GUI options are supported:
--- a/src/Makefile +++ b/src/Makefile @@ -1510,6 +1510,8 @@ PRO_AUTO = \ $(ALL_GUI_PRO) \ $(TCL_PRO) +ICON_APP = gui_mac.icns + PRO_MANUAL = os_amiga.pro os_msdos.pro os_win16.pro os_win32.pro \ os_mswin.pro os_beos.pro os_vms.pro os_riscos.pro $(PERL_PRO) @@ -2131,6 +2133,10 @@ shadow: runtime pixmaps cp config.mk.dist $(SHADOWDIR) mkdir $(SHADOWDIR)/xxd cd $(SHADOWDIR)/xxd; ln -s ../../xxd/*.[ch] ../../xxd/Make* . + if test -f $(ICON_APP); then \ + cd $(SHADOWDIR); \ + ln -s ../$(ICON_APP) ../os_mac.rsr.hqx ../dehqx.py .; \ + fi mkdir $(SHADOWDIR)/testdir cd $(SHADOWDIR)/testdir; ln -s ../../testdir/Makefile \ ../../testdir/vimrc.unix \ @@ -2494,7 +2500,6 @@ M4FLAGSX = $(M4FLAGS) -DAPP_EXE=$(VIMNAM -DAPP_VER=$(VERSION) -DICON_APP=$(ICON_APP) ### Icons -ICON_APP = gui_mac.icns ICONS = $(RESDIR)/$(ICON_APP) # If you uncomment the following lines the *.icns in the src directory will be
--- a/src/edit.c +++ b/src/edit.c @@ -114,7 +114,6 @@ static int compl_pending = FALSE; static pos_T compl_startpos; static colnr_T compl_col = 0; /* column where the text starts * that is being completed */ -static int save_sm = -1; static char_u *compl_orig_text = NULL; /* text as it was before * completion started */ static int compl_cont_mode = 0; @@ -2733,11 +2732,19 @@ ins_compl_clear() compl_pattern = NULL; vim_free(compl_leader); compl_leader = NULL; - save_sm = -1; edit_submode_extra = NULL; } /* + * Return TRUE when Insert completion is active. + */ + int +ins_compl_active() +{ + return compl_started; +} + +/* * Delete one character before the cursor and show the subset of the matches * that match the word that is now before the cursor. * Returns TRUE if the work is done and another char to be got from the user. @@ -3071,8 +3078,6 @@ ins_compl_prep(c) compl_matches = 0; msg_clr_cmdline(); /* necessary for "noshowmode" */ ctrl_x_mode = 0; - if (save_sm >= 0) - p_sm = save_sm; if (edit_submode != NULL) { edit_submode = NULL; @@ -3904,10 +3909,6 @@ ins_complete(c) { /* First time we hit ^N or ^P (in a row, I mean) */ - /* Turn off 'sm' so we don't show matches with ^X^L */ - save_sm = p_sm; - p_sm = FALSE; - did_ai = FALSE; #ifdef FEAT_SMARTINDENT did_si = FALSE;
--- a/src/eval.c +++ b/src/eval.c @@ -621,6 +621,7 @@ static void f_synID __ARGS((typval_T *ar static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv)); static void f_system __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv)); static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv)); static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv)); @@ -6983,6 +6984,7 @@ static struct fst {"synIDattr", 2, 3, f_synIDattr}, {"synIDtrans", 1, 1, f_synIDtrans}, {"system", 1, 2, f_system}, + {"tabpagenr", 0, 1, f_tabpagenr}, {"tagfiles", 0, 0, f_tagfiles}, {"taglist", 1, 1, f_taglist}, {"tempname", 0, 0, f_tempname}, @@ -14868,6 +14870,40 @@ done: } /* + * "tabpagenr()" function + */ +/* ARGSUSED */ + static void +f_tabpagenr(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + int nr = 1; +#ifdef FEAT_WINDOWS + tabpage_T *tp; + char_u *arg; + + if (argvars[0].v_type != VAR_UNKNOWN) + { + arg = get_tv_string_chk(&argvars[0]); + nr = 0; + if (arg != NULL) + { + if (STRCMP(arg, "$") == 0) + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) + ++nr; + else + EMSG2(_(e_invexpr2), arg); + } + } + else + for (tp = first_tabpage; tp != curtab; tp = tp->tp_next) + ++nr; +#endif + rettv->vval.v_number = nr; +} + +/* * "tagfiles()" function */ /*ARGSUSED*/
--- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -884,6 +884,8 @@ EX(CMD_tabclose, "tabclose", ex_tabclose EX(CMD_tabedit, "tabedit", ex_tabedit, BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR), EX(CMD_tabfind, "tabfind", ex_tabedit, + BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|NEEDARG|TRLBAR), +EX(CMD_tabnew, "tabnew", ex_tabedit, BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR), EX(CMD_tabonly, "tabonly", ex_tabonly, TRLBAR|CMDWIN),
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -6228,7 +6228,7 @@ ex_tabclose(eap) else # endif if (first_tabpage->tp_next == NULL) - EMSG(_("E999: Cannot close last tab page")); + EMSG(_("E784: Cannot close last tab page")); else { if (eap->addr_count > 0) @@ -6239,7 +6239,7 @@ ex_tabclose(eap) beep_flush(); return; } - if (tp->tp_topframe != topframe) + if (tp != curtab) { tabpage_close_other(tp, eap->forceit); return; @@ -6975,9 +6975,10 @@ theend: } /* - * :tabedit [[+command] file] open new Tab page with empty window - * :tabedit [[+command] file] open new Tab page and edit "file" - * :tabfind [[+command] file] open new Tab page and find "file" + * :tabedit open new Tab page with empty window + * :tabedit [+command] file open new Tab page and edit "file" + * :tabnew [[+command] file] just like :tabedit + * :tabfind [+command] file open new Tab page and find "file" */ void ex_tabedit(eap) @@ -10626,6 +10627,11 @@ ex_match(eap) eap->errmsg = e_trailing; return; } + if (*end != *p) + { + EMSG2(_(e_invarg2), p); + return; + } c = *end; *end = NUL;
--- a/src/fileio.c +++ b/src/fileio.c @@ -6960,8 +6960,10 @@ static struct event_name {"SpellFileMissing",EVENT_SPELLFILEMISSING}, {"StdinReadPost", EVENT_STDINREADPOST}, {"StdinReadPre", EVENT_STDINREADPRE}, + {"SwapExists", EVENT_SWAPEXISTS}, {"Syntax", EVENT_SYNTAX}, - {"SwapExists", EVENT_SWAPEXISTS}, + {"TabEnterPost", EVENT_TABENTERPOST}, + {"TabLeavePre", EVENT_TABLEAVEPRE}, {"TermChanged", EVENT_TERMCHANGED}, {"TermResponse", EVENT_TERMRESPONSE}, {"User", EVENT_USER},
--- a/src/gui.c +++ b/src/gui.c @@ -3598,14 +3598,9 @@ gui_update_scrollbars(force) * have both a left and right scrollbar, and we drag one of them, we still * need to update the other one. */ - if ( (gui.dragged_sb == SBAR_LEFT - || gui.dragged_sb == SBAR_RIGHT) - && (!gui.which_scrollbars[SBAR_LEFT] - || !gui.which_scrollbars[SBAR_RIGHT]) - && !force) - return; - - if (!force && (gui.dragged_sb == SBAR_LEFT || gui.dragged_sb == SBAR_RIGHT)) + if (!force && (gui.dragged_sb == SBAR_LEFT || gui.dragged_sb == SBAR_RIGHT) + && gui.which_scrollbars[SBAR_LEFT] + && gui.which_scrollbars[SBAR_RIGHT]) { /* * If we have two scrollbars and one of them is being dragged, just @@ -3618,7 +3613,6 @@ gui_update_scrollbars(force) gui.dragged_wp->w_scrollbars[0].value, gui.dragged_wp->w_scrollbars[0].size, gui.dragged_wp->w_scrollbars[0].max); - return; } /* avoid that moving components around generates events */ @@ -3628,6 +3622,12 @@ gui_update_scrollbars(force) { if (wp->w_buffer == NULL) /* just in case */ continue; + /* Skip a scrollbar that is being dragged. */ + if (!force && (gui.dragged_sb == SBAR_LEFT + || gui.dragged_sb == SBAR_RIGHT) + && gui.dragged_wp == wp) + continue; + #ifdef SCROLL_PAST_END max = wp->w_buffer->b_ml.ml_line_count - 1; #else @@ -3759,11 +3759,12 @@ gui_update_scrollbars(force) #endif sb->size = size; sb->max = max; - if (gui.which_scrollbars[SBAR_LEFT] && gui.dragged_sb != SBAR_LEFT) + if (gui.which_scrollbars[SBAR_LEFT] + && (gui.dragged_sb != SBAR_LEFT || gui.dragged_wp != wp)) gui_mch_set_scrollbar_thumb(&wp->w_scrollbars[SBAR_LEFT], val, size, max); if (gui.which_scrollbars[SBAR_RIGHT] - && gui.dragged_sb != SBAR_RIGHT) + && (gui.dragged_sb != SBAR_RIGHT || gui.dragged_wp != wp)) gui_mch_set_scrollbar_thumb(&wp->w_scrollbars[SBAR_RIGHT], val, size, max); }
--- a/src/main.c +++ b/src/main.c @@ -1710,15 +1710,6 @@ command_line_scan(parmp) #endif break; -#ifdef TARGET_API_MAC_OSX - /* For some reason on MacOS X, an argument like: - -psn_0_10223617 is passed in when invoke from Finder - or with the 'open' command */ - case 'p': - argv_idx = -1; /* bypass full -psn */ - main_start_gui(); - break; -#endif case 'M': /* "-M" no changes or writing of files */ reset_modifiable(); /* FALLTHROUGH */ @@ -1743,6 +1734,17 @@ command_line_scan(parmp) break; case 'p': /* "-p[N]" open N tab pages */ +#ifdef TARGET_API_MAC_OSX + /* For some reason on MacOS X, an argument like: + -psn_0_10223617 is passed in when invoke from Finder + or with the 'open' command */ + if (argv[0][argv_idx] == 's') + { + argv_idx = -1; /* bypass full -psn */ + main_start_gui(); + break; + } +#endif #ifdef FEAT_WINDOWS /* default is 0: open window for each file */ parmp->window_count = get_number_arg((char_u *)argv[0],
--- a/src/misc1.c +++ b/src/misc1.c @@ -2034,6 +2034,9 @@ ins_char_bytes(buf, charlen) #ifdef FEAT_MBYTE && charlen == 1 #endif +#ifdef FEAT_INS_EXPAND + && !ins_compl_active() +#endif ) showmatch(c);
--- a/src/proto/edit.pro +++ b/src/proto/edit.pro @@ -12,6 +12,7 @@ int ins_compl_add __ARGS((char_u *str, i void ins_compl_show_pum __ARGS((void)); char_u *find_word_start __ARGS((char_u *ptr)); char_u *find_word_end __ARGS((char_u *ptr)); +int ins_compl_active __ARGS((void)); void ins_compl_check_keys __ARGS((int frequency)); int get_literal __ARGS((void)); void insertchar __ARGS((int c, int flags, int second_indent));
--- a/src/screen.c +++ b/src/screen.c @@ -2516,6 +2516,7 @@ win_line(wp, lnum, startrow, endrow, noc long v; int char_attr = 0; /* attributes for next character */ + int attr_pri = FALSE; /* char_attr has priority */ int area_highlighting = FALSE; /* Visual or incsearch highlighting in this line */ int attr = 0; /* attributes for area highlighting */ @@ -2764,7 +2765,7 @@ win_line(wp, lnum, startrow, endrow, noc } /* - * handle 'insearch' and ":s///c" highlighting + * handle 'incsearch' and ":s///c" highlighting */ else #endif /* FEAT_VISUAL */ @@ -3287,14 +3288,7 @@ win_line(wp, lnum, startrow, endrow, noc else if (area_attr != 0 && (vcol == tocol || (noinvcur && (colnr_T)vcol == wp->w_virtcol))) -#ifdef LINE_ATTR - area_attr = line_attr; /* stop highlighting */ - else if (line_attr && ((fromcol == -10 && tocol == MAXCOL) - || (vcol < fromcol || vcol > tocol))) - area_attr = line_attr; -#else area_attr = 0; /* stop highlighting */ -#endif #ifdef FEAT_SEARCH_EXTRA if (!n_extra) @@ -3370,33 +3364,40 @@ win_line(wp, lnum, startrow, endrow, noc } #endif - if (area_attr != 0) - char_attr = area_attr; -#ifdef FEAT_SYN_HL - else if (search_attr == 0 && has_syntax) - char_attr = syntax_attr; -#endif - else - char_attr = search_attr; - #ifdef FEAT_DIFF - if (diff_hlf != (hlf_T)0 && n_extra == 0) + if (diff_hlf != (hlf_T)0) { if (diff_hlf == HLF_CHD && ptr - line >= change_start) diff_hlf = HLF_TXD; /* changed text */ if (diff_hlf == HLF_TXD && ptr - line > change_end) diff_hlf = HLF_CHD; /* changed line */ - if (attr == 0 || area_attr != attr) - area_attr = hl_attr(diff_hlf); - if (attr == 0 || char_attr != attr) - { - if (search_attr != 0) - char_attr = search_attr; - else - char_attr = hl_attr(diff_hlf); - } - } -#endif + line_attr = hl_attr(diff_hlf); + } +#endif + + /* Decide which of the highlight attributes to use. */ + attr_pri = TRUE; + if (area_attr != 0) + char_attr = area_attr; + else if (search_attr != 0) + char_attr = search_attr; +#ifdef LINE_ATTR + /* Use line_attr when not in the Visual or 'incsearch' area + * (area_attr may be 0 when "noinvcur" is set). */ + else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL) + || (vcol < fromcol || vcol >= tocol))) + char_attr = line_attr; +#endif + else + { + attr_pri = FALSE; +#ifdef FEAT_SYN_HL + if (has_syntax) + char_attr = syntax_attr; + else +#endif + char_attr = 0; + } } /* @@ -3727,7 +3728,7 @@ win_line(wp, lnum, startrow, endrow, noc line = ml_get_buf(wp->w_buffer, lnum, FALSE); ptr = line + v; - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) char_attr = syntax_attr; else char_attr = hl_combine_attr(syntax_attr, char_attr); @@ -3740,7 +3741,7 @@ win_line(wp, lnum, startrow, endrow, noc if (has_spell && v >= word_end && v > cur_checked_col) { spell_attr = 0; - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) char_attr = syntax_attr; if (c != 0 && (!has_syntax || can_spell)) { @@ -3813,7 +3814,7 @@ win_line(wp, lnum, startrow, endrow, noc } if (spell_attr != 0) { - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) char_attr = hl_combine_attr(char_attr, spell_attr); else char_attr = hl_combine_attr(spell_attr, char_attr); @@ -3840,7 +3841,7 @@ win_line(wp, lnum, startrow, endrow, noc if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') { c = lcs_trail; - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) { n_attr = 1; extra_attr = hl_attr(HLF_8); @@ -3953,7 +3954,7 @@ win_line(wp, lnum, startrow, endrow, noc c = ' '; lcs_eol_one = -1; --ptr; /* put it back at the NUL */ - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) { extra_attr = hl_attr(HLF_AT); n_attr = 1; @@ -3979,7 +3980,7 @@ win_line(wp, lnum, startrow, endrow, noc n_extra = byte2cells(c) - 1; c_extra = NUL; c = *p_extra++; - if (area_attr == 0 && search_attr == 0) + if (!attr_pri) { n_attr = n_extra + 1; extra_attr = hl_attr(HLF_8); @@ -4042,8 +4043,7 @@ win_line(wp, lnum, startrow, endrow, noc /* Don't override visual selection highlighting. */ if (n_attr > 0 && draw_state == WL_LINE - && (area_attr == 0 || char_attr != area_attr) - && (search_attr == 0 || char_attr != search_attr)) + && !attr_pri) char_attr = extra_attr; #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) @@ -4108,8 +4108,7 @@ win_line(wp, lnum, startrow, endrow, noc else mb_utf8 = FALSE; /* don't draw as UTF-8 */ #endif - if ((area_attr == 0 || char_attr != area_attr) - && (search_attr == 0 || char_attr != search_attr)) + if (!attr_pri) { saved_attr3 = char_attr; /* save current attr */ char_attr = hl_attr(HLF_AT); /* later copied to char_attr */
--- 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 (2006 Feb 17)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 17, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 18)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 18, compiled "
--- a/src/vim.h +++ b/src/vim.h @@ -347,7 +347,7 @@ typedef unsigned long long_u; /* * The characters and attributes cached for the screen. */ -#define schar_T char_u +typedef char_u schar_T; #ifdef FEAT_SYN_HL typedef unsigned short sattr_T; # define MAX_TYPENR 65535 @@ -1109,6 +1109,8 @@ enum auto_event EVENT_SPELLFILEMISSING, /* spell file missing */ EVENT_CURSORMOVED, /* cursor was moved */ EVENT_CURSORMOVEDI, /* cursor was moved in Insert mode */ + EVENT_TABLEAVEPRE, /* before leaving a tab page */ + EVENT_TABENTERPOST, /* after entering a tab page */ NUM_EVENTS /* MUST be the last one */ };
--- a/src/window.c +++ b/src/window.c @@ -46,7 +46,7 @@ static int win_alloc_firstwin __ARGS((vo #if defined(FEAT_WINDOWS) || defined(PROTO) static tabpage_T *alloc_tabpage __ARGS((void)); static void free_tabpage __ARGS((tabpage_T *tp)); -static void leave_tabpage __ARGS((tabpage_T *tp)); +static int leave_tabpage __ARGS((buf_T *new_curbuf)); static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf)); static void frame_fix_height __ARGS((win_T *wp)); static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin)); @@ -2282,15 +2282,15 @@ alt_tabpage() { tabpage_T *tp; - /* Use the next tab page if it exists. */ - if (curtab->tp_next != NULL) + /* Use the next tab page if we are currently at the first one. */ + if (curtab == first_tabpage) return curtab->tp_next; /* Find the previous tab page. */ for (tp = first_tabpage; tp->tp_next != NULL; tp = tp->tp_next) if (tp->tp_next == curtab) - return tp; - return first_tabpage; + break; + return tp; } /* @@ -2963,7 +2963,11 @@ win_new_tabpage() return FAIL; /* Remember the current windows in this Tab page. */ - leave_tabpage(curtab); + if (leave_tabpage(NULL) == FAIL) + { + vim_free(newtp); + return FAIL; + } curtab = newtp; /* Create a new empty window. */ @@ -2985,12 +2989,7 @@ win_new_tabpage() } /* Failed, get back the previous Tab page */ - topframe = tp->tp_topframe; - curwin = tp->tp_curwin; - prevwin = tp->tp_prevwin; - firstwin = tp->tp_firstwin; - lastwin = tp->tp_lastwin; - curtab = tp; + enter_tabpage(curtab, curbuf); return FAIL; } @@ -3060,12 +3059,33 @@ find_tabpage(n) } /* - * Prepare for leaving the current tab page "tp". + * Prepare for leaving the current tab page. + * When autocomands change "curtab" we don't leave the tab page and return + * FAIL. + * Careful: When OK is returned need to get a new tab page very very soon! */ - static void -leave_tabpage(tp) - tabpage_T *tp; +/*ARGSUSED*/ + static int +leave_tabpage(new_curbuf) + buf_T *new_curbuf; /* what is going to be the new curbuf, + NULL if unknown */ { + tabpage_T *tp = curtab; + +#ifdef FEAT_AUTOCMD + if (new_curbuf != curbuf) + { + apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); + if (curtab != tp) + return FAIL; + } + apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); + if (curtab != tp) + return FAIL; + apply_autocmds(EVENT_TABLEAVEPRE, NULL, NULL, FALSE, curbuf); + if (curtab != tp) + return FAIL; +#endif #if defined(FEAT_GUI) /* Remove the scrollbars. They may be added back later. */ if (gui.in_use) @@ -3079,6 +3099,7 @@ leave_tabpage(tp) tp->tp_old_Columns = Columns; firstwin = NULL; lastwin = NULL; + return OK; } /* @@ -3100,6 +3121,8 @@ enter_tabpage(tp, old_curbuf) prevwin = tp->tp_prevwin; #ifdef FEAT_AUTOCMD + apply_autocmds(EVENT_TABENTERPOST, NULL, NULL, FALSE, curbuf); + apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); if (old_curbuf != curbuf) apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); #endif @@ -3114,10 +3137,10 @@ enter_tabpage(tp, old_curbuf) /* The tabpage line may have appeared or disappeared, may need to resize * the frames for that. When the Vim window was resized need to update * frame sizes too. */ - if (tp->tp_old_Rows != Rows || old_off != firstwin->w_winrow) + if (curtab->tp_old_Rows != Rows || old_off != firstwin->w_winrow) shell_new_rows(); #ifdef FEAT_VERTSPLIT - if (tp->tp_old_Columns != Columns && starting == 0) + if (curtab->tp_old_Columns != Columns && starting == 0) shell_new_columns(); /* update window widths */ #endif @@ -3143,20 +3166,16 @@ enter_tabpage(tp, old_curbuf) goto_tabpage(n) int n; { - tabpage_T *otp = curtab; tabpage_T *tp; int i; - if (otp == NULL) - return; - if (n == 0) { /* No count, go to next tab page, wrap around end. */ - if (otp->tp_next == NULL) + if (curtab->tp_next == NULL) tp = first_tabpage; else - tp = otp->tp_next; + tp = curtab->tp_next; } else { @@ -3171,8 +3190,13 @@ goto_tabpage(n) } } - leave_tabpage(otp); - enter_tabpage(tp, curbuf); + if (leave_tabpage(tp->tp_curwin->w_buffer) == OK) + { + if (valid_tabpage(tp)) + enter_tabpage(tp, curbuf); + else + enter_tabpage(curtab, curbuf); + } } /*