?? items.vim
字號(hào):
" Description: Omni completion script for cpp files" Maintainer: Vissale NEANG" Last Change: 25 jun 2006" Build the item list of an instruction" An item is an instruction between a -> or . or ->* or .*" We can sort an item in different kinds:" eg: ((MyClass1*)(pObject))->_memberOfClass1.get() ->show()" | cast | | member | | method | | method |" @return a list of item" an item is a dictionnary where keys are:" tokens = list of token" kind = itemVariable|itemCast|itemCppCast|itemTemplate|itemFunction|itemUnknown|itemThis|itemScopefunction! omni#cpp#items#Get(tokens, ...) let bGetWordUnderCursor = (a:0>0)? a:1 : 0 let result = [] let itemsDelimiters = ['->', '.', '->*', '.*'] let tokens = reverse(omni#cpp#utils#BuildParenthesisGroups(a:tokens)) " fsm states: " 0 = initial state " TODO: add description of fsm states let state=(bGetWordUnderCursor)? 1 : 0 let item = {'tokens' : [], 'kind' : 'itemUnknown'} let parenGroup=-1 for token in tokens if state==0 if index(itemsDelimiters, token.value)>=0 let item = {'tokens' : [], 'kind' : 'itemUnknown'} let state = 1 elseif token.value=='::' let state = 9 let item.kind = 'itemScope' " Maybe end of tokens elseif token.kind =='cppOperatorPunctuator' " If it's a cppOperatorPunctuator and the current token is not " a itemsDelimiters or '::' we can exit let state=-1 break endif elseif state==1 call insert(item.tokens, token) if token.kind=='cppWord' " It's an attribute member or a variable let item.kind = 'itemVariable' let state = 2 " Maybe end of tokens elseif token.value=='this' let item.kind = 'itemThis' let state = 2 " Maybe end of tokens elseif token.value==')' let parenGroup = token.group let state = 3 elseif token.value==']' let parenGroup = token.group let state = 4 elseif token.kind == 'cppDigit' let state = -1 break endif elseif state==2 if index(itemsDelimiters, token.value)>=0 call insert(result, item) let item = {'tokens' : [], 'kind' : 'itemUnknown'} let state = 1 elseif token.value == '::' call insert(item.tokens, token) " We have to get namespace or classscope let state = 8 " Maybe end of tokens else call insert(result, item) let state=-1 break endif elseif state==3 call insert(item.tokens, token) if token.value=='(' && token.group == parenGroup let state = 5 " Maybe end of tokens endif elseif state==4 call insert(item.tokens, token) if token.value=='[' && token.group == parenGroup let state = 1 endif elseif state==5 if token.kind=='cppWord' " It's a function or method let item.kind = 'itemFunction' call insert(item.tokens, token) let state = 2 " Maybe end of tokens elseif token.value == '>' " Maybe a cpp cast or template let item.kind = 'itemTemplate' call insert(item.tokens, token) let parenGroup = token.group let state = 6 else " Perhaps it's a C cast eg: ((void*)(pData)) or a variable eg:(*pData) let item.kind = omni#cpp#utils#GetCastType(item.tokens) let state=-1 call insert(result, item) break endif elseif state==6 call insert(item.tokens, token) if token.value == '<' && token.group == parenGroup " Maybe a cpp cast or template let state = 7 endif elseif state==7 call insert(item.tokens, token) if token.kind=='cppKeyword' " It's a cpp cast let item.kind = omni#cpp#utils#GetCastType(item.tokens) let state=-1 call insert(result, item) break else " Template ? let state=-1 call insert(result, item) break endif elseif state==8 if token.kind=='cppWord' call insert(item.tokens, token) let state = 2 " Maybe end of tokens else let state=-1 call insert(result, item) break endif elseif state==9 if token.kind == 'cppWord' call insert(item.tokens, token) let state = 10 " Maybe end of tokens else let state=-1 call insert(result, item) break endif elseif state==10 if token.value == '::' call insert(item.tokens, token) let state = 9 " Maybe end of tokens else let state=-1 call insert(result, item) break endif endif endfor if index([2, 5, 8, 9, 10], state)>=0 if state==5 let item.kind = omni#cpp#utils#GetCastType(item.tokens) endif call insert(result, item) endif return resultendfunc" Resolve type information of items" @param namespaces: list of namespaces used in the file" @param szCurrentClassScope: the current class scope, only used for the first" item to detect if this item is a class member (attribute, method)" @param items: list of item, can be an empty list @see GetItemsToCompletefunction! omni#cpp#items#ResolveItemsTypeInfo(contextStack, items) " Note: kind = itemVariable|cCast|cppCast|template|function|itemUnknown|this " For the first item, if it's a variable we try to detect the type of the " variable with the function searchdecl. If it fails, thanks to the " current class scope, we try to detect if the variable is an attribute " member. " If the kind of the item is a function, we have to first check if the " function is a method of the class, if it fails we try to get a match in " the global namespace. After that we get the returned type of the " function. " It the kind is a C cast or C++ cast, there is no problem, it's the " easiest case. We just extract the type of the cast. let szCurrentContext = '' let typeInfo = {} " Note: We search the decl only for the first item let bSearchDecl = 1 for item in a:items let curItem = item if index(['itemVariable', 'itemFunction'], curItem.kind)>=0 " Note: a variable can be : MyNs::MyClass::_var or _var or (*pVar) " or _var[0][0] let szSymbol = s:GetSymbol(curItem.tokens) " If we have MyNamespace::myVar " We add MyNamespace in the context stack set szSymbol to myVar if match(szSymbol, '::\w\+$') >= 0 let szCurrentContext = substitute(szSymbol, '::\w\+$', '', 'g') let szSymbol = matchstr(szSymbol, '\w\+$') endif let tmpContextStack = a:contextStack if szCurrentContext != '' let tmpContextStack = [szCurrentContext] + a:contextStack endif if curItem.kind == 'itemVariable' let typeInfo = s:GetTypeInfoOfVariable(tmpContextStack, szSymbol, bSearchDecl) else let typeInfo = s:GetTypeInfoOfReturnedType(tmpContextStack, szSymbol) endif elseif curItem.kind == 'itemThis' if len(a:contextStack) let typeInfo = omni#cpp#utils#CreateTypeInfo(substitute(a:contextStack[0], '^::', '', 'g')) endif elseif curItem.kind == 'itemCast' let typeInfo = omni#cpp#utils#CreateTypeInfo(s:ResolveCCast(curItem.tokens)) elseif curItem.kind == 'itemCppCast' let typeInfo = omni#cpp#utils#CreateTypeInfo(s:ResolveCppCast(curItem.tokens)) elseif curItem.kind == 'itemScope' let typeInfo = omni#cpp#utils#CreateTypeInfo(substitute(s:TokensToString(curItem.tokens), '\s', '', 'g')) endif if omni#cpp#utils#IsTypeInfoValid(typeInfo) let szCurrentContext = omni#cpp#utils#GetTypeInfoString(typeInfo) endif let bSearchDecl = 0 endfor return typeInfoendfunc" Get symbol namefunction! s:GetSymbol(tokens) let szSymbol = '' let state = 0 for token in a:tokens if state == 0 if token.value == '::' let szSymbol .= token.value let state = 1 elseif token.kind == 'cppWord' let szSymbol .= token.value let state = 2 " Maybe end of token endif elseif state == 1 if token.kind == 'cppWord' let szSymbol .= token.value let state = 2 " Maybe end of token else " Error break endif elseif state == 2 if token.value == '::' let szSymbol .= token.value let state = 1 else break endif endif endfor return szSymbolendfunc" Search a declaration." eg: std::map" can be empty" Note: The returned type info can be a typedef" The typedef resolution is done later" @return" - a dictionnary where keys are" - type: the type of value same as type()" - value: the value
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -