⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 items.vim

📁 vim的自动配置文件
💻 VIM
📖 第 1 页 / 共 2 页
字号:
" 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -