Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет ДО ([info]do_) в [info]vim_ljr
@ 2005-12-05 14:45:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Скрипт для автоматической генерации switch для данного enum
Работает так: наводишь на имя enum, или на его член, или на переменную (глобальную или член класса) типа enum, и набираем
:EnumToSwitch.Либо из меню можно выбрать. Если ничего не найдётся, то скрипт переспросит ещё раз.





fun! GetType(tag)
        let myTag = substitute(a:tag,' ', '', 'g')
        if myTag == ''
                return {}
        endif
        "echo a:tag
        let tagList = taglist(myTag)
        let mySet = {}
        for newTag in tagList
                if newTag[ 'name' ] == myTag
                        let mySet[ newTag['kind'] ] = newTag
                endif
        endfor
        return mySet
endf
fun! GoToTag(tag)
        let myTag = substitute(a:tag,' ', '', 'g')
        let myCmd = 'stag '.myTag
        exec myCmd
endf
fun! EnumToSwitch(tag,bIsMember)
        call GoToTag(a:tag)
        if a:bIsMember == 0
                call search('^\s*{')
                normal y%
        else
                normal [{y%
        endif
        close
        normal p
        .,/^\s*}/s/^\(\s*\)\(\([A-Z0-9_]\)\([A-Z0-9_]\+\)\)\s*\(,\|\/\)\?\(.*\)$/\=submatch(1).'case '.submatch(2).":".submatch(6)."\r".submatch(1)."\tbreak;"/g
        "'<,'>s/^\(\s*\)\(\([A-Z]\)\([A-Z]\+\)\),\(.*\)$/\=submatch(1).'case '.submatch(2).submatch(5).":\r".submatch(1)."\tbreak;"/gc
endf

fun! AskEnumAndToSwitch()
        let myLine = getline('.')
        let myCol = col('.')
        let myChar = strpart(myLine, myCol - 1, 1)
        let bDel = 0
        let bSuccess = 0
        let EnumMember = ''
        if match( myChar, '[a-zA-Z0-9_]' ) != -1
                normal wbyw
                let bDel = 1
                let EnumMember = @"
        endif
        for dummy in [1,2]
                if !bDel
                        let EnumMember = input("Enter enum member:", EnumMember, "tag")
                endif
                for dummy1 in [1,2]
                        "let Pause=input("Pause:", EnumMember, "tag")
                        let Tags = GetType(EnumMember)
                        if has_key( Tags, 'e' )||has_key( Tags, 'g' )
                                if bDel
                                        normal daw
                                endif
                                call EnumToSwitch(EnumMember, has_key( Tags, 'e' ))
                                return 1
                        else
                                if has_key( Tags, 'm' )||has_key( Tags, 'v' )
                                        normal ww
                                        call GoToTag(EnumMember)
                                        normal ^yw
                                        let EnumMember = @"
                                        close
                                endif
                                let bDel = 0
                        endif
                endfor
        endfor
endf

command EnumToSwitch :call AskEnumAndToSwitch()
an 56775.50 &Custom.Convert\ Enum\ to\ switch     :call AskEnumAndToSwitch()<CR>







Upd:

Забыл сказать -- работает он только для 7.0 версии, которая пока альфа. Там просто слишком много добавлено в области скриптования, в частности типы List и Dictionary, возможность посмотреть спиок тагов и QuickFix list