]> granicus.if.org Git - vim/commitdiff
updated for version 7.0149 v7.0149
authorBram Moolenaar <Bram@vim.org>
Tue, 20 Sep 2005 23:22:24 +0000 (23:22 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 20 Sep 2005 23:22:24 +0000 (23:22 +0000)
32 files changed:
runtime/autoload/csscomplete.vim [new file with mode: 0644]
runtime/autoload/htmlcomplete.vim
runtime/doc/cmdline.txt
runtime/doc/eval.txt
runtime/doc/insert.txt
runtime/doc/tags
runtime/doc/todo.txt
runtime/doc/version7.txt
runtime/filetype.vim
runtime/scripts.vim
runtime/spell/en.ascii.spl
runtime/spell/en.latin1.spl
runtime/spell/en.utf-8.spl
runtime/spell/en/en_US.diff
runtime/spell/nl/nl_NL.diff
runtime/syntax/asterisk.vim [new file with mode: 0644]
src/diff.c
src/eval.c
src/ex_cmds.c
src/ex_cmds2.c
src/ex_docmd.c
src/ex_getln.c
src/fileio.c
src/if_cscope.c
src/main.c
src/mbyte.c
src/message.c
src/misc2.c
src/proto/ex_docmd.pro
src/proto/ex_getln.pro
src/quickfix.c
src/version.h

diff --git a/runtime/autoload/csscomplete.vim b/runtime/autoload/csscomplete.vim
new file mode 100644 (file)
index 0000000..8ac3600
--- /dev/null
@@ -0,0 +1,391 @@
+" Vim completion script
+" Language:    CSS 2.1
+" Maintainer:  Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change: 2005 Sep 19
+
+function! csscomplete#CompleteCSS(findstart, base)
+if a:findstart
+       " We need whole line to proper checking
+       return 0
+else
+       " There are few chars important for context:
+       " ^ ; : { } /* */
+       " Where ^ is start of line and /* */ are comment borders
+       " Depending on their relative position to cursor we will now what should
+       " be completed. 
+       " 1. if nearest are ^ or { or ; current word is property
+       " 2. if : it is value
+       " 3. if } we are outside of css definitions
+       " 4. for comments ignoring is be the easiest but assume they are the same
+       "    as 1. 
+       
+       let line = a:base
+       let res = []
+       let res2 = []
+       let borders = {}
+
+       " We need the last occurrence of char so reverse line
+       let revline = join(reverse(split(line, '.\zs')), '')
+       let openbrace  = stridx(revline, '{')
+       let closebrace = stridx(revline, '}')
+       let colon       = stridx(revline, ':')
+       let semicolon   = stridx(revline, ';')
+       let opencomm    = stridx(revline, '*/') " Line was reversed
+       let closecomm   = stridx(revline, '/*') " Line was reversed
+       let style       = stridx(revline, '=\s*elyts') " Line was reversed
+       let atrule      = stridx(revline, '@')
+
+       if openbrace > -1
+               let borders[openbrace] = "openbrace"
+       endif
+       if closebrace > -1
+               let borders[closebrace] = "closebrace"
+       endif
+       if colon > -1
+               let borders[colon] = "colon"
+       endif
+       if semicolon > -1
+               let borders[semicolon] = "semicolon"
+       endif
+       if opencomm > -1
+               let borders[opencomm] = "opencomm"
+       endif
+       if closecomm > -1
+               let borders[closecomm] = "closecomm"
+       endif
+       if style > -1
+               let borders[style] = "style"
+       endif
+       if atrule > -1
+               let borders[atrule] = "atrule"
+       endif
+
+       if len(borders) == 0 || borders[min(keys(borders))] =~ '^\(openbrace\|semicolon\|opencomm\|closecomm\|style\)$'
+               " Complete properties
+
+               let values = split("azimuth background-attachment background-color background-image background-position background-repeat background border-collapse border-color border-spacing border-style border-top border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color  border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width border-bottom-width border-left-width border-width border bottom caption-side clear clip color content counter-increment counter-reset cue-after cue-before cue cursor direction display elevation empty-cells float font-family font-size font-style font-variant font-weight font height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-right margin-left margin-top margin-bottom max-height max-width min-height min-width orphans outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page-break-after page-break-before page-break-inside pause-after pause-before pause pitch-range pitch play-during position quotes richness right speak-header speak-numeral speak-punctuation speak speech-rate stress table-layout text-align text-decoration text-indent text-transform top unicode-bidi vertical-align visibility voice-family volume white-space widows width word-spacing z-index")
+
+               let propbase = matchstr(line, '.\{-}\ze[a-zA-Z-]*$')
+               let entered_property = matchstr(line, '.\{-}\zs[a-zA-Z-]*$')
+
+               for m in values
+                       if m =~? '^'.entered_property
+                               call add(res, propbase . m.': ')
+                       elseif m =~? entered_property
+                               call add(res2, propbase . m.': ')
+                       endif
+               endfor
+
+               return res + res2
+
+       elseif borders[min(keys(borders))] == 'colon'
+               " Get name of property
+               let prop = tolower(matchstr(line, '\zs[a-zA-Z-]*\ze\s*:[^:]\{-}$'))
+
+               if prop == 'azimuth'
+                       let values = ["left-side", "far-left", "left", "center-left", "center", "center-right", "right", "far-right", "right-side", "behind", "leftwards", "rightwards"]
+               elseif prop == 'background-attachment'
+                       let values = ["scroll", "fixed"]
+               elseif prop == 'background-color'
+                       let values = ["transparent", "rgb(", "#"]
+               elseif prop == 'background-image'
+                       let values = ["url(", "none"]
+               elseif prop == 'background-position'
+                       let vals = matchstr(line, '.*:\s*\zs.*')
+                       if vals =~ '^\([a-zA-Z]\+\)\?$'
+                               let values = ["top", "center", "bottom"]
+                       elseif vals =~ '^[a-zA-Z]\+\s\+\([a-zA-Z]\+\)\?$'
+                               let values = ["left", "center", "right"]
+                       else
+                               return []
+                       endif
+               elseif prop == 'background-repeat'
+                       let values = ["repeat", "repeat-x", "repeat-y", "no-repeat"]
+               elseif prop == 'background'
+                       let values = ["url(", "scroll", "fixed", "transparent", "rgb(", "#", "none", "top", "center", "bottom" , "left", "right", "repeat", "repeat-x", "repeat-y", "no-repeat"]
+               elseif prop == 'border-collapse'
+                       let values = ["collapse", "separate"]
+               elseif prop == 'border-color'
+                       let values = ["rgb(", "#", "transparent"]
+               elseif prop == 'border-spacing'
+                       return []
+               elseif prop == 'border-style'
+                       let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+               elseif prop =~ 'border-\(top\|right\|bottom\|left\)$'
+                       let vals = matchstr(line, '.*:\s*\zs.*')
+                       if vals =~ '^\([a-zA-Z0-9.]\+\)\?$'
+                               let values = ["thin", "thick", "medium"]
+                       elseif vals =~ '^[a-zA-Z0-9.]\+\s\+\([a-zA-Z]\+\)\?$'
+                               let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+                       elseif vals =~ '^[a-zA-Z0-9.]\+\s\+[a-zA-Z]\+\s\+\([a-zA-Z(]\+\)\?$'
+                               let values = ["rgb(", "#", "transparent"]
+                       else
+                               return []
+                       endif
+               elseif prop =~ 'border-\(top\|right\|bottom\|left\)-color'
+                       let values = ["rgb(", "#", "transparent"]
+               elseif prop =~ 'border-\(top\|right\|bottom\|left\)-style'
+                       let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+               elseif prop =~ 'border-\(top\|right\|bottom\|left\)-width'
+                       let values = ["thin", "thick", "medium"]
+               elseif prop == 'border-width'
+                       let values = ["thin", "thick", "medium"]
+               elseif prop == 'border'
+                       let vals = matchstr(line, '.*:\s*\zs.*')
+                       if vals =~ '^\([a-zA-Z0-9.]\+\)\?$'
+                               let values = ["thin", "thick", "medium"]
+                       elseif vals =~ '^[a-zA-Z0-9.]\+\s\+\([a-zA-Z]\+\)\?$'
+                               let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+                       elseif vals =~ '^[a-zA-Z0-9.]\+\s\+[a-zA-Z]\+\s\+\([a-zA-Z(]\+\)\?$'
+                               let values = ["rgb(", "#", "transparent"]
+                       else
+                               return []
+                       endif
+               elseif prop == 'bottom'
+                       let values = ["auto"]
+               elseif prop == 'caption-side'
+                       let values = ["top", "bottom"]
+               elseif prop == 'clear'
+                       let values = ["none", "left", "right", "both"]
+               elseif prop == 'clip'
+                       let values = ["auto", "rect("]
+               elseif prop == 'color'
+                       let values = ["rgb(", "#"]
+               elseif prop == 'content'
+                       let values = ["normal", "attr(", "open-quote", "close-quote", "no-open-quote", "no-close-quote"]
+               elseif prop =~ 'counter-\(increment\|reset\)$'
+                       let values = ["none"]
+               elseif prop =~ '^\(cue-after\|cue-before\|cue\)$'
+                       let values = ["url(", "none"]
+               elseif prop == 'cursor'
+                       let values = ["url(", "auto", "crosshair", "default", "pointer", "move", "e-resize", "ne-resize", "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "text", "wait", "help", "progress"]
+               elseif prop == 'direction'
+                       let values = ["ltr", "rtl"]
+               elseif prop == 'display'
+                       let values = ["inline", "block", "list-item", "run-in", "inline-block", "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption", "none"]
+               elseif prop == 'elevation'
+                       let values = ["below", "level", "above", "higher", "lower"]
+               elseif prop == 'empty-cells'
+                       let values = ["show", "hide"]
+               elseif prop == 'float'
+                       let values = ["left", "right", "none"]
+               elseif prop == 'font-family'
+                       let values = ["sans-serif", "serif", "monospace", "cursive", "fantasy"]
+               elseif prop == 'font-size'
+                       return []
+               elseif prop == 'font-style'
+                       let values = ["normal", "italic", "oblique"]
+               elseif prop == 'font-variant'
+                       let values = ["normal", "small-caps"]
+               elseif prop == 'font-weight'
+                       let values = ["normal", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900"]
+               elseif prop == 'font'
+                       let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"]
+               elseif prop =~ '^\(height\|width\)$'
+                       let values = ["auto"]
+               elseif prop =~ '^\(left\|rigth\)$'
+                       let values = ["auto"]
+               elseif prop == 'letter-spacing'
+                       let values = ["normal"]
+               elseif prop == 'line-height'
+                       let values = ["normal"]
+               elseif prop == 'list-style-image'
+                       let values = ["url(", "none"]
+               elseif prop == 'list-style-position'
+                       let values = ["inside", "outside"]
+               elseif prop == 'list-style-type'
+                       let values = ["disc", "circle", "square", "decimal", "decimal-leading-zero", "lower-roman", "upper-roman", "lower-latin", "upper-latin", "none"]
+               elseif prop == 'list-style'
+                       return []
+               elseif prop == 'margin'
+                       let values = ["auto"]
+               elseif prop =~ 'margin-\(right\|left\|top\|bottom\)$'
+                       let values = ["auto"]
+               elseif prop == 'max-height'
+                       let values = ["auto"]
+               elseif prop == 'max-width'
+                       let values = ["none"]
+               elseif prop == 'min-height'
+                       let values = ["none"]
+               elseif prop == 'min-width'
+                       let values = ["none"]
+               elseif prop == 'orphans'
+                       return []
+               elseif prop == 'outline-color'
+                       let values = ["rgb(", "#"]
+               elseif prop == 'outline-style'
+                       let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+               elseif prop == 'outline-width'
+                       let values = ["thin", "thick", "medium"]
+               elseif prop == 'outline'
+                       let vals = matchstr(line, '.*:\s*\zs.*')
+                       if vals =~ '^\([a-zA-Z0-9,()#]\+\)\?$'
+                               let values = ["rgb(", "#"]
+                       elseif vals =~ '^[a-zA-Z0-9,()#]\+\s\+\([a-zA-Z]\+\)\?$'
+                               let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+                       elseif vals =~ '^[a-zA-Z0-9,()#]\+\s\+[a-zA-Z]\+\s\+\([a-zA-Z(]\+\)\?$'
+                               let values = ["thin", "thick", "medium"]
+                       else
+                               return []
+                       endif
+               elseif prop == 'overflow'
+                       let values = ["visible", "hidden", "scroll", "auto"]
+               elseif prop == 'padding'
+                       return []
+               elseif prop =~ 'padding-\(top\|right\|bottom\|left\)$'
+                       return []
+               elseif prop =~ 'page-break-\(after\|before\)$'
+                       let values = ["auto", "always", "avoid", "left", "right"]
+               elseif prop == 'page-break-inside'
+                       let values = ["auto", "avoid"]
+               elseif prop =~ 'pause-\(after\|before\)$'
+                       return []
+               elseif prop == 'pause'
+                       return []
+               elseif prop == 'pitch-range'
+                       return []
+               elseif prop == 'pitch'
+                       let values = ["x-low", "low", "medium", "high", "x-high"]
+               elseif prop == 'play-during'
+                       let values = ["url(", "mix", "repeat", "auto", "none"]
+               elseif prop == 'position'
+                       let values = ["static", "relative", "absolute", "fixed"]
+               elseif prop == 'quotes'
+                       let values = ["none"]
+               elseif prop == 'richness'
+                       return []
+               elseif prop == 'speak-header'
+                       let values = ["once", "always"]
+               elseif prop == 'speak-numeral'
+                       let values = ["digits", "continuous"]
+               elseif prop == 'speak-punctuation'
+                       let values = ["code", "none"]
+               elseif prop == 'speak'
+                       let values = ["normal", "none", "spell-out"]
+               elseif prop == 'speech-rate'
+                       let values = ["x-slow", "slow", "medium", "fast", "x-fast", "faster", "slower"]
+               elseif prop == 'stress'
+                       return []
+               elseif prop == 'table-layout'
+                       let values = ["auto", "fixed"]
+               elseif prop == 'text-align'
+                       let values = ["left", "right", "center", "justify"]
+               elseif prop == 'text-decoration'
+                       let values = ["none", "underline", "overline", "line-through", "blink"]
+               elseif prop == 'text-indent'
+                       return []
+               elseif prop == 'text-transform'
+                       let values = ["capitalize", "uppercase", "lowercase", "none"]
+               elseif prop == 'top'
+                       let values = ["auto"]
+               elseif prop == 'unicode-bidi'
+                       let values = ["normal", "embed", "bidi-override"]
+               elseif prop == 'vertical-align'
+                       let values = ["baseline", "sub", "super", "top", "text-top", "middle", "bottom", "text-bottom"]
+               elseif prop == 'visibility'
+                       let values = ["visible", "hidden", "collapse"]
+               elseif prop == 'voice-family'
+                       return []
+               elseif prop == 'volume'
+                       let values = ["silent", "x-soft", "soft", "medium", "loud", "x-loud"]
+               elseif prop == 'white-space'
+                       let values = ["normal", "pre", "nowrap", "pre-wrap", "pre-line"]
+               elseif prop == 'widows'
+                       return []
+               elseif prop == 'word-spacing'
+                       let values = ["normal"]
+               elseif prop == 'z-index'
+                       let values = ["auto"]
+               else
+                       return []
+               endif
+
+               " Complete values
+               let valbase = matchstr(line, '.\{-}\ze[a-zA-Z0-9#,.(_-]*$')
+               let entered_value = matchstr(line, '.\{-}\zs[a-zA-Z0-9#,.(_-]*$')
+
+               for m in values
+                       if m =~? '^'.entered_value
+                               call add(res, valbase . m)
+                       elseif m =~? entered_value
+                               call add(res2, valbase . m)
+                       endif
+               endfor
+
+               return res + res2
+
+       elseif borders[min(keys(borders))] == 'closebrace'
+
+               return []
+
+       elseif borders[min(keys(borders))] == 'atrule'
+
+               let afterat = matchstr(line, '.*@\zs.*')
+
+               if afterat =~ '\s'
+
+                       let atrulename = matchstr(line, '.*@\zs[a-zA-Z-]\+\ze')
+
+                       if atrulename == 'media'
+                               let values = ["screen", "tty", "tv", "projection", "handheld", "print", "braille", "aural", "all"]
+
+                               let atruleafterbase = matchstr(line, '.*@media\s\+\ze.*$')
+                               let entered_atruleafter = matchstr(line, '.*@media\s\+\zs.*$')
+
+                       elseif atrulename == 'import'
+                               let atruleafterbase = matchstr(line, '.*@import\s\+\ze.*$')
+                               let entered_atruleafter = matchstr(line, '.*@import\s\+\zs.*$')
+
+                               if entered_atruleafter =~ "^[\"']"
+                                       let filestart = matchstr(entered_atruleafter, '^.\zs.*')
+                                       let files = split(glob(filestart.'*'), '\n')
+                                       let values = map(copy(files), '"\"".v:val')
+
+                               elseif entered_atruleafter =~ "^url("
+                                       let filestart = matchstr(entered_atruleafter, "^url([\"']\\?\\zs.*")
+                                       let files = split(glob(filestart.'*'), '\n')
+                                       let values = map(copy(files), '"url(".v:val')
+                                       
+                               else
+                                       let values = ['"', 'url(']
+
+                               endif
+
+                       else
+                               return []
+
+                       endif
+
+                       for m in values
+                               if m =~? '^'.entered_atruleafter
+                                       call add(res, atruleafterbase . m)
+                               elseif m =~? entered_atruleafter
+                                       call add(res2, atruleafterbase . m)
+                               endif
+                       endfor
+
+                       return res + res2
+
+               endif
+
+               let values = ["charset", "page", "media", "import"]
+
+               let atrulebase = matchstr(line, '.*@\ze[a-zA-Z -]*$')
+               let entered_atrule = matchstr(line, '.*@\zs[a-zA-Z-]*$')
+
+               for m in values
+                       if m =~? '^'.entered_atrule
+                               call add(res, atrulebase . m.' ')
+                       elseif m =~? entered_atrule
+                               call add(res2, atrulebase . m.' ')
+                       endif
+               endfor
+
+               return res + res2
+
+       endif
+
+       return []
+
+       endif
+endfunction
index a9791451f0d29adc5b10192d727e7f4753a5a7c8..ab50952435fffaaebd2fc42269e6cca1af64ef0c 100644 (file)
@@ -1,7 +1,7 @@
 " Vim completion script
 " Language:    XHTML 1.0 Strict
 " Maintainer:  Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2005 Sep 15
+" Last Change: 2005 Sep 19
 
 function! htmlcomplete#CompleteTags(findstart, base)
   if a:findstart
@@ -11,26 +11,53 @@ function! htmlcomplete#CompleteTags(findstart, base)
     while start >= 0 && line[start - 1] !~ '<'
       let start -= 1
     endwhile
+       if start < 0
+               let curpos = line('.')
+               let stylestart = searchpair('<style\>', '', '<\/style\>', "bnW")
+               let styleend   = searchpair('<style\>', '', '<\/style\>', "nW")
+               if stylestart != 0 && styleend != 0 
+                       if stylestart <= curpos && styleend >= curpos
+                               let b:csscompl = 1
+                               let start = 0
+                       endif
+               endif
+       endif
     return start
   else
+       " Check if we should do CSS completion inside of <style> tag
+       if exists("b:csscompl")
+               unlet! b:csscompl
+               return csscomplete#CompleteCSS(0, a:base)
+       endif
+       if a:base =~ '>'
+               " Generally if a:base contains > it means we are outside of tag and
+               " should abandon action - with one exception: <style> span { bo
+               if a:base =~ 'style[^>]\{-}>[^<]\{-}$'
+                       return csscomplete#CompleteCSS(0, a:base)
+               else
+                       return []
+               endif
+       endif
+
        " Set attribute groups
-    let g:coreattrs = ["id", "class", "style", "title"] 
-    let g:i18n = ["lang", "xml:lang", "dir"]
-    let g:events = ["onclick", "ondblclick", "onmousedown", "onmouseup", "onmousemove",
+    let coreattrs = ["id", "class", "style", "title"] 
+    let i18n = ["lang", "xml:lang", "dir=\"ltr\" ", "dir=\"rtl\" "]
+    let events = ["onclick", "ondblclick", "onmousedown", "onmouseup", "onmousemove",
                        \ "onmouseout", "onkeypress", "onkeydown", "onkeyup"]
-    let g:focus = ["accesskey", "tabindex", "onfocus", "onblur"]
-    let g:coregroup = g:coreattrs
-    let g:coregroup = extend(g:coregroup, g:i18n)
-    let g:coregroup = extend(g:coregroup, g:events)
-    " find tags matching with "a:base"
+    let focus = ["accesskey", "tabindex", "onfocus", "onblur"]
+    let coregroup = coreattrs + i18n + events
     let res = []
+    let res2 = []
+    " find tags matching with "a:base"
        " If a:base contains > it means we are already outside of tag and we
        " should abandon action
-       if a:base =~ '>'
-               return []
-       endif
        " If a:base contains white space it is attribute. 
        " It could be also value of attribute...
+       " We have to get first word to offer
+       " proper completions
+       let tag = split(a:base)[0]
+       " Get last word, it should be attr name
+       let attr = matchstr(a:base, '.*\s\zs.*')
        " Possible situations where any prediction would be difficult:
        " 1. Events attributes
        if a:base =~ '\s'
@@ -40,6 +67,113 @@ function! htmlcomplete#CompleteTags(findstart, base)
                " Also retrieving class names from current file and linked
                " stylesheets.
                if a:base =~ "\\(on[a-z]*\\|style\\|class\\)\\s*=\\s*[\"']"
+                       if a:base =~ "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+                               " Handle class name completion
+                               " 1. Find lines of <link stylesheet>
+                               " 1a. Check file for @import
+                               " 2. Extract filename(s?) of stylesheet,
+                               call cursor(1,1)
+                               let head = getline(search('<head\>'), search('<\/head>'))
+                               let headjoined = join(copy(head), ' ')
+                               if headjoined =~ '<style'
+                                       let stylehead = substitute(headjoined, '+>\*[', ' ', 'g')
+                                       let styleheadlines = split(stylehead)
+                                       let headclasslines = filter(copy(styleheadlines), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
+                                       let internal = 1
+                               else
+                                       let internal = 0
+                               endif
+                               let styletable = []
+                               let secimportfiles = []
+                               let filestable = filter(copy(head), "v:val =~ '\\(@import\\|link.*stylesheet\\)'")
+                               for line in filestable
+                                       if line =~ "@import"
+                                               let styletable += [matchstr(line, "import\\s\\+\\(url(\\)\\?[\"']\\?\\zs\\f\\+\\ze")]
+                                       elseif line =~ "<link"
+                                               let styletable += [matchstr(line, "href\\s*=\\s*[\"']\\zs\\f\\+\\ze")]
+                                       endif
+                               endfor
+                               for file in filestable
+                                       if filereadable(file)
+                                               let stylesheet = readfile(file)
+                                               let secimport = filter(copy(stylesheet), "v:val =~ '@import'")
+                                               if len(secimport) > 0
+                                                       for line in secimport
+                                                               let secimportfiles += [matchstr(line, "import\\s\\+\\(url(\\)\\?[\"']\\?\\zs\\f\\+\\ze")]
+                                                       endfor
+                                               endif
+                                       endif
+                               endfor
+                               let cssfiles = styletable + secimportfiles
+                               let classes = []
+                               for file in cssfiles
+                                       if filereadable(file)
+                                               let stylesheet = readfile(file)
+                                               let stylefile = join(stylesheet)
+                                               let stylefile = substitute(stylefile, '+>\*[', ' ', 'g')
+                                               let stylesheet = split(stylefile)
+                                               let classlines = filter(copy(stylesheet), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
+                                       endif
+                                       " We gathered classes definitions from all external files
+                                       let classes += classlines
+                               endfor
+                               if internal == 1
+                                       let classes += headclasslines
+                               endif
+                               let elements = {}
+                               for element in classes
+                                       if element =~ '^\.'
+                                               let class = matchstr(element, '^\.\zs[a-zA-Z][a-zA-Z0-9_-]*\ze')
+                                               let class = substitute(class, ':.*', '', '')
+                                               if has_key(elements, "common")
+                                                       let elements["common"] .= " ".class
+                                               else
+                                                       let elements["common"] = class
+                                               endif
+                                       else
+                                               let class = matchstr(element, '[a-zA-Z1-6]*\.\zs[a-zA-Z][a-zA-Z0-9_-]*\ze')
+                                               let tagname = tolower(matchstr(element, '[a-zA-Z1-6]*\ze.'))
+                                               if tagname != ''
+                                                       if has_key(elements, tagname)
+                                                               let elements[tagname] .= " ".class
+                                                       else
+                                                               let elements[tagname] = class
+                                                       endif
+                                               endif
+                                       endif
+                               endfor
+
+                               if has_key(elements, tag) && has_key(elements, "common")
+                                       let values = split(elements[tag]." ".elements["common"])
+                               elseif has_key(elements, tag) && !has_key(elements, "common")
+                                       let values = split(elements[tag])
+                               elseif !has_key(elements, tag) && has_key(elements, "common")
+                                       let values = split(elements["common"])
+                               else
+                                       return []
+                               endif
+
+                               " We need special version of sbase
+                               let classbase = matchstr(a:base, ".*[\"']")
+                           let classquote = matchstr(classbase, '.$')
+
+
+                               let entered_class = matchstr(attr, ".*=\\s*[\"']\\zs.*")
+
+                               for m in sort(values)
+                                       if m =~? '^'.entered_class
+                                               call add(res, classbase . m . classquote . ' ')
+                                       elseif m =~? entered_class
+                                               call add(res2, classbase . m . classquote . ' ')
+                                       endif
+                               endfor
+
+                               return res + res2
+
+                       elseif a:base =~ "style\\s*=\\s*[\"'][^\"']*$"
+                               return csscomplete#CompleteCSS(0, a:base)
+
+                       endif
                        let stripbase = matchstr(a:base, ".*\\(on[a-z]*\\|style\\|class\\)\\s*=\\s*[\"']\\zs.*")
                        " Now we have a:base stripped from all chars up to style/class.
                        " It may fail with some strange style value combinations.
@@ -47,11 +181,6 @@ function! htmlcomplete#CompleteTags(findstart, base)
                                return []
                        endif
                endif
-               " We have to get first word to offer
-               " proper attributes.
-               let tag = split(a:base)[0]
-               " Get last word, it should be attr name
-               let attr = matchstr(a:base, '.*\s\zs.*')
                " If attr contains =\s*[\"'] we catched value of attribute
                if attr =~ "=\s*[\"']"
                        " Let do attribute specific completion
@@ -97,7 +226,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
                                endif
                        elseif attrname == 'type'
                                if a:base =~ '^input'
-                                       let values = ["input-text", "password", "checkbox", "radio", "submit", "reset", "input-file", "hidden", "input-image", "input-button"]
+                                       let values = ["text", "password", "checkbox", "radio", "submit", "reset", "file", "hidden", "image", "button"]
                                elseif a:base =~ '^button'
                                        let values = ["button", "submit", "reset"]
                                endif
@@ -111,128 +240,114 @@ function! htmlcomplete#CompleteTags(findstart, base)
 
                        " We need special version of sbase
                        let attrbase = matchstr(a:base, ".*[\"']")
+                       let attrquote = matchstr(attrbase, '.$')
 
                        for m in values
-                               if m =~ entered_value
-                                       call add(res, attrbase . m . '" ')
+                               " This if is needed to not offer all completions as-is
+                               " alphabetically but sort them. Those beginning with entered
+                               " part will be as first choices
+                               if m =~ '^'.entered_value
+                                       call add(res, attrbase . m . attrquote.' ')
+                               elseif m =~ entered_value
+                                       call add(res2, attrbase . m . attrquote.' ')
                                endif
                        endfor
+
+                       return res + res2
+
                endif
                " Shorten a:base to not include last word
                let sbase = matchstr(a:base, '.*\ze\s.*')
                if tag =~ '^\(abbr\|acronym\|b\|bdo\|big\|caption\|cite\|code\|dd\|dfn\|div\|dl\|dt\|em\|fieldset\|h\d\|kbd\|li\|noscript\|ol\|p\|samp\|small\|span\|strong\|sub\|sup\|tt\|ul\|var\)$'
-                       let attrs = g:coregroup
+                       let attrs = coregroup
                elseif tag == 'a'
-                       let tagspec = ["charset", "type", "name", "href", "hreflang", "rel", "rev", "shape", "coords"]
-                       let attrs = extend(tagspec, g:coregroup)
-                       let attrs = extend(attrs, g:focus)
+                       let attrs = coregroup + focus + ["charset", "type", "name", "href", "hreflang", "rel", "rev", "shape", "coords"]
                elseif tag == 'area'
-                       let attrs = g:coregroup
+                       let attrs = coregroup
                elseif tag == 'base'
                        let attrs = ["href", "id"]
                elseif tag == 'blockquote'
-                       let attrs = g:coregroup
-                       let attrs = extend(attrs, ["cite"])
+                       let attrs = coregroup + ["cite"]
                elseif tag == 'body'
-                       let attrs = g:coregroup
-                       let attrs = extend(attrs, ["onload", "onunload"])
+                       let attrs = coregroup + ["onload", "onunload"]
                elseif tag == 'br'
-                       let attrs = g:coreattrs
+                       let attrs = coreattrs
                elseif tag == 'button'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, g:focus)
-                       let attrs = extend(attrs, ["name", "value", "type"])
+                       let attrs = coreattrs + focus + ["name", "value", "type"]
                elseif tag == '^\(col\|colgroup\)$'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["span", "width", "align", "char", "charoff", "valign"])
+                       let attrs = coreattrs + ["span", "width", "align", "char", "charoff", "valign"]
                elseif tag =~ '^\(del\|ins\)$'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["cite", "datetime"])
+                       let attrs = coreattrs + ["cite", "datetime"]
                elseif tag == 'form'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["action", "method", "enctype", "onsubmit", "onreset", "accept", "accept-charset"])
+                       let attrs = coreattrs + ["action", "method=\"get\" ", "method=\"post\" ", "enctype", "onsubmit", "onreset", "accept", "accept-charset"]
                elseif tag == 'head'
-                       let attrs = g:i18n
-                       let attrs = extend(attrs, ["id", "profile"])
+                       let attrs = i18n + ["id", "profile"]
                elseif tag == 'html'
-                       let attrs = g:i18n
-                       let attrs = extend(attrs, ["id", "xmlns"])
+                       let attrs = i18n + ["id", "xmlns"]
                elseif tag == 'img'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["src", "alt", "longdesc", "height", "width", "usemap", "ismap"])
+                       let attrs = coreattrs + ["src", "alt", "longdesc", "height", "width", "usemap", "ismap"]
                elseif tag == 'input'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, g:focus)
-                       let attrs = extend(attrs, ["type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "onselect", "onchange", "accept"])
+                       let attrs = coreattrs + focus + ["type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "onselect", "onchange", "accept"]
                elseif tag == 'label'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["for", "accesskey", "onfocus", "onblur"])
+                       let attrs = coreattrs + ["for", "accesskey", "onfocus", "onblur"]
                elseif tag == 'legend'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["accesskey"])
+                       let attrs = coreattrs + ["accesskey"]
                elseif tag == 'link'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["charset", "href", "hreflang", "type", "rel", "rev", "media"])
+                       let attrs = coreattrs + ["charset", "href", "hreflang", "type", "rel", "rev", "media"]
                elseif tag == 'map'
-                       let attrs = g:i18n
-                       let attrs = extend(attrs, g:events)
-                       let attrs = extend(attrs, ["id", "class", "style", "title", "name"])
+                       let attrs = i18n + events + ["id", "class", "style", "title", "name"]
                elseif tag == 'meta'
-                       let attrs = g:i18n
-                       let attrs = extend(attrs, ["id", "http-equiv", "content", "scheme", "name"])
+                       let attrs = i18n + ["id", "http-equiv", "content", "scheme", "name"]
                elseif tag == 'title'
-                       let attrs = g:i18n
-                       let attrs = extend(attrs, ["id"])
+                       let attrs = i18n + ["id"]
                elseif tag == 'object'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex"])
+                       let attrs = coreattrs + ["declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex"]
                elseif tag == 'optgroup'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["disbled", "label"])
+                       let attrs = coreattrs + ["disbled", "label"]
                elseif tag == 'option'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["disbled", "selected", "value", "label"])
+                       let attrs = coreattrs + ["disbled", "selected", "value", "label"]
                elseif tag == 'param'
                        let attrs = ["id", "name", "value", "valuetype", "type"]
                elseif tag == 'pre'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["xml:space"])
+                       let attrs = coreattrs + ["xml:space"]
                elseif tag == 'q'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["cite"])
+                       let attrs = coreattrs + ["cite"]
                elseif tag == 'script'
                        let attrs = ["id", "charset", "type", "src", "defer", "xml:space"]
                elseif tag == 'select'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange"])
+                       let attrs = coreattrs + ["name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange"]
                elseif tag == 'style'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["id", "type", "media", "title", "xml:space"])
+                       let attrs = coreattrs + ["id", "type", "media", "title", "xml:space"]
                elseif tag == 'table'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["summary", "width", "border", "frame", "rules" "cellspacing", "cellpadding"])
+                       let attrs = coreattrs + ["summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding"]
                elseif tag =~ '^\(thead\|tfoot\|tbody\|tr\)$'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["align", "char", "charoff", "valign"])
+                       let attrs = coreattrs + ["align", "char", "charoff", "valign"]
                elseif tag == 'textarea'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, g:focus)
-                       let attrs = extend(attrs, ["name", "rows", "cols", "disabled", "readonly", "onselect", "onchange"])
+                       let attrs = coreattrs + focus + ["name", "rows", "cols", "disabled", "readonly", "onselect", "onchange"]
                elseif tag =~ '^\(th\|td\)$'
-                       let attrs = g:coreattrs
-                       let attrs = extend(attrs, ["abbr", "headers", "scope", "rowspan", "colspan", "align", "char", "charoff", "valign"])
+                       let attrs = coreattrs + ["abbr", "headers", "scope", "rowspan", "colspan", "align", "char", "charoff", "valign"]
+               else
+                       return []
                endif
 
                for m in sort(attrs)
-                       if m =~ attr
-                               if m =~ '^\(ismap\|defer\|declare\|nohref\|checked\|disabled\|selected\|readonly\)$'
+                       if m =~ '^'.attr
+                               if m =~ '^\(ismap\|defer\|declare\|nohref\|checked\|disabled\|selected\|readonly\)$' || m =~ '='
                                        call add(res, sbase.' '.m)
                                else
                                        call add(res, sbase.' '.m.'="')
                                endif
+                       elseif m =~ attr
+                               if m =~ '^\(ismap\|defer\|declare\|nohref\|checked\|disabled\|selected\|readonly\)$' || m =~ '='
+                                       call add(res2, sbase.' '.m)
+                               else
+                                       call add(res2, sbase.' '.m.'="')
+                               endif
                        endif
                endfor
-               return res
+
+               return res + res2
+
        endif
        " Close tag
        let b:unaryTagsStack = "base meta link hr br param img area input col"
@@ -258,17 +373,17 @@ function! htmlcomplete#CompleteTags(findstart, base)
        elseif opentag == 'pre'
                let tags = split("a tt i b big small br span bdo map ".phrase." ".miscinline." ".inlineforms)
        elseif opentag == 'html'
-               let tags = split("head body")
+               let tags = ["head", "body"]
        elseif opentag == 'legend'
                let tags = split(inline." ".miscinline)
        elseif opentag == 'head'
-               let tags = split("title base scipt style meta link object")
+               let tags = ["title", "base", "scipt", "style", "meta", "link", "object"]
        elseif opentag =~ '^\(noscript\|body\|blockquote\)$'
                let tags = split("form ".block." ".misc)
        elseif opentag =~ '^\(ul\|ol\)$'
                let tags = ["li"]
        elseif opentag == 'dl'
-               let tags = split("dt dd")
+               let tags = ["dt", "dd"]
        elseif opentag =~ '^\(ins\|del\|th\|td\|dd\|div\|li\)$'
                let tags = split("form ".block." ".inline." ".misc)
        elseif opentag == 'object'
@@ -280,30 +395,34 @@ function! htmlcomplete#CompleteTags(findstart, base)
        elseif opentag == 'form'
                let tags = split(block." ".misc)
        elseif opentag == 'select'
-               let tags = split("optgroup option")
+               let tags = ["optgroup", "option"]
        elseif opentag == 'optgroup'
                let tags = ["option"]
        elseif opentag == 'colgroup'
                let tags = ["col"]
        elseif opentag == '^\(textarea\|option\|script\|style\|title\)$'
-               let tags = []
+               let tags = ['empty']
        elseif opentag == 'button'
-               let tags = split("p h1 h2 h3 h4 h5 h6 div ul ol dl table")
-       elseif opentag =~ '^\(thead\|tfoot\|tbody)$'
+               let tags = ["p", "h1", "h2", "h3", "h4", "h5", "h6", "div", "ul", "ol", "dl", "table"]
+       elseif opentag =~ '^\(thead\|tfoot\|tbody\)$'
                let tags = ["tr"]
        elseif opentag == 'tr'
-               let tags = split("th td")
+               let tags = ["th", "td"]
        elseif opentag == 'table'
-               let tags = split("caption col colgroup thead tfoot tbody tr")
+               let tags = ["caption", "col", "colgroup", "thead", "tfoot", "tbody", "tr"]
+       else
+               return []
        endif
 
        for m in tags
-               if m =~ a:base
+               if m =~ '^'.a:base
                        call add(res, m)
+               elseif m =~ a:base
+                       call add(res2, m)
                endif
        endfor
 
-       return res
+       return res + res2
 
   endif
 endfunction
@@ -316,10 +435,10 @@ endfunction
 " Version: 0.9.1
 
 function! htmlcomplete#GetLastOpenTag(unaryTagsStack)
-       let linenum=line(".")
-       let lineend=col(".") - 1 " start: cursor position
+       let linenum=line('.')
+       let lineend=col('.') - 1 " start: cursor position
        let first=1              " flag for first line searched
-       let b:TagStack=""        " main stack of tags
+       let b:TagStack=''        " main stack of tags
        let startInComment=s:InComment()
 
        let tagpat='</\=\(\k\|[-:]\)\+\|/>'
@@ -330,7 +449,7 @@ function! htmlcomplete#GetLastOpenTag(unaryTagsStack)
                else
                        let lineend=strlen(line)
                endif
-               let b:lineTagStack=""
+               let b:lineTagStack=''
                let mpos=0
                let b:TagCol=0
                while (mpos > -1)
@@ -339,46 +458,45 @@ function! htmlcomplete#GetLastOpenTag(unaryTagsStack)
                                let b:TagCol=b:TagCol+mpos
                                let tag=matchstr(line,tagpat)
 
-                               if exists("b:closetag_disable_synID") || startInComment==s:InCommentAt(linenum, b:TagCol)
+                               if exists('b:closetag_disable_synID') || startInComment==s:InCommentAt(linenum, b:TagCol)
                                        let b:TagLine=linenum
-                                       call s:Push(matchstr(tag,'[^<>]\+'),"b:lineTagStack")
+                                       call s:Push(matchstr(tag,'[^<>]\+'),'b:lineTagStack')
                                endif
                                let lineend=lineend-mpos
                                let line=strpart(line,mpos,lineend)
                        endif
                endwhile
-               while (!s:EmptystackP("b:lineTagStack"))
-                       let tag=s:Pop("b:lineTagStack")
-                       if match(tag, "^/") == 0                "found end tag
-                               call s:Push(tag,"b:TagStack")
-                       elseif s:EmptystackP("b:TagStack") && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag
+               while (!s:EmptystackP('b:lineTagStack'))
+                       let tag=s:Pop('b:lineTagStack')
+                       if match(tag, '^/') == 0                "found end tag
+                               call s:Push(tag,'b:TagStack')
+                       elseif s:EmptystackP('b:TagStack') && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag
                                return tag
                        else
-                               let endtag=s:Peekstack("b:TagStack")
-                               if endtag == "/".tag || endtag == "/"
-                               call s:Pop("b:TagStack")        "found a open/close tag pair
-                       elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error
-                               return ""
+                               let endtag=s:Peekstack('b:TagStack')
+                               if endtag == '/'.tag || endtag == '/'
+                                       call s:Pop('b:TagStack')        "found a open/close tag pair
+                               elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error
+                                       return ''
+                               endif
                        endif
-               endif
+               endwhile
+               let linenum=linenum-1 | let first=0
        endwhile
-       let linenum=linenum-1 | let first=0
-endwhile
-return ""
+return ''
 endfunction
 
 function! s:InComment()
-       return synIDattr(synID(line("."), col("."), 0), "name") =~ 'Comment'
+       return synIDattr(synID(line('.'), col('.'), 0), 'name') =~ 'Comment'
 endfunction
 
 function! s:InCommentAt(line, col)
-       return synIDattr(synID(a:line, a:col, 0), "name") =~ 'Comment'
+       return synIDattr(synID(a:line, a:col, 0), 'name') =~ 'Comment'
 endfunction
 
-
 function! s:SetKeywords()
        let g:IsKeywordBak=&iskeyword
-       let &iskeyword="33-255"
+       let &iskeyword='33-255'
 endfunction
 
 function! s:RestoreKeywords()
@@ -387,15 +505,15 @@ endfunction
 
 function! s:Push(el, sname)
        if !s:EmptystackP(a:sname)
-               exe "let ".a:sname."=a:el.' '.".a:sname
+               exe 'let '.a:sname."=a:el.' '.".a:sname
        else
-               exe "let ".a:sname."=a:el"
+               exe 'let '.a:sname.'=a:el'
        endif
 endfunction
 
 function! s:EmptystackP(sname)
-       exe "let stack=".a:sname
-       if match(stack,"^ *$") == 0
+       exe 'let stack='.a:sname
+       if match(stack,'^ *$') == 0
                return 1
        else
                return 0
@@ -403,9 +521,9 @@ function! s:EmptystackP(sname)
 endfunction
 
 function! s:Instack(el, sname)
-       exe "let stack=".a:sname
+       exe 'let stack='.a:sname
        call s:SetKeywords()
-       let m=match(stack, "\\<".a:el."\\>")
+       let m=match(stack, '\<'.a:el.'\>')
        call s:RestoreKeywords()
        if m < 0
                return 0
@@ -416,25 +534,25 @@ endfunction
 
 function! s:Peekstack(sname)
        call s:SetKeywords()
-       exe "let stack=".a:sname
-       let top=matchstr(stack, "\\<.\\{-1,}\\>")
+       exe 'let stack='.a:sname
+       let top=matchstr(stack, '\<.\{-1,}\>')
        call s:RestoreKeywords()
        return top
 endfunction
 
 function! s:Pop(sname)
        if s:EmptystackP(a:sname)
-               return ""
+               return ''
        endif
-       exe "let stack=".a:sname
+       exe 'let stack='.a:sname
        call s:SetKeywords()
-       let loc=matchend(stack,"\\<.\\{-1,}\\>")
-       exe "let ".a:sname."=strpart(stack, loc+1, strlen(stack))"
-       let top=strpart(stack, match(stack, "\\<"), loc)
+       let loc=matchend(stack,'\<.\{-1,}\>')
+       exe 'let '.a:sname.'=strpart(stack, loc+1, strlen(stack))'
+       let top=strpart(stack, match(stack, '\<'), loc)
        call s:RestoreKeywords()
        return top
 endfunction
 
 function! s:Clearstack(sname)
-       exe "let ".a:sname."=''"
+       exe 'let '.a:sname."=''"
 endfunction
index d1764affb5dcfaf7c1e353886c2f61089bffd906..1ea512e6070b24c07e3f8e3e8eec3ed593a8fd8d 100644 (file)
@@ -1,4 +1,4 @@
-*cmdline.txt*   For Vim version 7.0aa.  Last change: 2005 Jul 05
+*cmdline.txt*   For Vim version 7.0aa.  Last change: 2005 Sep 17
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -153,6 +153,7 @@ CTRL-R {0-9a-z"%#:-=.}                                      *c_CTRL-R* *c_<C-R>*
                                                        *c_CTRL-R_=*
                        '='     the expression register: you are prompted to
                                enter an expression (see |expression|)
+                               (doesn't work at the expression prompt)
                See |registers| about registers.  {not in Vi}
                Implementation detail: When using the |expression| register
                and invoking setcmdpos(), this sets the position before
@@ -191,7 +192,8 @@ CTRL-\ e {expr}                                             *c_CTRL-\_e*
                to finish it.  It's most useful in mappings though.  See
                |expression|.
                See |c_CTRL-R_=| for inserting the result of an expression.
-               Useful functions are |getcmdline()| and |getcmdpos()|.
+               Useful functions are |getcmdtype()|, |getcmdline()| and
+               |getcmdpos()|.
                The cursor position is unchanged, except when the cursor was
                at the end of the line, then it stays at the end.
                |setcmdpos()| can be used to set the cursor position.
@@ -203,7 +205,9 @@ CTRL-\ e {expr}                                             *c_CTRL-\_e*
                           :call setcmdpos(strlen(cmd))
                           :return cmd
                        :endfunc
-<
+<              This doesn't work recursively, thus not when already editing
+               an expression.
+
                                                        *c_CTRL-Y*
 CTRL-Y         When there is a modeless selection, copy the selection into
                the clipboard. |modeless-selection|
index 368b4447465899424d35f849ad0ae355aa31718c..ed6ee899aca24931a07c398ee7c873219005cda3 100644 (file)
@@ -1,4 +1,4 @@
-*eval.txt*      For Vim version 7.0aa.  Last change: 2005 Sep 15
+*eval.txt*      For Vim version 7.0aa.  Last change: 2005 Sep 20
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1520,6 +1520,7 @@ getcharmod( )                     Number  modifiers for the last typed character
 getbufvar( {expr}, {varname})          variable {varname} in buffer {expr}
 getcmdline()                   String  return the current command-line
 getcmdpos()                    Number  return cursor position in command-line
+getcmdtype()                   String  return the current command-line type
 getcwd()                       String  the current working directory
 getfperm( {fname})             String  file permissions of file {fname}
 getfsize( {fname})             Number  size in bytes of file {fname}
@@ -1550,7 +1551,8 @@ iconv( {expr}, {from}, {to})      String  convert encoding of {expr}
 indent( {lnum})                        Number  indent of line {lnum}
 index( {list}, {expr} [, {start} [, {ic}]])
                                Number  index in {list} where {expr} appears
-input( {prompt} [, {text}])    String  get input from the user
+input( {prompt} [, {text} [, {completion}]])
+                               String  get input from the user
 inputdialog( {p} [, {t} [, {c}]]) String  like input() but in a GUI dialog
 inputrestore()                 Number  restore typeahead
 inputsave()                    Number  save and clear typeahead
@@ -2533,14 +2535,27 @@ getcmdline()                                            *getcmdline()*
                |c_CTRL-R_=|.
                Example: >
                        :cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR>
-<              Also see |getcmdpos()| and |setcmdpos()|.
+<              Also see |getcmdtype()|, |getcmdpos()| and |setcmdpos()|.
 
 getcmdpos()                                            *getcmdpos()*
                Return the position of the cursor in the command line as a
                byte count.  The first column is 1.
                Only works when editing the command line, thus requires use of
                |c_CTRL-\_e| or |c_CTRL-R_=|.  Returns 0 otherwise.
-               Also see |setcmdpos()| and |getcmdline()|.
+               Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|.
+
+getcmdtype()                                           *getcmdtype()*
+               Return the current command-line type. Possible return values
+               are:
+                   /   Search forward command
+                   ?   Search backward command
+                   :   Ex-command mode
+                   @   Input mode
+                   >   Debug mode
+               Only works when editing the command line, thus requires use of
+               |c_CTRL-\_e| or |c_CTRL-R_=|.  Returns an empty string
+               otherwise.
+               Also see |getcmdpos()|, |setcmdpos()| and |getcmdline()|.
 
                                                        *getcwd()*
 getcwd()       The result is a String, which is the name of the current
@@ -2910,19 +2925,34 @@ index({list}, {expr} [, {start} [, {ic}]])                      *index()*
                        :if index(numbers, 123) >= 0
 
 
-input({prompt} [, {text}])                             *input()*
+input({prompt} [, {text} [, {completion}]])            *input()*
                The result is a String, which is whatever the user typed on
                the command-line.  The parameter is either a prompt string, or
                a blank string (for no prompt).  A '\n' can be used in the
-               prompt to start a new line.  The highlighting set with
-               |:echohl| is used for the prompt.  The input is entered just
-               like a command-line, with the same editing commands and
-               mappings.  There is a separate history for lines typed for
-               input().
+               prompt to start a new line.
+               The highlighting set with |:echohl| is used for the prompt.
+               The input is entered just like a command-line, with the same
+               editing commands and mappings.  There is a separate history
+               for lines typed for input().
+               Example: >
+                       :if input("Coffee or beer? ") == "beer"
+                       :  echo "Cheers!"
+                       :endif
+<
                If the optional {text} is present, this is used for the
-               default reply, as if the user typed this.
-               NOTE: This must not be used in a startup file, for the
-               versions that only run in GUI mode (e.g., the Win32 GUI).
+               default reply, as if the user typed this.  Example: >
+                       :let color = input("Color? ", "white")
+
+<              The optional {completion} argument specifies the type of
+               completion supported for the input.  Without it completion is
+               not performed.  The supported completion types are the same as
+               that can be supplied to a user-defined command using the
+               "-complete=" argument.  Refer to |:command-completion| for
+               more information.  Example: >
+                       let fname = input("File: ", "", "file")
+<
+               NOTE: This function must not be used in a startup file, for
+               the versions that only run in GUI mode (e.g., the Win32 GUI).
                Note: When input() is called from within a mapping it will
                consume remaining characters from that mapping, because a
                mapping is handled like the characters were typed.
@@ -2931,13 +2961,7 @@ input({prompt} [, {text}])                               *input()*
                that further characters follow in the mapping, e.g., by using
                |:execute| or |:normal|.
 
-               Example: >
-                       :if input("Coffee or beer? ") == "beer"
-                       :  echo "Cheers!"
-                       :endif
-<              Example with default text: >
-                       :let color = input("Color? ", "white")
-<              Example with a mapping: >
+               Example with a mapping: >
                        :nmap \x :call GetFoo()<CR>:exe "/" . Foo<CR>
                        :function GetFoo()
                        :  call inputsave()
@@ -2957,6 +2981,7 @@ inputdialog({prompt} [, {text} [, {cancelreturn}]])               *inputdialog()*
                omitted an empty string is returned.
                Hitting <Enter> works like pressing the OK button.  Hitting
                <Esc> works like pressing the Cancel button.
+               NOTE: Command-line completion is not supported.
 
 inputlist({textlist})                                  *inputlist()*
                {textlist} must be a list of strings.  This list is displayed,
@@ -2996,6 +3021,7 @@ inputsecret({prompt} [, {text}])                  *inputsecret()*
                |history| stack.
                The result is a String, which is whatever the user actually
                typed on the command-line in response to the issued prompt.
+               NOTE: Command-line completion is not supported.
 
 insert({list}, {item} [, {idx}])                       *insert()*
                Insert {item} at the start of List {list}.
@@ -4450,6 +4476,8 @@ winheight({nr})                                           *winheight()*
 winline()      The result is a Number, which is the screen line of the cursor
                in the window.  This is counting screen lines from the top of
                the window.  The first line is one.
+               If the cursor was moved the view on the file will be updated
+               first, this may cause a scroll.
 
                                                        *winnr()*
 winnr([{arg}]) The result is a Number, which is the number of the current
index ffbb7a3da94ebfcf37d26f41ee826dd939592c27..30fe2d4f1ff0a0f6645ea70d566dd0453bc7b482 100644 (file)
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 7.0aa.  Last change: 2005 Sep 15
+*insert.txt*    For Vim version 7.0aa.  Last change: 2005 Sep 18
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -990,16 +990,17 @@ are included.
 
 When using after CTRL-X CTRL-O after "<" it is completed with tag name
 available in current context. Inside of tag completion aids to choose
-proper attributes, and when possible choose appropriate attribute value.
+proper attributes, and when possible choose appropriate attribute value
+including class names for CSS styles.
 
 When used after "</" CTRL-X CTRL-O will close the last opened tag.
 
-File htmlcompletion.vim provides through autoload mechanism
+File htmlcomplete.vim provides through |autoload| mechanism
 GetLastOpenTag function which can be used in XML files to get name of
 last open tag with: >
 
-       :echo htmlcompletion#GetLastOpenTag("b:unaryTagsStack")
-<
+        :echo htmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+
 
 ==============================================================================
 8. Insert mode commands                                        *inserting*
index 451212233d049bcb6d935a2e357b5d127c690a09..cc4d2a8a73c2f37d7691dbdf72a46924df43c08e 100644 (file)
@@ -4992,6 +4992,7 @@ ft-fvwm-syntax    syntax.txt      /*ft-fvwm-syntax*
 ft-groff-syntax        syntax.txt      /*ft-groff-syntax*
 ft-gsp-syntax  syntax.txt      /*ft-gsp-syntax*
 ft-haskell-syntax      syntax.txt      /*ft-haskell-syntax*
+ft-html-omni   insert.txt      /*ft-html-omni*
 ft-html-syntax syntax.txt      /*ft-html-syntax*
 ft-htmlos-syntax       syntax.txt      /*ft-htmlos-syntax*
 ft-ia64-syntax syntax.txt      /*ft-ia64-syntax*
@@ -5163,6 +5164,7 @@ getchar() eval.txt        /*getchar()*
 getcharmod()   eval.txt        /*getcharmod()*
 getcmdline()   eval.txt        /*getcmdline()*
 getcmdpos()    eval.txt        /*getcmdpos()*
+getcmdtype()   eval.txt        /*getcmdtype()*
 getcwd()       eval.txt        /*getcwd()*
 getfontname()  eval.txt        /*getfontname()*
 getfperm()     eval.txt        /*getfperm()*
@@ -5294,6 +5296,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*
@@ -7319,6 +7322,13 @@ zf       fold.txt        /*zf*
 zg     spell.txt       /*zg*
 zh     scroll.txt      /*zh*
 zi     fold.txt        /*zi*
+zip    zip.txt /*zip*
+zip-contents   zip.txt /*zip-contents*
+zip-copyright  zip.txt /*zip-copyright*
+zip-history    zip.txt /*zip-history*
+zip-manual     zip.txt /*zip-manual*
+zip-usage      zip.txt /*zip-usage*
+zip.txt        zip.txt /*zip.txt*
 zj     fold.txt        /*zj*
 zk     fold.txt        /*zk*
 zl     scroll.txt      /*zl*
index cbd77d0ae34f09403d41374750280d6920de573c..6f353bc711c7883b3c11bea1ef5fa1fe58dfca72 100644 (file)
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Sep 16
+*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Sep 20
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -32,6 +32,20 @@ be worked on, but only if you sponsor Vim development.  See |sponsor|.
 
 Test11 fails sometimes. (athena, huge features)
 
+ml_get errors: :%s/^\_s\+$//gc
+And: Insert mode in one window, long file, click in other window, short file.
+
+'scrolljump' negative used as a percentage, e.g. -50 is 50% of window height?
+
+Spelling:
+- suggestion for "a an" includes "an an", which is marked bad.  Check
+  suggestions for not being a bad word (when split)?
+- CTRL-X s doesn't consider 'spellcapcheck'.
+- Have spellbadword() return a list with bad word and reason it's bad?
+  (rare/local/bad/caps)
+- spellsuggest() needs a way to require a capital.  A flag or context?
+- Underscore in REP items stands for space.
+
 ccomplete:
 - How to use a popup menu?
 - When a typedef or struct is local to a file only use it in that file?
@@ -1726,7 +1740,6 @@ Built-in script language:
        filecopy(from, to)      Copy a file
        shorten(fname)          shorten a file name, like home_replace()
        perl(cmd)               call Perl and return string
-       input(prompt, complete) like input() but do specified completion
        inputrl()               like input() but right-to-left
        virtualmode()           add argument to obtain whether "$" was used in
                                Visual block mode.
index e4e981bb6c9385e62e5d4604530cc137d01363bc..d9845715e3804e144e0f691531e5b5e67fb13e68 100644 (file)
@@ -447,6 +447,8 @@ New functions: ~
 |get()|                        get an item from a List or Dictionary
 |getbufline()|         get a list of lines from a specified buffer
                        (Yegappan Lakshmanan)
+|getcmdtype()|         return the current command-line type
+                       (Yegappan Lakshmanan)
 |getfontname()|        get actual font name being used
 |getfperm()|           get file permission string (Nikolai Weibull)
 |getftype()|           get type of file (Nikolai Weibull)
@@ -812,6 +814,9 @@ Also support t_SI and t_EI on Unix with normal features. (Ciaran McCreesh)
 When 'foldcolumn' is one then put as much info in it as possible.  This allows
 closing a fold with the mouse by clicking on the '-'.
 
+input() takes an optional completion argument to specify the type of
+completion supported for the input. (Yegappan Lakshmanan)
+
 ==============================================================================
 COMPILE TIME CHANGES                                   *compile-changes-7*
 
index 33f312a92939fc217a0dfdb517698399a17b8661..a09f895487bc653024a73456dbee4ad0e4a785ba 100644 (file)
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:  Bram Moolenaar <Bram@vim.org>
-" Last Change: 2005 Aug 29
+" Last Change: 2005 Sep 19
 
 " Listen very carefully, I will say this only once
 if exists("did_load_filetypes")
@@ -1882,6 +1882,9 @@ au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
 " Most of these should call s:StarSetf() to avoid names ending in .gz and the
 " like are used.
 
+" Asterisk config file
+au BufNewFile,BufRead *asterisk/*.conf*         call s:StarSetf('asterisk')
+
 " BIND zone
 au BufNewFile,BufRead /var/named/*             call s:StarSetf('bindzone')
 
index dd439efdd8e50f56f479a0946acdd9faa37bbdae..06a6d36196644eef01ec866bc00c9397abc6f37a 100644 (file)
@@ -1,7 +1,7 @@
 " Vim support file to detect file types in scripts
 "
 " Maintainer:  Bram Moolenaar <Bram@vim.org>
-" Last change: 2005 May 20
+" Last change: 2005 Sep 20
 
 " 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
@@ -182,6 +182,7 @@ else
     " - "Index: <filename>" in the first line (CVS file)
   elseif s:line1 =~ '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\)'
        \ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
+       \ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
        \ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
     set ft=diff
 
index 0bbe6998f060b0723585e71724c52f287bf62f3d..c6ebea958c7823efbb90e22c0910ee0cd87731aa 100644 (file)
Binary files a/runtime/spell/en.ascii.spl and b/runtime/spell/en.ascii.spl differ
index 4d6f5ae62a94dab9c439b319e697a10bf828a98a..fe6b90e7d87f5a7064da254412509e36822bda4f 100644 (file)
Binary files a/runtime/spell/en.latin1.spl and b/runtime/spell/en.latin1.spl differ
index d630a766375f76aabd4a809f6c6d26c34523c6d6..46ef9a5c808e3f8dc387562b9d86316b2a72cfb9 100644 (file)
Binary files a/runtime/spell/en.utf-8.spl and b/runtime/spell/en.utf-8.spl differ
index 17051dcf8c735bae59d6508a3e502daa15c4ffaa..f947be92aa903c6d447585bc88cc5e3e7bb33683 100644 (file)
@@ -1,5 +1,5 @@
 *** en_US.orig.aff     Fri Apr 15 13:20:36 2005
---- en_US.aff  Sun Jul 31 22:17:40 2005
+--- en_US.aff  Tue Sep 20 19:41:00 2005
 ***************
 *** 3,4 ****
 --- 3,134 ----
   SFX G   e     ing        e
 ! SFX G   0     ing        [^e]
   
+***************
+*** 99,101 ****
+  
+! REP 88
+  REP a ei
+--- 229,231 ----
+  
+! REP 91
+  REP a ei
 ***************
 *** 137,138 ****
 --- 267,270 ----
 + REP y ie
 + REP ie y
   REP i ee
+***************
+*** 174,175 ****
+--- 306,308 ----
+  REP ew ue
++ REP uf ough
+  REP uff ough
+***************
+*** 188 ****
+--- 321,325 ----
+  REP shun cion
++ REP the_the the
++ REP an_an an
++ REP an_a a
++ REP a_an an
 *** en_US.orig.dic     Fri Apr 15 13:20:36 2005
 --- en_US.dic  Tue Aug 16 17:03:31 2005
 ***************
index d66d76dbf41337d93be5a3374f391382a5c337f0..bc068fd89d10a8adef7918747e1aad89a9e57963 100644 (file)
 + REP zoz z.o.z.
 + 
 *** nl_NL.orig.dic     Sun Jul  3 18:24:07 2005
---- nl_NL.dic  Sat Aug 13 14:10:15 2005
+--- nl_NL.dic  Mon Sep 19 20:25:09 2005
 ***************
 *** 1,3 ****
   119937
   voorjaarsmoeheid
 ***************
 *** 119938 ****
---- 119963,120139 ----
+--- 119963,120142 ----
   Ã¼berhaupt
 + Christiaan/X
 + Fred/X
 + bijv.
 + Gerard
 + Google
++ Luc
 + Luuk
++ Gert
++ Marion
diff --git a/runtime/syntax/asterisk.vim b/runtime/syntax/asterisk.vim
new file mode 100644 (file)
index 0000000..c4e2b15
--- /dev/null
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language:    Asterisk config file
+" Maintainer:  brc007
+" Last Change: 2005 Sep 19
+" version 0.2
+"
+" Additional changes made 2005 Mar 7 by Corydon76
+" * CVS priority, including n and s, and new label definitions
+" * ENV( and LEN( support
+" * Class patterns in extensions now match only the class pattern (instead of to a following expression)
+" * anthm's functions are matched
+" * Variables now appear in their own colors inside expressions
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+  syntax clear
+elseif exists("b:current_syntax")
+  finish
+endif
+
+"testing only
+syn sync clear
+syn sync fromstart
+
+
+syn keyword    asteriskTodo    TODO contained
+syn match      asteriskComment         ";.*" contains=asteriskTodo
+syn match       asteriskContext         "\[.\{-}\]"
+syn match      asteriskExten           "^\s*exten\s*=>"
+syn match       asteriskApp             "\s*,\s*\zs[a-zA-Z]*\ze"
+" Digits plus oldlabel (newlabel)
+syn match       asteriskPriority        ",[[:digit:]]\+\(+[[:alpha:]][[:alnum:]_]*\)\?\(([[:alpha:]][[:alnum:]_]*)\)\?,"
+" s or n plus digits (newlabel)
+syn match       asteriskPriority        ",[sn]\(+[[:digit:]]\+\)\?\(([[:alpha:]][[:alnum:]_]*)\)\?,"
+syn match       asteriskIncludeBad "^\s*#\s*[[:alnum:]]*"
+syn match       asteriskInclude                "^\s#\sinclude\s.*"
+syn match       asteriskVar             "\${_\{0,2}[[:alpha:]][[:alnum:]_]*\(:[[:digit:]]\+\)\{0,2}}"
+syn match       asteriskVarLen          "\${_\{0,2}[[:alpha:]][[:alnum:]_]*(.\{-})}" contains=asteriskVar,asteriskVarLen,asteriskExp
+syn match       asteriskExp             "\$\[.\{-}\]" contains=asteriskVar,asteriskVarLen,asteriskExp
+syn match       asteriskFunc            "\$([[:alpha:]][[:alnum:]_]*.*)" contains=asteriskVar,asteriskVarLen,asteriskExp
+
+" 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
+:if version >= 508 || !exists("did_conf_syntax_inits")
+  if version < 508
+    let did_conf_syntax_inits = 1
+    command -nargs=+ HiLink hi link <args>
+  else
+    command -nargs=+ HiLink hi def link <args>
+  endif
+
+
+  HiLink       asteriskComment Comment
+" not sure what type this should be, using String for testing.
+  HiLink       asteriskExten   String
+" same here
+  HiLink       asteriskContext         Identifier 
+  HiLink        asteriskApplication     Statement
+  HiLink        asteriskInclude                Preproc 
+  HiLink        asteriskIncludeBad  Error
+  HiLink       asteriskPriority        Preproc 
+  HiLink        asteriskVar             String
+  HiLink        asteriskVarLen          Function
+  HiLink        asteriskExp             Type
+ delcommand HiLink
+endif
+
+
+let b:current_syntax = "asterisk" 
+
+" vim: ts=8 sw=2
index f2af8e27446f32146b1dca3030f7f9c8e6952b48..b6f936e8f190cf724de1ae82aa7db625ca83f9cf 100644 (file)
@@ -668,18 +668,18 @@ ex_diffupdate(eap)
     for (;;)
     {
        ok = FALSE;
-       fd = fopen((char *)tmp_orig, "w");
+       fd = mch_fopen((char *)tmp_orig, "w");
        if (fd != NULL)
        {
            fwrite("line1\n", (size_t)6, (size_t)1, fd);
            fclose(fd);
-           fd = fopen((char *)tmp_new, "w");
+           fd = mch_fopen((char *)tmp_new, "w");
            if (fd != NULL)
            {
                fwrite("line2\n", (size_t)6, (size_t)1, fd);
                fclose(fd);
                diff_file(tmp_orig, tmp_new, tmp_diff);
-               fd = fopen((char *)tmp_diff, "r");
+               fd = mch_fopen((char *)tmp_diff, "r");
                if (fd != NULL)
                {
                    char_u      linebuf[LBUFLEN];
@@ -1144,7 +1144,7 @@ diff_read(idx_orig, idx_new, fname)
     long       count_orig, count_new;
     int                notset = TRUE;      /* block "*dp" not set yet */
 
-    fd = fopen((char *)fname, "r");
+    fd = mch_fopen((char *)fname, "r");
     if (fd == NULL)
     {
        EMSG(_("E98: Cannot read diff output"));
index e087b7aabe679aa531b558d01f45436276a417cb..2365b3fedef76addc8e06cd863a3f5741524ee10 100644 (file)
@@ -504,6 +504,7 @@ static void f_getchar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getcharmod __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getcmdline __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getcmdpos __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_getcmdtype __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getcwd __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getfontname __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getfperm __ARGS((typval_T *argvars, typval_T *rettv));
@@ -6769,6 +6770,7 @@ static struct fst
     {"getcharmod",     0, 0, f_getcharmod},
     {"getcmdline",     0, 0, f_getcmdline},
     {"getcmdpos",      0, 0, f_getcmdpos},
+    {"getcmdtype",     0, 0, f_getcmdtype},
     {"getcwd",         0, 0, f_getcwd},
     {"getfontname",    0, 1, f_getfontname},
     {"getfperm",       1, 1, f_getfperm},
@@ -6799,7 +6801,7 @@ static struct fst
     {"iconv",          3, 3, f_iconv},
     {"indent",         1, 1, f_indent},
     {"index",          2, 4, f_index},
-    {"input",          1, 2, f_input},
+    {"input",          1, 3, f_input},
     {"inputdialog",    1, 3, f_inputdialog},
     {"inputlist",      1, 1, f_inputlist},
     {"inputrestore",   0, 0, f_inputrestore},
@@ -9437,6 +9439,24 @@ f_getcmdpos(argvars, rettv)
     rettv->vval.v_number = get_cmdline_pos() + 1;
 }
 
+/*
+ * "getcmdtype()" function
+ */
+/*ARGSUSED*/
+    static void
+f_getcmdtype(argvars, rettv)
+    typval_T   *argvars;
+    typval_T   *rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = alloc(2);
+    if (rettv->vval.v_string != NULL)
+    {
+       rettv->vval.v_string[0] = get_cmdline_type();
+       rettv->vval.v_string[1] = NUL;
+    }
+}
+
 /*
  * "getcwd()" function
  */
@@ -10794,6 +10814,8 @@ f_input(argvars, rettv)
     char_u     buf[NUMBUFLEN];
     int                cmd_silent_save = cmd_silent;
     char_u     *defstr = (char_u *)"";
+    int                xp_type = EXPAND_NOTHING;
+    char_u     *xp_arg = NULL;
 
     rettv->v_type = VAR_STRING;
 
@@ -10835,9 +10857,31 @@ f_input(argvars, rettv)
                stuffReadbuffSpec(defstr);
        }
 
