0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

updated for version 7.0143

This commit is contained in:
Bram Moolenaar 2005-09-07 21:21:14 +00:00
parent 4615234489
commit caa0fcfa6b
3 changed files with 112 additions and 59 deletions

View File

@ -1,11 +1,11 @@
" Vim completion script " Vim completion script
" Language: C " Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2005 Sep 05 " Last Change: 2005 Sep 07
function! ccomplete#Complete(findstart, base) function! ccomplete#Complete(findstart, base)
if a:findstart if a:findstart
" locate the start of the word " Locate the start of the item, including "." and "->".
let line = getline('.') let line = getline('.')
let start = col('.') - 1 let start = col('.') - 1
while start > 0 while start > 0
@ -20,82 +20,128 @@ function! ccomplete#Complete(findstart, base)
return start return start
endif endif
" return list of matches " Return list of matches.
if a:base !~ '\.\|->'
" Split item in words, keep empty word after "." or "->".
" "aa" -> ['aa'], "aa." -> ['aa', ''], "aa.bb" -> ['aa', 'bb'], etc.
let items = split(a:base, '\.\|->', 1)
if len(items) <= 1
" Only one part, no "." or "->": complete from tags file. " Only one part, no "." or "->": complete from tags file.
let diclist = taglist(a:base) " When local completion is wanted CTRL-N would have been used.
return map(diclist, 'v:val["name"]') return map(taglist('^' . a:base), 'v:val["name"]')
endif endif
" Find variable locally in function or file. let basetext = matchstr(a:base, '.*\(\.\|->\)')
let items = split(a:base, '\.\|->')
" At the moment we only do "aa.bb", not "aa.bb.cc" " Find variable locally in current function, current file or tags file.
if len(items) > 2
return []
endif
let line = ''
if searchdecl(items[0]) == 0 || searchdecl(items[0], 1) == 0 if searchdecl(items[0]) == 0 || searchdecl(items[0], 1) == 0
" Found, now figure out the type. " Found, now figure out the type.
" TODO: join previous line if it makes sense " TODO: join previous line if it makes sense
let line = getline('.') let line = getline('.')
let col = col('.') let col = col('.')
let res = ccomplete#Nextitem(strpart(line, 0, col), items[1:], basetext)
else else
" Find the variable in the tags file " Find the variable in the tags file
let diclist = taglist(items[0]) let diclist = taglist('^' . items[0] . '$')
let res = []
for i in range(len(diclist)) for i in range(len(diclist))
" For now we only recognize a variable. " For now we only recognize a variable.
" The command in the tags file must be a search pattern that shows the
" declaration of the variable.
if diclist[i]['kind'] == 'v' if diclist[i]['kind'] == 'v'
let line = diclist[i]['cmd'] let line = diclist[i]['cmd']
if line[0] == '/' && line[1] == '^' if line[0] == '/' && line[1] == '^'
" the command is a search pattern, remove the leading /^ let line = strpart(line, 2) " Remove /^ from the cmd
let line = strpart(line, 2) let col = match(line, items[0])
call extend(res, ccomplete#Nextitem(strpart(line, 0, col), items[1:], basetext)
endif endif
let col = match(line, items[0])
break
endif endif
endfor endfor
endif endif
if line == '' return res
return [] endfunc
endif
" Is there a * before the variable name? function! ccomplete#Nextitem(lead, items, basetext)
let col -= 1
let star = 0 " Use the text up to the variable name and split it in tokens.
while col > 0 let tokens = split(a:lead, '\s\+\|\<')
let col -= 1
if line[col] == '*' " Try to recognize the type of the variable. This is rough guessing...
let star = 1 let members = []
elseif line[col] !~ '\s' let taglines = []
for tidx in range(len(tokens))
" Recognize 'struct foobar'.
if tokens[tidx] == 'struct' && tidx + 1 < len(tokens)
let [members, taglines] = ccomplete#StructMembers(tokens[tidx + 1], a:items[0])
break break
endif endif
endwhile
" Use the line up to the variable name and split it in tokens. " Recognize a typedef: 'foobar_t'.
let lead = strpart(line, 0, col + 1) let diclist = taglist('^' . tokens[tidx] . '$')
let tokens = split(lead, '\s\+\|\<') for i in range(len(diclist))
" For now we only recognize "typedef struct foobar".
let basetext = matchstr(a:base, '.*\.\|->') " The command in the tags file must be a search pattern that shows the
" typedef.
for i in range(len(tokens) - 1) let cmd = diclist[i]['cmd']
if tokens[i] == 'struct' let ci = matchend(cmd, 'typedef\s\+struct\s\+')
let name = tokens[i + 1] if ci > 1
" Todo: Use all tags files; What about local structures? let name = matchstr(cmd, '\w*', ci)
exe 'vimgrep /\<struct:' . name . '\>/j tags' let [m, l] = ccomplete#StructMembers(name, a:items[0])
let res = [] call extend(members, m)
for l in getqflist() call extend(taglines, l)
let memb = matchstr(l['text'], '[^\t]*') endif
if len(items) == 1 || memb =~ '^' . items[1] endfor
call add(res, basetext . memb) if len(members) > 0
endif break
endfor
return res
endif endif
endfor endfor
return tokens if len(members) > 0
if len(a:items) == 1
return map(members, 'a:basetext . v:val')
endif
" More items following. For each of the possible members find the
" matching following members.
let res = []
for i in range(len(members))
let line = taglines[i]
let memb = members[i]
let s = match(line, '\t\zs/^')
if s > 0
let e = match(line, members[i], s)
if e > 0
call extend(res, ccomplete#Nextitem(strpart(line, s, e - s), a:items[1:], a:basetext))
endif
endif
endfor
return res
endif
" Failed to find anything.
return []
endfunction endfunction
" Return a list with two lists:
" - a list of members of structure "name" starting with string "item".
" - a list of the tag lines where the member is defined.
function! ccomplete#StructMembers(name, item)
" Todo: Use all tags files; What about local structures?
exe 'vimgrep /\<struct:' . a:name . '\>/j tags'
let members = []
let taglines = []
for l in getqflist()
let memb = matchstr(l['text'], '[^\t]*')
if memb =~ '^' . a:item
call add(members, memb)
call add(taglines, l['text'])
endif
endfor
return [members, taglines]
endfunction

View File

@ -1,4 +1,4 @@
*todo.txt* For Vim version 7.0aa. Last change: 2005 Sep 06 *todo.txt* For Vim version 7.0aa. Last change: 2005 Sep 07
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -30,12 +30,11 @@ 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 -----------------------
When ":vimgrep" lists filenames they should be shortened. Silence messages When ":vimgrep" lists filenames while searching they should be shortened.
for decompressing. Silence messages for decompressing?
When 'rl' is set "q/" causes hit-enter prompt. ccomplete:
- need list of tags files used in 'tags'.
Try out using the free MS compiler and debugger, using Make_mvc.mak.
Mac unicode patch (Da Woon Jung): Mac unicode patch (Da Woon Jung):
- selecting proportional font breaks display - selecting proportional font breaks display
@ -43,6 +42,7 @@ Mac unicode patch (Da Woon Jung):
Win32: Use the free downloadable compiler 7.1. Figure out how to do debugging Win32: Use the free downloadable compiler 7.1. Figure out how to do debugging
(with Agide?) and describe it. (George Reilly) (with Agide?) and describe it. (George Reilly)
Try out using the free MS compiler and debugger, using Make_mvc.mak.
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
@ -91,7 +91,8 @@ PLANNED FOR VERSION 7.0:
How to get the type of "var"? How to get the type of "var"?
tags file doesn't give type of typedef! E.g., oparg_T is tags file doesn't give type of typedef! E.g., oparg_T is
listed with "^} oparg_T;$" listed with "^} oparg_T;$"
mlcscope may do it, but I can't find the sources mlcscope may do it, but it's not very portable.
http://www.exptools.com/cscope
How to get the members of that type? How to get the members of that type?
tags file has struct: and class: fields tags file has struct: and class: fields

View File

@ -1,4 +1,4 @@
*version7.txt* For Vim version 7.0aa. Last change: 2005 Sep 06 *version7.txt* For Vim version 7.0aa. Last change: 2005 Sep 07
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -1326,4 +1326,10 @@ Could be noticed with a Thai font.
Output of ":function" could leave some of the typed text behind. (Yegappan Output of ":function" could leave some of the typed text behind. (Yegappan
Lakshmanan) Lakshmanan)
When the command line history has only a few lines the command line window
would be opened with these lines above the first window line.
When using a command line window for search strings ":qa" would result in
searching for "qa" instead of quitting all windows.
vim:tw=78:ts=8:ft=help:norl: vim:tw=78:ts=8:ft=help:norl: