Dnia środa, 4 października 2006 05:06, Hari Krishna Dara napisał:
> A new version is available, to try:
>
> - Download the below file and put it in your autoload directory:
> http://haridara.googlepages.com/forms.vim
>
> - Start a fresh Vim session and execute:
> :call forms#demo()
>
> The new version has support for listening to changes in the field
> values. The demo can now automatically lookup city and state when you
> fill in your zipcode using a webservice (you need wget in the path and
> need Internet connection).
Using this version I wrote example tag form generated from xml data
file. It uses simple validation (only two fields: accesskey and dir)
acting when leaving field.
Playing with it gave me some more ideas:
- obligatory fields (and highlighting of that)
- single hotkey per form is real problem (try <C-G>o), at least shortcut
should take to *first* field with that letter not last
- bug when first field is empty; cursor is placed directly after ':' in
label, only Tab is taking it to real field; below workaround is
putting always ' ' as value if field is empty.
How to use.
- open it ;)
- correct path to xml/xhtml10s.vim
- so %
-------------------------------------------------
" Form
" Data about attributes:
" g:xmldata_{b:html_omni_flavor}[tagname][1]
if !exists('g:xmldata_xhtml10s')
source ~/.vim/autoload/xml/xhtml10s.vim
endif
let attrs = g:xmldata_xhtml10s['a'][1]
let g:tfList = {}
function! g:tfList.actionPerformed(name)
if a:name ==# 'ok'
let output =
\ "Output:\n"
for i in g:formfields
if b:curForm.getFieldValue(i) !~ '^\s*$'
let output .= i.'="'.b:curForm.getFieldValue(i)."\"\n"
endif
endfor
call input(output)
redraw
else
call input('Form cancelled, closing window')
return ":bw!\<CR>"
endif
endfunction
function! g:tfList.valueChanged(name, oldval, newval)
if a:name == 'accesskey'
function! UpdateAcckey()
if len(b:curForm.getFieldValue('accesskey')) > 1
call b:curForm.fieldMap['accesskey'].setValue(' ')
endif
endfunction
return ":call UpdateAcckey()\<CR>"
elseif a:name == 'dir'
function! UpdateDir()
if b:curForm.getFieldValue('dir') !~ '^\(\s*\|ltr\|rtl\)$'
call b:curForm.fieldMap['dir'].setValue(' ')
endif
endfunction
return ":call UpdateDir()\<CR>"
endif
return ''
endfunction
let htmlform = g:forms#form.new("Tag a")
let g:formfields = []
for attr in sort(keys(attrs))
if len(attrs[attr]) == 0
call htmlform.addTextField(attr, attr.':', ' ', attr[0])
else
call htmlform.addComboBox(attr, attr.':', ' ', attrs[attr],
attr[0], 1)
endif
let g:formfields += [attr]
endfor
call htmlform.addButton('ok', 'OK', '', 'o', g:tfList)
call htmlform.addButton('cancel', 'cancel', '', 'c', g:tfList)
call htmlform.setDefaultButton('ok')
for field in htmlform.fields
if field.type != g:forms#FT_BUTTON
call field.setListener(g:tfList)
endif
endfor
vert new
exe "normal! 30\<C-W>|"
call forms#ShowForm(htmlform)
-------------------------------------------------