|

|

Скрипт для автоматической генерации 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
|
|