summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvimboss <devnull@localhost>2005-09-20 23:22:24 +0000
committervimboss <devnull@localhost>2005-09-20 23:22:24 +0000
commitb0c6743ef35aa793028a9191a03b37b0dfc05a60 (patch)
treef6b8a9bdb8bf573cea7862b3ab5ad41dfb5d1b46
parent3d12b72f75bd520aff8dd322fa9fbdcab385aa59 (diff)
downloadvim-7.0149.tar.gz
updated for version 7.0149v7.0149v7-0149
-rw-r--r--runtime/autoload/csscomplete.vim391
-rw-r--r--runtime/autoload/htmlcomplete.vim390
-rw-r--r--runtime/doc/cmdline.txt10
-rw-r--r--runtime/doc/eval.txt68
-rw-r--r--runtime/doc/insert.txt11
-rw-r--r--runtime/doc/tags10
-rw-r--r--runtime/doc/todo.txt17
-rw-r--r--runtime/doc/version7.txt5
-rw-r--r--runtime/filetype.vim5
-rw-r--r--runtime/scripts.vim3
-rw-r--r--runtime/spell/en.ascii.splbin566617 -> 566661 bytes
-rw-r--r--runtime/spell/en.latin1.splbin568721 -> 568765 bytes
-rw-r--r--runtime/spell/en.utf-8.splbin569152 -> 569196 bytes
-rw-r--r--runtime/spell/en/en_US.diff25
-rw-r--r--runtime/spell/nl/nl_NL.diff7
-rw-r--r--runtime/syntax/asterisk.vim73
-rw-r--r--src/diff.c8
-rw-r--r--src/eval.c50
-rw-r--r--src/ex_cmds.c6
-rw-r--r--src/ex_cmds2.c6
-rw-r--r--src/ex_docmd.c137
-rw-r--r--src/ex_getln.c63
-rw-r--r--src/fileio.c9
-rw-r--r--src/if_cscope.c2
-rw-r--r--src/main.c2
-rw-r--r--src/mbyte.c2
-rw-r--r--src/message.c2
-rw-r--r--src/misc2.c3
-rw-r--r--src/proto/ex_docmd.pro1
-rw-r--r--src/proto/ex_getln.pro3
-rw-r--r--src/quickfix.c2
-rw-r--r--src/version.h4
32 files changed, 1057 insertions, 258 deletions
diff --git a/runtime/autoload/csscomplete.vim b/runtime/autoload/csscomplete.vim
new file mode 100644
index 00000000..8ac36006
--- /dev/null
+++ b/runtime/autoload/csscomplete.vim
@@ -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
diff --git a/runtime/autoload/htmlcomplete.vim b/runtime/autoload/htmlcomplete.vim
index a9791451..ab509524 100644
--- a/runtime/autoload/htmlcomplete.vim
+++ b/runtime/autoload/htmlcomplete.vim
@@ -1,7 +1,7 @@
" Vim completion script
" Language: XHTML 1.0 Strict
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 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
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index d1764aff..1ea512e6 100644
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -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|
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 368b4447..ed6ee899 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 7.0aa. Last change: 2005 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
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index ffbb7a3d..30fe2d4f 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -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*
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 45121223..cc4d2a8a 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -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*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index cbd77d0a..6f353bc7 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt* For Vim version 7.0aa. Last change: 2005 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.
diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt
index e4e981bb..d9845715 100644
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -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*
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 33f312a9..a09f8954 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -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')
diff --git a/runtime/scripts.vim b/runtime/scripts.vim
index dd439efd..06a6d361 100644
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -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
diff --git a/runtime/spell/en.ascii.spl b/runtime/spell/en.ascii.spl
index 0bbe6998..c6ebea95 100644
--- a/runtime/spell/en.ascii.spl
+++ b/runtime/spell/en.ascii.spl
Binary files differ
diff --git a/runtime/spell/en.latin1.spl b/runtime/spell/en.latin1.spl
index 4d6f5ae6..fe6b90e7 100644
--- a/runtime/spell/en.latin1.spl
+++ b/runtime/spell/en.latin1.spl
Binary files differ
diff --git a/runtime/spell/en.utf-8.spl b/runtime/spell/en.utf-8.spl
index d630a766..46ef9a5c 100644
--- a/runtime/spell/en.utf-8.spl
+++ b/runtime/spell/en.utf-8.spl
Binary files differ
diff --git a/runtime/spell/en/en_US.diff b/runtime/spell/en/en_US.diff
index 17051dcf..f947be92 100644
--- a/runtime/spell/en/en_US.diff
+++ b/runtime/spell/en/en_US.diff
@@ -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 ----
@@ -165,12 +165,35 @@
! SFX G 0 ing [^e]
***************
+*** 99,101 ****
+
+! REP 88
+ REP a ei
+--- 229,231 ----
+
+! REP 91
+ REP a ei
+***************
*** 137,138 ****
--- 267,270 ----
REP uy i
+ 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
***************
diff --git a/runtime/spell/nl/nl_NL.diff b/runtime/spell/nl/nl_NL.diff
index d66d76db..bc068fd8 100644
--- a/runtime/spell/nl/nl_NL.diff
+++ b/runtime/spell/nl/nl_NL.diff
@@ -141,7 +141,7 @@
+ 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
@@ -259,7 +259,7 @@
voorjaarsmoeheid
***************
*** 119938 ****
---- 119963,120139 ----
+--- 119963,120142 ----
überhaupt
+ Christiaan/X
+ Fred/X
@@ -436,4 +436,7 @@
+ bijv.
+ Gerard
+ Google
++ Luc
+ Luuk
++ Gert
++ Marion
diff --git a/runtime/syntax/asterisk.vim b/runtime/syntax/asterisk.vim
new file mode 100644
index 00000000..c4e2b15f
--- /dev/null
+++ b/runtime/syntax/asterisk.vim
@@ -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
diff --git a/src/diff.c b/src/diff.c
index f2af8e27..b6f936e8 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -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"));
diff --git a/src/eval.c b/src/eval.c
index e087b7aa..2365b3fe 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -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},
@@ -9438,6 +9440,24 @@ f_getcmdpos(argvars, rettv)
}
/*
+ * "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
*/
/*ARGSUSED*/
@@ -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
}
/*
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 529baf7b..c35ad386 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -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]);
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index bd8d748e..c635bfc4 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -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
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 6e6e2971..72ffc18c 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -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;
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 6f6550b7..b69076fc 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -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)
@@ -4838,6 +4875,22 @@ set_cmdline_pos(pos)
}
/*
+ * 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
* num < 0: relative position in history wrt newest entry
diff --git a/src/fileio.c b/src/fileio.c
index d49d87b6..916fdcb5 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -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
diff --git a/src/if_cscope.c b/src/if_cscope.c
index 7653308f..24d7d065 100644
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -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 */
diff --git a/src/main.c b/src/main.c
index 0067b1c2..898205e2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -201,7 +201,7 @@ main
#endif
#ifdef STARTUPTIME
- time_fd = fopen(STARTUPTIME, "a");
+ time_fd = mch_fopen(STARTUPTIME, "a");
TIME_MSG("--- VIM STARTING ---");
#endif
diff --git a/src/mbyte.c b/src/mbyte.c
index abdb9e8b..d057266b 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -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");
diff --git a/src/message.c b/src/message.c
index b5329bc9..6daa3655 100644
--- a/src/message.c
+++ b/src/message.c
@@ -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);
diff --git a/src/misc2.c b/src/misc2.c
index 30574155..e691aa96 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -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)
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index f4df30d7..25601e17 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -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));
diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro
index f0d45a31..fe2752b8 100644
--- a/src/proto/ex_getln.pro
+++ b/src/proto/ex_getln.pro
@@ -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));
diff --git a/src/quickfix.c b/src/quickfix.c
index 56f1671a..11331878 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -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;
diff --git a/src/version.h b/src/version.h
index f4c9e713..0cb24ada 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
-#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 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 "