mirror of
https://github.com/zoriya/vim.git
synced 2025-12-18 13:15:21 +00:00
updated for version 7.0197
This commit is contained in:
@@ -41,7 +41,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
let start = col('.') - 1
|
let start = col('.') - 1
|
||||||
let b:jscompl = 1
|
let b:jscompl = 1
|
||||||
let b:jsrange = [scriptstart, scriptend]
|
let b:jsrange = [scriptstart, scriptend]
|
||||||
while start >= 0 && line[start - 1] =~ '\w'
|
while start >= 0 && line[start - 1] =~ '\k'
|
||||||
let start -= 1
|
let start -= 1
|
||||||
endwhile
|
endwhile
|
||||||
" We are inside of <script> tag. But we should also get contents
|
" We are inside of <script> tag. But we should also get contents
|
||||||
@@ -102,7 +102,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
" completion will be badly reported
|
" completion will be badly reported
|
||||||
if b:compl_context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
|
if b:compl_context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
|
||||||
let start = col('.') - 1
|
let start = col('.') - 1
|
||||||
while start >= 0 && line[start - 1] =~ '\w'
|
while start >= 0 && line[start - 1] =~ '\k'
|
||||||
let start -= 1
|
let start -= 1
|
||||||
endwhile
|
endwhile
|
||||||
endif
|
endif
|
||||||
@@ -178,13 +178,6 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Set attribute groups
|
|
||||||
let coreattrs = ["id", "class", "style", "title"]
|
|
||||||
let i18n = ["lang", "xml:lang", "dir=\"ltr\" ", "dir=\"rtl\" "]
|
|
||||||
let events = ["onclick", "ondblclick", "onmousedown", "onmouseup", "onmousemove",
|
|
||||||
\ "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup"]
|
|
||||||
let focus = ["accesskey", "tabindex", "onfocus", "onblur"]
|
|
||||||
let coregroup = coreattrs + i18n + events
|
|
||||||
" If context contains > it means we are already outside of tag and we
|
" If context contains > it means we are already outside of tag and we
|
||||||
" should abandon action
|
" should abandon action
|
||||||
" If context contains white space it is attribute.
|
" If context contains white space it is attribute.
|
||||||
@@ -403,12 +396,11 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
|
|
||||||
" 3. Proper call for javascriptcomplete#CompleteJS
|
" 3. Proper call for javascriptcomplete#CompleteJS
|
||||||
call cursor(l,c)
|
call cursor(l,c)
|
||||||
let js_context = matchstr(a:base, '\w\+$')
|
let js_context = matchstr(a:base, '\k\+$')
|
||||||
let js_shortcontext = substitute(a:base, js_context.'$', '', '')
|
let js_shortcontext = substitute(a:base, js_context.'$', '', '')
|
||||||
let b:compl_context = context
|
let b:compl_context = context
|
||||||
let b:jsrange = [l, l]
|
let b:jsrange = [l, l]
|
||||||
unlet! l c
|
unlet! l c
|
||||||
"return map(javascriptcomplete#CompleteJS(0, js_context), 'js_shortcontext.v:val')
|
|
||||||
return javascriptcomplete#CompleteJS(0, js_context)
|
return javascriptcomplete#CompleteJS(0, js_context)
|
||||||
|
|
||||||
endif
|
endif
|
||||||
@@ -501,95 +493,44 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
" Attribute completion {{{
|
" Attribute completion {{{
|
||||||
" Shorten context to not include last word
|
" Shorten context to not include last word
|
||||||
let sbase = matchstr(context, '.*\ze\s.*')
|
let sbase = matchstr(context, '.*\ze\s.*')
|
||||||
if tag =~ '^\(abbr\|acronym\|address\|b\|bdo\|big\|caption\|cite\|code\|dd\|dfn\|div\|dl\|dt\|em\|fieldset\|h\d\|hr\|i\|kbd\|li\|noscript\|ol\|p\|samp\|small\|span\|strong\|sub\|sup\|tt\|ul\|var\)$'
|
|
||||||
let attrs = coregroup
|
" Load data {{{
|
||||||
elseif tag == 'a'
|
if !exists("g:xmldata_xhtml10s")
|
||||||
let attrs = coregroup + focus + ["charset", "type", "name", "href", "hreflang", "rel", "rev", "shape", "coords"]
|
runtime! autoload/xml/xhtml10s.vim
|
||||||
elseif tag == 'area'
|
|
||||||
let attrs = coregroup + focus + ["shape", "coords", "href", "nohref", "alt"]
|
|
||||||
elseif tag == 'base'
|
|
||||||
let attrs = ["href", "id"]
|
|
||||||
elseif tag == 'blockquote'
|
|
||||||
let attrs = coregroup + ["cite"]
|
|
||||||
elseif tag == 'body'
|
|
||||||
let attrs = coregroup + ["onload", "onunload"]
|
|
||||||
elseif tag == 'br'
|
|
||||||
let attrs = coreattrs
|
|
||||||
elseif tag == 'button'
|
|
||||||
let attrs = coregroup + focus + ["name", "value", "type"]
|
|
||||||
elseif tag == '^\(col\|colgroup\)$'
|
|
||||||
let attrs = coregroup + ["span", "width", "align", "char", "charoff", "valign"]
|
|
||||||
elseif tag =~ '^\(del\|ins\)$'
|
|
||||||
let attrs = coregroup + ["cite", "datetime"]
|
|
||||||
elseif tag == 'form'
|
|
||||||
let attrs = coregroup + ["action", "method=\"get\" ", "method=\"post\" ", "enctype", "onsubmit", "onreset", "accept", "accept-charset"]
|
|
||||||
elseif tag == 'head'
|
|
||||||
let attrs = i18n + ["id", "profile"]
|
|
||||||
elseif tag == 'html'
|
|
||||||
let attrs = i18n + ["id", "xmlns"]
|
|
||||||
elseif tag == 'img'
|
|
||||||
let attrs = coregroup + ["src", "alt", "longdesc", "height", "width", "usemap", "ismap"]
|
|
||||||
elseif tag == 'input'
|
|
||||||
let attrs = coregroup + ["type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "onselect", "onchange", "accept"]
|
|
||||||
elseif tag == 'label'
|
|
||||||
let attrs = coregroup + ["for", "accesskey", "onfocus", "onblur"]
|
|
||||||
elseif tag == 'legend'
|
|
||||||
let attrs = coregroup + ["accesskey"]
|
|
||||||
elseif tag == 'link'
|
|
||||||
let attrs = coregroup + ["charset", "href", "hreflang", "type", "rel", "rev", "media"]
|
|
||||||
elseif tag == 'map'
|
|
||||||
let attrs = i18n + events + ["id", "class", "style", "title", "name"]
|
|
||||||
elseif tag == 'meta'
|
|
||||||
let attrs = i18n + ["id", "http-equiv", "content", "scheme", "name"]
|
|
||||||
elseif tag == 'title'
|
|
||||||
let attrs = i18n + ["id"]
|
|
||||||
elseif tag == 'object'
|
|
||||||
let attrs = coregroup + ["declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex"]
|
|
||||||
elseif tag == 'optgroup'
|
|
||||||
let attrs = coregroup + ["disbled", "label"]
|
|
||||||
elseif tag == 'option'
|
|
||||||
let attrs = coregroup + ["disbled", "selected", "value", "label"]
|
|
||||||
elseif tag == 'param'
|
|
||||||
let attrs = ["id", "name", "value", "valuetype", "type"]
|
|
||||||
elseif tag == 'pre'
|
|
||||||
let attrs = coregroup + ["xml:space"]
|
|
||||||
elseif tag == 'q'
|
|
||||||
let attrs = coregroup + ["cite"]
|
|
||||||
elseif tag == 'script'
|
|
||||||
let attrs = ["id", "charset", "type=\"text/javascript\"", "type", "src", "defer", "xml:space"]
|
|
||||||
elseif tag == 'select'
|
|
||||||
let attrs = coregroup + ["name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange"]
|
|
||||||
elseif tag == 'style'
|
|
||||||
let attrs = coreattrs + ["id", "type=\"text/css\"", "type", "media", "title", "xml:space"]
|
|
||||||
elseif tag == 'table'
|
|
||||||
let attrs = coregroup + ["summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding"]
|
|
||||||
elseif tag =~ '^\(thead\|tfoot\|tbody\|tr\)$'
|
|
||||||
let attrs = coregroup + ["align", "char", "charoff", "valign"]
|
|
||||||
elseif tag == 'textarea'
|
|
||||||
let attrs = coregroup + ["name", "rows", "cols", "disabled", "readonly", "onselect", "onchange"]
|
|
||||||
elseif tag =~ '^\(th\|td\)$'
|
|
||||||
let attrs = coregroup + ["abbr", "headers", "scope", "rowspan", "colspan", "align", "char", "charoff", "valign"]
|
|
||||||
else
|
|
||||||
return []
|
|
||||||
endif
|
endif
|
||||||
|
" }}}
|
||||||
|
"
|
||||||
|
let attrs = keys(g:xmldata_xhtml10s[tag][1])
|
||||||
|
|
||||||
for m in sort(attrs)
|
for m in sort(attrs)
|
||||||
if m =~ '^'.attr
|
if m =~ '^'.attr
|
||||||
if m =~ '^\(ismap\|defer\|declare\|nohref\|checked\|disabled\|selected\|readonly\)$' || m =~ '='
|
call add(res, m)
|
||||||
call add(res, m)
|
|
||||||
else
|
|
||||||
call add(res, m.'="')
|
|
||||||
endif
|
|
||||||
elseif m =~ attr
|
elseif m =~ attr
|
||||||
if m =~ '^\(ismap\|defer\|declare\|nohref\|checked\|disabled\|selected\|readonly\)$' || m =~ '='
|
call add(res2, m)
|
||||||
call add(res2, m)
|
|
||||||
else
|
|
||||||
call add(res2, m.'="')
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
let menu = res + res2
|
||||||
return res + res2
|
if has_key(g:xmldata_xhtml10s, 'vimxmlattrinfo')
|
||||||
|
let final_menu = []
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if has_key(g:xmldata_xhtml10s['vimxmlattrinfo'], item)
|
||||||
|
let m_menu = g:xmldata_xhtml10s['vimxmlattrinfo'][item][0]
|
||||||
|
let m_info = g:xmldata_xhtml10s['vimxmlattrinfo'][item][1]
|
||||||
|
if m_menu !~ 'Bool'
|
||||||
|
let item .= '="'
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let m_menu = ''
|
||||||
|
let m_info = ''
|
||||||
|
let item .= '="'
|
||||||
|
endif
|
||||||
|
let final_menu += [{'word':item, 'menu':m_menu, 'info':m_info}]
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
let final_menu = map(menu, 'v:val."=\""')
|
||||||
|
endif
|
||||||
|
return final_menu
|
||||||
|
|
||||||
endif
|
endif
|
||||||
" }}}
|
" }}}
|
||||||
@@ -625,8 +566,25 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
call add(res2, m)
|
call add(res2, m)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
let menu = res + res2
|
||||||
|
if has_key(g:xmldata_xhtml10s, 'vimxmltaginfo')
|
||||||
|
let final_menu = []
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if has_key(g:xmldata_xhtml10s['vimxmltaginfo'], item)
|
||||||
|
let m_menu = g:xmldata_xhtml10s['vimxmltaginfo'][item][0]
|
||||||
|
let m_info = g:xmldata_xhtml10s['vimxmltaginfo'][item][1]
|
||||||
|
else
|
||||||
|
let m_menu = ''
|
||||||
|
let m_info = ''
|
||||||
|
endif
|
||||||
|
let final_menu += [{'word':item, 'menu':m_menu, 'info':m_info}]
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
let final_menu = menu
|
||||||
|
endif
|
||||||
|
return final_menu
|
||||||
|
|
||||||
return res + res2
|
|
||||||
|
|
||||||
" }}}
|
" }}}
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
let compl_begin = col('.') - 2
|
let compl_begin = col('.') - 2
|
||||||
" Bit risky but JS is rather limited language and local chars shouldn't
|
" Bit risky but JS is rather limited language and local chars shouldn't
|
||||||
" fint way into names
|
" fint way into names
|
||||||
while start >= 0 && line[start - 1] =~ '\w'
|
while start >= 0 && line[start - 1] =~ '\k'
|
||||||
let start -= 1
|
let start -= 1
|
||||||
endwhile
|
endwhile
|
||||||
let b:compl_context = getline('.')[0:compl_begin]
|
let b:compl_context = getline('.')[0:compl_begin]
|
||||||
@@ -120,17 +120,17 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
let stris = striprop + strimeth
|
let stris = striprop + strimeth
|
||||||
|
|
||||||
" User created properties
|
" User created properties
|
||||||
let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"')
|
let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
|
||||||
let juser_props1 = join(user_props1, ' ')
|
let juser_props1 = join(user_props1, ' ')
|
||||||
let user_props1 = split(juser_props1, '\zethis\.')
|
let user_props1 = split(juser_props1, '\zethis\.')
|
||||||
unlet! juser_props1
|
unlet! juser_props1
|
||||||
call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")')
|
call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
|
||||||
|
|
||||||
let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"')
|
let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
|
||||||
let juser_props2 = join(user_props2, ' ')
|
let juser_props2 = join(user_props2, ' ')
|
||||||
let user_props2 = split(juser_props2, '\zeprototype\.')
|
let user_props2 = split(juser_props2, '\zeprototype\.')
|
||||||
unlet! juser_props2
|
unlet! juser_props2
|
||||||
call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\w\\+\\ze")')
|
call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")')
|
||||||
let user_props = user_props1 + user_props2
|
let user_props = user_props1 + user_props2
|
||||||
|
|
||||||
" HTML DOM properties
|
" HTML DOM properties
|
||||||
@@ -394,11 +394,11 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
" for regexp "= /re/"
|
" for regexp "= /re/"
|
||||||
" 4. Make correction for Microsoft.XMLHTTP ActiveXObject
|
" 4. Make correction for Microsoft.XMLHTTP ActiveXObject
|
||||||
" 5. Repeat for external files
|
" 5. Repeat for external files
|
||||||
let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$')
|
let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
|
||||||
if len(object) > 0
|
if len(object) > 0
|
||||||
let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
|
let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
|
||||||
if decl_line > 0
|
if decl_line > 0
|
||||||
let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
|
let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
|
||||||
if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
||||||
let object_type = 'XMLHttpRequest'
|
let object_type = 'XMLHttpRequest'
|
||||||
endif
|
endif
|
||||||
@@ -413,7 +413,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
if decl_line == 0 && exists("b:js_extfiles")
|
if decl_line == 0 && exists("b:js_extfiles")
|
||||||
let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
|
let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
|
||||||
if len(dext_line) > 0
|
if len(dext_line) > 0
|
||||||
let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\w\+\ze')
|
let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
|
||||||
if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
||||||
let object_type = 'XMLHttpRequest'
|
let object_type = 'XMLHttpRequest'
|
||||||
endif
|
endif
|
||||||
@@ -532,7 +532,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
" constructs like: var var1, var2, var3 = "something";
|
" constructs like: var var1, var2, var3 = "something";
|
||||||
for i in range(len(variables))
|
for i in range(len(variables))
|
||||||
let comma_separated = split(variables[i], ',\s*')
|
let comma_separated = split(variables[i], ',\s*')
|
||||||
call map(comma_separated, 'matchstr(v:val, "\\w\\+")')
|
call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
|
||||||
let vars += comma_separated
|
let vars += comma_separated
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
@@ -540,11 +540,11 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
unlet! vars
|
unlet! vars
|
||||||
|
|
||||||
" Add "no var" variables.
|
" Add "no var" variables.
|
||||||
let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
|
let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
|
||||||
let u_vars = []
|
let u_vars = []
|
||||||
for i in range(len(undeclared_variables))
|
for i in range(len(undeclared_variables))
|
||||||
let split_equal = split(undeclared_variables[i], '\s*=')
|
let split_equal = split(undeclared_variables[i], '\s*=')
|
||||||
call map(split_equal, 'matchstr(v:val, "\\w\\+$")')
|
call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
|
||||||
let u_vars += split_equal
|
let u_vars += split_equal
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
@@ -554,10 +554,20 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
" Get functions
|
" Get functions
|
||||||
let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
|
let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
|
||||||
let arguments = copy(functions)
|
let arguments = copy(functions)
|
||||||
call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")')
|
call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
|
||||||
call map(functions, 'v:val."("')
|
call map(functions, 'v:val."("')
|
||||||
let functions = sort(functions)
|
let functions = sort(functions)
|
||||||
|
|
||||||
|
" Create table to keep arguments for additional 'menu' info
|
||||||
|
let b:js_menuinfo = {}
|
||||||
|
for i in arguments
|
||||||
|
let g:ia = i
|
||||||
|
let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
|
||||||
|
if len(f_elements) == 3
|
||||||
|
let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
" Get functions arguments
|
" Get functions arguments
|
||||||
call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
|
call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
|
||||||
let jargs = join(arguments, ',')
|
let jargs = join(arguments, ',')
|
||||||
@@ -590,7 +600,26 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
return res + res2
|
let menu = res + res2
|
||||||
|
let final_menu = []
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if item =~ '($'
|
||||||
|
let kind = 'f'
|
||||||
|
if has_key(b:js_menuinfo, item)
|
||||||
|
let m_info = b:js_menuinfo[item]
|
||||||
|
else
|
||||||
|
let m_info = ''
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let kind = 'v'
|
||||||
|
let m_info = ''
|
||||||
|
endif
|
||||||
|
let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
|
||||||
|
endfor
|
||||||
|
let g:fm = final_menu
|
||||||
|
return final_menu
|
||||||
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" vim:set foldmethod=marker:
|
" vim:set foldmethod=marker:
|
||||||
|
|||||||
@@ -230,25 +230,42 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
|||||||
|
|
||||||
for m in sort(attrs)
|
for m in sort(attrs)
|
||||||
if m =~ '^'.attr
|
if m =~ '^'.attr
|
||||||
if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m][0] =~ '^BOOL$'
|
call add(res, m)
|
||||||
call add(res, m)
|
|
||||||
elseif m =~ '='
|
|
||||||
call add(res, m)
|
|
||||||
else
|
|
||||||
call add(res, m.'="')
|
|
||||||
endif
|
|
||||||
elseif m =~ attr
|
elseif m =~ attr
|
||||||
if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][m][0] =~ '^BOOL$'
|
call add(res2, m)
|
||||||
call add(res, m)
|
|
||||||
elseif m =~ '='
|
|
||||||
call add(res, m)
|
|
||||||
else
|
|
||||||
call add(res2, m.'="')
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
let menu = res + res2
|
||||||
return res + res2
|
let final_menu = []
|
||||||
|
if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, 'vimxmlattrinfo')
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'], item)
|
||||||
|
let m_menu = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'][item][0]
|
||||||
|
let m_info = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'][item][1]
|
||||||
|
else
|
||||||
|
let m_menu = ''
|
||||||
|
let m_info = ''
|
||||||
|
endif
|
||||||
|
if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
|
||||||
|
let item = item
|
||||||
|
else
|
||||||
|
let item .= '="'
|
||||||
|
endif
|
||||||
|
let final_menu += [{'word':item, 'menu':m_menu, 'info':m_info}]
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
|
||||||
|
let item = item
|
||||||
|
else
|
||||||
|
let item .= '="'
|
||||||
|
endif
|
||||||
|
let final_menu += [item]
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
return final_menu
|
||||||
|
|
||||||
endif
|
endif
|
||||||
" Close tag
|
" Close tag
|
||||||
@@ -308,21 +325,36 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
|||||||
let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
|
let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
|
||||||
let context = substitute(context, '^\k*:', '', '')
|
let context = substitute(context, '^\k*:', '', '')
|
||||||
|
|
||||||
if b:xml_namespace == 'DEFAULT'
|
|
||||||
let b:xml_namespace = ''
|
|
||||||
else
|
|
||||||
let b:xml_namespace .= ':'
|
|
||||||
endif
|
|
||||||
|
|
||||||
for m in tags
|
for m in tags
|
||||||
if m =~ '^'.context
|
if m =~ '^'.context
|
||||||
call add(res, b:xml_namespace.m)
|
call add(res, m)
|
||||||
elseif m =~ context
|
elseif m =~ context
|
||||||
call add(res2, b:xml_namespace.m)
|
call add(res2, m)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
let menu = res + res2
|
||||||
return res + res2
|
if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, 'vimxmltaginfo')
|
||||||
|
let final_menu = []
|
||||||
|
for i in range(len(menu))
|
||||||
|
let item = menu[i]
|
||||||
|
if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'], item)
|
||||||
|
let m_menu = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'][item][0]
|
||||||
|
let m_info = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'][item][1]
|
||||||
|
else
|
||||||
|
let m_menu = ''
|
||||||
|
let m_info = ''
|
||||||
|
endif
|
||||||
|
if b:xml_namespace == 'DEFAULT'
|
||||||
|
let xml_namespace = ''
|
||||||
|
else
|
||||||
|
let xml_namespace = b:xml_namespace.':'
|
||||||
|
endif
|
||||||
|
let final_menu += [{'word':xml_namespace.item, 'menu':m_menu, 'info':m_info}]
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
let final_menu = menu
|
||||||
|
endif
|
||||||
|
return final_menu
|
||||||
|
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 09
|
*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -471,6 +471,7 @@ CursorHoldI Just like CursorHold, but in Insert mode.
|
|||||||
CursorMoved After the cursor was moved in Normal mode.
|
CursorMoved After the cursor was moved in Normal mode.
|
||||||
Not triggered when there is typeahead or when
|
Not triggered when there is typeahead or when
|
||||||
an operator is pending.
|
an operator is pending.
|
||||||
|
For an example see |match-parens|.
|
||||||
Careful: Don't do anything that the user does
|
Careful: Don't do anything that the user does
|
||||||
not expect or that is slow.
|
not expect or that is slow.
|
||||||
*CursorMovedI*
|
*CursorMovedI*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*change.txt* For Vim version 7.0aa. Last change: 2005 Dec 16
|
*change.txt* For Vim version 7.0aa. Last change: 2006 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -1168,12 +1168,18 @@ The next three commands always work on whole lines.
|
|||||||
|
|
||||||
*gq*
|
*gq*
|
||||||
gq{motion} Format the lines that {motion} moves over.
|
gq{motion} Format the lines that {motion} moves over.
|
||||||
If 'formatprg' is empty formatting is done internally
|
Formatting is done with one of three methods:
|
||||||
and the 'textwidth' option controls the length of each
|
1. If 'formatexpr' is not empty the expression is
|
||||||
formatted line (see below).
|
evaluated. This can differ for each buffer.
|
||||||
|
2. If 'formatprg' is not mepty an external program
|
||||||
|
is used.
|
||||||
|
3. Otherise formatting is done internally.
|
||||||
|
|
||||||
|
In the third case the 'textwidth' option controls the
|
||||||
|
length of each formatted line (see below).
|
||||||
If the 'textwidth' option is 0, the formatted line
|
If the 'textwidth' option is 0, the formatted line
|
||||||
length is the screen width (with a maximum width of
|
length is the screen width (with a maximum width of
|
||||||
79). {not in Vi}
|
79).
|
||||||
The 'formatoptions' option controls the type of
|
The 'formatoptions' option controls the type of
|
||||||
formatting |fo-table|.
|
formatting |fo-table|.
|
||||||
The cursor is left on the first non-blank of the last
|
The cursor is left on the first non-blank of the last
|
||||||
@@ -1193,8 +1199,8 @@ gqq Format the current line. {not in Vi}
|
|||||||
*gw*
|
*gw*
|
||||||
gw{motion} Format the lines that {motion} moves over. Similar to
|
gw{motion} Format the lines that {motion} moves over. Similar to
|
||||||
|gq| but puts the cursor back at the same position in
|
|gq| but puts the cursor back at the same position in
|
||||||
the text. However, 'formatprg' is not used.
|
the text. However, 'formatprg' and 'formatexpr' are
|
||||||
{not in Vi}
|
not used. {not in Vi}
|
||||||
|
|
||||||
gwgw *gwgw* *gww*
|
gwgw *gwgw* *gww*
|
||||||
gww Format the current line as with "gw". {not in Vi}
|
gww Format the current line as with "gw". {not in Vi}
|
||||||
@@ -1225,9 +1231,10 @@ white space!).
|
|||||||
|
|
||||||
The 'joinspaces' option is used when lines are joined together.
|
The 'joinspaces' option is used when lines are joined together.
|
||||||
|
|
||||||
You can set the 'formatprg' option to the name of an external program for Vim
|
You can set the 'formatexpr' option to an expression or the 'formatprg' option
|
||||||
to use for text formatting. The 'textwidth' and other options have no effect
|
to the name of an external program for Vim to use for text formatting. The
|
||||||
on formatting by an external program.
|
'textwidth' and other options have no effect on formatting by an external
|
||||||
|
program.
|
||||||
|
|
||||||
*right-justify*
|
*right-justify*
|
||||||
There is no command in Vim to right justify text. You can do it with
|
There is no command in Vim to right justify text. You can do it with
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 10
|
*eval.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -1203,6 +1203,7 @@ v:count The count given for the last Normal mode command. Can be used
|
|||||||
:map _x :<C-U>echo "the count is " . v:count<CR>
|
:map _x :<C-U>echo "the count is " . v:count<CR>
|
||||||
< Note: The <C-U> is required to remove the line range that you
|
< Note: The <C-U> is required to remove the line range that you
|
||||||
get when typing ':' after a count.
|
get when typing ':' after a count.
|
||||||
|
Also used for evaluating the 'formatexpr' option.
|
||||||
"count" also works, for backwards compatibility.
|
"count" also works, for backwards compatibility.
|
||||||
|
|
||||||
*v:count1* *count1-variable*
|
*v:count1* *count1-variable*
|
||||||
@@ -1624,6 +1625,7 @@ nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum}
|
|||||||
nr2char( {expr}) String single char with ASCII value {expr}
|
nr2char( {expr}) String single char with ASCII value {expr}
|
||||||
prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum}
|
prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum}
|
||||||
printf( {fmt}, {expr1}...) String format text
|
printf( {fmt}, {expr1}...) String format text
|
||||||
|
pumvisible() Number whether popup menu is visible
|
||||||
range( {expr} [, {max} [, {stride}]])
|
range( {expr} [, {max} [, {stride}]])
|
||||||
List items from {expr} to {max}
|
List items from {expr} to {max}
|
||||||
readfile({fname} [, {binary} [, {max}]])
|
readfile({fname} [, {binary} [, {max}]])
|
||||||
@@ -1647,6 +1649,10 @@ searchdecl({name} [, {global} [, {thisblock}]])
|
|||||||
Number search for variable declaration
|
Number search for variable declaration
|
||||||
searchpair( {start}, {middle}, {end} [, {flags} [, {skip}]])
|
searchpair( {start}, {middle}, {end} [, {flags} [, {skip}]])
|
||||||
Number search for other end of start/end pair
|
Number search for other end of start/end pair
|
||||||
|
searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip}]])
|
||||||
|
List search for other end of start/end pair
|
||||||
|
searchpos( {pattern} [, {flags}])
|
||||||
|
List search for {pattern}
|
||||||
server2client( {clientid}, {string})
|
server2client( {clientid}, {string})
|
||||||
Number send reply string
|
Number send reply string
|
||||||
serverlist() String get a list of available servers
|
serverlist() String get a list of available servers
|
||||||
@@ -3471,6 +3477,15 @@ nr2char({expr}) *nr2char()*
|
|||||||
characters. nr2char(0) is a real NUL and terminates the
|
characters. nr2char(0) is a real NUL and terminates the
|
||||||
string, thus results in an empty string.
|
string, thus results in an empty string.
|
||||||
|
|
||||||
|
prevnonblank({lnum}) *prevnonblank()*
|
||||||
|
Return the line number of the first line at or above {lnum}
|
||||||
|
that is not blank. Example: >
|
||||||
|
let ind = indent(prevnonblank(v:lnum - 1))
|
||||||
|
< When {lnum} is invalid or there is no non-blank line at or
|
||||||
|
above it, zero is returned.
|
||||||
|
Also see |nextnonblank()|.
|
||||||
|
|
||||||
|
|
||||||
printf({fmt}, {expr1} ...) *printf()*
|
printf({fmt}, {expr1} ...) *printf()*
|
||||||
Return a String with {fmt}, where "%" items are replaced by
|
Return a String with {fmt}, where "%" items are replaced by
|
||||||
the formatted form of their respective arguments. Example: >
|
the formatted form of their respective arguments. Example: >
|
||||||
@@ -3598,13 +3613,10 @@ printf({fmt}, {expr1} ...) *printf()*
|
|||||||
arguments an error is given. Up to 18 arguments can be used.
|
arguments an error is given. Up to 18 arguments can be used.
|
||||||
|
|
||||||
|
|
||||||
prevnonblank({lnum}) *prevnonblank()*
|
pumvisible() *pumvisible()*
|
||||||
Return the line number of the first line at or above {lnum}
|
Returns non-zero when the popup menu is visible, zero
|
||||||
that is not blank. Example: >
|
otherwise. See |ins-completion-menu|.
|
||||||
let ind = indent(prevnonblank(v:lnum - 1))
|
|
||||||
< When {lnum} is invalid or there is no non-blank line at or
|
|
||||||
above it, zero is returned.
|
|
||||||
Also see |nextnonblank()|.
|
|
||||||
|
|
||||||
*E726* *E727*
|
*E726* *E727*
|
||||||
range({expr} [, {max} [, {stride}]]) *range()*
|
range({expr} [, {max} [, {stride}]]) *range()*
|
||||||
@@ -3714,9 +3726,9 @@ remote_send({server}, {string} [, {idvar}])
|
|||||||
Send the {string} to {server}. The string is sent as input
|
Send the {string} to {server}. The string is sent as input
|
||||||
keys and the function returns immediately. At the Vim server
|
keys and the function returns immediately. At the Vim server
|
||||||
the keys are not mapped |:map|.
|
the keys are not mapped |:map|.
|
||||||
If {idvar} is present, it is taken as the name of a
|
If {idvar} is present, it is taken as the name of a variable
|
||||||
variable and a {serverid} for later use with
|
and a {serverid} for later use with remote_read() is stored
|
||||||
remote_read() is stored there.
|
there.
|
||||||
See also |clientserver| |RemoteReply|.
|
See also |clientserver| |RemoteReply|.
|
||||||
This function is not available in the |sandbox|.
|
This function is not available in the |sandbox|.
|
||||||
{only available when compiled with the |+clientserver| feature}
|
{only available when compiled with the |+clientserver| feature}
|
||||||
@@ -3919,6 +3931,27 @@ searchpair({start}, {middle}, {end} [, {flags} [, {skip}]])
|
|||||||
|
|
||||||
:echo searchpair('{', '', '}', 'bW',
|
:echo searchpair('{', '', '}', 'bW',
|
||||||
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
|
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
|
||||||
|
<
|
||||||
|
*searchpairpos()*
|
||||||
|
searchpairpos({start}, {middle}, {end} [, {flags} [, {skip}]])
|
||||||
|
Same as searchpair(), but returns a List with the line and
|
||||||
|
column position of the match. The first element of the List is
|
||||||
|
the line number and the second element is the byte index of
|
||||||
|
the column position of the match. If no match is found,
|
||||||
|
returns [0, 0].
|
||||||
|
>
|
||||||
|
:let [lnum,col] = searchpairpos('{', '', '}', 'n')
|
||||||
|
<
|
||||||
|
See |match-parens| for a bigger and more useful example.
|
||||||
|
|
||||||
|
searchpos({pattern} [, {flags}]) *searchpos()*
|
||||||
|
Same as search(), but returns a List with the line and column
|
||||||
|
position of the match. The first element of the List is the
|
||||||
|
line number and the second element is the byte index of the
|
||||||
|
column position of the match. If no match is found, returns
|
||||||
|
[0, 0].
|
||||||
|
>
|
||||||
|
:let [lnum,col] = searchpos('mypattern', 'n')
|
||||||
<
|
<
|
||||||
server2client( {clientid}, {string}) *server2client()*
|
server2client( {clientid}, {string}) *server2client()*
|
||||||
Send a reply string to {clientid}. The most recent {clientid}
|
Send a reply string to {clientid}. The most recent {clientid}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*gui.txt* For Vim version 7.0aa. Last change: 2005 Aug 07
|
*gui.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -37,7 +37,8 @@ The X11 version of Vim can run both in GUI and in non-GUI mode. See
|
|||||||
|
|
||||||
*gui-init* *gvimrc* *.gvimrc* *_gvimrc*
|
*gui-init* *gvimrc* *.gvimrc* *_gvimrc*
|
||||||
When the GUI starts up initializations are carried out, in this order:
|
When the GUI starts up initializations are carried out, in this order:
|
||||||
- The termcap options are reset to their default value for the GUI.
|
- The 'term' option is set to "builgin_gui" and terminal options are reset to
|
||||||
|
their default value for the GUI |terminal-options|.
|
||||||
- If the system menu file exists, it is sourced. The name of this file is
|
- If the system menu file exists, it is sourced. The name of this file is
|
||||||
normally "$VIMRUNTIME/menu.vim". You can check this with ":version". Also
|
normally "$VIMRUNTIME/menu.vim". You can check this with ":version". Also
|
||||||
see |$VIMRUNTIME|. To skip loading the system menu include 'M' in
|
see |$VIMRUNTIME|. To skip loading the system menu include 'M' in
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*insert.txt* For Vim version 7.0aa. Last change: 2006 Feb 10
|
*insert.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -126,8 +126,10 @@ CTRL-R {0-9a-z"%#*+:.-=} *i_CTRL-R*
|
|||||||
'=' the expression register: you are prompted to
|
'=' the expression register: you are prompted to
|
||||||
enter an expression (see |expression|)
|
enter an expression (see |expression|)
|
||||||
Note that 0x80 (128 decimal) is used for
|
Note that 0x80 (128 decimal) is used for
|
||||||
special keys, use CTRL-R CTRL-R to insert it
|
special keys. E.g., you can use this to move
|
||||||
literally.
|
the cursor up:
|
||||||
|
CTRL-R ="\<Up>"
|
||||||
|
Use CTRL-R CTRL-R to insert text literally.
|
||||||
See |registers| about registers. {not in Vi}
|
See |registers| about registers. {not in Vi}
|
||||||
|
|
||||||
CTRL-R CTRL-R {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-R*
|
CTRL-R CTRL-R {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-R*
|
||||||
@@ -422,7 +424,7 @@ When 'textwidth' and 'wrapmargin' are both set, 'textwidth' is used.
|
|||||||
If you don't really want to break the line, but view the line wrapped at a
|
If you don't really want to break the line, but view the line wrapped at a
|
||||||
convenient place, see the 'linebreak' option.
|
convenient place, see the 'linebreak' option.
|
||||||
|
|
||||||
The line is only broken automatically when using insert mode, or when
|
The line is only broken automatically when using Insert mode, or when
|
||||||
appending to a line. When in replace mode and the line length is not
|
appending to a line. When in replace mode and the line length is not
|
||||||
changed, the line will not be broken.
|
changed, the line will not be broken.
|
||||||
|
|
||||||
@@ -438,6 +440,10 @@ characters to the 'formatoptions' option:
|
|||||||
current insert command. Only differs from "l" when entering non-white
|
current insert command. Only differs from "l" when entering non-white
|
||||||
characters while crossing the 'textwidth' boundary.
|
characters while crossing the 'textwidth' boundary.
|
||||||
|
|
||||||
|
Normally an internal function will be used to decide where to break the line.
|
||||||
|
If you want to do it in a different way set the 'formatexpr' option to an
|
||||||
|
expression that will take care of the line break.
|
||||||
|
|
||||||
If you want to format a block of text, you can use the "gq" operator. Type
|
If you want to format a block of text, you can use the "gq" operator. Type
|
||||||
"gq" and a movement command to move the cursor to the end of the block. In
|
"gq" and a movement command to move the cursor to the end of the block. In
|
||||||
many cases, the command "gq}" will do what you want (format until the end of
|
many cases, the command "gq}" will do what you want (format until the end of
|
||||||
@@ -622,8 +628,8 @@ CTRL-X CTRL-L Search backwards for a line that starts with the
|
|||||||
the cursor. Indent is ignored. The matching line is
|
the cursor. Indent is ignored. The matching line is
|
||||||
inserted in front of the cursor.
|
inserted in front of the cursor.
|
||||||
The 'complete' option is used to decide which buffers
|
The 'complete' option is used to decide which buffers
|
||||||
are searched for a match. Only loaded buffers are
|
are searched for a match. Both loaded and unloaded
|
||||||
used.
|
buffers are used.
|
||||||
CTRL-L or
|
CTRL-L or
|
||||||
CTRL-P Search backwards for next matching line. This line
|
CTRL-P Search backwards for next matching line. This line
|
||||||
replaces the previous matching line.
|
replaces the previous matching line.
|
||||||
@@ -1071,25 +1077,37 @@ The menu is used when:
|
|||||||
- The terminal supports at least 8 colors.
|
- The terminal supports at least 8 colors.
|
||||||
- There are at least two matches.
|
- There are at least two matches.
|
||||||
|
|
||||||
While the menu is displayed these keys have a special meaning:
|
There are two states:
|
||||||
<CR> and <Enter> Accept the currently selected match
|
1. A complete match has been inserted.
|
||||||
|
2. Only part of a match has been inserted.
|
||||||
|
|
||||||
<PageUp> Select a match several entries back
|
When "longest" is in 'completeopt' and there is more than one match you start
|
||||||
<PageDown> Select a match several entries further
|
in the second state.
|
||||||
|
|
||||||
|
In the first state these keys have a special meaning:
|
||||||
|
<BS> and CTRL-H Delete one character, find the matches for the word before
|
||||||
|
the cursor. This reduces the list of matches, often to one
|
||||||
|
entry. Switches to the second state.
|
||||||
|
|
||||||
|
In the second state these keys have a special meaning:
|
||||||
<BS> and CTRL-H Delete one character, find the matches for the shorter word
|
<BS> and CTRL-H Delete one character, find the matches for the shorter word
|
||||||
before the cursor. This may find more matches.
|
before the cursor. This may find more matches.
|
||||||
CTRL-L Add one character from the current match, may reduce the
|
CTRL-L Add one character from the current match, may reduce the
|
||||||
number of matches. Does not work after selecting one of the
|
number of matches.
|
||||||
matches with CTRL-N, <Up>, etc.
|
any printable character: Add this character and reduce the number of matches.
|
||||||
<Up> Select the previous match, as if CTRL-P was used, but don't
|
|
||||||
insert it when editing the selection.
|
In both states these can be used:
|
||||||
<Down> Select the next match, as if CTRL-N was used, but don't
|
<CR> and <Enter> Accept the currently selected match
|
||||||
insert it when editing the selection.
|
<PageUp> Select a match several entries back
|
||||||
|
<PageDown> Select a match several entries further
|
||||||
|
<Up> Select the previous match, as if CTRL-P was used, but don't
|
||||||
|
insert the newly selected word.
|
||||||
|
<Down> Select the next match, as if CTRL-N was used, but don't
|
||||||
|
insert the newly selected word.
|
||||||
|
|
||||||
|
If you select another match, e.g., with CTRL-N or CTRL-P, you go back to the
|
||||||
|
first state. However, the list of matches doesn't change.
|
||||||
|
|
||||||
The selection is being edited after typing <BS>, CTRL-L or when using the
|
|
||||||
longest common match. This stops when a match is inserted, as with CTRL-N or
|
|
||||||
CTRL-P.
|
|
||||||
|
|
||||||
The colors of the menu can be changed with these highlight groups:
|
The colors of the menu can be changed with these highlight groups:
|
||||||
Pmenu normal item |hl-Pmenu|
|
Pmenu normal item |hl-Pmenu|
|
||||||
@@ -1097,8 +1115,16 @@ PmenuSel selected item |hl-PmenuSel|
|
|||||||
PmenuSbar scrollbar |hl-PmenuSbar|
|
PmenuSbar scrollbar |hl-PmenuSbar|
|
||||||
PmenuThumb thumb of the scrollbar |hl-PmenuThumb|
|
PmenuThumb thumb of the scrollbar |hl-PmenuThumb|
|
||||||
|
|
||||||
|
There are no special mappings for when the popup menu is visible. However,
|
||||||
|
you can use an Insert mode mapping that checks the |pumvisible()| function to
|
||||||
|
do something different. Example: >
|
||||||
|
:inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR>
|
||||||
|
|
||||||
Filetype-specific remarks for omni completion *compl-omni-filetypes*
|
|
||||||
|
FILETYPE-SPECIFIC REMARKS FOR OMNI COMPLETION *compl-omni-filetypes*
|
||||||
|
|
||||||
|
The file used for {filetype} should be autoload/{filetype}complete.vim
|
||||||
|
in 'runtimepath'. Thus for "java" it is autoload/javacomplete.vim.
|
||||||
|
|
||||||
|
|
||||||
C *ft-c-omni*
|
C *ft-c-omni*
|
||||||
@@ -1144,23 +1170,22 @@ specification.
|
|||||||
HTML and XHTML *ft-html-omni*
|
HTML and XHTML *ft-html-omni*
|
||||||
*ft-xhtml-omni*
|
*ft-xhtml-omni*
|
||||||
|
|
||||||
CTRL-X CTRL-O provides completion of various elements of (X)HTML files.
|
CTRL-X CTRL-O provides completion of various elements of (X)HTML files. It is
|
||||||
It is designed to support writing of XHTML 1.0 Strict files but will
|
designed to support writing of XHTML 1.0 Strict files but will also works for
|
||||||
also works for other versions of HTML. Features:
|
other versions of HTML. Features:
|
||||||
|
|
||||||
- after "<" complete tag name depending on context (no div suggestion
|
- after "<" complete tag name depending on context (no div suggestion inside
|
||||||
inside of an a tag)
|
of an a tag); '/>' indicates empty tags
|
||||||
- inside of tag complete proper attributes (no width attribute for an
|
- inside of tag complete proper attributes (no width attribute for an a tag);
|
||||||
a tag)
|
show also type of attribute; '*' indicates required attributes
|
||||||
- when attribute has limited number of possible values help to complete
|
- when attribute has limited number of possible values help to complete them
|
||||||
them
|
|
||||||
- complete names of entities
|
- complete names of entities
|
||||||
- complete values of "class" and "id" attributes with data obtained from
|
- complete values of "class" and "id" attributes with data obtained from
|
||||||
style tag and included CSS files
|
<style> tag and included CSS files
|
||||||
- when completing value of "style" attribute or working inside of "style" tag
|
- when completing value of "style" attribute or working inside of "style" tag
|
||||||
switch to |ft-css-omni| completion
|
switch to |ft-css-omni| completion
|
||||||
- when completing values of events attributes or working inside of "script" tag
|
- when completing values of events attributes or working inside of "script"
|
||||||
switch to |ft-javascript-omni| completion
|
tag switch to |ft-javascript-omni| completion
|
||||||
- when used after "</" CTRL-X CTRL-O will close the last opened tag
|
- when used after "</" CTRL-X CTRL-O will close the last opened tag
|
||||||
|
|
||||||
Note: When used first time completion menu will be shown with little delay
|
Note: When used first time completion menu will be shown with little delay
|
||||||
@@ -1176,7 +1201,7 @@ Completion of most elements of JavaScript language and DOM elements.
|
|||||||
Complete:
|
Complete:
|
||||||
|
|
||||||
- variables
|
- variables
|
||||||
- function name
|
- function name; show function arguments
|
||||||
- function arguments
|
- function arguments
|
||||||
- properties of variables trying to detect type of variable
|
- properties of variables trying to detect type of variable
|
||||||
- complete DOM objects and properties depending on context
|
- complete DOM objects and properties depending on context
|
||||||
@@ -1244,7 +1269,7 @@ Format of XML data file *xml-omni-datafile*
|
|||||||
|
|
||||||
Vim distribution provides two data files as examples (xhtml10s.vim, xsl.vim)
|
Vim distribution provides two data files as examples (xhtml10s.vim, xsl.vim)
|
||||||
|
|
||||||
XML data files are stored in "autoload/xml" directory in 'runtimepath'. They
|
XML data files are stored in "autoload/xml" directory in 'runtimepath'. They
|
||||||
have meaningful name which will be used in commands. It should be unique name
|
have meaningful name which will be used in commands. It should be unique name
|
||||||
which will not create conflicts in future. For example name xhtml10s.vim means
|
which will not create conflicts in future. For example name xhtml10s.vim means
|
||||||
it is data file for XHTML 1.0 Strict.
|
it is data file for XHTML 1.0 Strict.
|
||||||
@@ -1258,9 +1283,9 @@ compound from two parts:
|
|||||||
Part two must be exactly the same as name of file.
|
Part two must be exactly the same as name of file.
|
||||||
|
|
||||||
Variable is data structure in form of |Dictionary|. Keys are tag names and
|
Variable is data structure in form of |Dictionary|. Keys are tag names and
|
||||||
values are two element |List|. First element of List is also List with
|
values are two element |List|. First element of List is also List with names
|
||||||
names of possible children, second element is |Dictionary| with names of
|
of possible children, second element is |Dictionary| with names of attributes
|
||||||
attributes as keys and possible values of attributes as values. Example: >
|
as keys and possible values of attributes as values. Example: >
|
||||||
|
|
||||||
let g:xmldata_crippledhtml = {
|
let g:xmldata_crippledhtml = {
|
||||||
\ "html":
|
\ "html":
|
||||||
@@ -1272,21 +1297,31 @@ attributes as keys and possible values of attributes as values. Example: >
|
|||||||
\ "meta":
|
\ "meta":
|
||||||
\ [ [], {"id": [], "http-equiv": [], "name": [], "content": [], "scheme":
|
\ [ [], {"id": [], "http-equiv": [], "name": [], "content": [], "scheme":
|
||||||
\ [], "lang": [], "xml:lang": [], "dir": ["ltr", "rtl"]}]
|
\ [], "lang": [], "xml:lang": [], "dir": ["ltr", "rtl"]}]
|
||||||
\ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"]}
|
\ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"]},
|
||||||
|
\ "vimxmltaginfo": {
|
||||||
|
\ 'meta': ['/>', '']},
|
||||||
|
\ "vimxmlattrinfo": {
|
||||||
|
\ 'http-equiv': ['ContentType', '']}
|
||||||
|
|
||||||
This example should be put in "autoload/xml/crippledhtml.vim" file.
|
This example should be put in "autoload/xml/crippledhtml.vim" file.
|
||||||
|
|
||||||
In example are visible two special elements:
|
In example are visible four special elements:
|
||||||
|
|
||||||
1. "vimxmlentities" - special key with List containing entities of this XML
|
1. "vimxmlentities" - special key with List containing entities of this XML
|
||||||
dialect.
|
dialect.
|
||||||
2. "BOOL" - value of attribute key showing if attribute should be inserted
|
2. "BOOL" - value of attribute key showing if attribute should be inserted
|
||||||
bare ("defer" vs. 'defer="'). It can be the only element of List of
|
bare ("defer" vs. 'defer="'). It can be the only element of List of
|
||||||
attribute values.
|
attribute values.
|
||||||
|
3. "vimxmltaginfo" - special key with dictionary containing as key tag names,
|
||||||
|
as value two element List for additional menu info and long description.
|
||||||
|
4. "vimxmlattrinfo" - special key with dictionary containing as key attribute
|
||||||
|
names, as value two element List for additional menu info and long
|
||||||
|
description.
|
||||||
|
|
||||||
Note: Tag names in data file MUST not contain namespace description. Check
|
Note: Tag names in data file MUST not contain namespace description. Check
|
||||||
xsl.vim for example.
|
xsl.vim for example.
|
||||||
|
|
||||||
|
|
||||||
Commands
|
Commands
|
||||||
|
|
||||||
:XMLns {name} [{namespace}] *:XMLns*
|
:XMLns {name} [{namespace}] *:XMLns*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 10
|
*options.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -127,7 +127,7 @@ Note that an option may also have been set as a side effect of setting
|
|||||||
{not available when compiled without the +eval feature}
|
{not available when compiled without the +eval feature}
|
||||||
|
|
||||||
*:set-termcap* *E522*
|
*:set-termcap* *E522*
|
||||||
For {option} the form "t_xx" may be used to set a termcap option. This will
|
For {option} the form "t_xx" may be used to set a terminal option. This will
|
||||||
override the value from the termcap. You can then use it in a mapping. If
|
override the value from the termcap. You can then use it in a mapping. If
|
||||||
the "xx" part contains special characters, use the <t_xx> form: >
|
the "xx" part contains special characters, use the <t_xx> form: >
|
||||||
:set <t_#4>=^[Ot
|
:set <t_#4>=^[Ot
|
||||||
@@ -2036,8 +2036,8 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
When set to "msg", error messages that would otherwise be omitted will
|
When set to "msg", error messages that would otherwise be omitted will
|
||||||
be given anyway. This is useful when debugging 'foldexpr' or
|
be given anyway. This is useful when debugging 'foldexpr',
|
||||||
'indentexpr'.
|
'formatexpr' or 'indentexpr'.
|
||||||
When set to "beep", a message will be given when otherwise only a beep
|
When set to "beep", a message will be given when otherwise only a beep
|
||||||
would be produced.
|
would be produced.
|
||||||
The values can be combined, separated by a comma.
|
The values can be combined, separated by a comma.
|
||||||
@@ -2882,17 +2882,43 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
The name of an external program that will be used to format the lines
|
The name of an external program that will be used to format the lines
|
||||||
selected with the "gq" command. The program must take the input on
|
selected with the |gq| operator. The program must take the input on
|
||||||
stdin and produce the output on stdout. The Unix program "fmt" is
|
stdin and produce the output on stdout. The Unix program "fmt" is
|
||||||
such a program.
|
such a program.
|
||||||
If this option is an empty string, the internal format function will
|
If the 'formatexpr' option is not empty it will be used instead.
|
||||||
be used |C-indenting|.
|
Otherwise, if 'formatprg' option is an empty string, the internal
|
||||||
|
format function will be used |C-indenting|.
|
||||||
Environment variables are expanded |:set_env|. See |option-backslash|
|
Environment variables are expanded |:set_env|. See |option-backslash|
|
||||||
about including spaces and backslashes.
|
about including spaces and backslashes.
|
||||||
This option cannot be set from a |modeline| or in the |sandbox|, for
|
The expression may be evaluated in the |sandbox|, see
|
||||||
security reasons.
|
|sandbox-option|.
|
||||||
|
|
||||||
*'fsync'* *'fs'*
|
*'formatexpr'* *'fex'*
|
||||||
|
'formatexpr' 'fex' string (default "")
|
||||||
|
local to buffer
|
||||||
|
{not in Vi}
|
||||||
|
{not available when compiled without the |+eval|
|
||||||
|
feature}
|
||||||
|
Expression which is evaluated to format a range of lines for the |gq|
|
||||||
|
operator. The |v:lnum| variable holds the first line to be formatted,
|
||||||
|
|v:count| the number of lines to be formatted.
|
||||||
|
When this option is empty 'formatprg' is used.
|
||||||
|
Example: >
|
||||||
|
:set formatexp=mylang#Format()
|
||||||
|
< This will invoke the mylang#Format() function in the
|
||||||
|
autoload/mylang.vim file in 'runtimepath'. |autoload|
|
||||||
|
|
||||||
|
The expression is also evaluated when 'textwidth' is set and adding
|
||||||
|
text beyond that limit. This happens under the same conditions as
|
||||||
|
when internal formatting is used. Make sure the cursor is kept in the
|
||||||
|
same spot relative to the text then! The |mode()| function will
|
||||||
|
return "i" or "R" in this situation. When the function returns
|
||||||
|
non-zero Vim will fall back to using the internal format mechanism.
|
||||||
|
|
||||||
|
The expression may be evaluated in the |sandbox|, see
|
||||||
|
|sandbox-option|.
|
||||||
|
|
||||||
|
*'fsync'* *'fs'*
|
||||||
'fsync' 'fs' boolean (default on)
|
'fsync' 'fs' boolean (default on)
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
@@ -7016,7 +7042,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'weirdinvert' 'wiv' boolean (default off)
|
'weirdinvert' 'wiv' boolean (default off)
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
This option has the same effect as the 't_xs' termcap option.
|
This option has the same effect as the 't_xs' terminal option.
|
||||||
It is provided for backwards compatibility with version 4.x.
|
It is provided for backwards compatibility with version 4.x.
|
||||||
Setting 'weirdinvert' has the effect of making 't_xs' non-empty, and
|
Setting 'weirdinvert' has the effect of making 't_xs' non-empty, and
|
||||||
vice versa. Has no effect when the GUI is running.
|
vice versa. Has no effect when the GUI is running.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*os_dos.txt* For Vim version 7.0aa. Last change: 2003 Dec 20
|
*os_dos.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -126,8 +126,8 @@ text. For example, to get grey text on a blue background: >
|
|||||||
See |highlight-groups| for other groups that are available.
|
See |highlight-groups| for other groups that are available.
|
||||||
|
|
||||||
A DOS console does not support attributes like bold and underlining. You can
|
A DOS console does not support attributes like bold and underlining. You can
|
||||||
set the color used in five modes with nine termcap options. Note that this is
|
set the color used in five modes with nine terminal options. Note that this
|
||||||
not necessary since you can set the color directly with the ":highlight"
|
is not necessary since you can set the color directly with the ":highlight"
|
||||||
command; these options are for backward compatibility with older Vim versions.
|
command; these options are for backward compatibility with older Vim versions.
|
||||||
The |'highlight'| option specifies which of the five modes is used for which
|
The |'highlight'| option specifies which of the five modes is used for which
|
||||||
action. >
|
action. >
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*pattern.txt* For Vim version 7.0aa. Last change: 2006 Feb 01
|
*pattern.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -161,7 +161,7 @@ The offset gives the cursor position relative to the found match:
|
|||||||
s[-num] [num] characters to the left of the start of the match
|
s[-num] [num] characters to the left of the start of the match
|
||||||
b[+num] [num] identical to s[+num] above (mnemonic: begin)
|
b[+num] [num] identical to s[+num] above (mnemonic: begin)
|
||||||
b[-num] [num] identical to s[-num] above (mnemonic: begin)
|
b[-num] [num] identical to s[-num] above (mnemonic: begin)
|
||||||
;{pattern} perform another searcn, see |//;|
|
;{pattern} perform another search, see |//;|
|
||||||
|
|
||||||
If a '-' or '+' is given but [num] is omitted, a count of one will be used.
|
If a '-' or '+' is given but [num] is omitted, a count of one will be used.
|
||||||
When including an offset with 'e', the search becomes inclusive (the
|
When including an offset with 'e', the search becomes inclusive (the
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*quickref.txt* For Vim version 7.0aa. Last change: 2006 Jan 11
|
*quickref.txt* For Vim version 7.0aa. Last change: 2006 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -692,6 +692,7 @@ Short explanation of each option: *option-list*
|
|||||||
|'formatlistpat'| |'flp'| pattern used to recognize a list header
|
|'formatlistpat'| |'flp'| pattern used to recognize a list header
|
||||||
|'formatoptions'| |'fo'| how automatic formatting is to be done
|
|'formatoptions'| |'fo'| how automatic formatting is to be done
|
||||||
|'formatprg'| |'fp'| name of external program used with "gq" command
|
|'formatprg'| |'fp'| name of external program used with "gq" command
|
||||||
|
|'formatexpr'| |'fex'| expression used with "gq" command
|
||||||
|'fsync'| |'fs'| whether to invoke fsync() after file write
|
|'fsync'| |'fs'| whether to invoke fsync() after file write
|
||||||
|'gdefault'| |'gd'| the ":substitute" flag 'g' is default on
|
|'gdefault'| |'gd'| the ":substitute" flag 'g' is default on
|
||||||
|'grepformat'| |'gfm'| format of 'grepprg' output
|
|'grepformat'| |'gfm'| format of 'grepprg' output
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*starting.txt* For Vim version 7.0aa. Last change: 2006 Jan 19
|
*starting.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -706,7 +706,8 @@ accordingly. Vim proceeds in this order:
|
|||||||
'shell' option. On MS-DOS and Win32, the COMSPEC variable is used
|
'shell' option. On MS-DOS and Win32, the COMSPEC variable is used
|
||||||
if SHELL is not set.
|
if SHELL is not set.
|
||||||
The environment variable TERM, if it exists, is used to set the 'term'
|
The environment variable TERM, if it exists, is used to set the 'term'
|
||||||
option.
|
option. However, 'term' will change later when starting the GUI (step
|
||||||
|
8 below).
|
||||||
|
|
||||||
2. Process the arguments
|
2. Process the arguments
|
||||||
The options and file names from the command that start Vim are
|
The options and file names from the command that start Vim are
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
|
|||||||
'fen' options.txt /*'fen'*
|
'fen' options.txt /*'fen'*
|
||||||
'fenc' options.txt /*'fenc'*
|
'fenc' options.txt /*'fenc'*
|
||||||
'fencs' options.txt /*'fencs'*
|
'fencs' options.txt /*'fencs'*
|
||||||
|
'fex' options.txt /*'fex'*
|
||||||
'ff' options.txt /*'ff'*
|
'ff' options.txt /*'ff'*
|
||||||
'ffs' options.txt /*'ffs'*
|
'ffs' options.txt /*'ffs'*
|
||||||
'fileencoding' options.txt /*'fileencoding'*
|
'fileencoding' options.txt /*'fileencoding'*
|
||||||
@@ -231,6 +232,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
|
|||||||
'foldnestmax' options.txt /*'foldnestmax'*
|
'foldnestmax' options.txt /*'foldnestmax'*
|
||||||
'foldopen' options.txt /*'foldopen'*
|
'foldopen' options.txt /*'foldopen'*
|
||||||
'foldtext' options.txt /*'foldtext'*
|
'foldtext' options.txt /*'foldtext'*
|
||||||
|
'formatexpr' options.txt /*'formatexpr'*
|
||||||
'formatlistpat' options.txt /*'formatlistpat'*
|
'formatlistpat' options.txt /*'formatlistpat'*
|
||||||
'formatoptions' options.txt /*'formatoptions'*
|
'formatoptions' options.txt /*'formatoptions'*
|
||||||
'formatprg' options.txt /*'formatprg'*
|
'formatprg' options.txt /*'formatprg'*
|
||||||
@@ -5870,6 +5872,7 @@ mark-motions motion.txt /*mark-motions*
|
|||||||
masm.vim syntax.txt /*masm.vim*
|
masm.vim syntax.txt /*masm.vim*
|
||||||
match() eval.txt /*match()*
|
match() eval.txt /*match()*
|
||||||
match-highlight pattern.txt /*match-highlight*
|
match-highlight pattern.txt /*match-highlight*
|
||||||
|
match-parens tips.txt /*match-parens*
|
||||||
matchend() eval.txt /*matchend()*
|
matchend() eval.txt /*matchend()*
|
||||||
matchit-install usr_05.txt /*matchit-install*
|
matchit-install usr_05.txt /*matchit-install*
|
||||||
matchlist() eval.txt /*matchlist()*
|
matchlist() eval.txt /*matchlist()*
|
||||||
@@ -6312,6 +6315,7 @@ progname-variable eval.txt /*progname-variable*
|
|||||||
progress.vim syntax.txt /*progress.vim*
|
progress.vim syntax.txt /*progress.vim*
|
||||||
ptcap.vim syntax.txt /*ptcap.vim*
|
ptcap.vim syntax.txt /*ptcap.vim*
|
||||||
pterm-mouse options.txt /*pterm-mouse*
|
pterm-mouse options.txt /*pterm-mouse*
|
||||||
|
pumvisible() eval.txt /*pumvisible()*
|
||||||
put change.txt /*put*
|
put change.txt /*put*
|
||||||
put-Visual-mode change.txt /*put-Visual-mode*
|
put-Visual-mode change.txt /*put-Visual-mode*
|
||||||
python if_pyth.txt /*python*
|
python if_pyth.txt /*python*
|
||||||
@@ -6532,6 +6536,8 @@ search-range pattern.txt /*search-range*
|
|||||||
search-replace change.txt /*search-replace*
|
search-replace change.txt /*search-replace*
|
||||||
searchdecl() eval.txt /*searchdecl()*
|
searchdecl() eval.txt /*searchdecl()*
|
||||||
searchpair() eval.txt /*searchpair()*
|
searchpair() eval.txt /*searchpair()*
|
||||||
|
searchpairpos() eval.txt /*searchpairpos()*
|
||||||
|
searchpos() eval.txt /*searchpos()*
|
||||||
section motion.txt /*section*
|
section motion.txt /*section*
|
||||||
sed.vim syntax.txt /*sed.vim*
|
sed.vim syntax.txt /*sed.vim*
|
||||||
self eval.txt /*self*
|
self eval.txt /*self*
|
||||||
@@ -7014,6 +7020,7 @@ termcap-changed version4.txt /*termcap-changed*
|
|||||||
termcap-colors term.txt /*termcap-colors*
|
termcap-colors term.txt /*termcap-colors*
|
||||||
termcap-cursor-color term.txt /*termcap-cursor-color*
|
termcap-cursor-color term.txt /*termcap-cursor-color*
|
||||||
termcap-cursor-shape term.txt /*termcap-cursor-shape*
|
termcap-cursor-shape term.txt /*termcap-cursor-shape*
|
||||||
|
termcap-options term.txt /*termcap-options*
|
||||||
termcap-title term.txt /*termcap-title*
|
termcap-title term.txt /*termcap-title*
|
||||||
terminal-colors os_unix.txt /*terminal-colors*
|
terminal-colors os_unix.txt /*terminal-colors*
|
||||||
terminal-info term.txt /*terminal-info*
|
terminal-info term.txt /*terminal-info*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*term.txt* For Vim version 7.0aa. Last change: 2005 Dec 14
|
*term.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -208,7 +208,7 @@ starts with CSI, it assumes that the terminal is in 8-bit mode and will
|
|||||||
convert all key sequences to their 8-bit variants.
|
convert all key sequences to their 8-bit variants.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
2. Terminal options *terminal-options* *E436*
|
2. Terminal options *terminal-options* *termcap-options* *E436*
|
||||||
|
|
||||||
The terminal options can be set just like normal options. But they are not
|
The terminal options can be set just like normal options. But they are not
|
||||||
shown with the ":set all" command. Instead use ":set termcap".
|
shown with the ":set all" command. Instead use ":set termcap".
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*tips.txt* For Vim version 7.0aa. Last change: 2005 Apr 19
|
*tips.txt* For Vim version 7.0aa. Last change: 2006 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -24,6 +24,7 @@ Compressing the help files |gzip-helpfile|
|
|||||||
Hex editing |hex-editing|
|
Hex editing |hex-editing|
|
||||||
Executing shell commands in a window |shell-window|
|
Executing shell commands in a window |shell-window|
|
||||||
Using <> notation in autocommands |autocmd-<>|
|
Using <> notation in autocommands |autocmd-<>|
|
||||||
|
Highlighting matching parens |match-parens|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Editing C programs *C-editing*
|
Editing C programs *C-editing*
|
||||||
@@ -443,4 +444,58 @@ forget to double the number of existing backslashes and put a backslash before
|
|||||||
For a real buffer menu, user functions should be used (see |:function|), but
|
For a real buffer menu, user functions should be used (see |:function|), but
|
||||||
then the <> notation isn't used, which defeats using it as an example here.
|
then the <> notation isn't used, which defeats using it as an example here.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
Highlighting matching parens *match-parens*
|
||||||
|
|
||||||
|
This example shows the use of a few advanced tricks:
|
||||||
|
- using the |CursorMoved| autocommand event
|
||||||
|
- using |searchpairpos()| to find a matching paren
|
||||||
|
- using |:match| to highlight something
|
||||||
|
- using a |pattern| to match a specific position in the file.
|
||||||
|
|
||||||
|
This should be put in a Vim script file, since it uses script-local variables.
|
||||||
|
Note that it doesn't recognize strings or comments in the text.
|
||||||
|
>
|
||||||
|
let s:paren_hl_on = 0
|
||||||
|
function s:Highlight_Matching_Paren()
|
||||||
|
if s:paren_hl_on
|
||||||
|
match none
|
||||||
|
let s:paren_hl_on = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let c_lnum = line('.')
|
||||||
|
let c_col = col('.')
|
||||||
|
|
||||||
|
let c = getline(c_lnum)[c_col - 1]
|
||||||
|
let plist = split(&matchpairs, ':\|,')
|
||||||
|
let i = index(plist, c)
|
||||||
|
if i < 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if i % 2 == 0
|
||||||
|
let s_flags = 'nW'
|
||||||
|
let c2 = plist[i + 1]
|
||||||
|
else
|
||||||
|
let s_flags = 'nbW'
|
||||||
|
let c2 = c
|
||||||
|
let c = plist[i - 1]
|
||||||
|
endif
|
||||||
|
if c == '['
|
||||||
|
let c = '\['
|
||||||
|
let c2 = '\]'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags)
|
||||||
|
|
||||||
|
if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$')
|
||||||
|
exe 'match Search /\(\%' . c_lnum . 'l\%' . c_col .
|
||||||
|
\ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/'
|
||||||
|
let s:paren_hl_on = 1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
autocmd CursorMoved * call s:Highlight_Matching_Paren()
|
||||||
|
autocmd InsertEnter * match none
|
||||||
|
<
|
||||||
|
|
||||||
vim:tw=78:ts=8:ft=help:norl:
|
vim:tw=78:ts=8:ft=help:norl:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 10
|
*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -30,19 +30,48 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
|
|||||||
*known-bugs*
|
*known-bugs*
|
||||||
-------------------- Known bugs and current work -----------------------
|
-------------------- Known bugs and current work -----------------------
|
||||||
|
|
||||||
|
Support WINDOW TABS. Works like several pages, each with their own split
|
||||||
|
windows. Let's call them "tab pages".
|
||||||
|
|
||||||
|
todo:
|
||||||
|
- ":qa"?
|
||||||
|
- "2gt" doesn't restore syntax HL. GUI: scrollbars are wrong.
|
||||||
|
- line at top of frame with tabs. 'tabline' option 0/1/2 like 'laststatus'
|
||||||
|
Use the name of the first buffer in the tab (ignoring the help window,
|
||||||
|
unless it's the only one). Add a number for the window count.
|
||||||
|
Add 'tabtext' option, like 'statusline'.
|
||||||
|
Select tab with mouse.
|
||||||
|
- When deleting a buffer also close windows in other tab pages.
|
||||||
|
- check all places where (firstwin == lastwin) is used (and vise versa)
|
||||||
|
- check all places wheren only_one_window() is used.
|
||||||
|
- When Vim window is resized all tabs must be resized.
|
||||||
|
- E999
|
||||||
|
- ":tabclose N" close tab N
|
||||||
|
docs:
|
||||||
|
:tabedit
|
||||||
|
:tabfind
|
||||||
|
:tab N
|
||||||
|
:tabs
|
||||||
|
{count}gt
|
||||||
|
:tabclose
|
||||||
|
:close and :quit (last window in tab)
|
||||||
|
"gt": Use "1gt" - "99gt" to switch to another tab. "gt" goes to the
|
||||||
|
next one. Hint in docs: To mess with another buffer, without
|
||||||
|
changing the window layout, do this in another tab.
|
||||||
|
|
||||||
|
add GUI Tabs for some systems.
|
||||||
|
Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6.
|
||||||
|
Simple patch for GTK by Luis M (nov 7).
|
||||||
|
|
||||||
|
Don't forget to provide an "X" to close the current tab.
|
||||||
|
|
||||||
|
Need to be able to search the windows in inactive tabs, e.g. for the
|
||||||
|
quickfix window.
|
||||||
|
|
||||||
|
|
||||||
Crash with X command server (Ciaran McCreesh).
|
Crash with X command server (Ciaran McCreesh).
|
||||||
|
|
||||||
ccomplete / omnicomplete:
|
Ctags still hasn't included the patch...
|
||||||
- For C add tag "kind" field to each match?
|
|
||||||
- Flickering because of syntax highlighting redrawing further lines.
|
|
||||||
- Finding out if an item has members (to add '.' or '->') requires a grep in
|
|
||||||
the tags files, that is very slow. Is there another solution? At least
|
|
||||||
stop at the first match.
|
|
||||||
Could build the list of items for each structure in memory. Is that faster?
|
|
||||||
Not using too much memory?
|
|
||||||
- When a typedef or struct is local to a file only use it in that file?
|
|
||||||
- Special mappings for when the popup menu is visible? Would allow for making
|
|
||||||
a specific selection (e.g, methods vs variables).
|
|
||||||
|
|
||||||
spelling:
|
spelling:
|
||||||
- Also use the spelling dictionary for dictionary completion.
|
- Also use the spelling dictionary for dictionary completion.
|
||||||
@@ -87,13 +116,6 @@ spelling:
|
|||||||
adding a bad word like "zw" would. Use "zuw" to undo "zw"? (Antonio
|
adding a bad word like "zw" would. Use "zuw" to undo "zw"? (Antonio
|
||||||
Colombo)
|
Colombo)
|
||||||
|
|
||||||
7 Add plugins for formatting. Should be able to make a choice depending on
|
|
||||||
the language of a file (English/Korean/Japanese/etc.).
|
|
||||||
Setting the 'langformat' option to "chinese" would load the
|
|
||||||
"format/chinese.vim" plugin.
|
|
||||||
Edward L. Fox explains how it should be done for most Asian languages. (2005
|
|
||||||
Nov 24)
|
|
||||||
|
|
||||||
An error in a function uses a line number that doesn't take line continuation
|
An error in a function uses a line number that doesn't take line continuation
|
||||||
into account. (Mikolaj Machowski) Store line count in an extra array?
|
into account. (Mikolaj Machowski) Store line count in an extra array?
|
||||||
|
|
||||||
@@ -113,7 +135,6 @@ Mac unicode patch (Da Woon Jung):
|
|||||||
(Alan Schmitt)
|
(Alan Schmitt)
|
||||||
|
|
||||||
Patch to add a few flags to search(). (Benji Fisher, Nov 29, doc update Dec 1)
|
Patch to add a few flags to search(). (Benji Fisher, Nov 29, doc update Dec 1)
|
||||||
Also add search???() function that returns list with lnum and col.
|
|
||||||
|
|
||||||
Win32: Use the free downloadable compiler 7.1 (2003). Figure out how to do
|
Win32: Use the free downloadable compiler 7.1 (2003). Figure out how to do
|
||||||
debugging (with Agide?) and describe it. (George Reilly)
|
debugging (with Agide?) and describe it. (George Reilly)
|
||||||
@@ -125,9 +146,6 @@ Try using Visual C++ Express 2005. (Ilya Bobir Dec 20)
|
|||||||
Win32: Check that installer puts menu items in "all users" dir when possible,
|
Win32: Check that installer puts menu items in "all users" dir when possible,
|
||||||
not administrator dir.
|
not administrator dir.
|
||||||
|
|
||||||
CTRL-X CTRL-L only completes from loaded buffers. Make it work for unloaded
|
|
||||||
buffers too?
|
|
||||||
|
|
||||||
Autoload:
|
Autoload:
|
||||||
- Add a Vim script in $VIMRUNTIME/tools that takes a file with a list of
|
- Add a Vim script in $VIMRUNTIME/tools that takes a file with a list of
|
||||||
script names and a help file and produces a script that can be sourced to
|
script names and a help file and produces a script that can be sourced to
|
||||||
@@ -158,48 +176,30 @@ Awaiting response:
|
|||||||
|
|
||||||
CONSIDERED FOR VERSION 7.0:
|
CONSIDERED FOR VERSION 7.0:
|
||||||
|
|
||||||
- Omni completion: Understands the programming language and finds matches
|
Omni completion:
|
||||||
that make sense. Esp. members of classes/structs.
|
ccomplete:
|
||||||
|
- Finding out if an item has members (to add '.' or '->') requires a grep
|
||||||
It's not much different from other Insert-mode completion, use the same
|
in the tags files, that is very slow. Is there another solution? At
|
||||||
mechanism. Use CTRL-X CTRL-O and 'omnifunc'. Set 'omnifunc' in the
|
least stop at the first match.
|
||||||
filetype plugin, define the function in the autoload directory.
|
Could build the list of items for each structure in memory. Is that
|
||||||
|
faster? Not using too much memory?
|
||||||
Separately develop the completion logic and the UI. When adding UI stuff
|
- For C add tag "kind" field to each match?
|
||||||
make it work for all completion methods.
|
- Flickering because of syntax highlighting redrawing further lines.
|
||||||
|
- When a typedef or struct is local to a file only use it in that file?
|
||||||
|
|
||||||
UI:
|
UI:
|
||||||
- Complete longest common string first, like 'wildmode' "longest:full".
|
|
||||||
- Add an "auto" mode: after typing a character (or string) completion is
|
- Add an "auto" mode: after typing a character (or string) completion is
|
||||||
done for the longest common string. plugin defines the possible
|
done for the longest common string. plugin defines the possible
|
||||||
characters/strings. (Martin Stubenschrott)
|
characters/strings. (Martin Stubenschrott)
|
||||||
|
And/or: Provide a function to popup the menu, so that an insert mode
|
||||||
|
mapping can start it (with a specific selection).
|
||||||
- GUI implementation of the popup menu.
|
- GUI implementation of the popup menu.
|
||||||
- When using tags, show match in preview window (function prototype,
|
- Show "info" from a match in preview window.
|
||||||
struct member, etc.).
|
|
||||||
Or use one window for matches, another for context/info (Doug Kearns,
|
Or use one window for matches, another for context/info (Doug Kearns,
|
||||||
2005 Sep 13)
|
2005 Sep 13)
|
||||||
- Ideas on: http://www.wholetomato.com/
|
- Ideas on: http://www.wholetomato.com/
|
||||||
|
|
||||||
|
|
||||||
Completion logic:
|
Completion logic:
|
||||||
Use runtime/autoload/{filetype}complete.vim files.
|
|
||||||
|
|
||||||
In function arguments suggest variables of expected type.
|
|
||||||
Tags file has "signature" field.
|
|
||||||
|
|
||||||
List of completions is a Dictionary with items:
|
|
||||||
complist[0]['text'] = completion text
|
|
||||||
complist[0]['type'] = type of completion (e.g. function, var, arg)
|
|
||||||
complist[0]['help'] = help text (e.g. function declaration)
|
|
||||||
complist[0]['helpfunc'] = function that shows help text
|
|
||||||
etc.
|
|
||||||
|
|
||||||
Can CTRL-] (jump to tag) include the "." and "->" to restrict the
|
|
||||||
number of possible matches? (Flemming Madsen)
|
|
||||||
|
|
||||||
In general: Besides completion, figure out the type of a variable
|
|
||||||
and use it for information.
|
|
||||||
|
|
||||||
Ideas from others:
|
Ideas from others:
|
||||||
http://www.vim.org/scripts/script.php?script_id=747
|
http://www.vim.org/scripts/script.php?script_id=747
|
||||||
http://sourceforge.net/projects/insenvim
|
http://sourceforge.net/projects/insenvim
|
||||||
@@ -212,10 +212,6 @@ CONSIDERED FOR VERSION 7.0:
|
|||||||
Uses ctags to find the info:
|
Uses ctags to find the info:
|
||||||
ctags -f $allTagsFile --fields=+aiKmnsSz --language-force=C++ --C++-kinds=+cefgmnpsut-dlux -u $files
|
ctags -f $allTagsFile --fields=+aiKmnsSz --language-force=C++ --C++-kinds=+cefgmnpsut-dlux -u $files
|
||||||
|
|
||||||
UI: popup menu with list of alternatives, icon to indicate type
|
|
||||||
optional popup window with info about selected alternative
|
|
||||||
Unrelated settings are changed (e.g. 'mousemodel').
|
|
||||||
|
|
||||||
www.vim.org script 1213 (Java Development Environment) (Fuchuan Wang)
|
www.vim.org script 1213 (Java Development Environment) (Fuchuan Wang)
|
||||||
IComplete: http://www.vim.org/scripts/script.php?script_id=1265
|
IComplete: http://www.vim.org/scripts/script.php?script_id=1265
|
||||||
and http://stud4.tuwien.ac.at/~e0125672/icomplete/
|
and http://stud4.tuwien.ac.at/~e0125672/icomplete/
|
||||||
@@ -223,21 +219,15 @@ CONSIDERED FOR VERSION 7.0:
|
|||||||
Ivan Villanueva has something for Java.
|
Ivan Villanueva has something for Java.
|
||||||
Emads: http://www.xref-tech.com/xrefactory/more_c_completion.html
|
Emads: http://www.xref-tech.com/xrefactory/more_c_completion.html
|
||||||
Ideas from the Vim 7 BOF at SANE:
|
Ideas from the Vim 7 BOF at SANE:
|
||||||
- It's not possible to have one solution for all languages. Design an
|
|
||||||
interface for completion plugins. The matches can be done in a
|
|
||||||
Vim-script list.
|
|
||||||
- For interpreted languages, use the interpreter to obtain information.
|
- For interpreted languages, use the interpreter to obtain information.
|
||||||
Should work for Java (Eclipse does this), Python, Tcl, etc.
|
Should work for Java (Eclipse does this), Python, Tcl, etc.
|
||||||
Richard Emberson mentioned working on an interface to Java.
|
Richard Emberson mentioned working on an interface to Java.
|
||||||
- Check Readline for its completion interface.
|
- Check Readline for its completion interface.
|
||||||
- Use ctags for other languages. Writing a file could trigger running
|
- Use ctags for other languages. Writing a file could trigger running
|
||||||
ctags, merging the tags of the changed file.
|
ctags, merging the tags of the changed file.
|
||||||
"Visual Assist" http://www.wholetomato.com/products:
|
|
||||||
Completion in .NET framework SharpDevelop: http://www.icsharpcode.net
|
Completion in .NET framework SharpDevelop: http://www.icsharpcode.net
|
||||||
|
|
||||||
- Pre-expand abbreviations, show which abbrevs would match?
|
- Pre-expand abbreviations, show which abbrevs would match?
|
||||||
- Provide a function to popup the menu, so that an insert mode mapping can
|
|
||||||
start it (with a specific selection).
|
|
||||||
|
|
||||||
- UNDO TREE: keep all states of the text, don't delete undo info.
|
- UNDO TREE: keep all states of the text, don't delete undo info.
|
||||||
When making a change, instead of clearing any future undo (thus redo)
|
When making a change, instead of clearing any future undo (thus redo)
|
||||||
@@ -259,24 +249,6 @@ CONSIDERED FOR VERSION 7.0:
|
|||||||
before some time/date can be flushed. 'undopersist' gives maximum time to
|
before some time/date can be flushed. 'undopersist' gives maximum time to
|
||||||
keep undo: "3h", "1d", "2w", "1y", etc. For the file use dot and
|
keep undo: "3h", "1d", "2w", "1y", etc. For the file use dot and
|
||||||
extension: ".filename.un~" (like swapfile but "un~" instead of "swp").
|
extension: ".filename.un~" (like swapfile but "un~" instead of "swp").
|
||||||
7 Support WINDOW TABS. Works like several pages, each with their own
|
|
||||||
split windows.
|
|
||||||
In Emacs these are called frames. Could also call them "pages".
|
|
||||||
Use the name of the first buffer in the tab (ignoring the help window,
|
|
||||||
unless it's the only one). Add a number for the window count.
|
|
||||||
First make it work on the console. Use a line of text with highlighting.
|
|
||||||
Then add GUI Tabs for some systems.
|
|
||||||
Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6.
|
|
||||||
Simple patch for GTK by Luis M (nov 7).
|
|
||||||
Don't forget to provide an "X" to close the current tab.
|
|
||||||
Implementation: keep the list of windows as-is. When switching to another
|
|
||||||
tab make the buffers in the current windows hidden, save the window
|
|
||||||
layout, buildup the other window layout and fill with buffers.
|
|
||||||
Need to be able to search the windows in inactive tabs, e.g. for the
|
|
||||||
quickfix window.
|
|
||||||
Use "1gt" - "99gt" to switch to a tab?
|
|
||||||
Also hidden tabs? Useful for messing with a temp buffer without changing
|
|
||||||
the window layout.
|
|
||||||
- EMBEDDING: Make it possible to run Vim inside a window of another program.
|
- EMBEDDING: Make it possible to run Vim inside a window of another program.
|
||||||
For Xwindows this can be done with XReparentWindow().
|
For Xwindows this can be done with XReparentWindow().
|
||||||
For GTK Neil Bird has a patch to use Vim like a widget.
|
For GTK Neil Bird has a patch to use Vim like a widget.
|
||||||
@@ -431,7 +403,7 @@ Awaiting updated patches:
|
|||||||
7 Completion of network shares, patch by Yasuhiro Matsumoto.
|
7 Completion of network shares, patch by Yasuhiro Matsumoto.
|
||||||
Update 2004 Sep 6.
|
Update 2004 Sep 6.
|
||||||
How does this work? Missing comments.
|
How does this work? Missing comments.
|
||||||
gettext() Translate a message. (Patch from Yasuhiro Matsumoto)
|
- gettext() Translate a message. (Patch from Yasuhiro Matsumoto)
|
||||||
Update 2004 Sep 10
|
Update 2004 Sep 10
|
||||||
Another patch from Edward L. Fox (2005 Nov 24)
|
Another patch from Edward L. Fox (2005 Nov 24)
|
||||||
Search in 'runtimepath'?
|
Search in 'runtimepath'?
|
||||||
@@ -2085,6 +2057,9 @@ Shared libraries:
|
|||||||
|
|
||||||
|
|
||||||
Tags:
|
Tags:
|
||||||
|
7 Can CTRL-] (jump to tag) include a following "." and "->" to restrict the
|
||||||
|
number of possible matches? Check tags file for an item that has members.
|
||||||
|
(Flemming Madsen)
|
||||||
7 Count before CTRL-]: jump to N'th match
|
7 Count before CTRL-]: jump to N'th match
|
||||||
8 Scope arguments for ":tag", e.g.: ":tag class:cPage open", like Elvis.
|
8 Scope arguments for ":tag", e.g.: ":tag class:cPage open", like Elvis.
|
||||||
8 When output of ":tselect" is long, getting the more-prompt, should be able
|
8 When output of ":tselect" is long, getting the more-prompt, should be able
|
||||||
@@ -3288,6 +3263,13 @@ Debug mode:
|
|||||||
|
|
||||||
|
|
||||||
Various improvements:
|
Various improvements:
|
||||||
|
7 Add plugins for formatting? Should be able to make a choice depending on
|
||||||
|
the language of a file (English/Korean/Japanese/etc.).
|
||||||
|
Setting the 'langformat' option to "chinese" would load the
|
||||||
|
"format/chinese.vim" plugin.
|
||||||
|
The plugin would set 'formatexpr' and define the function being called.
|
||||||
|
Edward L. Fox explains how it should be done for most Asian languages.
|
||||||
|
(2005 Nov 24)
|
||||||
7 [t to move to previous xml/html tag (like "vatov"), ]t to move to next
|
7 [t to move to previous xml/html tag (like "vatov"), ]t to move to next
|
||||||
("vatv").
|
("vatv").
|
||||||
7 [< to move to previous xml/html tag, e.g., previous <li>. ]< to move to
|
7 [< to move to previous xml/html tag, e.g., previous <li>. ]< to move to
|
||||||
@@ -3419,9 +3401,6 @@ Various improvements:
|
|||||||
paragraph. Both start a new paragraph on any indent change.
|
paragraph. Both start a new paragraph on any indent change.
|
||||||
7 Add a way to define an item list with a pattern in 'formatoptions'. The
|
7 Add a way to define an item list with a pattern in 'formatoptions'. The
|
||||||
'n' flag doesn't work for "6.3" or "6a.".
|
'n' flag doesn't work for "6.3" or "6a.".
|
||||||
8 Add 'formatexpr' option: Used for formatting operator "gq" instead of the
|
|
||||||
builtin formatting or 'formatprg'. Or use a string that starts with "="
|
|
||||||
in 'formatprg': "=MyFormat()".
|
|
||||||
8 Allow using a trailing space to signal a paragraph that continues on the
|
8 Allow using a trailing space to signal a paragraph that continues on the
|
||||||
next line (MIME text/plain; format=flowed, RFC 2646). Can be used for
|
next line (MIME text/plain; format=flowed, RFC 2646). Can be used for
|
||||||
continuous formatting. Could use 'autoformat' option, which specifies a
|
continuous formatting. Could use 'autoformat' option, which specifies a
|
||||||
|
|||||||
@@ -654,7 +654,9 @@ Working with text in the current buffer:
|
|||||||
nextnonblank() find next non-blank line
|
nextnonblank() find next non-blank line
|
||||||
prevnonblank() find previous non-blank line
|
prevnonblank() find previous non-blank line
|
||||||
search() find a match for a pattern
|
search() find a match for a pattern
|
||||||
|
searchpos() find a match for a pattern
|
||||||
searchpair() find the other end of a start/skip/end
|
searchpair() find the other end of a start/skip/end
|
||||||
|
searchpairpos() find the other end of a start/skip/end
|
||||||
|
|
||||||
System functions and manipulation of files:
|
System functions and manipulation of files:
|
||||||
browse() put up a file requester
|
browse() put up a file requester
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 10
|
*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -414,6 +414,8 @@ Options: ~
|
|||||||
(based on an idea from Yegappan Lakshmanan)
|
(based on an idea from Yegappan Lakshmanan)
|
||||||
'formatlistpat' pattern to recognize a numbered list for formatting.
|
'formatlistpat' pattern to recognize a numbered list for formatting.
|
||||||
(idea by Hugo Haas)
|
(idea by Hugo Haas)
|
||||||
|
'formatexpr' expression for formatting text with |gq| and when text
|
||||||
|
goes over 'textwidth' in Insert mode.
|
||||||
'spell' switch spell checking on/off
|
'spell' switch spell checking on/off
|
||||||
'spelllang' languages to check spelling for
|
'spelllang' languages to check spelling for
|
||||||
'spellsuggest' methods for spell suggestions
|
'spellsuggest' methods for spell suggestions
|
||||||
@@ -558,6 +560,8 @@ New and extended functions: ~
|
|||||||
|repeat()| repeat "expr" "count" times (Christophe Poucet)
|
|repeat()| repeat "expr" "count" times (Christophe Poucet)
|
||||||
|reverse()| reverse the order of a List
|
|reverse()| reverse the order of a List
|
||||||
|searchdecl()| search for declaration of variable
|
|searchdecl()| search for declaration of variable
|
||||||
|
|searchpairpos()| return a List with the position of the match
|
||||||
|
|searchpos()| return a List with the position of the match
|
||||||
|setloclist()| modify a location list (Yegappan Lakshmanan)
|
|setloclist()| modify a location list (Yegappan Lakshmanan)
|
||||||
|setqflist()| modify a quickfix list (Yegappan Lakshmanan)
|
|setqflist()| modify a quickfix list (Yegappan Lakshmanan)
|
||||||
|sort()| sort a List
|
|sort()| sort a List
|
||||||
@@ -1004,6 +1008,7 @@ itself.
|
|||||||
":saveas asdf.c" will set 'filetype' to c when it's empty. Also for ":w
|
":saveas asdf.c" will set 'filetype' to c when it's empty. Also for ":w
|
||||||
asdf.c" when it sets the filename for the buffer.
|
asdf.c" when it sets the filename for the buffer.
|
||||||
|
|
||||||
|
Insert mode completion for whole lines now also searches unloaded buffers.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
COMPILE TIME CHANGES *compile-changes-7*
|
COMPILE TIME CHANGES *compile-changes-7*
|
||||||
@@ -1686,4 +1691,9 @@ Crashed when expanding a file name argument in backticks.
|
|||||||
In some situations the menu and scrollbar didn't work, when the value contains
|
In some situations the menu and scrollbar didn't work, when the value contains
|
||||||
a CSI byte. (Yukihiro Nakadaira)
|
a CSI byte. (Yukihiro Nakadaira)
|
||||||
|
|
||||||
|
GTK GUI: When drawing the balloon focus changes and we might get a key release
|
||||||
|
event that removed the balloon again. Ignore the key release event.
|
||||||
|
|
||||||
|
'titleold' was included in ":mkexrc" and ":mksession" files.
|
||||||
|
|
||||||
vim:tw=78:ts=8:ft=help:norl:
|
vim:tw=78:ts=8:ft=help:norl:
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
" VHDL indent ('93 syntax)
|
" VHDL indent ('93 syntax)
|
||||||
" Language: VHDL
|
" Language: VHDL
|
||||||
" Maintainer: Gerald Lai <laigera+vim?gmail.com>
|
" Maintainer: Gerald Lai <laigera+vim?gmail.com>
|
||||||
" Version: 1.3
|
" Version: 1.34
|
||||||
" Last Change: 2006 Jan 31
|
" Last Change: 2006 Feb 11
|
||||||
" URL: http://www.vim.org/scripts/script.php?script_id=1450
|
" URL: http://www.vim.org/scripts/script.php?script_id=1450
|
||||||
|
|
||||||
" only load this indent file when no other was loaded
|
" only load this indent file when no other was loaded
|
||||||
@@ -17,13 +17,35 @@ setlocal indentkeys=!^F,o,O,e,0(,0)
|
|||||||
setlocal indentkeys+==~if,=~then,=~elsif,=~else
|
setlocal indentkeys+==~if,=~then,=~elsif,=~else
|
||||||
setlocal indentkeys+==~begin,=~is,=~select,=~--
|
setlocal indentkeys+==~begin,=~is,=~select,=~--
|
||||||
|
|
||||||
" move around
|
" count repeat
|
||||||
|
function! <SID>CountWrapper(cmd)
|
||||||
|
let i = v:count1
|
||||||
|
if a:cmd[0] == ":"
|
||||||
|
while i > 0
|
||||||
|
execute a:cmd
|
||||||
|
let i = i - 1
|
||||||
|
endwhile
|
||||||
|
else
|
||||||
|
execute "normal! gv\<Esc>"
|
||||||
|
execute "normal ".i.a:cmd
|
||||||
|
let curcol = col(".")
|
||||||
|
let curline = line(".")
|
||||||
|
normal! gv
|
||||||
|
call cursor(curline, curcol)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" explore motion
|
||||||
" keywords: "architecture", "block", "configuration", "component", "entity", "function", "package", "procedure", "process", "record", "units"
|
" keywords: "architecture", "block", "configuration", "component", "entity", "function", "package", "procedure", "process", "record", "units"
|
||||||
let b:vhdl_explore = '\%(architecture\|block\|configuration\|component\|entity\|function\|package\|procedure\|process\|record\|units\)'
|
let b:vhdl_explore = '\%(architecture\|block\|configuration\|component\|entity\|function\|package\|procedure\|process\|record\|units\)'
|
||||||
nnoremap <silent><buffer>[[ :cal search('\%(\<end\s\+\)\@<!\<'.b:vhdl_explore.'\>\c','bW')<CR>
|
noremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
|
||||||
nnoremap <silent><buffer>]] :cal search('\%(\<end\s\+\)\@<!\<'.b:vhdl_explore.'\>\c','W')<CR>
|
noremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
|
||||||
nnoremap <silent><buffer>[] :cal search('\<end\s\+'.b:vhdl_explore.'\>\c','bW')<CR>
|
noremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
|
||||||
nnoremap <silent><buffer>][ :cal search('\<end\s\+'.b:vhdl_explore.'\>\c','W')<CR>
|
noremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
|
||||||
|
vnoremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper('[[')<CR>
|
||||||
|
vnoremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(']]')<CR>
|
||||||
|
vnoremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper('[]')<CR>
|
||||||
|
vnoremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper('][')<CR>
|
||||||
|
|
||||||
" constants
|
" constants
|
||||||
" not a comment
|
" not a comment
|
||||||
|
|||||||
10
src/buffer.c
10
src/buffer.c
@@ -1700,6 +1700,9 @@ free_buf_options(buf, free_p_ff)
|
|||||||
clear_string_option(&buf->b_p_inde);
|
clear_string_option(&buf->b_p_inde);
|
||||||
clear_string_option(&buf->b_p_indk);
|
clear_string_option(&buf->b_p_indk);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
clear_string_option(&buf->b_p_fex);
|
||||||
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
clear_string_option(&buf->b_p_key);
|
clear_string_option(&buf->b_p_key);
|
||||||
#endif
|
#endif
|
||||||
@@ -2840,9 +2843,12 @@ buf_same_ino(buf, stp)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print info about the current buffer.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
fileinfo(fullname, shorthelp, dont_truncate)
|
fileinfo(fullname, shorthelp, dont_truncate)
|
||||||
int fullname;
|
int fullname; /* when non-zero print full path */
|
||||||
int shorthelp;
|
int shorthelp;
|
||||||
int dont_truncate;
|
int dont_truncate;
|
||||||
{
|
{
|
||||||
@@ -3476,7 +3482,7 @@ build_stl_str_hl(wp, out, outlen, fmt, fillchar, maxwidth, hl)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
t = (opt == STL_FULLPATH) ? wp->w_buffer->b_ffname
|
t = (opt == STL_FULLPATH) ? wp->w_buffer->b_ffname
|
||||||
: wp->w_buffer->b_fname;
|
: wp->w_buffer->b_fname;
|
||||||
home_replace(wp->w_buffer, t, NameBuff, MAXPATHL, TRUE);
|
home_replace(wp->w_buffer, t, NameBuff, MAXPATHL, TRUE);
|
||||||
}
|
}
|
||||||
trans_characters(NameBuff, MAXPATHL);
|
trans_characters(NameBuff, MAXPATHL);
|
||||||
|
|||||||
679
src/edit.c
679
src/edit.c
@@ -130,6 +130,7 @@ static void ins_compl_del_pum __ARGS((void));
|
|||||||
static int pum_wanted __ARGS((void));
|
static int pum_wanted __ARGS((void));
|
||||||
static int pum_two_or_more __ARGS((void));
|
static int pum_two_or_more __ARGS((void));
|
||||||
static void ins_compl_dictionaries __ARGS((char_u *dict, char_u *pat, int flags, int thesaurus));
|
static void ins_compl_dictionaries __ARGS((char_u *dict, char_u *pat, int flags, int thesaurus));
|
||||||
|
static char_u *find_line_end __ARGS((char_u *ptr));
|
||||||
static void ins_compl_free __ARGS((void));
|
static void ins_compl_free __ARGS((void));
|
||||||
static void ins_compl_clear __ARGS((void));
|
static void ins_compl_clear __ARGS((void));
|
||||||
static int ins_compl_bs __ARGS((void));
|
static int ins_compl_bs __ARGS((void));
|
||||||
@@ -157,6 +158,7 @@ static void ins_redraw __ARGS((int ready));
|
|||||||
static void ins_ctrl_v __ARGS((void));
|
static void ins_ctrl_v __ARGS((void));
|
||||||
static void undisplay_dollar __ARGS((void));
|
static void undisplay_dollar __ARGS((void));
|
||||||
static void insert_special __ARGS((int, int, int));
|
static void insert_special __ARGS((int, int, int));
|
||||||
|
static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only));
|
||||||
static void check_auto_format __ARGS((int));
|
static void check_auto_format __ARGS((int));
|
||||||
static void redo_literal __ARGS((int c));
|
static void redo_literal __ARGS((int c));
|
||||||
static void start_arrow __ARGS((pos_T *end_insert_pos));
|
static void start_arrow __ARGS((pos_T *end_insert_pos));
|
||||||
@@ -2184,13 +2186,13 @@ ins_compl_longest_match(match)
|
|||||||
if (has_mbyte)
|
if (has_mbyte)
|
||||||
{
|
{
|
||||||
l = mb_ptr2len(p);
|
l = mb_ptr2len(p);
|
||||||
if (STRNCMP(p, s, l) != 0)
|
if (STRNICMP(p, s, l) != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (*p != *s)
|
if (MB_TOLOWER(*p) != MB_TOLOWER(*s))
|
||||||
break;
|
break;
|
||||||
l = 1;
|
l = 1;
|
||||||
}
|
}
|
||||||
@@ -2471,7 +2473,7 @@ ins_compl_show_pum()
|
|||||||
ins_compl_dictionaries(dict, pat, flags, thesaurus)
|
ins_compl_dictionaries(dict, pat, flags, thesaurus)
|
||||||
char_u *dict;
|
char_u *dict;
|
||||||
char_u *pat;
|
char_u *pat;
|
||||||
int flags;
|
int flags; /* DICT_FIRST and/or DICT_EXACT */
|
||||||
int thesaurus;
|
int thesaurus;
|
||||||
{
|
{
|
||||||
char_u *ptr;
|
char_u *ptr;
|
||||||
@@ -2490,7 +2492,23 @@ ins_compl_dictionaries(dict, pat, flags, thesaurus)
|
|||||||
save_p_scs = p_scs;
|
save_p_scs = p_scs;
|
||||||
if (curbuf->b_p_inf)
|
if (curbuf->b_p_inf)
|
||||||
p_scs = FALSE;
|
p_scs = FALSE;
|
||||||
regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
|
|
||||||
|
/* When invoked to match whole lines for CTRL-X CTRL-L adjust the pattern
|
||||||
|
* to only match at the start of a line. Otherwise just match the
|
||||||
|
* pattern. */
|
||||||
|
if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
|
||||||
|
{
|
||||||
|
i = STRLEN(pat) + 8;
|
||||||
|
ptr = alloc(i);
|
||||||
|
if (ptr == NULL)
|
||||||
|
return;
|
||||||
|
vim_snprintf((char *)ptr, i, "^\\s*\\zs%s", pat);
|
||||||
|
regmatch.regprog = vim_regcomp(ptr, p_magic ? RE_MAGIC : 0);
|
||||||
|
vim_free(ptr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
|
||||||
|
|
||||||
/* ignore case depends on 'ignorecase', 'smartcase' and "pat" */
|
/* ignore case depends on 'ignorecase', 'smartcase' and "pat" */
|
||||||
regmatch.rm_ic = ignorecase(pat);
|
regmatch.rm_ic = ignorecase(pat);
|
||||||
while (buf != NULL && regmatch.regprog != NULL && *dict != NUL
|
while (buf != NULL && regmatch.regprog != NULL && *dict != NUL
|
||||||
@@ -2537,7 +2555,10 @@ ins_compl_dictionaries(dict, pat, flags, thesaurus)
|
|||||||
while (vim_regexec(®match, buf, (colnr_T)(ptr - buf)))
|
while (vim_regexec(®match, buf, (colnr_T)(ptr - buf)))
|
||||||
{
|
{
|
||||||
ptr = regmatch.startp[0];
|
ptr = regmatch.startp[0];
|
||||||
ptr = find_word_end(ptr);
|
if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
|
||||||
|
ptr = find_line_end(ptr);
|
||||||
|
else
|
||||||
|
ptr = find_word_end(ptr);
|
||||||
add_r = ins_compl_add_infercase(regmatch.startp[0],
|
add_r = ins_compl_add_infercase(regmatch.startp[0],
|
||||||
(int)(ptr - regmatch.startp[0]),
|
(int)(ptr - regmatch.startp[0]),
|
||||||
files[i], dir, 0);
|
files[i], dir, 0);
|
||||||
@@ -2652,6 +2673,22 @@ find_word_end(ptr)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the end of the line, omitting CR and NL at the end.
|
||||||
|
* Returns a pointer to just after the line.
|
||||||
|
*/
|
||||||
|
static char_u *
|
||||||
|
find_line_end(ptr)
|
||||||
|
char_u *ptr;
|
||||||
|
{
|
||||||
|
char_u *s;
|
||||||
|
|
||||||
|
s = ptr + STRLEN(ptr);
|
||||||
|
while (s > ptr && (s[-1] == CAR || s[-1] == NL))
|
||||||
|
--s;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the list of completions
|
* Free the list of completions
|
||||||
*/
|
*/
|
||||||
@@ -3102,9 +3139,7 @@ ins_compl_next_buf(buf, flag)
|
|||||||
? buf->b_p_bl
|
? buf->b_p_bl
|
||||||
: (!buf->b_p_bl
|
: (!buf->b_p_bl
|
||||||
|| (buf->b_ml.ml_mfp == NULL) != (flag == 'u')))
|
|| (buf->b_ml.ml_mfp == NULL) != (flag == 'u')))
|
||||||
|| buf->b_scanned
|
|| buf->b_scanned))
|
||||||
|| (buf->b_ml.ml_mfp == NULL
|
|
||||||
&& ctrl_x_mode == CTRL_X_WHOLE_LINE)))
|
|
||||||
;
|
;
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
@@ -3176,8 +3211,8 @@ expand_by_function(type, base)
|
|||||||
* Get the next expansion(s), using "compl_pattern".
|
* Get the next expansion(s), using "compl_pattern".
|
||||||
* The search starts at position "ini" in curbuf and in the direction
|
* The search starts at position "ini" in curbuf and in the direction
|
||||||
* compl_direction.
|
* compl_direction.
|
||||||
* When "compl_started" is FALSE start at that position, otherwise
|
* When "compl_started" is FALSE start at that position, otherwise continue
|
||||||
* continue where we stopped searching before.
|
* where we stopped searching before.
|
||||||
* This may return before finding all the matches.
|
* This may return before finding all the matches.
|
||||||
* Return the total number of matches or -1 if still unknown -- Acevedo
|
* Return the total number of matches or -1 if still unknown -- Acevedo
|
||||||
*/
|
*/
|
||||||
@@ -3432,7 +3467,7 @@ ins_compl_get_exp(ini)
|
|||||||
RE_LAST);
|
RE_LAST);
|
||||||
if (!compl_started)
|
if (!compl_started)
|
||||||
{
|
{
|
||||||
/* set compl_started even on fail */
|
/* set "compl_started" even on fail */
|
||||||
compl_started = TRUE;
|
compl_started = TRUE;
|
||||||
first_match_pos = *pos;
|
first_match_pos = *pos;
|
||||||
last_match_pos = *pos;
|
last_match_pos = *pos;
|
||||||
@@ -4242,8 +4277,7 @@ ins_complete(c)
|
|||||||
/*
|
/*
|
||||||
* Find next match (and following matches).
|
* Find next match (and following matches).
|
||||||
*/
|
*/
|
||||||
n = ins_compl_next(TRUE, ins_compl_key2count(c),
|
n = ins_compl_next(TRUE, ins_compl_key2count(c), c != K_UP && c != K_DOWN);
|
||||||
c != K_UP && c != K_DOWN);
|
|
||||||
|
|
||||||
/* may undisplay the popup menu */
|
/* may undisplay the popup menu */
|
||||||
ins_compl_upd_pum();
|
ins_compl_upd_pum();
|
||||||
@@ -4671,29 +4705,14 @@ insertchar(c, flags, second_indent)
|
|||||||
int flags; /* INSCHAR_FORMAT, etc. */
|
int flags; /* INSCHAR_FORMAT, etc. */
|
||||||
int second_indent; /* indent for second line if >= 0 */
|
int second_indent; /* indent for second line if >= 0 */
|
||||||
{
|
{
|
||||||
int haveto_redraw = FALSE;
|
|
||||||
int textwidth;
|
int textwidth;
|
||||||
#ifdef FEAT_COMMENTS
|
#ifdef FEAT_COMMENTS
|
||||||
colnr_T leader_len;
|
|
||||||
char_u *p;
|
char_u *p;
|
||||||
int no_leader = FALSE;
|
|
||||||
int do_comments = (flags & INSCHAR_DO_COM);
|
|
||||||
#endif
|
#endif
|
||||||
int fo_white_par;
|
|
||||||
int first_line = TRUE;
|
|
||||||
int fo_ins_blank;
|
int fo_ins_blank;
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
int fo_multibyte;
|
|
||||||
#endif
|
|
||||||
int save_char = NUL;
|
|
||||||
int cc;
|
|
||||||
|
|
||||||
textwidth = comp_textwidth(flags & INSCHAR_FORMAT);
|
textwidth = comp_textwidth(flags & INSCHAR_FORMAT);
|
||||||
fo_ins_blank = has_format_option(FO_INS_BLANK);
|
fo_ins_blank = has_format_option(FO_INS_BLANK);
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
fo_multibyte = has_format_option(FO_MBYTE_BREAK);
|
|
||||||
#endif
|
|
||||||
fo_white_par = has_format_option(FO_WHITE_PAR);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to break the line in two or more pieces when:
|
* Try to break the line in two or more pieces when:
|
||||||
@@ -4710,7 +4729,7 @@ insertchar(c, flags, second_indent)
|
|||||||
* - 'formatoptions' doesn't have 'b' or a blank was inserted at or
|
* - 'formatoptions' doesn't have 'b' or a blank was inserted at or
|
||||||
* before 'textwidth'
|
* before 'textwidth'
|
||||||
*/
|
*/
|
||||||
if (textwidth
|
if (textwidth > 0
|
||||||
&& ((flags & INSCHAR_FORMAT)
|
&& ((flags & INSCHAR_FORMAT)
|
||||||
|| (!vim_iswhite(c)
|
|| (!vim_iswhite(c)
|
||||||
&& !((State & REPLACE_FLAG)
|
&& !((State & REPLACE_FLAG)
|
||||||
@@ -4725,288 +4744,15 @@ insertchar(c, flags, second_indent)
|
|||||||
|| Insstart_blank_vcol <= (colnr_T)textwidth
|
|| Insstart_blank_vcol <= (colnr_T)textwidth
|
||||||
))))))
|
))))))
|
||||||
{
|
{
|
||||||
/*
|
/* Format with 'formatexpr' when it's set. Use internal formatting
|
||||||
* When 'ai' is off we don't want a space under the cursor to be
|
* when 'formatexpr' isn't set or it returns non-zero. */
|
||||||
* deleted. Replace it with an 'x' temporarily.
|
#if defined(FEAT_EVAL)
|
||||||
*/
|
if (*curbuf->b_p_fex == NUL
|
||||||
if (!curbuf->b_p_ai)
|
|| fex_format(curwin->w_cursor.lnum, 1L) != 0)
|
||||||
{
|
|
||||||
cc = gchar_cursor();
|
|
||||||
if (vim_iswhite(cc))
|
|
||||||
{
|
|
||||||
save_char = cc;
|
|
||||||
pchar_cursor('x');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Repeat breaking lines, until the current line is not too long.
|
|
||||||
*/
|
|
||||||
while (!got_int)
|
|
||||||
{
|
|
||||||
int startcol; /* Cursor column at entry */
|
|
||||||
int wantcol; /* column at textwidth border */
|
|
||||||
int foundcol; /* column for start of spaces */
|
|
||||||
int end_foundcol = 0; /* column for start of word */
|
|
||||||
colnr_T len;
|
|
||||||
colnr_T virtcol;
|
|
||||||
#ifdef FEAT_VREPLACE
|
|
||||||
int orig_col = 0;
|
|
||||||
char_u *saved_text = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
colnr_T col;
|
internal_format(textwidth, second_indent, flags, c == NUL);
|
||||||
|
|
||||||
virtcol = get_nolist_virtcol();
|
|
||||||
if (virtcol < (colnr_T)textwidth)
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef FEAT_COMMENTS
|
|
||||||
if (no_leader)
|
|
||||||
do_comments = FALSE;
|
|
||||||
else if (!(flags & INSCHAR_FORMAT)
|
|
||||||
&& has_format_option(FO_WRAP_COMS))
|
|
||||||
do_comments = TRUE;
|
|
||||||
|
|
||||||
/* Don't break until after the comment leader */
|
|
||||||
if (do_comments)
|
|
||||||
leader_len = get_leader_len(ml_get_curline(), NULL, FALSE);
|
|
||||||
else
|
|
||||||
leader_len = 0;
|
|
||||||
|
|
||||||
/* If the line doesn't start with a comment leader, then don't
|
|
||||||
* start one in a following broken line. Avoids that a %word
|
|
||||||
* moved to the start of the next line causes all following lines
|
|
||||||
* to start with %. */
|
|
||||||
if (leader_len == 0)
|
|
||||||
no_leader = TRUE;
|
|
||||||
#endif
|
|
||||||
if (!(flags & INSCHAR_FORMAT)
|
|
||||||
#ifdef FEAT_COMMENTS
|
|
||||||
&& leader_len == 0
|
|
||||||
#endif
|
|
||||||
&& !has_format_option(FO_WRAP))
|
|
||||||
|
|
||||||
{
|
|
||||||
textwidth = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((startcol = curwin->w_cursor.col) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* find column of textwidth border */
|
|
||||||
coladvance((colnr_T)textwidth);
|
|
||||||
wantcol = curwin->w_cursor.col;
|
|
||||||
|
|
||||||
curwin->w_cursor.col = startcol - 1;
|
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
/* Correct cursor for multi-byte character. */
|
|
||||||
if (has_mbyte)
|
|
||||||
mb_adjust_cursor();
|
|
||||||
#endif
|
|
||||||
foundcol = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find position to break at.
|
|
||||||
* Stop at first entered white when 'formatoptions' has 'v'
|
|
||||||
*/
|
|
||||||
while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
|
|
||||||
|| curwin->w_cursor.lnum != Insstart.lnum
|
|
||||||
|| curwin->w_cursor.col >= Insstart.col)
|
|
||||||
{
|
|
||||||
cc = gchar_cursor();
|
|
||||||
if (WHITECHAR(cc))
|
|
||||||
{
|
|
||||||
/* remember position of blank just before text */
|
|
||||||
end_foundcol = curwin->w_cursor.col;
|
|
||||||
|
|
||||||
/* find start of sequence of blanks */
|
|
||||||
while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
|
|
||||||
{
|
|
||||||
dec_cursor();
|
|
||||||
cc = gchar_cursor();
|
|
||||||
}
|
|
||||||
if (curwin->w_cursor.col == 0 && WHITECHAR(cc))
|
|
||||||
break; /* only spaces in front of text */
|
|
||||||
#ifdef FEAT_COMMENTS
|
|
||||||
/* Don't break until after the comment leader */
|
|
||||||
if (curwin->w_cursor.col < leader_len)
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
if (has_format_option(FO_ONE_LETTER))
|
|
||||||
{
|
|
||||||
/* do not break after one-letter words */
|
|
||||||
if (curwin->w_cursor.col == 0)
|
|
||||||
break; /* one-letter word at begin */
|
|
||||||
|
|
||||||
col = curwin->w_cursor.col;
|
|
||||||
dec_cursor();
|
|
||||||
cc = gchar_cursor();
|
|
||||||
|
|
||||||
if (WHITECHAR(cc))
|
|
||||||
continue; /* one-letter, continue */
|
|
||||||
curwin->w_cursor.col = col;
|
|
||||||
}
|
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
if (has_mbyte)
|
|
||||||
foundcol = curwin->w_cursor.col
|
|
||||||
+ (*mb_ptr2len)(ml_get_cursor());
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
foundcol = curwin->w_cursor.col + 1;
|
|
||||||
if (curwin->w_cursor.col < (colnr_T)wantcol)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
else if (cc >= 0x100 && fo_multibyte
|
|
||||||
&& curwin->w_cursor.col <= (colnr_T)wantcol)
|
|
||||||
{
|
|
||||||
/* Break after or before a multi-byte character. */
|
|
||||||
foundcol = curwin->w_cursor.col;
|
|
||||||
if (curwin->w_cursor.col < (colnr_T)wantcol)
|
|
||||||
foundcol += (*mb_char2len)(cc);
|
|
||||||
end_foundcol = foundcol;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (curwin->w_cursor.col == 0)
|
|
||||||
break;
|
|
||||||
dec_cursor();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foundcol == 0) /* no spaces, cannot break line */
|
|
||||||
{
|
|
||||||
curwin->w_cursor.col = startcol;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Going to break the line, remove any "$" now. */
|
|
||||||
undisplay_dollar();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Offset between cursor position and line break is used by replace
|
|
||||||
* stack functions. VREPLACE does not use this, and backspaces
|
|
||||||
* over the text instead.
|
|
||||||
*/
|
|
||||||
#ifdef FEAT_VREPLACE
|
|
||||||
if (State & VREPLACE_FLAG)
|
|
||||||
orig_col = startcol; /* Will start backspacing from here */
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
replace_offset = startcol - end_foundcol - 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* adjust startcol for spaces that will be deleted and
|
|
||||||
* characters that will remain on top line
|
|
||||||
*/
|
|
||||||
curwin->w_cursor.col = foundcol;
|
|
||||||
while (cc = gchar_cursor(), WHITECHAR(cc))
|
|
||||||
inc_cursor();
|
|
||||||
startcol -= curwin->w_cursor.col;
|
|
||||||
if (startcol < 0)
|
|
||||||
startcol = 0;
|
|
||||||
|
|
||||||
#ifdef FEAT_VREPLACE
|
|
||||||
if (State & VREPLACE_FLAG)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* In VREPLACE mode, we will backspace over the text to be
|
|
||||||
* wrapped, so save a copy now to put on the next line.
|
|
||||||
*/
|
|
||||||
saved_text = vim_strsave(ml_get_cursor());
|
|
||||||
curwin->w_cursor.col = orig_col;
|
|
||||||
if (saved_text == NULL)
|
|
||||||
break; /* Can't do it, out of memory */
|
|
||||||
saved_text[startcol] = NUL;
|
|
||||||
|
|
||||||
/* Backspace over characters that will move to the next line */
|
|
||||||
if (!fo_white_par)
|
|
||||||
backspace_until_column(foundcol);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* put cursor after pos. to break line */
|
|
||||||
if (!fo_white_par)
|
|
||||||
curwin->w_cursor.col = foundcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Split the line just before the margin.
|
|
||||||
* Only insert/delete lines, but don't really redraw the window.
|
|
||||||
*/
|
|
||||||
open_line(FORWARD, OPENLINE_DELSPACES + OPENLINE_MARKFIX
|
|
||||||
+ (fo_white_par ? OPENLINE_KEEPTRAIL : 0)
|
|
||||||
#ifdef FEAT_COMMENTS
|
|
||||||
+ (do_comments ? OPENLINE_DO_COM : 0)
|
|
||||||
#endif
|
|
||||||
, old_indent);
|
|
||||||
old_indent = 0;
|
|
||||||
|
|
||||||
replace_offset = 0;
|
|
||||||
if (first_line)
|
|
||||||
{
|
|
||||||
if (second_indent < 0 && has_format_option(FO_Q_NUMBER))
|
|
||||||
second_indent = get_number_indent(curwin->w_cursor.lnum -1);
|
|
||||||
if (second_indent >= 0)
|
|
||||||
{
|
|
||||||
#ifdef FEAT_VREPLACE
|
|
||||||
if (State & VREPLACE_FLAG)
|
|
||||||
change_indent(INDENT_SET, second_indent, FALSE, NUL);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
(void)set_indent(second_indent, SIN_CHANGED);
|
|
||||||
}
|
|
||||||
first_line = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef FEAT_VREPLACE
|
|
||||||
if (State & VREPLACE_FLAG)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* In VREPLACE mode we have backspaced over the text to be
|
|
||||||
* moved, now we re-insert it into the new line.
|
|
||||||
*/
|
|
||||||
ins_bytes(saved_text);
|
|
||||||
vim_free(saved_text);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Check if cursor is not past the NUL off the line, cindent
|
|
||||||
* may have added or removed indent.
|
|
||||||
*/
|
|
||||||
curwin->w_cursor.col += startcol;
|
|
||||||
len = (colnr_T)STRLEN(ml_get_curline());
|
|
||||||
if (curwin->w_cursor.col > len)
|
|
||||||
curwin->w_cursor.col = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
haveto_redraw = TRUE;
|
|
||||||
#ifdef FEAT_CINDENT
|
|
||||||
can_cindent = TRUE;
|
|
||||||
#endif
|
|
||||||
/* moved the cursor, don't autoindent or cindent now */
|
|
||||||
did_ai = FALSE;
|
|
||||||
#ifdef FEAT_SMARTINDENT
|
|
||||||
did_si = FALSE;
|
|
||||||
can_si = FALSE;
|
|
||||||
can_si_back = FALSE;
|
|
||||||
#endif
|
|
||||||
line_breakcheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (save_char) /* put back space after cursor */
|
|
||||||
pchar_cursor(save_char);
|
|
||||||
|
|
||||||
if (c == NUL) /* formatting only */
|
|
||||||
return;
|
|
||||||
if (haveto_redraw)
|
|
||||||
{
|
|
||||||
update_topline();
|
|
||||||
redraw_curbuf_later(VALID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c == NUL) /* only formatting was wanted */
|
if (c == NUL) /* only formatting was wanted */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -5104,7 +4850,7 @@ insertchar(c, flags, second_indent)
|
|||||||
|
|
||||||
buf[0] = c;
|
buf[0] = c;
|
||||||
i = 1;
|
i = 1;
|
||||||
if (textwidth)
|
if (textwidth > 0)
|
||||||
virtcol = get_nolist_virtcol();
|
virtcol = get_nolist_virtcol();
|
||||||
/*
|
/*
|
||||||
* Stop the string when:
|
* Stop the string when:
|
||||||
@@ -5157,6 +4903,8 @@ insertchar(c, flags, second_indent)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
|
int cc;
|
||||||
|
|
||||||
if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
|
if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
|
||||||
{
|
{
|
||||||
char_u buf[MB_MAXBYTES + 1];
|
char_u buf[MB_MAXBYTES + 1];
|
||||||
@@ -5178,6 +4926,312 @@ insertchar(c, flags, second_indent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format text at the current insert position.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
internal_format(textwidth, second_indent, flags, format_only)
|
||||||
|
int textwidth;
|
||||||
|
int second_indent;
|
||||||
|
int flags;
|
||||||
|
int format_only;
|
||||||
|
{
|
||||||
|
int cc;
|
||||||
|
int save_char = NUL;
|
||||||
|
int haveto_redraw = FALSE;
|
||||||
|
int fo_ins_blank = has_format_option(FO_INS_BLANK);
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
int fo_multibyte = has_format_option(FO_MBYTE_BREAK);
|
||||||
|
#endif
|
||||||
|
int fo_white_par = has_format_option(FO_WHITE_PAR);
|
||||||
|
int first_line = TRUE;
|
||||||
|
#ifdef FEAT_COMMENTS
|
||||||
|
colnr_T leader_len;
|
||||||
|
int no_leader = FALSE;
|
||||||
|
int do_comments = (flags & INSCHAR_DO_COM);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When 'ai' is off we don't want a space under the cursor to be
|
||||||
|
* deleted. Replace it with an 'x' temporarily.
|
||||||
|
*/
|
||||||
|
if (!curbuf->b_p_ai)
|
||||||
|
{
|
||||||
|
cc = gchar_cursor();
|
||||||
|
if (vim_iswhite(cc))
|
||||||
|
{
|
||||||
|
save_char = cc;
|
||||||
|
pchar_cursor('x');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Repeat breaking lines, until the current line is not too long.
|
||||||
|
*/
|
||||||
|
while (!got_int)
|
||||||
|
{
|
||||||
|
int startcol; /* Cursor column at entry */
|
||||||
|
int wantcol; /* column at textwidth border */
|
||||||
|
int foundcol; /* column for start of spaces */
|
||||||
|
int end_foundcol = 0; /* column for start of word */
|
||||||
|
colnr_T len;
|
||||||
|
colnr_T virtcol;
|
||||||
|
#ifdef FEAT_VREPLACE
|
||||||
|
int orig_col = 0;
|
||||||
|
char_u *saved_text = NULL;
|
||||||
|
#endif
|
||||||
|
colnr_T col;
|
||||||
|
|
||||||
|
virtcol = get_nolist_virtcol();
|
||||||
|
if (virtcol < (colnr_T)textwidth)
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef FEAT_COMMENTS
|
||||||
|
if (no_leader)
|
||||||
|
do_comments = FALSE;
|
||||||
|
else if (!(flags & INSCHAR_FORMAT)
|
||||||
|
&& has_format_option(FO_WRAP_COMS))
|
||||||
|
do_comments = TRUE;
|
||||||
|
|
||||||
|
/* Don't break until after the comment leader */
|
||||||
|
if (do_comments)
|
||||||
|
leader_len = get_leader_len(ml_get_curline(), NULL, FALSE);
|
||||||
|
else
|
||||||
|
leader_len = 0;
|
||||||
|
|
||||||
|
/* If the line doesn't start with a comment leader, then don't
|
||||||
|
* start one in a following broken line. Avoids that a %word
|
||||||
|
* moved to the start of the next line causes all following lines
|
||||||
|
* to start with %. */
|
||||||
|
if (leader_len == 0)
|
||||||
|
no_leader = TRUE;
|
||||||
|
#endif
|
||||||
|
if (!(flags & INSCHAR_FORMAT)
|
||||||
|
#ifdef FEAT_COMMENTS
|
||||||
|
&& leader_len == 0
|
||||||
|
#endif
|
||||||
|
&& !has_format_option(FO_WRAP))
|
||||||
|
|
||||||
|
{
|
||||||
|
textwidth = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((startcol = curwin->w_cursor.col) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* find column of textwidth border */
|
||||||
|
coladvance((colnr_T)textwidth);
|
||||||
|
wantcol = curwin->w_cursor.col;
|
||||||
|
|
||||||
|
curwin->w_cursor.col = startcol - 1;
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
/* Correct cursor for multi-byte character. */
|
||||||
|
if (has_mbyte)
|
||||||
|
mb_adjust_cursor();
|
||||||
|
#endif
|
||||||
|
foundcol = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find position to break at.
|
||||||
|
* Stop at first entered white when 'formatoptions' has 'v'
|
||||||
|
*/
|
||||||
|
while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
|
||||||
|
|| curwin->w_cursor.lnum != Insstart.lnum
|
||||||
|
|| curwin->w_cursor.col >= Insstart.col)
|
||||||
|
{
|
||||||
|
cc = gchar_cursor();
|
||||||
|
if (WHITECHAR(cc))
|
||||||
|
{
|
||||||
|
/* remember position of blank just before text */
|
||||||
|
end_foundcol = curwin->w_cursor.col;
|
||||||
|
|
||||||
|
/* find start of sequence of blanks */
|
||||||
|
while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
|
||||||
|
{
|
||||||
|
dec_cursor();
|
||||||
|
cc = gchar_cursor();
|
||||||
|
}
|
||||||
|
if (curwin->w_cursor.col == 0 && WHITECHAR(cc))
|
||||||
|
break; /* only spaces in front of text */
|
||||||
|
#ifdef FEAT_COMMENTS
|
||||||
|
/* Don't break until after the comment leader */
|
||||||
|
if (curwin->w_cursor.col < leader_len)
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
if (has_format_option(FO_ONE_LETTER))
|
||||||
|
{
|
||||||
|
/* do not break after one-letter words */
|
||||||
|
if (curwin->w_cursor.col == 0)
|
||||||
|
break; /* one-letter word at begin */
|
||||||
|
|
||||||
|
col = curwin->w_cursor.col;
|
||||||
|
dec_cursor();
|
||||||
|
cc = gchar_cursor();
|
||||||
|
|
||||||
|
if (WHITECHAR(cc))
|
||||||
|
continue; /* one-letter, continue */
|
||||||
|
curwin->w_cursor.col = col;
|
||||||
|
}
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte)
|
||||||
|
foundcol = curwin->w_cursor.col
|
||||||
|
+ (*mb_ptr2len)(ml_get_cursor());
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
foundcol = curwin->w_cursor.col + 1;
|
||||||
|
if (curwin->w_cursor.col < (colnr_T)wantcol)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
else if (cc >= 0x100 && fo_multibyte
|
||||||
|
&& curwin->w_cursor.col <= (colnr_T)wantcol)
|
||||||
|
{
|
||||||
|
/* Break after or before a multi-byte character. */
|
||||||
|
foundcol = curwin->w_cursor.col;
|
||||||
|
if (curwin->w_cursor.col < (colnr_T)wantcol)
|
||||||
|
foundcol += (*mb_char2len)(cc);
|
||||||
|
end_foundcol = foundcol;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (curwin->w_cursor.col == 0)
|
||||||
|
break;
|
||||||
|
dec_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundcol == 0) /* no spaces, cannot break line */
|
||||||
|
{
|
||||||
|
curwin->w_cursor.col = startcol;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Going to break the line, remove any "$" now. */
|
||||||
|
undisplay_dollar();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Offset between cursor position and line break is used by replace
|
||||||
|
* stack functions. VREPLACE does not use this, and backspaces
|
||||||
|
* over the text instead.
|
||||||
|
*/
|
||||||
|
#ifdef FEAT_VREPLACE
|
||||||
|
if (State & VREPLACE_FLAG)
|
||||||
|
orig_col = startcol; /* Will start backspacing from here */
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
replace_offset = startcol - end_foundcol - 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* adjust startcol for spaces that will be deleted and
|
||||||
|
* characters that will remain on top line
|
||||||
|
*/
|
||||||
|
curwin->w_cursor.col = foundcol;
|
||||||
|
while (cc = gchar_cursor(), WHITECHAR(cc))
|
||||||
|
inc_cursor();
|
||||||
|
startcol -= curwin->w_cursor.col;
|
||||||
|
if (startcol < 0)
|
||||||
|
startcol = 0;
|
||||||
|
|
||||||
|
#ifdef FEAT_VREPLACE
|
||||||
|
if (State & VREPLACE_FLAG)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* In VREPLACE mode, we will backspace over the text to be
|
||||||
|
* wrapped, so save a copy now to put on the next line.
|
||||||
|
*/
|
||||||
|
saved_text = vim_strsave(ml_get_cursor());
|
||||||
|
curwin->w_cursor.col = orig_col;
|
||||||
|
if (saved_text == NULL)
|
||||||
|
break; /* Can't do it, out of memory */
|
||||||
|
saved_text[startcol] = NUL;
|
||||||
|
|
||||||
|
/* Backspace over characters that will move to the next line */
|
||||||
|
if (!fo_white_par)
|
||||||
|
backspace_until_column(foundcol);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/* put cursor after pos. to break line */
|
||||||
|
if (!fo_white_par)
|
||||||
|
curwin->w_cursor.col = foundcol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Split the line just before the margin.
|
||||||
|
* Only insert/delete lines, but don't really redraw the window.
|
||||||
|
*/
|
||||||
|
open_line(FORWARD, OPENLINE_DELSPACES + OPENLINE_MARKFIX
|
||||||
|
+ (fo_white_par ? OPENLINE_KEEPTRAIL : 0)
|
||||||
|
#ifdef FEAT_COMMENTS
|
||||||
|
+ (do_comments ? OPENLINE_DO_COM : 0)
|
||||||
|
#endif
|
||||||
|
, old_indent);
|
||||||
|
old_indent = 0;
|
||||||
|
|
||||||
|
replace_offset = 0;
|
||||||
|
if (first_line)
|
||||||
|
{
|
||||||
|
if (second_indent < 0 && has_format_option(FO_Q_NUMBER))
|
||||||
|
second_indent = get_number_indent(curwin->w_cursor.lnum -1);
|
||||||
|
if (second_indent >= 0)
|
||||||
|
{
|
||||||
|
#ifdef FEAT_VREPLACE
|
||||||
|
if (State & VREPLACE_FLAG)
|
||||||
|
change_indent(INDENT_SET, second_indent, FALSE, NUL);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
(void)set_indent(second_indent, SIN_CHANGED);
|
||||||
|
}
|
||||||
|
first_line = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_VREPLACE
|
||||||
|
if (State & VREPLACE_FLAG)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* In VREPLACE mode we have backspaced over the text to be
|
||||||
|
* moved, now we re-insert it into the new line.
|
||||||
|
*/
|
||||||
|
ins_bytes(saved_text);
|
||||||
|
vim_free(saved_text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Check if cursor is not past the NUL off the line, cindent
|
||||||
|
* may have added or removed indent.
|
||||||
|
*/
|
||||||
|
curwin->w_cursor.col += startcol;
|
||||||
|
len = (colnr_T)STRLEN(ml_get_curline());
|
||||||
|
if (curwin->w_cursor.col > len)
|
||||||
|
curwin->w_cursor.col = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
haveto_redraw = TRUE;
|
||||||
|
#ifdef FEAT_CINDENT
|
||||||
|
can_cindent = TRUE;
|
||||||
|
#endif
|
||||||
|
/* moved the cursor, don't autoindent or cindent now */
|
||||||
|
did_ai = FALSE;
|
||||||
|
#ifdef FEAT_SMARTINDENT
|
||||||
|
did_si = FALSE;
|
||||||
|
can_si = FALSE;
|
||||||
|
can_si_back = FALSE;
|
||||||
|
#endif
|
||||||
|
line_breakcheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (save_char != NUL) /* put back space after cursor */
|
||||||
|
pchar_cursor(save_char);
|
||||||
|
|
||||||
|
if (!format_only && haveto_redraw)
|
||||||
|
{
|
||||||
|
update_topline();
|
||||||
|
redraw_curbuf_later(VALID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called after inserting or deleting text: When 'formatoptions' includes the
|
* Called after inserting or deleting text: When 'formatoptions' includes the
|
||||||
* 'a' flag format from the current line until the end of the paragraph.
|
* 'a' flag format from the current line until the end of the paragraph.
|
||||||
@@ -7254,7 +7308,10 @@ ins_insert(replaceState)
|
|||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
set_vim_var_string(VV_INSERTMODE,
|
set_vim_var_string(VV_INSERTMODE,
|
||||||
(char_u *)((State & REPLACE_FLAG) ? "i" :
|
(char_u *)((State & REPLACE_FLAG) ? "i" :
|
||||||
replaceState == VREPLACE ? "v" : "r"), 1);
|
# ifdef FEAT_VREPLACE
|
||||||
|
replaceState == VREPLACE ? "v" :
|
||||||
|
# endif
|
||||||
|
"r"), 1);
|
||||||
# endif
|
# endif
|
||||||
apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
164
src/eval.c
164
src/eval.c
@@ -573,6 +573,7 @@ static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv));
|
|||||||
static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_printf __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_printf __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
|
static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_range __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_range __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
@@ -588,6 +589,8 @@ static void f_reverse __ARGS((typval_T *argvars, typval_T *rettv));
|
|||||||
static void f_search __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_search __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_searchdecl __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_searchdecl __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_searchpair __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_searchpair __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
|
static void f_searchpairpos __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
|
static void f_searchpos __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_server2client __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_server2client __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
@@ -704,6 +707,8 @@ static void func_ref __ARGS((char_u *name));
|
|||||||
static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
|
static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
|
||||||
static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
|
static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
|
||||||
static win_T *find_win_by_nr __ARGS((typval_T *vp));
|
static win_T *find_win_by_nr __ARGS((typval_T *vp));
|
||||||
|
static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
|
||||||
|
static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
|
||||||
|
|
||||||
/* Character used as separated in autoload function/variable names. */
|
/* Character used as separated in autoload function/variable names. */
|
||||||
#define AUTOLOAD_CHAR '#'
|
#define AUTOLOAD_CHAR '#'
|
||||||
@@ -6930,6 +6935,7 @@ static struct fst
|
|||||||
{"nr2char", 1, 1, f_nr2char},
|
{"nr2char", 1, 1, f_nr2char},
|
||||||
{"prevnonblank", 1, 1, f_prevnonblank},
|
{"prevnonblank", 1, 1, f_prevnonblank},
|
||||||
{"printf", 2, 19, f_printf},
|
{"printf", 2, 19, f_printf},
|
||||||
|
{"pumvisible", 0, 0, f_pumvisible},
|
||||||
{"range", 1, 3, f_range},
|
{"range", 1, 3, f_range},
|
||||||
{"readfile", 1, 3, f_readfile},
|
{"readfile", 1, 3, f_readfile},
|
||||||
{"remote_expr", 2, 3, f_remote_expr},
|
{"remote_expr", 2, 3, f_remote_expr},
|
||||||
@@ -6945,6 +6951,8 @@ static struct fst
|
|||||||
{"search", 1, 2, f_search},
|
{"search", 1, 2, f_search},
|
||||||
{"searchdecl", 1, 3, f_searchdecl},
|
{"searchdecl", 1, 3, f_searchdecl},
|
||||||
{"searchpair", 3, 5, f_searchpair},
|
{"searchpair", 3, 5, f_searchpair},
|
||||||
|
{"searchpairpos", 3, 5, f_searchpairpos},
|
||||||
|
{"searchpos", 1, 2, f_searchpos},
|
||||||
{"server2client", 2, 2, f_server2client},
|
{"server2client", 2, 2, f_server2client},
|
||||||
{"serverlist", 0, 0, f_serverlist},
|
{"serverlist", 0, 0, f_serverlist},
|
||||||
{"setbufvar", 3, 3, f_setbufvar},
|
{"setbufvar", 3, 3, f_setbufvar},
|
||||||
@@ -12213,6 +12221,22 @@ f_printf(argvars, rettv)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "pumvisible()" function
|
||||||
|
*/
|
||||||
|
/*ARGSUSED*/
|
||||||
|
static void
|
||||||
|
f_pumvisible(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
rettv->vval.v_number = 0;
|
||||||
|
#ifdef FEAT_INS_EXPAND
|
||||||
|
if (pum_visible())
|
||||||
|
rettv->vval.v_number = 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "range()" function
|
* "range()" function
|
||||||
*/
|
*/
|
||||||
@@ -13135,12 +13159,12 @@ get_search_arg(varp, flagsp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "search()" function
|
* Shared by search() and searchpos() functions
|
||||||
*/
|
*/
|
||||||
static void
|
static int
|
||||||
f_search(argvars, rettv)
|
search_cmn(argvars, match_pos)
|
||||||
typval_T *argvars;
|
typval_T *argvars;
|
||||||
typval_T *rettv;
|
pos_T *match_pos;
|
||||||
{
|
{
|
||||||
char_u *pat;
|
char_u *pat;
|
||||||
pos_T pos;
|
pos_T pos;
|
||||||
@@ -13148,8 +13172,7 @@ f_search(argvars, rettv)
|
|||||||
int save_p_ws = p_ws;
|
int save_p_ws = p_ws;
|
||||||
int dir;
|
int dir;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
int retval = 0; /* default: FAIL */
|
||||||
rettv->vval.v_number = 0; /* default: FAIL */
|
|
||||||
|
|
||||||
pat = get_tv_string(&argvars[0]);
|
pat = get_tv_string(&argvars[0]);
|
||||||
dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
|
dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
|
||||||
@@ -13172,10 +13195,16 @@ f_search(argvars, rettv)
|
|||||||
if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
|
if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
|
||||||
SEARCH_KEEP, RE_SEARCH) != FAIL)
|
SEARCH_KEEP, RE_SEARCH) != FAIL)
|
||||||
{
|
{
|
||||||
rettv->vval.v_number = pos.lnum;
|
retval = pos.lnum;
|
||||||
if (flags & SP_SETPCMARK)
|
if (flags & SP_SETPCMARK)
|
||||||
setpcmark();
|
setpcmark();
|
||||||
curwin->w_cursor = pos;
|
curwin->w_cursor = pos;
|
||||||
|
if (match_pos != NULL)
|
||||||
|
{
|
||||||
|
/* Store the match cursor position */
|
||||||
|
match_pos->lnum = pos.lnum;
|
||||||
|
match_pos->col = pos.col + 1;
|
||||||
|
}
|
||||||
/* "/$" will put the cursor after the end of the line, may need to
|
/* "/$" will put the cursor after the end of the line, may need to
|
||||||
* correct that here */
|
* correct that here */
|
||||||
check_cursor();
|
check_cursor();
|
||||||
@@ -13186,6 +13215,19 @@ f_search(argvars, rettv)
|
|||||||
curwin->w_cursor = save_cursor;
|
curwin->w_cursor = save_cursor;
|
||||||
theend:
|
theend:
|
||||||
p_ws = save_p_ws;
|
p_ws = save_p_ws;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "search()" function
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
f_search(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
rettv->vval.v_number = search_cmn(argvars, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -13216,12 +13258,12 @@ f_searchdecl(argvars, rettv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "searchpair()" function
|
* Used by searchpair() and searchpairpos()
|
||||||
*/
|
*/
|
||||||
static void
|
static int
|
||||||
f_searchpair(argvars, rettv)
|
searchpair_cmn(argvars, match_pos)
|
||||||
typval_T *argvars;
|
typval_T *argvars;
|
||||||
typval_T *rettv;
|
pos_T *match_pos;
|
||||||
{
|
{
|
||||||
char_u *spat, *mpat, *epat;
|
char_u *spat, *mpat, *epat;
|
||||||
char_u *skip;
|
char_u *skip;
|
||||||
@@ -13231,8 +13273,7 @@ f_searchpair(argvars, rettv)
|
|||||||
char_u nbuf1[NUMBUFLEN];
|
char_u nbuf1[NUMBUFLEN];
|
||||||
char_u nbuf2[NUMBUFLEN];
|
char_u nbuf2[NUMBUFLEN];
|
||||||
char_u nbuf3[NUMBUFLEN];
|
char_u nbuf3[NUMBUFLEN];
|
||||||
|
int retval = 0; /* default: FAIL */
|
||||||
rettv->vval.v_number = 0; /* default: FAIL */
|
|
||||||
|
|
||||||
/* Get the three pattern arguments: start, middle, end. */
|
/* Get the three pattern arguments: start, middle, end. */
|
||||||
spat = get_tv_string_chk(&argvars[0]);
|
spat = get_tv_string_chk(&argvars[0]);
|
||||||
@@ -13254,7 +13295,7 @@ f_searchpair(argvars, rettv)
|
|||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optional fifth argument: skip expresion */
|
/* Optional fifth argument: skip expression */
|
||||||
if (argvars[3].v_type == VAR_UNKNOWN
|
if (argvars[3].v_type == VAR_UNKNOWN
|
||||||
|| argvars[4].v_type == VAR_UNKNOWN)
|
|| argvars[4].v_type == VAR_UNKNOWN)
|
||||||
skip = (char_u *)"";
|
skip = (char_u *)"";
|
||||||
@@ -13263,10 +13304,55 @@ f_searchpair(argvars, rettv)
|
|||||||
if (skip == NULL)
|
if (skip == NULL)
|
||||||
goto theend; /* type error */
|
goto theend; /* type error */
|
||||||
|
|
||||||
rettv->vval.v_number = do_searchpair(spat, mpat, epat, dir, skip, flags);
|
retval = do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos);
|
||||||
|
|
||||||
theend:
|
theend:
|
||||||
p_ws = save_p_ws;
|
p_ws = save_p_ws;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "searchpair()" function
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
f_searchpair(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
rettv->vval.v_number = searchpair_cmn(argvars, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "searchpairpos()" function
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
f_searchpairpos(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
list_T *l;
|
||||||
|
pos_T match_pos;
|
||||||
|
int lnum = 0;
|
||||||
|
int col = 0;
|
||||||
|
|
||||||
|
rettv->vval.v_number = 0;
|
||||||
|
|
||||||
|
l = list_alloc();
|
||||||
|
if (l == NULL)
|
||||||
|
return;
|
||||||
|
rettv->v_type = VAR_LIST;
|
||||||
|
rettv->vval.v_list = l;
|
||||||
|
++l->lv_refcount;
|
||||||
|
|
||||||
|
if (searchpair_cmn(argvars, &match_pos) > 0)
|
||||||
|
{
|
||||||
|
lnum = match_pos.lnum;
|
||||||
|
col = match_pos.col;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_append_number(l, (varnumber_T)lnum);
|
||||||
|
list_append_number(l, (varnumber_T)col);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -13275,13 +13361,14 @@ theend:
|
|||||||
* Returns 0 or -1 for no match,
|
* Returns 0 or -1 for no match,
|
||||||
*/
|
*/
|
||||||
long
|
long
|
||||||
do_searchpair(spat, mpat, epat, dir, skip, flags)
|
do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos)
|
||||||
char_u *spat; /* start pattern */
|
char_u *spat; /* start pattern */
|
||||||
char_u *mpat; /* middle pattern */
|
char_u *mpat; /* middle pattern */
|
||||||
char_u *epat; /* end pattern */
|
char_u *epat; /* end pattern */
|
||||||
int dir; /* BACKWARD or FORWARD */
|
int dir; /* BACKWARD or FORWARD */
|
||||||
char_u *skip; /* skip expression */
|
char_u *skip; /* skip expression */
|
||||||
int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE */
|
int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE */
|
||||||
|
pos_T *match_pos;
|
||||||
{
|
{
|
||||||
char_u *save_cpo;
|
char_u *save_cpo;
|
||||||
char_u *pat, *pat2 = NULL, *pat3 = NULL;
|
char_u *pat, *pat2 = NULL, *pat3 = NULL;
|
||||||
@@ -13389,6 +13476,13 @@ do_searchpair(spat, mpat, epat, dir, skip, flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (match_pos != NULL)
|
||||||
|
{
|
||||||
|
/* Store the match cursor position */
|
||||||
|
match_pos->lnum = curwin->w_cursor.lnum;
|
||||||
|
match_pos->col = curwin->w_cursor.col + 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* If 'n' flag is used or search failed: restore cursor position. */
|
/* If 'n' flag is used or search failed: restore cursor position. */
|
||||||
if ((flags & SP_NOMOVE) || retval == 0)
|
if ((flags & SP_NOMOVE) || retval == 0)
|
||||||
curwin->w_cursor = save_cursor;
|
curwin->w_cursor = save_cursor;
|
||||||
@@ -13401,6 +13495,40 @@ theend:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "searchpos()" function
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
f_searchpos(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
list_T *l;
|
||||||
|
pos_T match_pos;
|
||||||
|
int lnum = 0;
|
||||||
|
int col = 0;
|
||||||
|
|
||||||
|
rettv->vval.v_number = 0;
|
||||||
|
|
||||||
|
l = list_alloc();
|
||||||
|
if (l == NULL)
|
||||||
|
return;
|
||||||
|
rettv->v_type = VAR_LIST;
|
||||||
|
rettv->vval.v_list = l;
|
||||||
|
++l->lv_refcount;
|
||||||
|
|
||||||
|
if (search_cmn(argvars, &match_pos) > 0)
|
||||||
|
{
|
||||||
|
lnum = match_pos.lnum;
|
||||||
|
col = match_pos.col;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_append_number(l, (varnumber_T)lnum);
|
||||||
|
list_append_number(l, (varnumber_T)col);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
static void
|
static void
|
||||||
f_server2client(argvars, rettv)
|
f_server2client(argvars, rettv)
|
||||||
@@ -14027,11 +14155,9 @@ f_spellbadword(argvars, rettv)
|
|||||||
typval_T *rettv;
|
typval_T *rettv;
|
||||||
{
|
{
|
||||||
char_u *word = (char_u *)"";
|
char_u *word = (char_u *)"";
|
||||||
#ifdef FEAT_SYN_HL
|
|
||||||
int len = 0;
|
|
||||||
hlf_T attr = HLF_COUNT;
|
hlf_T attr = HLF_COUNT;
|
||||||
|
int len = 0;
|
||||||
list_T *l;
|
list_T *l;
|
||||||
#endif
|
|
||||||
|
|
||||||
l = list_alloc();
|
l = list_alloc();
|
||||||
if (l == NULL)
|
if (l == NULL)
|
||||||
|
|||||||
@@ -877,6 +877,16 @@ EX(CMD_tag, "tag", ex_tag,
|
|||||||
RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR),
|
RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR),
|
||||||
EX(CMD_tags, "tags", do_tags,
|
EX(CMD_tags, "tags", do_tags,
|
||||||
TRLBAR|CMDWIN),
|
TRLBAR|CMDWIN),
|
||||||
|
EX(CMD_tab, "tab", ex_tab,
|
||||||
|
RANGE|NOTADR|COUNT|TRLBAR),
|
||||||
|
EX(CMD_tabclose, "tabclose", ex_tabclose,
|
||||||
|
BANG|TRLBAR|CMDWIN),
|
||||||
|
EX(CMD_tabedit, "tabedit", ex_tabedit,
|
||||||
|
BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
|
||||||
|
EX(CMD_tabfind, "tabfind", ex_tabedit,
|
||||||
|
BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
|
||||||
|
EX(CMD_tabs, "tabs", ex_tabs,
|
||||||
|
TRLBAR|CMDWIN),
|
||||||
EX(CMD_tcl, "tcl", ex_tcl,
|
EX(CMD_tcl, "tcl", ex_tcl,
|
||||||
RANGE|EXTRA|NEEDARG|CMDWIN),
|
RANGE|EXTRA|NEEDARG|CMDWIN),
|
||||||
EX(CMD_tcldo, "tcldo", ex_tcldo,
|
EX(CMD_tcldo, "tcldo", ex_tcldo,
|
||||||
|
|||||||
247
src/ex_docmd.c
247
src/ex_docmd.c
@@ -148,11 +148,13 @@ static void ex_cquit __ARGS((exarg_T *eap));
|
|||||||
static void ex_quit_all __ARGS((exarg_T *eap));
|
static void ex_quit_all __ARGS((exarg_T *eap));
|
||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
static void ex_close __ARGS((exarg_T *eap));
|
static void ex_close __ARGS((exarg_T *eap));
|
||||||
static void ex_win_close __ARGS((exarg_T *eap, win_T *win));
|
static void ex_win_close __ARGS((int forceit, win_T *win));
|
||||||
static void ex_only __ARGS((exarg_T *eap));
|
static void ex_only __ARGS((exarg_T *eap));
|
||||||
static void ex_all __ARGS((exarg_T *eap));
|
static void ex_all __ARGS((exarg_T *eap));
|
||||||
static void ex_resize __ARGS((exarg_T *eap));
|
static void ex_resize __ARGS((exarg_T *eap));
|
||||||
static void ex_stag __ARGS((exarg_T *eap));
|
static void ex_stag __ARGS((exarg_T *eap));
|
||||||
|
static void ex_tabclose __ARGS((exarg_T *eap));
|
||||||
|
static void ex_tabs __ARGS((exarg_T *eap));
|
||||||
#else
|
#else
|
||||||
# define ex_close ex_ni
|
# define ex_close ex_ni
|
||||||
# define ex_only ex_ni
|
# define ex_only ex_ni
|
||||||
@@ -160,6 +162,10 @@ static void ex_stag __ARGS((exarg_T *eap));
|
|||||||
# define ex_resize ex_ni
|
# define ex_resize ex_ni
|
||||||
# define ex_splitview ex_ni
|
# define ex_splitview ex_ni
|
||||||
# define ex_stag ex_ni
|
# define ex_stag ex_ni
|
||||||
|
# define ex_tabedit ex_ni
|
||||||
|
# define ex_tab ex_ni
|
||||||
|
# define ex_tabs ex_ni
|
||||||
|
# define ex_tabclose ex_ni
|
||||||
#endif
|
#endif
|
||||||
#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
|
#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
|
||||||
static void ex_pclose __ARGS((exarg_T *eap));
|
static void ex_pclose __ARGS((exarg_T *eap));
|
||||||
@@ -6138,19 +6144,38 @@ ex_close(eap)
|
|||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
if (!text_locked())
|
if (!text_locked())
|
||||||
ex_win_close(eap, curwin);
|
ex_win_close(eap->forceit, curwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_QUICKFIX
|
||||||
|
/*
|
||||||
|
* ":pclose": Close any preview window.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
ex_win_close(eap, win)
|
ex_pclose(eap)
|
||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
win_T *win;
|
||||||
|
|
||||||
|
for (win = firstwin; win != NULL; win = win->w_next)
|
||||||
|
if (win->w_p_pvw)
|
||||||
|
{
|
||||||
|
ex_win_close(eap->forceit, win);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
ex_win_close(forceit, win)
|
||||||
|
int forceit;
|
||||||
win_T *win;
|
win_T *win;
|
||||||
{
|
{
|
||||||
int need_hide;
|
int need_hide;
|
||||||
buf_T *buf = win->w_buffer;
|
buf_T *buf = win->w_buffer;
|
||||||
|
|
||||||
need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1);
|
need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1);
|
||||||
if (need_hide && !P_HID(buf) && !eap->forceit)
|
if (need_hide && !P_HID(buf) && !forceit)
|
||||||
{
|
{
|
||||||
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
|
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
|
||||||
if ((p_confirm || cmdmod.confirm) && p_write)
|
if ((p_confirm || cmdmod.confirm) && p_write)
|
||||||
@@ -6175,24 +6200,33 @@ ex_win_close(eap, win)
|
|||||||
win_close(win, !need_hide && !P_HID(buf));
|
win_close(win, !need_hide && !P_HID(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_QUICKFIX
|
|
||||||
/*
|
/*
|
||||||
* ":pclose": Close any preview window.
|
* ":tabclose": close current tab page, unless it is the last one
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
ex_pclose(eap)
|
ex_tabclose(eap)
|
||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
win_T *win;
|
# ifdef FEAT_CMDWIN
|
||||||
|
if (cmdwin_type != 0)
|
||||||
for (win = firstwin; win != NULL; win = win->w_next)
|
cmdwin_result = K_IGNORE;
|
||||||
if (win->w_p_pvw)
|
else
|
||||||
|
# endif
|
||||||
|
if (!text_locked())
|
||||||
{
|
{
|
||||||
ex_win_close(eap, win);
|
if (first_tabpage->tp_next == NULL)
|
||||||
break;
|
EMSG(_("E999: Cannot close last tab page"));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* First close all the windows but the current one. If that
|
||||||
|
* worked then close the last window in this tab, that will
|
||||||
|
* close it. */
|
||||||
|
ex_only(eap);
|
||||||
|
if (lastwin == firstwin)
|
||||||
|
ex_win_close(eap->forceit, curwin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ":only".
|
* ":only".
|
||||||
@@ -6722,41 +6756,41 @@ ex_splitview(eap)
|
|||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
win_T *old_curwin;
|
win_T *old_curwin;
|
||||||
#if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
||||||
char_u *fname = NULL;
|
char_u *fname = NULL;
|
||||||
#endif
|
# endif
|
||||||
#ifdef FEAT_BROWSE
|
# ifdef FEAT_BROWSE
|
||||||
int browse_flag = cmdmod.browse;
|
int browse_flag = cmdmod.browse;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef FEAT_VERTSPLIT
|
# ifndef FEAT_VERTSPLIT
|
||||||
if (eap->cmdidx == CMD_vsplit || eap->cmdidx == CMD_vnew)
|
if (eap->cmdidx == CMD_vsplit || eap->cmdidx == CMD_vnew)
|
||||||
{
|
{
|
||||||
ex_ni(eap);
|
ex_ni(eap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
old_curwin = curwin;
|
old_curwin = curwin;
|
||||||
#ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
need_mouse_correct = TRUE;
|
need_mouse_correct = TRUE;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifdef FEAT_QUICKFIX
|
# ifdef FEAT_QUICKFIX
|
||||||
/* A ":split" in the quickfix window works like ":new". Don't want two
|
/* A ":split" in the quickfix window works like ":new". Don't want two
|
||||||
* quickfix windows. */
|
* quickfix windows. */
|
||||||
if (bt_quickfix(curbuf))
|
if (bt_quickfix(curbuf))
|
||||||
{
|
{
|
||||||
if (eap->cmdidx == CMD_split)
|
if (eap->cmdidx == CMD_split)
|
||||||
eap->cmdidx = CMD_new;
|
eap->cmdidx = CMD_new;
|
||||||
# ifdef FEAT_VERTSPLIT
|
# ifdef FEAT_VERTSPLIT
|
||||||
if (eap->cmdidx == CMD_vsplit)
|
if (eap->cmdidx == CMD_vsplit)
|
||||||
eap->cmdidx = CMD_vnew;
|
eap->cmdidx = CMD_vnew;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifdef FEAT_SEARCHPATH
|
# ifdef FEAT_SEARCHPATH
|
||||||
if (eap->cmdidx == CMD_sfind)
|
if (eap->cmdidx == CMD_sfind)
|
||||||
{
|
{
|
||||||
fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
|
fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
|
||||||
@@ -6765,15 +6799,15 @@ ex_splitview(eap)
|
|||||||
goto theend;
|
goto theend;
|
||||||
eap->arg = fname;
|
eap->arg = fname;
|
||||||
}
|
}
|
||||||
# ifdef FEAT_BROWSE
|
# ifdef FEAT_BROWSE
|
||||||
else
|
else
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
# ifdef FEAT_BROWSE
|
||||||
#ifdef FEAT_BROWSE
|
|
||||||
if (cmdmod.browse
|
if (cmdmod.browse
|
||||||
# ifdef FEAT_VERTSPLIT
|
# ifdef FEAT_VERTSPLIT
|
||||||
&& eap->cmdidx != CMD_vnew
|
&& eap->cmdidx != CMD_vnew
|
||||||
#endif
|
# endif
|
||||||
&& eap->cmdidx != CMD_new)
|
&& eap->cmdidx != CMD_new)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
@@ -6797,36 +6831,165 @@ ex_splitview(eap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmdmod.browse = FALSE; /* Don't browse again in do_ecmd(). */
|
cmdmod.browse = FALSE; /* Don't browse again in do_ecmd(). */
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
|
if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
|
||||||
*eap->cmd == 'v' ? WSP_VERT : 0) != FAIL)
|
*eap->cmd == 'v' ? WSP_VERT : 0) != FAIL)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_SCROLLBIND
|
# ifdef FEAT_SCROLLBIND
|
||||||
/* Reset 'scrollbind' when editing another file, but keep it when
|
/* Reset 'scrollbind' when editing another file, but keep it when
|
||||||
* doing ":split" without arguments. */
|
* doing ":split" without arguments. */
|
||||||
if (*eap->arg != NUL
|
if (*eap->arg != NUL
|
||||||
#ifdef FEAT_BROWSE
|
# ifdef FEAT_BROWSE
|
||||||
|| cmdmod.browse
|
|| cmdmod.browse
|
||||||
#endif
|
# endif
|
||||||
)
|
)
|
||||||
curwin->w_p_scb = FALSE;
|
curwin->w_p_scb = FALSE;
|
||||||
else
|
else
|
||||||
do_check_scrollbind(FALSE);
|
do_check_scrollbind(FALSE);
|
||||||
#endif
|
# endif
|
||||||
do_exedit(eap, old_curwin);
|
do_exedit(eap, old_curwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_BROWSE
|
# ifdef FEAT_BROWSE
|
||||||
cmdmod.browse = browse_flag;
|
cmdmod.browse = browse_flag;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
||||||
theend:
|
theend:
|
||||||
vim_free(fname);
|
vim_free(fname);
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
/*
|
||||||
|
* :tabedit [[+command] file] open new Tab page with empty window
|
||||||
|
* :tabedit [[+command] file] open new Tab page and edit "file"
|
||||||
|
* :tabfind [[+command] file] open new Tab page and find "file"
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ex_tabedit(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
||||||
|
char_u *fname = NULL;
|
||||||
|
# endif
|
||||||
|
# ifdef FEAT_BROWSE
|
||||||
|
int browse_flag = cmdmod.browse;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef FEAT_GUI
|
||||||
|
need_mouse_correct = TRUE;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef FEAT_SEARCHPATH
|
||||||
|
if (eap->cmdidx == CMD_tabfind)
|
||||||
|
{
|
||||||
|
fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
|
||||||
|
FNAME_MESS, TRUE, curbuf->b_ffname);
|
||||||
|
if (fname == NULL)
|
||||||
|
goto theend;
|
||||||
|
eap->arg = fname;
|
||||||
|
}
|
||||||
|
# ifdef FEAT_BROWSE
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# ifdef FEAT_BROWSE
|
||||||
|
if (cmdmod.browse)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
# ifdef FEAT_GUI
|
||||||
|
!gui.in_use &&
|
||||||
|
# endif
|
||||||
|
au_has_group((char_u *)"FileExplorer"))
|
||||||
|
{
|
||||||
|
/* No browsing supported but we do have the file explorer:
|
||||||
|
* Edit the directory. */
|
||||||
|
if (*eap->arg == NUL || !mch_isdir(eap->arg))
|
||||||
|
eap->arg = (char_u *)".";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fname = do_browse(0, (char_u *)_("Edit File in new tab page"),
|
||||||
|
eap->arg, NULL, NULL, NULL, curbuf);
|
||||||
|
if (fname == NULL)
|
||||||
|
goto theend;
|
||||||
|
eap->arg = fname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmdmod.browse = FALSE; /* Don't browse again in do_ecmd(). */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if (win_new_tabpage() != FAIL)
|
||||||
|
{
|
||||||
|
# ifdef FEAT_SCROLLBIND
|
||||||
|
curwin->w_p_scb = FALSE;
|
||||||
|
# endif
|
||||||
|
do_exedit(eap, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef FEAT_BROWSE
|
||||||
|
cmdmod.browse = browse_flag;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
|
||||||
|
theend:
|
||||||
|
vim_free(fname);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* :tab command
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ex_tab(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
goto_tabpage((int)eap->line2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* :tabs command: List tabs and their contents.
|
||||||
|
*/
|
||||||
|
/*ARGSUSED*/
|
||||||
|
static void
|
||||||
|
ex_tabs(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
tabpage_T *tp;
|
||||||
|
win_T *wp;
|
||||||
|
int tabcount = 1;
|
||||||
|
|
||||||
|
msg_start();
|
||||||
|
msg_scroll = TRUE;
|
||||||
|
for (tp = first_tabpage; tp != NULL && !got_int; tp = tp->tp_next)
|
||||||
|
{
|
||||||
|
msg_putchar('\n');
|
||||||
|
vim_snprintf((char *)IObuff, IOSIZE, _("Tab page %d"), tabcount++);
|
||||||
|
msg_outtrans_attr(IObuff, hl_attr(HLF_T));
|
||||||
|
out_flush(); /* output one line at a time */
|
||||||
|
ui_breakcheck();
|
||||||
|
|
||||||
|
if (tp->tp_topframe == topframe)
|
||||||
|
wp = firstwin;
|
||||||
|
else
|
||||||
|
wp = tp->tp_firstwin;
|
||||||
|
for ( ; wp != NULL && !got_int; wp = wp->w_next)
|
||||||
|
{
|
||||||
|
msg_puts((char_u *)"\n ");
|
||||||
|
if (buf_spname(wp->w_buffer) != NULL)
|
||||||
|
STRCPY(IObuff, buf_spname(wp->w_buffer));
|
||||||
|
else
|
||||||
|
home_replace(wp->w_buffer, wp->w_buffer->b_fname,
|
||||||
|
IObuff, IOSIZE, TRUE);
|
||||||
|
msg_outtrans(IObuff);
|
||||||
|
out_flush(); /* output one line at a time */
|
||||||
|
ui_breakcheck();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* FEAT_WINDOWS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ":mode": Set screen mode.
|
* ":mode": Set screen mode.
|
||||||
|
|||||||
@@ -488,6 +488,7 @@ EXTERN win_T *prevwin INIT(= NULL); /* previous window */
|
|||||||
# define W_NEXT(wp) NULL
|
# define W_NEXT(wp) NULL
|
||||||
# define FOR_ALL_WINDOWS(wp) wp = curwin;
|
# define FOR_ALL_WINDOWS(wp) wp = curwin;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EXTERN win_T *curwin; /* currently active window */
|
EXTERN win_T *curwin; /* currently active window */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -496,6 +497,15 @@ EXTERN win_T *curwin; /* currently active window */
|
|||||||
*/
|
*/
|
||||||
EXTERN frame_T *topframe; /* top of the window frame tree */
|
EXTERN frame_T *topframe; /* top of the window frame tree */
|
||||||
|
|
||||||
|
#ifdef FEAT_WINDOWS
|
||||||
|
/*
|
||||||
|
* Tab pages are nothing more than alternative topframes. "first_tabpage"
|
||||||
|
* points to the first one in the list, "topframe" is the current one.
|
||||||
|
*/
|
||||||
|
EXTERN tabpage_T *first_tabpage;
|
||||||
|
EXTERN int redraw_tabpage INIT(= FALSE); /* redraw tab pages line */
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All buffers are linked in a list. 'firstbuf' points to the first entry,
|
* All buffers are linked in a list. 'firstbuf' points to the first entry,
|
||||||
* 'lastbuf' to the last entry and 'curbuf' to the currently active buffer.
|
* 'lastbuf' to the last entry and 'curbuf' to the currently active buffer.
|
||||||
|
|||||||
@@ -168,7 +168,7 @@
|
|||||||
typedef struct GuiScrollbar
|
typedef struct GuiScrollbar
|
||||||
{
|
{
|
||||||
long ident; /* Unique identifier for each scrollbar */
|
long ident; /* Unique identifier for each scrollbar */
|
||||||
struct window *wp; /* Scrollbar's window, NULL for bottom */
|
win_T *wp; /* Scrollbar's window, NULL for bottom */
|
||||||
int type; /* one of SBAR_{LEFT,RIGHT,BOTTOM} */
|
int type; /* one of SBAR_{LEFT,RIGHT,BOTTOM} */
|
||||||
long value; /* Represents top line number visible */
|
long value; /* Represents top line number visible */
|
||||||
#ifdef FEAT_GUI_ATHENA
|
#ifdef FEAT_GUI_ATHENA
|
||||||
|
|||||||
@@ -609,7 +609,10 @@ key_event(BalloonEval *beval, unsigned keyval, int is_keypress)
|
|||||||
? (int)GDK_CONTROL_MASK : 0);
|
? (int)GDK_CONTROL_MASK : 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
cancelBalloon(beval);
|
/* Don't do this for key release, we apparently get these with
|
||||||
|
* focus changes in some GTK version. */
|
||||||
|
if (is_keypress)
|
||||||
|
cancelBalloon(beval);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Scheme_Type tag;
|
Scheme_Type tag;
|
||||||
struct window *win;
|
win_T *win;
|
||||||
} vim_mz_window;
|
} vim_mz_window;
|
||||||
|
|
||||||
#define INVALID_WINDOW_VALUE ((win_T *)(-1))
|
#define INVALID_WINDOW_VALUE ((win_T *)(-1))
|
||||||
|
|||||||
13
src/main.c
13
src/main.c
@@ -297,9 +297,11 @@ main
|
|||||||
TIME_MSG("window checked");
|
TIME_MSG("window checked");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate the first window and buffer. Can't do much without it.
|
* Allocate the first window and buffer.
|
||||||
|
* Can't do anything without it, exit when it fails.
|
||||||
*/
|
*/
|
||||||
win_alloc_first();
|
if (win_alloc_first() == FAIL)
|
||||||
|
mch_exit(0);
|
||||||
|
|
||||||
init_yank(); /* init yank buffers */
|
init_yank(); /* init yank buffers */
|
||||||
|
|
||||||
@@ -505,12 +507,7 @@ main
|
|||||||
if (usingNetbeans)
|
if (usingNetbeans)
|
||||||
Columns += 2; /* leave room for glyph gutter */
|
Columns += 2; /* leave room for glyph gutter */
|
||||||
#endif
|
#endif
|
||||||
firstwin->w_height = Rows - p_ch;
|
win_init_size();
|
||||||
topframe->fr_height = Rows - p_ch;
|
|
||||||
#ifdef FEAT_VERTSPLIT
|
|
||||||
firstwin->w_width = Columns;
|
|
||||||
topframe->fr_width = Columns;
|
|
||||||
#endif
|
|
||||||
#ifdef FEAT_DIFF
|
#ifdef FEAT_DIFF
|
||||||
/* Set the 'diff' option now, so that it can be checked for in a .vimrc
|
/* Set the 'diff' option now, so that it can be checked for in a .vimrc
|
||||||
* file. There is no buffer yet though. */
|
* file. There is no buffer yet though. */
|
||||||
|
|||||||
@@ -3355,7 +3355,7 @@ get_off_or_lnum(buf_T *buf, char_u **argp)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert lnum,col to character offset
|
* Convert (lnum,col) to byte offset in the file.
|
||||||
*/
|
*/
|
||||||
static long
|
static long
|
||||||
pos2off(buf_T *buf, pos_T *pos)
|
pos2off(buf_T *buf, pos_T *pos)
|
||||||
|
|||||||
13
src/normal.c
13
src/normal.c
@@ -1935,7 +1935,12 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_FORMAT:
|
case OP_FORMAT:
|
||||||
if (*p_fp != NUL)
|
#if defined(FEAT_EVAL)
|
||||||
|
if (*curbuf->b_p_fex != NUL)
|
||||||
|
op_formatexpr(oap); /* use expression */
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (*p_fp != NUL)
|
||||||
op_colon(oap); /* use external command */
|
op_colon(oap); /* use external command */
|
||||||
else
|
else
|
||||||
op_format(oap, FALSE); /* use internal function */
|
op_format(oap, FALSE); /* use internal function */
|
||||||
@@ -7832,6 +7837,12 @@ nv_g_cmd(cap)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_WINDOWS
|
||||||
|
case 't':
|
||||||
|
goto_tabpage((int)cap->count0);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
clearopbeep(oap);
|
clearopbeep(oap);
|
||||||
break;
|
break;
|
||||||
|
|||||||
43
src/ops.c
43
src/ops.c
@@ -4312,6 +4312,49 @@ op_format(oap, keep_cursor)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Implementation of the format operator 'gq' for when using 'formatexpr'.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
op_formatexpr(oap)
|
||||||
|
oparg_T *oap;
|
||||||
|
{
|
||||||
|
# ifdef FEAT_VISUAL
|
||||||
|
if (oap->is_VIsual)
|
||||||
|
/* When there is no change: need to remove the Visual selection */
|
||||||
|
redraw_curbuf_later(INVERTED);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
(void)fex_format(oap->start.lnum, oap->line_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fex_format(lnum, count)
|
||||||
|
linenr_T lnum;
|
||||||
|
long count;
|
||||||
|
{
|
||||||
|
int use_sandbox = was_set_insecurely((char_u *)"formatexpr");
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set v:lnum to the first line number and v:count to the number of lines.
|
||||||
|
*/
|
||||||
|
set_vim_var_nr(VV_LNUM, lnum);
|
||||||
|
set_vim_var_nr(VV_COUNT, count);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Evaluate the function.
|
||||||
|
*/
|
||||||
|
if (use_sandbox)
|
||||||
|
++sandbox;
|
||||||
|
r = eval_to_number(curbuf->b_p_fex);
|
||||||
|
if (use_sandbox)
|
||||||
|
--sandbox;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Format "line_count" lines, starting at the cursor position.
|
* Format "line_count" lines, starting at the cursor position.
|
||||||
* When "line_count" is negative, format until the end of the paragraph.
|
* When "line_count" is negative, format until the end of the paragraph.
|
||||||
|
|||||||
26
src/option.c
26
src/option.c
@@ -79,6 +79,7 @@ typedef enum
|
|||||||
, PV_FDT
|
, PV_FDT
|
||||||
, PV_FEN
|
, PV_FEN
|
||||||
, PV_FENC
|
, PV_FENC
|
||||||
|
, PV_FEX
|
||||||
, PV_FF
|
, PV_FF
|
||||||
, PV_FML
|
, PV_FML
|
||||||
, PV_FMR
|
, PV_FMR
|
||||||
@@ -204,6 +205,9 @@ static char_u *p_inex;
|
|||||||
static char_u *p_inde;
|
static char_u *p_inde;
|
||||||
static char_u *p_indk;
|
static char_u *p_indk;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
static char_u *p_fex;
|
||||||
|
#endif
|
||||||
static int p_inf;
|
static int p_inf;
|
||||||
static char_u *p_isk;
|
static char_u *p_isk;
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
@@ -974,6 +978,15 @@ static struct vimoption
|
|||||||
# endif
|
# endif
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
{"formatexpr", "fex", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
(char_u *)&p_fex, PV_FEX,
|
||||||
|
{(char_u *)"", (char_u *)0L}
|
||||||
|
#else
|
||||||
|
(char_u *)NULL, PV_NONE,
|
||||||
|
{(char_u *)0L, (char_u *)0L}
|
||||||
|
#endif
|
||||||
|
},
|
||||||
{"formatoptions","fo", P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
|
{"formatoptions","fo", P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
|
||||||
(char_u *)&p_fo, PV_FO,
|
(char_u *)&p_fo, PV_FO,
|
||||||
{(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}},
|
{(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}},
|
||||||
@@ -1129,7 +1142,7 @@ static struct vimoption
|
|||||||
{(char_u *)FALSE, (char_u *)0L}},
|
{(char_u *)FALSE, (char_u *)0L}},
|
||||||
{"highlight", "hl", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
|
{"highlight", "hl", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
|
||||||
(char_u *)&p_hl, PV_NONE,
|
(char_u *)&p_hl, PV_NONE,
|
||||||
{(char_u *)"8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb",
|
{(char_u *)"8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabPage,#:TabPageSel,_:TabPageFill",
|
||||||
(char_u *)0L}},
|
(char_u *)0L}},
|
||||||
{"history", "hi", P_NUM|P_VIM,
|
{"history", "hi", P_NUM|P_VIM,
|
||||||
(char_u *)&p_hi, PV_NONE,
|
(char_u *)&p_hi, PV_NONE,
|
||||||
@@ -2264,7 +2277,7 @@ static struct vimoption
|
|||||||
(char_u *)NULL, PV_NONE,
|
(char_u *)NULL, PV_NONE,
|
||||||
#endif
|
#endif
|
||||||
{(char_u *)85L, (char_u *)0L}},
|
{(char_u *)85L, (char_u *)0L}},
|
||||||
{"titleold", NULL, P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE,
|
{"titleold", NULL, P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC,
|
||||||
#ifdef FEAT_TITLE
|
#ifdef FEAT_TITLE
|
||||||
(char_u *)&p_titleold, PV_NONE,
|
(char_u *)&p_titleold, PV_NONE,
|
||||||
{(char_u *)N_("Thanks for flying Vim"),
|
{(char_u *)N_("Thanks for flying Vim"),
|
||||||
@@ -4755,6 +4768,9 @@ check_buf_options(buf)
|
|||||||
check_string_option(&buf->b_p_inde);
|
check_string_option(&buf->b_p_inde);
|
||||||
check_string_option(&buf->b_p_indk);
|
check_string_option(&buf->b_p_indk);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
check_string_option(&buf->b_p_fex);
|
||||||
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
check_string_option(&buf->b_p_key);
|
check_string_option(&buf->b_p_key);
|
||||||
#endif
|
#endif
|
||||||
@@ -8583,6 +8599,9 @@ get_varp(p)
|
|||||||
case PV_INDE: return (char_u *)&(curbuf->b_p_inde);
|
case PV_INDE: return (char_u *)&(curbuf->b_p_inde);
|
||||||
case PV_INDK: return (char_u *)&(curbuf->b_p_indk);
|
case PV_INDK: return (char_u *)&(curbuf->b_p_indk);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
case PV_FEX: return (char_u *)&(curbuf->b_p_fex);
|
||||||
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
case PV_KEY: return (char_u *)&(curbuf->b_p_key);
|
case PV_KEY: return (char_u *)&(curbuf->b_p_key);
|
||||||
#endif
|
#endif
|
||||||
@@ -8942,6 +8961,9 @@ buf_copy_options(buf, flags)
|
|||||||
buf->b_p_inde = vim_strsave(p_inde);
|
buf->b_p_inde = vim_strsave(p_inde);
|
||||||
buf->b_p_indk = vim_strsave(p_indk);
|
buf->b_p_indk = vim_strsave(p_indk);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
buf->b_p_fex = vim_strsave(p_fex);
|
||||||
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
buf->b_p_key = vim_strsave(p_key);
|
buf->b_p_key = vim_strsave(p_key);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save));
|
|||||||
long get_dict_number __ARGS((dict_T *d, char_u *key));
|
long get_dict_number __ARGS((dict_T *d, char_u *key));
|
||||||
char_u *get_function_name __ARGS((expand_T *xp, int idx));
|
char_u *get_function_name __ARGS((expand_T *xp, int idx));
|
||||||
char_u *get_expr_name __ARGS((expand_T *xp, int idx));
|
char_u *get_expr_name __ARGS((expand_T *xp, int idx));
|
||||||
long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags));
|
long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos));
|
||||||
void set_vim_var_nr __ARGS((int idx, long val));
|
void set_vim_var_nr __ARGS((int idx, long val));
|
||||||
long get_vim_var_nr __ARGS((int idx));
|
long get_vim_var_nr __ARGS((int idx));
|
||||||
char_u *get_vim_var_str __ARGS((int idx));
|
char_u *get_vim_var_str __ARGS((int idx));
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ void alist_set __ARGS((alist_T *al, int count, char_u **files, int use_curbuf, i
|
|||||||
void alist_add __ARGS((alist_T *al, char_u *fname, int set_fnum));
|
void alist_add __ARGS((alist_T *al, char_u *fname, int set_fnum));
|
||||||
void alist_slash_adjust __ARGS((void));
|
void alist_slash_adjust __ARGS((void));
|
||||||
void ex_splitview __ARGS((exarg_T *eap));
|
void ex_splitview __ARGS((exarg_T *eap));
|
||||||
|
void ex_tabedit __ARGS((exarg_T *eap));
|
||||||
|
void ex_tab __ARGS((exarg_T *eap));
|
||||||
void do_exedit __ARGS((exarg_T *eap, win_T *old_curwin));
|
void do_exedit __ARGS((exarg_T *eap, win_T *old_curwin));
|
||||||
void free_cd_dir __ARGS((void));
|
void free_cd_dir __ARGS((void));
|
||||||
void do_sleep __ARGS((long msec));
|
void do_sleep __ARGS((long msec));
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ void ex_display __ARGS((exarg_T *eap));
|
|||||||
void do_do_join __ARGS((long count, int insert_space));
|
void do_do_join __ARGS((long count, int insert_space));
|
||||||
int do_join __ARGS((int insert_space));
|
int do_join __ARGS((int insert_space));
|
||||||
void op_format __ARGS((oparg_T *oap, int keep_cursor));
|
void op_format __ARGS((oparg_T *oap, int keep_cursor));
|
||||||
|
void op_formatexpr __ARGS((oparg_T *oap));
|
||||||
|
int fex_format __ARGS((linenr_T lnum, long count));
|
||||||
void format_lines __ARGS((linenr_T line_count));
|
void format_lines __ARGS((linenr_T line_count));
|
||||||
int paragraph_start __ARGS((linenr_T lnum));
|
int paragraph_start __ARGS((linenr_T lnum));
|
||||||
int do_addsub __ARGS((int command, linenr_T Prenum1));
|
int do_addsub __ARGS((int command, linenr_T Prenum1));
|
||||||
|
|||||||
@@ -7,11 +7,15 @@ int make_windows __ARGS((int count, int vertical));
|
|||||||
void win_move_after __ARGS((win_T *win1, win_T *win2));
|
void win_move_after __ARGS((win_T *win1, win_T *win2));
|
||||||
void win_equal __ARGS((win_T *next_curwin, int current, int dir));
|
void win_equal __ARGS((win_T *next_curwin, int current, int dir));
|
||||||
void close_windows __ARGS((buf_T *buf));
|
void close_windows __ARGS((buf_T *buf));
|
||||||
|
int last_window __ARGS((void));
|
||||||
void win_close __ARGS((win_T *win, int free_buf));
|
void win_close __ARGS((win_T *win, int free_buf));
|
||||||
void win_free_all __ARGS((void));
|
void win_free_all __ARGS((void));
|
||||||
void close_others __ARGS((int message, int forceit));
|
void close_others __ARGS((int message, int forceit));
|
||||||
void win_init __ARGS((win_T *wp));
|
void win_init __ARGS((win_T *wp));
|
||||||
void win_alloc_first __ARGS((void));
|
int win_alloc_first __ARGS((void));
|
||||||
|
void win_init_size __ARGS((void));
|
||||||
|
int win_new_tabpage __ARGS((void));
|
||||||
|
void goto_tabpage __ARGS((int n));
|
||||||
void win_goto __ARGS((win_T *wp));
|
void win_goto __ARGS((win_T *wp));
|
||||||
win_T *win_find_nr __ARGS((int winnr));
|
win_T *win_find_nr __ARGS((int winnr));
|
||||||
void win_enter __ARGS((win_T *wp, int undo_sync));
|
void win_enter __ARGS((win_T *wp, int undo_sync));
|
||||||
@@ -32,6 +36,7 @@ void win_drag_vsep_line __ARGS((win_T *dragwin, int offset));
|
|||||||
void win_comp_scroll __ARGS((win_T *wp));
|
void win_comp_scroll __ARGS((win_T *wp));
|
||||||
void command_height __ARGS((long old_p_ch));
|
void command_height __ARGS((long old_p_ch));
|
||||||
void last_status __ARGS((int morewin));
|
void last_status __ARGS((int morewin));
|
||||||
|
int tabpageline_height __ARGS((void));
|
||||||
char_u *grab_file_name __ARGS((long count));
|
char_u *grab_file_name __ARGS((long count));
|
||||||
char_u *file_name_at_cursor __ARGS((int options, long count));
|
char_u *file_name_at_cursor __ARGS((int options, long count));
|
||||||
char_u *file_name_in_line __ARGS((char_u *line, int col, int options, long count, char_u *rel_fname));
|
char_u *file_name_in_line __ARGS((char_u *line, int col, int options, long count, char_u *rel_fname));
|
||||||
|
|||||||
87
src/screen.c
87
src/screen.c
@@ -167,6 +167,9 @@ static void redraw_block __ARGS((int row, int end, win_T *wp));
|
|||||||
static int win_do_lines __ARGS((win_T *wp, int row, int line_count, int mayclear, int del));
|
static int win_do_lines __ARGS((win_T *wp, int row, int line_count, int mayclear, int del));
|
||||||
static void win_rest_invalid __ARGS((win_T *wp));
|
static void win_rest_invalid __ARGS((win_T *wp));
|
||||||
static void msg_pos_mode __ARGS((void));
|
static void msg_pos_mode __ARGS((void));
|
||||||
|
#if defined(FEAT_WINDOWS)
|
||||||
|
static void draw_tabpage __ARGS((void));
|
||||||
|
#endif
|
||||||
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
|
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
|
||||||
static int fillchar_status __ARGS((int *attr, int is_curwin));
|
static int fillchar_status __ARGS((int *attr, int is_curwin));
|
||||||
#endif
|
#endif
|
||||||
@@ -390,6 +393,9 @@ update_screen(type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
redraw_cmdline = TRUE;
|
redraw_cmdline = TRUE;
|
||||||
|
#ifdef FEAT_WINDOWS
|
||||||
|
redraw_tabpage = TRUE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
msg_scrolled = 0;
|
msg_scrolled = 0;
|
||||||
need_wait_return = FALSE;
|
need_wait_return = FALSE;
|
||||||
@@ -468,6 +474,12 @@ update_screen(type)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_WINDOWS
|
||||||
|
/* Redraw the tab pages line if needed. */
|
||||||
|
if (redraw_tabpage || type >= NOT_VALID)
|
||||||
|
draw_tabpage();
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Go from top to bottom through the windows, redrawing the ones that need
|
* Go from top to bottom through the windows, redrawing the ones that need
|
||||||
* it.
|
* it.
|
||||||
@@ -4947,6 +4959,8 @@ redraw_statuslines()
|
|||||||
for (wp = firstwin; wp; wp = wp->w_next)
|
for (wp = firstwin; wp; wp = wp->w_next)
|
||||||
if (wp->w_redr_status)
|
if (wp->w_redr_status)
|
||||||
win_redr_status(wp);
|
win_redr_status(wp);
|
||||||
|
if (redraw_tabpage)
|
||||||
|
draw_tabpage();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -8409,6 +8423,79 @@ unshowmode(force)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_WINDOWS)
|
||||||
|
/*
|
||||||
|
* Draw the tab pages line at the top of the Vim window.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
draw_tabpage()
|
||||||
|
{
|
||||||
|
int tabcount = 0;
|
||||||
|
tabpage_T *tp;
|
||||||
|
int tabwidth;
|
||||||
|
int col = 0;
|
||||||
|
int had_current = FALSE;
|
||||||
|
int attr;
|
||||||
|
win_T *wp;
|
||||||
|
int c;
|
||||||
|
int len;
|
||||||
|
int attr_sel = hl_attr(HLF_TPS);
|
||||||
|
int attr_nosel = hl_attr(HLF_TP);
|
||||||
|
int attr_fill = hl_attr(HLF_TPF);
|
||||||
|
|
||||||
|
redraw_tabpage = FALSE;
|
||||||
|
|
||||||
|
if (tabpageline_height() < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
|
||||||
|
++tabcount;
|
||||||
|
|
||||||
|
tabwidth = Columns / tabcount;
|
||||||
|
if (tabwidth < 6)
|
||||||
|
tabwidth = 6;
|
||||||
|
|
||||||
|
attr = attr_nosel;
|
||||||
|
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
|
||||||
|
{
|
||||||
|
if (tp->tp_topframe == topframe)
|
||||||
|
{
|
||||||
|
c = '/';
|
||||||
|
had_current = TRUE;
|
||||||
|
attr = attr_sel;
|
||||||
|
}
|
||||||
|
else if (!had_current)
|
||||||
|
c = '/';
|
||||||
|
else
|
||||||
|
c = '\\';
|
||||||
|
screen_putchar(c, 0, col++, attr);
|
||||||
|
|
||||||
|
if (tp->tp_topframe != topframe)
|
||||||
|
attr = attr_nosel;
|
||||||
|
|
||||||
|
if (tp->tp_topframe == topframe)
|
||||||
|
wp = curwin;
|
||||||
|
else
|
||||||
|
wp = tp->tp_curwin;
|
||||||
|
if (buf_spname(wp->w_buffer) != NULL)
|
||||||
|
STRCPY(NameBuff, buf_spname(wp->w_buffer));
|
||||||
|
else
|
||||||
|
home_replace(wp->w_buffer, wp->w_buffer->b_fname, NameBuff,
|
||||||
|
MAXPATHL, TRUE);
|
||||||
|
trans_characters(NameBuff, MAXPATHL);
|
||||||
|
len = STRLEN(NameBuff);
|
||||||
|
if (len > tabwidth) /* TODO: multi-byte chars */
|
||||||
|
len = tabwidth;
|
||||||
|
screen_puts_len(NameBuff, len, 0, col, attr);
|
||||||
|
col += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_putchar('\\', 0, col++, attr);
|
||||||
|
while (col < Columns)
|
||||||
|
screen_putchar('_', 0, col++, attr_fill);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
|
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
|
||||||
/*
|
/*
|
||||||
* Get the character to use in a status line. Get its attributes in "*attr".
|
* Get the character to use in a status line. Get its attributes in "*attr".
|
||||||
|
|||||||
@@ -3733,7 +3733,7 @@ again:
|
|||||||
{
|
{
|
||||||
if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
|
if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
|
||||||
(char_u *)"",
|
(char_u *)"",
|
||||||
(char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0) <= 0)
|
(char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0, NULL) <= 0)
|
||||||
{
|
{
|
||||||
curwin->w_cursor = old_pos;
|
curwin->w_cursor = old_pos;
|
||||||
goto theend;
|
goto theend;
|
||||||
@@ -3766,7 +3766,7 @@ again:
|
|||||||
sprintf((char *)spat, "<%.*s\\%%(\\_[^>]\\{-}[^/]>\\|>\\)\\c", len, p);
|
sprintf((char *)spat, "<%.*s\\%%(\\_[^>]\\{-}[^/]>\\|>\\)\\c", len, p);
|
||||||
sprintf((char *)epat, "</%.*s>\\c", len, p);
|
sprintf((char *)epat, "</%.*s>\\c", len, p);
|
||||||
|
|
||||||
r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"", 0);
|
r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"", 0, NULL);
|
||||||
|
|
||||||
vim_free(spat);
|
vim_free(spat);
|
||||||
vim_free(epat);
|
vim_free(epat);
|
||||||
|
|||||||
@@ -68,10 +68,10 @@ typedef struct growarray
|
|||||||
*/
|
*/
|
||||||
#include "regexp.h"
|
#include "regexp.h"
|
||||||
|
|
||||||
typedef struct window win_T;
|
typedef struct window_S win_T;
|
||||||
typedef struct wininfo wininfo_T;
|
typedef struct wininfo_S wininfo_T;
|
||||||
typedef struct frame frame_T;
|
typedef struct frame_S frame_T;
|
||||||
typedef int scid_T; /* script ID */
|
typedef int scid_T; /* script ID */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is here because gui.h needs the pos_T and win_T, and win_T needs gui.h
|
* This is here because gui.h needs the pos_T and win_T, and win_T needs gui.h
|
||||||
@@ -215,7 +215,7 @@ typedef struct
|
|||||||
* The window-info is kept in a list at b_wininfo. It is kept in
|
* The window-info is kept in a list at b_wininfo. It is kept in
|
||||||
* most-recently-used order.
|
* most-recently-used order.
|
||||||
*/
|
*/
|
||||||
struct wininfo
|
struct wininfo_S
|
||||||
{
|
{
|
||||||
wininfo_T *wi_next; /* next entry or NULL for last entry */
|
wininfo_T *wi_next; /* next entry or NULL for last entry */
|
||||||
wininfo_T *wi_prev; /* previous entry or NULL for first entry */
|
wininfo_T *wi_prev; /* previous entry or NULL for first entry */
|
||||||
@@ -1330,6 +1330,9 @@ struct file_buffer
|
|||||||
char_u *b_p_inde; /* 'indentexpr' */
|
char_u *b_p_inde; /* 'indentexpr' */
|
||||||
char_u *b_p_indk; /* 'indentkeys' */
|
char_u *b_p_indk; /* 'indentkeys' */
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(FEAT_EVAL)
|
||||||
|
char_u *b_p_fex; /* 'formatexpr' */
|
||||||
|
#endif
|
||||||
#ifdef FEAT_CRYPT
|
#ifdef FEAT_CRYPT
|
||||||
char_u *b_p_key; /* 'key' */
|
char_u *b_p_key; /* 'key' */
|
||||||
#endif
|
#endif
|
||||||
@@ -1546,11 +1549,24 @@ typedef struct w_line
|
|||||||
#endif
|
#endif
|
||||||
} wline_T;
|
} wline_T;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tab pages point to the top frame of each tab page.
|
||||||
|
*/
|
||||||
|
typedef struct tabpage_S tabpage_T;
|
||||||
|
struct tabpage_S
|
||||||
|
{
|
||||||
|
tabpage_T *tp_next; /* next tabpage or NULL */
|
||||||
|
frame_T *tp_topframe;
|
||||||
|
win_T *tp_curwin; /* current window in this Tab page */
|
||||||
|
win_T *tp_firstwin; /* first window in this Tab page */
|
||||||
|
win_T *tp_lastwin; /* last window in this Tab page */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Windows are kept in a tree of frames. Each frame has a column (FR_COL)
|
* Windows are kept in a tree of frames. Each frame has a column (FR_COL)
|
||||||
* or row (FR_ROW) layout or is a leaf, which has a window.
|
* or row (FR_ROW) layout or is a leaf, which has a window.
|
||||||
*/
|
*/
|
||||||
struct frame
|
struct frame_S
|
||||||
{
|
{
|
||||||
char fr_layout; /* FR_LEAF, FR_COL or FR_ROW */
|
char fr_layout; /* FR_LEAF, FR_COL or FR_ROW */
|
||||||
#ifdef FEAT_VERTSPLIT
|
#ifdef FEAT_VERTSPLIT
|
||||||
@@ -1577,7 +1593,7 @@ struct frame
|
|||||||
*
|
*
|
||||||
* All row numbers are relative to the start of the window, except w_winrow.
|
* All row numbers are relative to the start of the window, except w_winrow.
|
||||||
*/
|
*/
|
||||||
struct window
|
struct window_S
|
||||||
{
|
{
|
||||||
buf_T *w_buffer; /* buffer we are a window into (used
|
buf_T *w_buffer; /* buffer we are a window into (used
|
||||||
often, keep it the first item!) */
|
often, keep it the first item!) */
|
||||||
|
|||||||
@@ -6079,6 +6079,9 @@ static char *(highlight_init_both[]) =
|
|||||||
"DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red",
|
"DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red",
|
||||||
"PmenuThumb cterm=reverse gui=reverse",
|
"PmenuThumb cterm=reverse gui=reverse",
|
||||||
"PmenuSbar ctermbg=Grey guibg=Grey",
|
"PmenuSbar ctermbg=Grey guibg=Grey",
|
||||||
|
"TabPage term=underline cterm=underline ctermbg=grey gui=underline guibg=grey",
|
||||||
|
"TabPageSel term=reverse,bold cterm=reverse,bold gui=reverse,bold",
|
||||||
|
"TabPageFill term=underline cterm=underline ctermbg=grey gui=underline guibg=grey",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2980,6 +2980,10 @@ get_bytes_from_buf(buf, bytes, num_bytes)
|
|||||||
++len; /* skip KE_FILLER */
|
++len; /* skip KE_FILLER */
|
||||||
/* else it should be KS_SPECIAL, and c already equals K_SPECIAL */
|
/* else it should be KS_SPECIAL, and c already equals K_SPECIAL */
|
||||||
}
|
}
|
||||||
|
else if (c == CSI && buf[len] == KS_EXTRA && buf[len + 1] == (int)KE_CSI)
|
||||||
|
/* CSI is stored as CSI KS_SPECIAL KE_CSI to avoid confusion with
|
||||||
|
* the start of a special key, see add_to_input_buf_csi(). */
|
||||||
|
len += 2;
|
||||||
bytes[i] = c;
|
bytes[i] = c;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
|
|||||||
1
src/ui.c
1
src/ui.c
@@ -2897,6 +2897,7 @@ mouse_find_win(rowp, colp)
|
|||||||
frame_T *fp;
|
frame_T *fp;
|
||||||
|
|
||||||
fp = topframe;
|
fp = topframe;
|
||||||
|
*rowp -= firstwin->w_winrow;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (fp->fr_layout == FR_LEAF)
|
if (fp->fr_layout == FR_LEAF)
|
||||||
|
|||||||
@@ -36,5 +36,5 @@
|
|||||||
#define VIM_VERSION_NODOT "vim70aa"
|
#define VIM_VERSION_NODOT "vim70aa"
|
||||||
#define VIM_VERSION_SHORT "7.0aa"
|
#define VIM_VERSION_SHORT "7.0aa"
|
||||||
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
|
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
|
||||||
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 10)"
|
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 14)"
|
||||||
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 10, compiled "
|
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 14, compiled "
|
||||||
|
|||||||
@@ -1157,6 +1157,9 @@ typedef enum
|
|||||||
, HLF_PSI /* popup menu selected item */
|
, HLF_PSI /* popup menu selected item */
|
||||||
, HLF_PSB /* popup menu scrollbar */
|
, HLF_PSB /* popup menu scrollbar */
|
||||||
, HLF_PST /* popup menu scrollbar thumb */
|
, HLF_PST /* popup menu scrollbar thumb */
|
||||||
|
, HLF_TP /* tabpage line */
|
||||||
|
, HLF_TPS /* tabpage line selected */
|
||||||
|
, HLF_TPF /* tabpage line filler */
|
||||||
, HLF_COUNT /* MUST be the last one */
|
, HLF_COUNT /* MUST be the last one */
|
||||||
} hlf_T;
|
} hlf_T;
|
||||||
|
|
||||||
@@ -1165,7 +1168,7 @@ typedef enum
|
|||||||
'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \
|
'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \
|
||||||
'f', 'F', 'A', 'C', 'D', 'T', '>', \
|
'f', 'F', 'A', 'C', 'D', 'T', '>', \
|
||||||
'B', 'P', 'R', 'L', \
|
'B', 'P', 'R', 'L', \
|
||||||
'+', '=', 'x', 'X'}
|
'+', '=', 'x', 'X', '*', '#', '_'}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Boolean constants
|
* Boolean constants
|
||||||
|
|||||||
322
src/window.c
322
src/window.c
@@ -29,6 +29,7 @@ static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topf
|
|||||||
static win_T *win_free_mem __ARGS((win_T *win, int *dirp));
|
static win_T *win_free_mem __ARGS((win_T *win, int *dirp));
|
||||||
static win_T *winframe_remove __ARGS((win_T *win, int *dirp));
|
static win_T *winframe_remove __ARGS((win_T *win, int *dirp));
|
||||||
static frame_T *win_altframe __ARGS((win_T *win));
|
static frame_T *win_altframe __ARGS((win_T *win));
|
||||||
|
static tabpage_T *alt_tabpage __ARGS((void));
|
||||||
static win_T *frame2win __ARGS((frame_T *frp));
|
static win_T *frame2win __ARGS((frame_T *frp));
|
||||||
static int frame_has_win __ARGS((frame_T *frp, win_T *wp));
|
static int frame_has_win __ARGS((frame_T *frp, win_T *wp));
|
||||||
static void frame_new_height __ARGS((frame_T *topfrp, int height, int topfirst, int wfh));
|
static void frame_new_height __ARGS((frame_T *topfrp, int height, int topfirst, int wfh));
|
||||||
@@ -40,6 +41,12 @@ static void frame_add_vsep __ARGS((frame_T *frp));
|
|||||||
static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin));
|
static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin));
|
||||||
static void frame_fix_width __ARGS((win_T *wp));
|
static void frame_fix_width __ARGS((win_T *wp));
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
static int win_alloc_firstwin __ARGS((void));
|
||||||
|
#if defined(FEAT_WINDOWS) || defined(PROTO)
|
||||||
|
static tabpage_T *current_tabpage __ARGS((void));
|
||||||
|
static void leave_tabpage __ARGS((tabpage_T *tp));
|
||||||
|
static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf));
|
||||||
static void frame_fix_height __ARGS((win_T *wp));
|
static void frame_fix_height __ARGS((win_T *wp));
|
||||||
static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin));
|
static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin));
|
||||||
static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin));
|
static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin));
|
||||||
@@ -77,6 +84,9 @@ static void win_new_height __ARGS((win_T *, int));
|
|||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
static long p_ch_used = 1L; /* value of 'cmdheight' when frame
|
static long p_ch_used = 1L; /* value of 'cmdheight' when frame
|
||||||
size was set */
|
size was set */
|
||||||
|
# define ROWS_AVAIL (Rows - p_ch - tabpageline_height())
|
||||||
|
#else
|
||||||
|
# define ROWS_AVAIL (Rows - p_ch)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_WINDOWS) || defined(PROTO)
|
#if defined(FEAT_WINDOWS) || defined(PROTO)
|
||||||
@@ -932,7 +942,7 @@ win_split_ins(size, flags, newwin, dir)
|
|||||||
if (flags & (WSP_TOP | WSP_BOT))
|
if (flags & (WSP_TOP | WSP_BOT))
|
||||||
{
|
{
|
||||||
/* set height and row of new window to full height */
|
/* set height and row of new window to full height */
|
||||||
wp->w_winrow = 0;
|
wp->w_winrow = tabpageline_height();
|
||||||
wp->w_height = curfrp->fr_height - (p_ls > 0);
|
wp->w_height = curfrp->fr_height - (p_ls > 0);
|
||||||
wp->w_status_height = (p_ls > 0);
|
wp->w_status_height = (p_ls > 0);
|
||||||
}
|
}
|
||||||
@@ -1507,7 +1517,8 @@ win_equal(next_curwin, current, dir)
|
|||||||
dir = 'b';
|
dir = 'b';
|
||||||
#endif
|
#endif
|
||||||
win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current,
|
win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current,
|
||||||
topframe, dir, 0, 0, (int)Columns, topframe->fr_height);
|
topframe, dir, 0, tabpageline_height(),
|
||||||
|
(int)Columns, topframe->fr_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1806,6 +1817,16 @@ close_windows(buf)
|
|||||||
--RedrawingDisabled;
|
--RedrawingDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if the current window is the only window that exists.
|
||||||
|
* Returns FALSE if there is a window in another tab page.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
last_window()
|
||||||
|
{
|
||||||
|
return (lastwin == firstwin && first_tabpage->tp_next == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* close window "win"
|
* close window "win"
|
||||||
* If "free_buf" is TRUE related buffer may be unloaded.
|
* If "free_buf" is TRUE related buffer may be unloaded.
|
||||||
@@ -1818,6 +1839,7 @@ win_close(win, free_buf)
|
|||||||
int free_buf;
|
int free_buf;
|
||||||
{
|
{
|
||||||
win_T *wp;
|
win_T *wp;
|
||||||
|
buf_T *old_curbuf = curbuf;
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
int other_buffer = FALSE;
|
int other_buffer = FALSE;
|
||||||
#endif
|
#endif
|
||||||
@@ -1825,7 +1847,7 @@ win_close(win, free_buf)
|
|||||||
int dir;
|
int dir;
|
||||||
int help_window = FALSE;
|
int help_window = FALSE;
|
||||||
|
|
||||||
if (lastwin == firstwin)
|
if (last_window())
|
||||||
{
|
{
|
||||||
EMSG(_("E444: Cannot close last window"));
|
EMSG(_("E444: Cannot close last window"));
|
||||||
return;
|
return;
|
||||||
@@ -1854,11 +1876,11 @@ win_close(win, free_buf)
|
|||||||
{
|
{
|
||||||
other_buffer = TRUE;
|
other_buffer = TRUE;
|
||||||
apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
|
||||||
if (!win_valid(win) || firstwin == lastwin)
|
if (!win_valid(win) || last_window())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
|
||||||
if (!win_valid(win) || firstwin == lastwin)
|
if (!win_valid(win) || last_window())
|
||||||
return;
|
return;
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
/* autocmds may abort script processing */
|
/* autocmds may abort script processing */
|
||||||
@@ -1874,16 +1896,42 @@ win_close(win, free_buf)
|
|||||||
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0);
|
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0);
|
||||||
/* Autocommands may have closed the window already, or closed the only
|
/* Autocommands may have closed the window already, or closed the only
|
||||||
* other window. */
|
* other window. */
|
||||||
if (!win_valid(win) || firstwin == lastwin)
|
if (!win_valid(win) || last_window())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Free the memory used for the window. */
|
/* Free the memory used for the window. */
|
||||||
wp = win_free_mem(win, &dir);
|
wp = win_free_mem(win, &dir);
|
||||||
|
|
||||||
|
/* When closing the last window in a tab page go to another tab page. */
|
||||||
|
if (wp == NULL)
|
||||||
|
{
|
||||||
|
tabpage_T *ptp = NULL;
|
||||||
|
tabpage_T *tp;
|
||||||
|
tabpage_T *atp = alt_tabpage();
|
||||||
|
|
||||||
|
for (tp = first_tabpage; tp->tp_topframe != topframe; tp = tp->tp_next)
|
||||||
|
ptp = tp;
|
||||||
|
if (tp == NULL)
|
||||||
|
{
|
||||||
|
EMSG2(_(e_intern2), "win_close()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ptp == NULL)
|
||||||
|
first_tabpage = tp->tp_next;
|
||||||
|
else
|
||||||
|
ptp->tp_next = tp->tp_next;
|
||||||
|
vim_free(tp);
|
||||||
|
|
||||||
|
/* We don't do the window resizing stuff, let enter_tabpage() take
|
||||||
|
* care of entering a window in another tab page. */
|
||||||
|
enter_tabpage(atp, old_curbuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure curwin isn't invalid. It can cause severe trouble when
|
/* Make sure curwin isn't invalid. It can cause severe trouble when
|
||||||
* printing an error message. For win_equal() curbuf needs to be valid
|
* printing an error message. For win_equal() curbuf needs to be valid
|
||||||
* too. */
|
* too. */
|
||||||
if (win == curwin)
|
else if (win == curwin)
|
||||||
{
|
{
|
||||||
curwin = wp;
|
curwin = wp;
|
||||||
#ifdef FEAT_QUICKFIX
|
#ifdef FEAT_QUICKFIX
|
||||||
@@ -1937,8 +1985,8 @@ win_close(win, free_buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if last window has a status line now and we don't want one,
|
* If last window has a status line now and we don't want one,
|
||||||
* remove the status line
|
* remove the status line.
|
||||||
*/
|
*/
|
||||||
last_status(FALSE);
|
last_status(FALSE);
|
||||||
|
|
||||||
@@ -1975,9 +2023,13 @@ win_free_mem(win, dirp)
|
|||||||
/* reduce the reference count to the argument list. */
|
/* reduce the reference count to the argument list. */
|
||||||
alist_unlink(win->w_alist);
|
alist_unlink(win->w_alist);
|
||||||
|
|
||||||
/* remove the window and its frame from the tree of frames. */
|
/* Remove the window and its frame from the tree of frames. */
|
||||||
frp = win->w_frame;
|
frp = win->w_frame;
|
||||||
wp = winframe_remove(win, dirp);
|
if (firstwin == lastwin)
|
||||||
|
/* Last window in a tab page. */
|
||||||
|
wp = NULL;
|
||||||
|
else
|
||||||
|
wp = winframe_remove(win, dirp);
|
||||||
vim_free(frp);
|
vim_free(frp);
|
||||||
win_free(win);
|
win_free(win);
|
||||||
|
|
||||||
@@ -2115,6 +2167,10 @@ win_altframe(win)
|
|||||||
frame_T *frp;
|
frame_T *frp;
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
|
if (firstwin == lastwin)
|
||||||
|
/* Last window in this tab page, will go to next tab page. */
|
||||||
|
return alt_tabpage()->tp_curwin->w_frame;
|
||||||
|
|
||||||
frp = win->w_frame;
|
frp = win->w_frame;
|
||||||
#ifdef FEAT_VERTSPLIT
|
#ifdef FEAT_VERTSPLIT
|
||||||
if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW)
|
if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW)
|
||||||
@@ -2127,6 +2183,28 @@ win_altframe(win)
|
|||||||
return frp->fr_prev;
|
return frp->fr_prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the tabpage that will be used if the current one is closed.
|
||||||
|
*/
|
||||||
|
static tabpage_T *
|
||||||
|
alt_tabpage()
|
||||||
|
{
|
||||||
|
tabpage_T *tp = current_tabpage();
|
||||||
|
|
||||||
|
if (tp != NULL)
|
||||||
|
{
|
||||||
|
/* Use the next tab page if it exists. */
|
||||||
|
if (tp->tp_next != NULL)
|
||||||
|
return tp->tp_next;
|
||||||
|
|
||||||
|
/* Find the previous tab page. */
|
||||||
|
for (tp = first_tabpage; tp->tp_next != NULL; tp = tp->tp_next)
|
||||||
|
if (tp->tp_next == current_tabpage())
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
return first_tabpage;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the left-upper window in frame "frp".
|
* Find the left-upper window in frame "frp".
|
||||||
*/
|
*/
|
||||||
@@ -2640,11 +2718,7 @@ close_others(message, forceit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
if (message && lastwin != firstwin)
|
||||||
* If current window has a status line and we don't want one,
|
|
||||||
* remove the status line.
|
|
||||||
*/
|
|
||||||
if (lastwin != firstwin)
|
|
||||||
EMSG(_("E445: Other window contains changes"));
|
EMSG(_("E445: Other window contains changes"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2686,15 +2760,36 @@ win_init(wp)
|
|||||||
/*
|
/*
|
||||||
* Allocate the first window and put an empty buffer in it.
|
* Allocate the first window and put an empty buffer in it.
|
||||||
* Called from main().
|
* Called from main().
|
||||||
* When this fails we can't do anything: exit.
|
* Return FAIL when something goes wrong (out of memory).
|
||||||
*/
|
*/
|
||||||
void
|
int
|
||||||
win_alloc_first()
|
win_alloc_first()
|
||||||
|
{
|
||||||
|
if (win_alloc_firstwin() == FAIL)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
|
#ifdef FEAT_WINDOWS
|
||||||
|
first_tabpage = (tabpage_T *)alloc((unsigned)sizeof(tabpage_T));
|
||||||
|
if (first_tabpage == NULL)
|
||||||
|
return FAIL;
|
||||||
|
first_tabpage->tp_topframe = topframe;
|
||||||
|
first_tabpage->tp_next = NULL;
|
||||||
|
#endif
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate one window and put an empty buffer in it.
|
||||||
|
* Called to create the first window in a new tab page.
|
||||||
|
* Return FAIL when something goes wrong (out of memory).
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
win_alloc_firstwin()
|
||||||
{
|
{
|
||||||
curwin = win_alloc(NULL);
|
curwin = win_alloc(NULL);
|
||||||
curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
|
curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
|
||||||
if (curwin == NULL || curbuf == NULL)
|
if (curwin == NULL || curbuf == NULL)
|
||||||
mch_exit(0);
|
return FAIL;
|
||||||
curwin->w_buffer = curbuf;
|
curwin->w_buffer = curbuf;
|
||||||
curbuf->b_nwindows = 1; /* there is one window */
|
curbuf->b_nwindows = 1; /* there is one window */
|
||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
@@ -2704,7 +2799,7 @@ win_alloc_first()
|
|||||||
|
|
||||||
topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
|
topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
|
||||||
if (topframe == NULL)
|
if (topframe == NULL)
|
||||||
mch_exit(0);
|
return FAIL;
|
||||||
topframe->fr_layout = FR_LEAF;
|
topframe->fr_layout = FR_LEAF;
|
||||||
#ifdef FEAT_VERTSPLIT
|
#ifdef FEAT_VERTSPLIT
|
||||||
topframe->fr_width = Columns;
|
topframe->fr_width = Columns;
|
||||||
@@ -2715,9 +2810,169 @@ win_alloc_first()
|
|||||||
#endif
|
#endif
|
||||||
topframe->fr_win = curwin;
|
topframe->fr_win = curwin;
|
||||||
curwin->w_frame = topframe;
|
curwin->w_frame = topframe;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the window and frame size to the maximum.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
win_init_size()
|
||||||
|
{
|
||||||
|
firstwin->w_height = ROWS_AVAIL;
|
||||||
|
topframe->fr_height = ROWS_AVAIL;
|
||||||
|
#ifdef FEAT_VERTSPLIT
|
||||||
|
firstwin->w_width = Columns;
|
||||||
|
topframe->fr_width = Columns;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_WINDOWS) || defined(PROTO)
|
#if defined(FEAT_WINDOWS) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Create a new Tab page with one empty window.
|
||||||
|
* Put it just after the current Tab page.
|
||||||
|
* Return FAIL or OK.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
win_new_tabpage()
|
||||||
|
{
|
||||||
|
tabpage_T *tp;
|
||||||
|
tabpage_T *newtp;
|
||||||
|
|
||||||
|
newtp = (tabpage_T *)alloc((unsigned)sizeof(tabpage_T));
|
||||||
|
if (newtp == NULL)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
|
tp = current_tabpage();
|
||||||
|
|
||||||
|
/* Remember the current windows in this Tab page. */
|
||||||
|
leave_tabpage(tp);
|
||||||
|
|
||||||
|
/* Create a new empty window. */
|
||||||
|
if (win_alloc_firstwin() == OK)
|
||||||
|
{
|
||||||
|
/* copy options from previous to new curwin */
|
||||||
|
win_copy_options(tp->tp_curwin, curwin);
|
||||||
|
|
||||||
|
/* Make the new Tab page the new topframe. */
|
||||||
|
newtp->tp_next = tp->tp_next;
|
||||||
|
tp->tp_next = newtp;
|
||||||
|
win_init_size();
|
||||||
|
firstwin->w_winrow = tabpageline_height();
|
||||||
|
|
||||||
|
newtp->tp_topframe = topframe;
|
||||||
|
redraw_all_later(CLEAR);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Failed, get back the previous Tab page */
|
||||||
|
topframe = tp->tp_topframe;
|
||||||
|
curwin = tp->tp_curwin;
|
||||||
|
firstwin = tp->tp_firstwin;
|
||||||
|
lastwin = tp->tp_lastwin;
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a pointer to the current tab page.
|
||||||
|
*/
|
||||||
|
static tabpage_T *
|
||||||
|
current_tabpage()
|
||||||
|
{
|
||||||
|
tabpage_T *tp;
|
||||||
|
|
||||||
|
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
|
||||||
|
if (tp->tp_topframe == topframe)
|
||||||
|
break;
|
||||||
|
if (tp == NULL)
|
||||||
|
EMSG2(_(e_intern2), "current_tabpage()");
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare for leaving the current tab page "tp".
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
leave_tabpage(tp)
|
||||||
|
tabpage_T *tp;
|
||||||
|
{
|
||||||
|
tp->tp_curwin = curwin;
|
||||||
|
tp->tp_firstwin = firstwin;
|
||||||
|
tp->tp_lastwin = lastwin;
|
||||||
|
firstwin = NULL;
|
||||||
|
lastwin = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start using tab page "tp".
|
||||||
|
*/
|
||||||
|
/*ARGSUSED*/
|
||||||
|
static void
|
||||||
|
enter_tabpage(tp, old_curbuf)
|
||||||
|
tabpage_T *tp;
|
||||||
|
buf_T *old_curbuf;
|
||||||
|
{
|
||||||
|
firstwin = tp->tp_firstwin;
|
||||||
|
lastwin = tp->tp_lastwin;
|
||||||
|
topframe = tp->tp_topframe;
|
||||||
|
win_enter_ext(tp->tp_curwin, FALSE, TRUE);
|
||||||
|
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
if (old_curbuf != curbuf)
|
||||||
|
apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* status line may appear or disappear */
|
||||||
|
last_status(FALSE);
|
||||||
|
|
||||||
|
#if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
|
||||||
|
/* When 'guioptions' includes 'L' or 'R' may have to add or remove
|
||||||
|
* scrollbars. */
|
||||||
|
if (gui.in_use && !win_hasvertsplit())
|
||||||
|
gui_init_which_components(NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
redraw_all_later(CLEAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go to tab page "n". For ":tab N" and "Ngt".
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
goto_tabpage(n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
tabpage_T *otp = current_tabpage();
|
||||||
|
tabpage_T *tp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (otp == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
/* No count, go to next tab page, wrap around end. */
|
||||||
|
if (otp->tp_next == NULL)
|
||||||
|
tp = first_tabpage;
|
||||||
|
else
|
||||||
|
tp = otp->tp_next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Go to tab page "n". */
|
||||||
|
i = 0;
|
||||||
|
for (tp = first_tabpage; ++i != n; tp = tp->tp_next)
|
||||||
|
if (tp == NULL)
|
||||||
|
{
|
||||||
|
beep_flush();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_tabpage(otp);
|
||||||
|
enter_tabpage(tp, curbuf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Go to another window.
|
* Go to another window.
|
||||||
@@ -3007,6 +3262,7 @@ win_enter_ext(wp, undo_sync, curwin_invalid)
|
|||||||
maketitle();
|
maketitle();
|
||||||
#endif
|
#endif
|
||||||
curwin->w_redr_status = TRUE;
|
curwin->w_redr_status = TRUE;
|
||||||
|
redraw_tabpage = TRUE;
|
||||||
if (restart_edit)
|
if (restart_edit)
|
||||||
redraw_later(VALID); /* causes status line redraw */
|
redraw_later(VALID); /* causes status line redraw */
|
||||||
|
|
||||||
@@ -3325,7 +3581,7 @@ win_free_lsize(wp)
|
|||||||
void
|
void
|
||||||
shell_new_rows()
|
shell_new_rows()
|
||||||
{
|
{
|
||||||
int h = (int)(Rows - p_ch);
|
int h = (int)ROWS_AVAIL;
|
||||||
|
|
||||||
if (firstwin == NULL) /* not initialized yet */
|
if (firstwin == NULL) /* not initialized yet */
|
||||||
return;
|
return;
|
||||||
@@ -3430,7 +3686,7 @@ win_size_restore(gap)
|
|||||||
static int
|
static int
|
||||||
win_comp_pos()
|
win_comp_pos()
|
||||||
{
|
{
|
||||||
int row = 0;
|
int row = tabpageline_height();
|
||||||
int col = 0;
|
int col = 0;
|
||||||
|
|
||||||
frame_comp_pos(topframe, &row, &col);
|
frame_comp_pos(topframe, &row, &col);
|
||||||
@@ -3593,8 +3849,8 @@ frame_setheight(curfrp, height)
|
|||||||
if (curfrp->fr_parent == NULL)
|
if (curfrp->fr_parent == NULL)
|
||||||
{
|
{
|
||||||
/* topframe: can only change the command line */
|
/* topframe: can only change the command line */
|
||||||
if (height > Rows - p_ch)
|
if (height > ROWS_AVAIL)
|
||||||
height = Rows - p_ch;
|
height = ROWS_AVAIL;
|
||||||
if (height > 0)
|
if (height > 0)
|
||||||
frame_new_height(curfrp, height, FALSE, FALSE);
|
frame_new_height(curfrp, height, FALSE, FALSE);
|
||||||
}
|
}
|
||||||
@@ -3841,7 +4097,7 @@ frame_setwidth(curfrp, width)
|
|||||||
|
|
||||||
if (width <= room)
|
if (width <= room)
|
||||||
break;
|
break;
|
||||||
if (run == 2 || curfrp->fr_height >= Rows - p_ch)
|
if (run == 2 || curfrp->fr_height >= ROWS_AVAIL)
|
||||||
{
|
{
|
||||||
if (width > room)
|
if (width > room)
|
||||||
width = room;
|
width = room;
|
||||||
@@ -4524,6 +4780,18 @@ last_status_rec(fr, statusline)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if the tab page line is to be drawn.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tabpageline_height()
|
||||||
|
{
|
||||||
|
/* TODO: option to tell when to show the tabs. */
|
||||||
|
if (first_tabpage->tp_next == NULL)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* FEAT_WINDOWS */
|
#endif /* FEAT_WINDOWS */
|
||||||
|
|
||||||
#if defined(FEAT_SEARCHPATH) || defined(PROTO)
|
#if defined(FEAT_SEARCHPATH) || defined(PROTO)
|
||||||
@@ -4846,6 +5114,10 @@ only_one_window()
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
win_T *wp;
|
win_T *wp;
|
||||||
|
|
||||||
|
/* If there is another tab page there always is another window. */
|
||||||
|
if (first_tabpage->tp_next != NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
for (wp = firstwin; wp != NULL; wp = wp->w_next)
|
for (wp = firstwin; wp != NULL; wp = wp->w_next)
|
||||||
if (!((wp->w_buffer->b_help && !curbuf->b_help)
|
if (!((wp->w_buffer->b_help && !curbuf->b_help)
|
||||||
# ifdef FEAT_QUICKFIX
|
# ifdef FEAT_QUICKFIX
|
||||||
|
|||||||
Reference in New Issue
Block a user