" ragtag.vim - Ghetto XML/HTML mappings (formerly allml.vim)
" Author: Tim Pope
" Version: 2.0
" GetLatestVimScripts: 1896 1 :AutoInstall: ragtag.vim
if exists("g:loaded_ragtag") || &cp
finish
endif
let g:loaded_ragtag = 1
if has("autocmd")
augroup ragtag
autocmd!
autocmd FileType *html*,wml,xml,xslt,xsd,jsp call s:Init()
autocmd FileType php,asp*,cf,mason,eruby call s:Init()
if version >= 700
autocmd InsertLeave * call s:Leave()
endif
autocmd CursorHold * if exists("b:loaded_ragtag") | call s:Leave() | endif
augroup END
endif
inoremap ragtagHtmlComplete =htmlEn()=htmlDis()
" Public interface, for if you have your own filetypes to activate on
function! RagtagInit()
call s:Init()
endfunction
function! AllmlInit()
call s:Init()
endfunction
function! s:Init()
let b:loaded_ragtag = 1
inoremap xmlversion =toupper(charset())"?>
inoremap htmltrans
inoremap xhtmltrans
if s:subtype() == "xml"
imap O
else
imap ] >O
endif
" <% %>
if &ft == "eruby"
inoremap - <%-%>3hi
inoremap _ I<%A-%>Fs
elseif &ft == "cf"
inoremap -
inoremap _
else
imap - >2hi
imap _ IA>Fs
endif
" Comments
if &ft =~ '^asp'
imap ' '>2hi
imap " I'A>Fs
let b:surround_35 = maparg("","i")."' \r ".maparg(">","i")
elseif &ft == "jsp"
inoremap ' %----%>4hi
inoremap " I<%--A--%>Fs
let b:surround_35 = "<%-- \r --%>"
elseif &ft == "cf"
inoremap ' !------>4hi
inoremap " IFs
setlocal commentstring=
let b:surround_35 = ""
elseif &ft == "html" || &ft == "xml" || &ft == "xhtml"
inoremap ' !---->3hi
inoremap " IFs
let b:surround_35 = ""
elseif &ft == "django"
inoremap ' {##}2hi
inoremap " I{#A#}Fs
let b:surround_35 = "{# \r #}"
else
imap ' #>2hi
imap " I#A>Fs
let b:surround_35 = maparg("","i")."# \r ".maparg(">","i")
endif
imap % ragtagUrlEncode
imap & ragtagXmlEncode
imap % ragtagUrlV
imap & ragtagXmlV
if !exists("b:did_indent")
if s:subtype() == "xml"
runtime! indent/xml.vim
else
runtime! indent/html.vim
endif
endif
" Pet peeve. Do people still not close their and
tags?
if exists("g:html_indent_tags") && g:html_indent_tags !~ '\\|p\>'
let g:html_indent_tags = g:html_indent_tags.'\|p\|li\|dt\|dd'
endif
set indentkeys+=!^F
let b:surround_indent = 1
silent doautocmd User ragtag
silent doautocmd User allml
endfunction
function! s:Leave()
call s:disableescape()
endfunction
function! s:length(str)
return strlen(substitute(a:str,'.','.','g'))
endfunction
function! s:repeat(str,cnt)
let cnt = a:cnt
let str = ""
while cnt > 0
let str = str . a:str
let cnt = cnt - 1
endwhile
return str
endfunction
function! s:doctypeSeek()
if !exists("b:ragtag_doctype_index")
if exists("b:allml_doctype_index")
let b:ragtag_doctype_index = b:allml_doctype_index
elseif &ft == 'xhtml' || &ft == 'eruby'
let b:ragtag_doctype_index = 10
elseif &ft != 'xml'
let b:ragtag_doctype_index = 7
endif
endif
let index = b:ragtag_doctype_index - 1
return (index < 0 ? s:repeat("\",-index) : s:repeat("\",index))
endfunction
function! s:stylesheetTag()
if !exists("b:ragtag_stylesheet_link_tag")
if exists("b:allml_stylesheet_link_tag")
let b:ragtag_stylesheet_link_tag = b:allml_stylesheet_link_tag
else
let b:ragtag_stylesheet_link_tag = ""
endif
endif
return s:insertTag(b:ragtag_stylesheet_link_tag)
endfunction
function! s:javascriptIncludeTag()
if !exists("b:ragtag_javascript_include_tag")
if exists("b:allml_javascript_include_tag")
let b:ragtag_javascript_include_tag = b:allml_javascript_include_tag
else
let b:ragtag_javascript_include_tag = ""
endif
endif
return s:insertTag(b:ragtag_javascript_include_tag)
endfunction
function! s:insertTag(tag)
let tag = a:tag
if s:subtype() == "html"
let tag = substitute(a:tag,'\s*/>','>','g')
endif
let before = matchstr(tag,'^.\{-\}\ze\r')
let after = matchstr(tag,'\r\zs\%(.*\r\)\@!.\{-\}$')
" middle isn't currently used
let middle = matchstr(tag,'\r\zs.\{-\}\ze\r')
return before.after.s:repeat("\",s:length(after))
endfunction
function! s:htmlEn()
let b:ragtag_omni = &l:omnifunc
let b:ragtag_isk = &l:isk
" : is for namespaced xml attributes
setlocal omnifunc=htmlcomplete#CompleteTags isk+=:
return ""
endfunction
function! s:htmlDis()
if exists("b:ragtag_omni")
let &l:omnifunc = b:ragtag_omni
unlet b:ragtag_omni
endif
if exists("b:ragtag_isk")
let &l:isk = b:ragtag_isk
unlet b:ragtag_isk
endif
return ""
endfunction
function! s:subtype()
let top = getline(1)."\n".getline(2)
if (top =~ '' && &ft !~? 'html') || &ft =~? '^\%(xml\|xsd\|xslt\)$'
return "xml"
elseif top =~? '\'
return 'xhtml'
elseif top =~ '[^<]\'
return "html"
elseif &ft == "xhtml" || &ft == "eruby"
return "xhtml"
elseif exists("b:loaded_ragtag")
return "html"
else
return ""
endif
endfunction
function! s:closetagback()
if s:subtype() == "html"
return ">\"
else
return " />\\\"
endif
endfunction
function! s:closetag()
if s:subtype() == "html"
return ">"
else
return " />"
endif
endfunction
function! s:charset()
let enc = &fileencoding
if enc == ""
let enc = &encoding
endif
if enc == "latin1"
return "ISO-8859-1"
elseif enc == ""
return "US-ASCII"
else
return enc
endif
endfunction
function! s:tagextras()
if s:subtype() == "xml"
return ""
elseif @" == 'html' && s:subtype() == 'xhtml'
let lang = "en"
if exists("$LANG") && $LANG =~ '^..'
let lang = strpart($LANG,0,2)
endif
return ' xmlns="http://www.w3.org/1999/xhtml" lang="'.lang.'" xml:lang="'.lang.'"'
elseif @" == 'style'
return ' type="text/css"'
elseif @" == 'script'
return ' type="text/javascript"'
elseif @" == 'table'
return ' cellspacing="0"'
else
return ""
endif
endfunction
inoremap urlspace =getinput()=~?'\%([?&]\&\)[%a-z0-9._~+-]*=[%a-z0-9._~+-]*$'?'+':'%20'
function! s:urltab(htmlesc)
let line = s:getinput()
let g:line = line
if line =~ '[^ <>"'."'".']\@"'."'".']\@ ragtagBSUrl
inoremap %0A
imap