+       if (argvars[2].v_type != VAR_UNKNOWN)
+       {
+           char_u      *xp_name;
+           int         xp_namelen;
+           long        argt;
+
+           rettv->vval.v_string = NULL;
+
+           xp_name = get_tv_string_buf_chk(&argvars[2], buf);
+           if (xp_name == NULL)
+               return;
+
+           xp_namelen = STRLEN(xp_name);
+
+           if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt, &xp_arg)
+                                                                     == FAIL)
+               return;
+       }
+
        if (defstr != NULL)
            rettv->vval.v_string =
-               getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr);
+               getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr,
+                                 xp_type, xp_arg);
+
+       vim_free(xp_arg);
 
        /* since the user typed this, no need to wait for return */
        need_wait_return = FALSE;
@@ -17680,10 +17724,8 @@ list_func_head(fp, indent)
     }
     msg_putchar(')');
     msg_clr_eos();
-#ifdef FEAT_EVAL
     if (p_verbose > 0)
        last_set_msg(fp->uf_script_ID);
-#endif
 }
 
 /*
index 529baf7b32f620b0691cf3423136f1435d9103fa..c35ad38622d77c546545d2348dcf321e17a5f0a8 100644 (file)
@@ -5688,7 +5688,7 @@ fix_help_buffer()
                        {
                            for (fi = 0; fi < fcount; ++fi)
                            {
-                               fd = fopen((char *)fnames[fi], "r");
+                               fd = mch_fopen((char *)fnames[fi], "r");
                                if (fd != NULL)
                                {
                                    vim_fgets(IObuff, IOSIZE, fd);
@@ -5953,7 +5953,7 @@ helptags_one(dir, ext, tagfname)
     STRCPY(NameBuff, dir);
     add_pathsep(NameBuff);
     STRCAT(NameBuff, tagfname);
-    fd_tags = fopen((char *)NameBuff, "w");
+    fd_tags = mch_fopen((char *)NameBuff, "w");
     if (fd_tags == NULL)
     {
        EMSG2(_("E152: Cannot open %s for writing"), NameBuff);
@@ -5988,7 +5988,7 @@ helptags_one(dir, ext, tagfname)
      */
     for (fi = 0; fi < filecount && !got_int; ++fi)
     {
-       fd = fopen((char *)files[fi], "r");
+       fd = mch_fopen((char *)files[fi], "r");
        if (fd == NULL)
        {
            EMSG2(_("E153: Unable to open %s for reading"), files[fi]);
index bd8d748e85714cc3dfd631085af096e13a71d0b3..c635bfc4ce7733ec6a70c5a660f4454d298987c8 100644 (file)
@@ -167,7 +167,7 @@ do_debug(cmd)
        if (!debug_greedy)
            save_typeahead(&typeaheadbuf);
 
-       cmdline = getcmdline_prompt('>', NULL, 0);
+       cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL);
 
        if (!debug_greedy)
            restore_typeahead(&typeaheadbuf);
@@ -1031,7 +1031,7 @@ profile_dump()
 
     if (profile_fname != NULL)
     {
-       fd = fopen((char *)profile_fname, "w");
+       fd = mch_fopen((char *)profile_fname, "w");
        if (fd == NULL)
            EMSG2(_(e_notopen), profile_fname);
        else
@@ -1149,7 +1149,7 @@ script_dump_profile(fd)
            fprintf(fd, "\n");
            fprintf(fd, "count  total (s)   self (s)\n");
 
-           sfd = fopen((char *)si->sn_name, "r");
+           sfd = mch_fopen((char *)si->sn_name, "r");
            if (sfd == NULL)
                fprintf(fd, "Cannot open file!\n");
            else
index 6e6e2971fa03c2c3ff071978dad4b597a6413995..72ffc18c47a8a03aceced7555ff0b1e213ddcba3 100644 (file)
@@ -5267,66 +5267,15 @@ invalid_count:
        }
        else if (STRNICMP(attr, "complete", attrlen) == 0)
        {
-           char_u      *arg = NULL;
-           size_t      arglen = 0;
-
            if (val == NULL)
            {
-               EMSG(_("E179: argument required for complete"));
+               EMSG(_("E179: argument required for -complete"));
                return FAIL;
            }
-           /* Look for any argument part - which is the part after any ',' */
-           for (i = 0; i < (int)vallen; ++i)
-           {
-               if (val[i] == ',')
-               {
-                   arg = &val[i + 1];
-                   arglen = vallen - i - 1;
-                   vallen = i;
-                   break;
-               }
-           }
-
-           for (i = 0; command_complete[i].expand != 0; ++i)
-           {
-               if (STRLEN(command_complete[i].name) == vallen
-                       && STRNCMP(val, command_complete[i].name, vallen) == 0)
-               {
-                   *compl = command_complete[i].expand;
-                   if (command_complete[i].expand == EXPAND_BUFFERS)
-                       *argt |= BUFNAME;
-                   else if (command_complete[i].expand == EXPAND_DIRECTORIES
-                           || command_complete[i].expand == EXPAND_FILES)
-                       *argt |= XFILE;
-                   break;
-               }
-           }
 
-           if (command_complete[i].expand == 0)
-           {
-               EMSG2(_("E180: Invalid complete value: %s"), val);
-               return FAIL;
-           }
-#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-           if (*compl != EXPAND_USER_DEFINED && *compl != EXPAND_USER_LIST &&
-               arg != NULL)
-#else
-           if (arg != NULL)
-#endif
-           {
-               EMSG(_("E468: Completion argument only allowed for custom completion"));
-               return FAIL;
-           }
-#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-           if ((*compl == EXPAND_USER_DEFINED || *compl == EXPAND_USER_LIST) &&
-               arg == NULL)
-           {
-               EMSG(_("E467: Custom completion requires a function argument"));
+           if (parse_compl_arg(val, (int)vallen, compl, argt, compl_arg)
+                                                                     == FAIL)
                return FAIL;
-           }
-           if (arg != NULL)
-               *compl_arg = vim_strnsave(arg, (int)arglen);
-#endif
        }
        else
        {
@@ -5914,6 +5863,86 @@ get_user_cmd_complete(xp, idx)
 
 #endif /* FEAT_USR_CMDS */
 
+#if defined(FEAT_USR_CMDS) || defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Parse a completion argument "value[vallen]".
+ * The detected completion goes in "*complp", argument type in "*argt".
+ * When there is an argument, for function and user defined completion, it's
+ * copied to allocated memory and stored in "*compl_arg".
+ * Returns FAIL if something is wrong.
+ */
+    int
+parse_compl_arg(value, vallen, complp, argt, compl_arg)
+    char_u     *value;
+    int                vallen;
+    int                *complp;
+    long       *argt;
+    char_u     **compl_arg;
+{
+    char_u     *arg = NULL;
+    size_t     arglen = 0;
+    int                i;
+    int                valend = vallen;
+
+    /* Look for any argument part - which is the part after any ',' */
+    for (i = 0; i < vallen; ++i)
+    {
+       if (value[i] == ',')
+       {
+           arg = &value[i + 1];
+           arglen = vallen - i - 1;
+           valend = i;
+           break;
+       }
+    }
+
+    for (i = 0; command_complete[i].expand != 0; ++i)
+    {
+       if (STRLEN(command_complete[i].name) == valend
+               && STRNCMP(value, command_complete[i].name, valend) == 0)
+       {
+           *complp = command_complete[i].expand;
+           if (command_complete[i].expand == EXPAND_BUFFERS)
+               *argt |= BUFNAME;
+           else if (command_complete[i].expand == EXPAND_DIRECTORIES
+                   || command_complete[i].expand == EXPAND_FILES)
+               *argt |= XFILE;
+           break;
+       }
+    }
+
+    if (command_complete[i].expand == 0)
+    {
+       EMSG2(_("E180: Invalid complete value: %s"), value);
+       return FAIL;
+    }
+
+# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
+    if (*complp != EXPAND_USER_DEFINED && *complp != EXPAND_USER_LIST
+                                                              && arg != NULL)
+# else
+    if (arg != NULL)
+# endif
+    {
+       EMSG(_("E468: Completion argument only allowed for custom completion"));
+       return FAIL;
+    }
+
+# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
+    if ((*complp == EXPAND_USER_DEFINED || *complp == EXPAND_USER_LIST)
+                                                              && arg == NULL)
+    {
+       EMSG(_("E467: Custom completion requires a function argument"));
+       return FAIL;
+    }
+
+    if (arg != NULL)
+       *compl_arg = vim_strnsave(arg, (int)arglen);
+# endif
+    return OK;
+}
+#endif
+
     static void
 ex_colorscheme(eap)
     exarg_T    *eap;
index 6f6550b79f739581449ca9c4d16945ed1db17196..b69076fcc6dbffe227591a9c97a466b1d9803978 100644 (file)
@@ -31,6 +31,11 @@ struct cmdline_info
     int                cmdattr;        /* attributes for prompt */
     int                overstrike;     /* Typing mode on the command line.  Shared by
                                   getcmdline() and put_on_cmdline(). */
+    int                xp_context;     /* type of expansion */
+# ifdef FEAT_EVAL
+    char_u     *xp_arg;        /* user-defined expansion arg */
+    int                input_fn;       /* Invoked for input() function */
+# endif
 };
 
 static struct cmdline_info ccline;     /* current cmdline_info */
@@ -254,6 +259,15 @@ getcmdline(firstc, count, indent)
     xpc.xp_context = EXPAND_NOTHING;
     xpc.xp_backslash = XP_BS_NONE;
 
+#if defined(FEAT_EVAL)
+    if (ccline.input_fn)
+    {
+       xpc.xp_context = ccline.xp_context;
+       xpc.xp_pattern = ccline.cmdbuff;
+       xpc.xp_arg = ccline.xp_arg;
+    }
+#endif
+
     /*
      * Avoid scrolling when called by a recursive do_cmdline(), e.g. when
      * doing ":@0" when register 0 doesn't contain a CR.
@@ -414,6 +428,13 @@ getcmdline(firstc, count, indent)
            if (p_wmnu && wild_menu_showing != 0)
            {
                int skt = KeyTyped;
+               int old_RedrawingDisabled;
+
+               if (ccline.input_fn)
+               {
+                   old_RedrawingDisabled = RedrawingDisabled;
+                   RedrawingDisabled = 0;
+               }
 
                if (wild_menu_showing == WM_SCROLLED)
                {
@@ -442,6 +463,8 @@ getcmdline(firstc, count, indent)
 # endif
                    redraw_statuslines();
                }
+               if (ccline.input_fn)
+                   RedrawingDisabled = old_RedrawingDisabled;
                KeyTyped = skt;
                wild_menu_showing = 0;
            }
@@ -1791,10 +1814,12 @@ returncmd:
  * Returns the command line in allocated memory, or NULL.
  */
     char_u *
-getcmdline_prompt(firstc, prompt, attr)
+getcmdline_prompt(firstc, prompt, attr, xp_context, xp_arg)
     int                firstc;
     char_u     *prompt;        /* command line prompt */
     int                attr;           /* attributes for prompt */
+    int                xp_context;     /* type of expansion */
+    char_u     *xp_arg;        /* user-defined expansion argument */
 {
     char_u             *s;
     struct cmdline_info        save_ccline;
@@ -1803,6 +1828,11 @@ getcmdline_prompt(firstc, prompt, attr)
     save_cmdline(&save_ccline);
     ccline.cmdprompt = prompt;
     ccline.cmdattr = attr;
+# ifdef FEAT_EVAL
+    ccline.xp_context = xp_context;
+    ccline.xp_arg = xp_arg;
+    ccline.input_fn = (firstc == '@');
+# endif
     s = getcmdline(firstc, 1L, 0);
     restore_cmdline(&save_ccline);
     /* Restore msg_col, the prompt from input() may have changed it. */
@@ -1830,7 +1860,7 @@ cmdline_charsize(idx)
     static void
 set_cmdspos()
 {
-    if (ccline.cmdfirstc)
+    if (ccline.cmdfirstc != NUL)
        ccline.cmdspos = 1 + ccline.cmdindent;
     else
        ccline.cmdspos = 0 + ccline.cmdindent;
@@ -2222,7 +2252,7 @@ redrawcmd_preedit()
 
        old_row = msg_row;
        old_col = msg_col;
-       cmdspos = ((ccline.cmdfirstc) ? 1 : 0) + ccline.cmdindent;
+       cmdspos = ((ccline.cmdfirstc != NUL) ? 1 : 0) + ccline.cmdindent;
 
 # ifdef FEAT_MBYTE
        if (has_mbyte)
@@ -2813,14 +2843,14 @@ redrawcmdprompt()
 
     if (cmd_silent)
        return;
-    if (ccline.cmdfirstc)
+    if (ccline.cmdfirstc != NUL)
        msg_putchar(ccline.cmdfirstc);
     if (ccline.cmdprompt != NULL)
     {
        msg_puts_attr(ccline.cmdprompt, ccline.cmdattr);
        ccline.cmdindent = msg_col + (msg_row - cmdline_row) * Columns;
        /* do the reverse of set_cmdspos() */
-       if (ccline.cmdfirstc)
+       if (ccline.cmdfirstc != NUL)
            --ccline.cmdindent;
     }
     else
@@ -3843,6 +3873,7 @@ set_expand_context(xp)
     if (ccline.cmdfirstc != ':'
 #ifdef FEAT_EVAL
            && ccline.cmdfirstc != '>' && ccline.cmdfirstc != '='
+           && !ccline.input_fn
 #endif
            )
     {
@@ -3875,6 +3906,12 @@ set_cmd_context(xp, str, len, col)
     if (ccline.cmdfirstc == '=')
        /* pass CMD_SIZE because there is no real command */
        set_context_for_expression(xp, str, CMD_SIZE);
+    else if (ccline.input_fn)
+    {
+       xp->xp_context = ccline.xp_context;
+       xp->xp_pattern = ccline.cmdbuff;
+       xp->xp_arg = ccline.xp_arg;
+    }
     else
 #endif
        while (nextcomm != NULL)
@@ -4837,6 +4874,22 @@ set_cmdline_pos(pos)
     return 0;
 }
 
+/*
+ * Get the current command-line type.
+ * Returns ':' or '/' or '?' or '@' or '>'
+ * Only works when the command line is being edited.
+ * Returns NUL when something is wrong.
+ */
+    int
+get_cmdline_type()
+{
+    struct cmdline_info *p = get_ccline_ptr();
+
+    if (p == NULL)
+       return NUL;
+    return p->cmdfirstc;
+}
+
 /*
  * Calculate history index from a number:
  *   num > 0: seen as identifying number of a history entry
index d49d87b693b9f0904bbe65ef036cb70f039cbd76..916fdcb5d9397ffbbc5024d9028c7b0ad68ad86d 100644 (file)
@@ -3483,12 +3483,11 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
                }
                if (backup != NULL)
                {
-
                    /*
-                    * Delete any existing backup and move the current version to
-                    * the backup.      For safety, we don't remove the backup until
-                    * the write has finished successfully. And if the 'backup'
-                    * option is set, leave it around.
+                    * Delete any existing backup and move the current version
+                    * to the backup.   For safety, we don't remove the backup
+                    * until the write has finished successfully. And if the
+                    * 'backup' option is set, leave it around.
                     */
                    /*
                     * If the renaming of the original file to the backup file
index 7653308f19ef4c5c983882e566579e8343dcb7ad..24d7d065904da46eea5dd4916a8ce3d6dc602653 100644 (file)
@@ -1098,7 +1098,7 @@ cs_find_common(opt, pat, forceit, verbose)
        FILE *f;
        char_u *tmp = vim_tempname('c');
 
-       f = fopen((char *)tmp, "w");
+       f = mch_fopen((char *)tmp, "w");
        cs_file_results(f, nummatches);
        fclose(f);
        /* '-' starts a new error list */
index 0067b1c2f76d0cd48569b184f27a25703f1cf63f..898205e28016bd07953f5da3f4c61fb638dbef70 100644 (file)
@@ -201,7 +201,7 @@ main
 #endif
 
 #ifdef STARTUPTIME
-    time_fd = fopen(STARTUPTIME, "a");
+    time_fd = mch_fopen(STARTUPTIME, "a");
     TIME_MSG("--- VIM STARTING ---");
 #endif
 
index abdb9e8b3a3ef5968e62dad7a8123360ac2bff5e..d057266bfa81e710c9194c944590b7d921ce5a62 100644 (file)
@@ -161,7 +161,7 @@ xim_log(char *s, ...)
        return;
     if (fd == NULL)
     {
-       fd = fopen("xim.log", "w");
+       fd = mch_fopen("xim.log", "w");
        if (fd == NULL)
        {
            EMSG("Cannot open xim.log");
index b5329bc9cf90e77c02e754a6bfa447b39f2c75be..6daa365508b0f150ce7be586a6c2dc1fd07f7473 100644 (file)
@@ -3034,7 +3034,7 @@ verbose_open()
        /* Only give the error message once. */
        verbose_did_open = TRUE;
 
-       verbose_fd = fopen((char *)p_vfile, "a");
+       verbose_fd = mch_fopen((char *)p_vfile, "a");
        if (verbose_fd == NULL)
        {
            EMSG2(_(e_notopen), p_vfile);
index 3057415543a3a5a0bf088127bf394e8c89218949..e691aa96b9815b03f31eda570445b80f63c15c4e 100644 (file)
@@ -3512,7 +3512,8 @@ get_crypt_key(store, twice)
        cmdline_row = msg_row;
        p1 = getcmdline_prompt(NUL, round == 0
                ? (char_u *)_("Enter encryption key: ")
-               : (char_u *)_("Enter same key again: "), 0);
+               : (char_u *)_("Enter same key again: "), 0, EXPAND_NOTHING,
+               NULL);
        cmdline_star = FALSE;
 
        if (p1 == NULL)
index f4df30d766a06341defbef906e4838b3c135909f..25601e1713e88e79d3113c757d79c33efe54c2a6 100644 (file)
@@ -21,6 +21,7 @@ char_u *get_user_commands __ARGS((expand_T *xp, int idx));
 char_u *get_user_cmd_flags __ARGS((expand_T *xp, int idx));
 char_u *get_user_cmd_nargs __ARGS((expand_T *xp, int idx));
 char_u *get_user_cmd_complete __ARGS((expand_T *xp, int idx));
+int parse_compl_arg __ARGS((char_u *value, int vallen, int *complp, long *argt, char_u **compl_arg));
 void not_exiting __ARGS((void));
 void handle_drop __ARGS((int filec, char_u **filev, int split));
 void alist_clear __ARGS((alist_T *al));
index f0d45a31fe982a723dfb3d4594d9544cbd3a1db9..fe2752b8d94d831cbde3988fc46ec768473e34eb 100644 (file)
@@ -1,6 +1,6 @@
 /* ex_getln.c */
 char_u *getcmdline __ARGS((int firstc, long count, int indent));
-char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr));
+char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg));
 char_u *getexline __ARGS((int c, void *dummy, int indent));
 char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
 int cmdline_overstrike __ARGS((void));
@@ -33,6 +33,7 @@ int get_history_idx __ARGS((int histype));
 char_u *get_cmdline_str __ARGS((void));
 int get_cmdline_pos __ARGS((void));
 int set_cmdline_pos __ARGS((int pos));
+int get_cmdline_type __ARGS((void));
 char_u *get_history_entry __ARGS((int histype, int idx));
 int clr_history __ARGS((int histype));
 int del_history_entry __ARGS((int histype, char_u *str));
index 56f1671aea4374f2a7d10b25b2e63450cf688e87..113318782ef12b235218daadf3d7779c926755ff 100644 (file)
@@ -3056,7 +3056,7 @@ ex_helpgrep(eap)
                                           + STRLEN(fnames[fi]) - 3, 3) == 0))
                            continue;
 #endif
-                   fd = fopen((char *)fnames[fi], "r");
+                   fd = mch_fopen((char *)fnames[fi], "r");
                    if (fd != NULL)
                    {
                        lnum = 1;
index f4c9e71325154d4afc96e4cb0f8f4b1d76c87e22..0cb24adaee5cb355ec867cada4dc6d2dbf2682a8 100644 (file)
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT      "vim70aa"
 #define VIM_VERSION_SHORT      "7.0aa"
 #define VIM_VERSION_MEDIUM     "7.0aa ALPHA"
-#define VIM_VERSION_LONG       "VIM - Vi IMproved 7.0aa ALPHA (2005 Sep 16)"
-#define VIM_VERSION_LONG_DATE  "VIM - Vi IMproved 7.0aa ALPHA (2005 Sep 16, compiled "
+#define VIM_VERSION_LONG       "VIM - Vi IMproved 7.0aa ALPHA (2005 Sep 20)"
+#define VIM_VERSION_LONG_DATE  "VIM - Vi IMproved 7.0aa ALPHA (2005 Sep 20, compiled "