Keep HTML attributes when changing tags

By default keep the HTML attributes of the previous surrounding tag.

Option to remove attributes if the new tag prompt is ended with '>'.

Fixes #95.
This commit is contained in:
Shane Smith 2014-05-31 14:57:29 -04:00
parent fd75eb2cb2
commit 5d6b91ce80
2 changed files with 21 additions and 16 deletions

View File

@ -130,9 +130,10 @@ code blocks in C-style languages, <C-}> (which is really <C-]>) adds braces on
lines separate from the content. lines separate from the content.
If t or < is used, Vim prompts for an HTML/XML tag to insert. You may specify If t or < is used, Vim prompts for an HTML/XML tag to insert. You may specify
attributes here and they will be stripped from the closing tag. End your attributes here and they will be stripped from the closing tag. If replacing a
input by pressing <CR> or >. If <C-T> is used, the tags will appear on lines tag, its attributes are kept in the new tag. End your input with > to discard
by themselves. the those attributes. If <C-T> is used, the tags will appear on lines by
themselves.
If s is used, a leading but not trailing space is added. This is useful for If s is used, a leading but not trailing space is added. This is useful for
removing parentheses from a function call with csbs. removing parentheses from a function call with csbs.

View File

@ -124,13 +124,12 @@ function! s:process(string)
return s return s
endfunction endfunction
function! s:wrap(string,char,type,...) function! s:wrap(string,char,type,removed,special)
let keeper = a:string let keeper = a:string
let newchar = a:char let newchar = a:char
let s:input = "" let s:input = ""
let type = a:type let type = a:type
let linemode = type ==# 'V' ? 1 : 0 let linemode = type ==# 'V' ? 1 : 0
let special = a:0 ? a:1 : 0
let before = "" let before = ""
let after = "" let after = ""
if type ==# "V" if type ==# "V"
@ -171,7 +170,7 @@ function! s:wrap(string,char,type,...)
if !maparg(">","c") if !maparg(">","c")
let dounmapb = 1 let dounmapb = 1
" Hide from AsNeeded " Hide from AsNeeded
exe "cn"."oremap > <CR>" exe "cn"."oremap > ><CR>"
endif endif
let default = "" let default = ""
if newchar ==# "T" if newchar ==# "T"
@ -181,18 +180,24 @@ function! s:wrap(string,char,type,...)
let default = matchstr(s:lastdel,'<\zs.\{-\}\ze>') let default = matchstr(s:lastdel,'<\zs.\{-\}\ze>')
endif endif
let tag = input("<",default) let tag = input("<",default)
echo "<".substitute(tag,'>*$','>','')
if dounmapb if dounmapb
silent! cunmap > silent! cunmap >
endif endif
let s:input = tag let s:input = tag
if tag != "" if tag != ""
let keepAttributes = ( match(tag, ">$") == -1 )
let tag = substitute(tag,'>*$','','') let tag = substitute(tag,'>*$','','')
let attributes = ""
if keepAttributes
let attributes = matchstr(a:removed, '<[^ \t\n]\+\zs\_.\{-\}\ze>')
endif
let s:input = tag . '>' let s:input = tag . '>'
let before = '<'.tag.'>'
if tag =~ '/$' if tag =~ '/$'
let tag = substitute(tag, '/$', '', '')
let before = '<'.tag.attributes.' />'
let after = '' let after = ''
else else
let before = '<'.tag.attributes.'>'
let after = '</'.substitute(tag,' .*','','').'>' let after = '</'.substitute(tag,' .*','','').'>'
endif endif
if newchar == "\<C-T>" || newchar == "," if newchar == "\<C-T>" || newchar == ","
@ -246,7 +251,7 @@ function! s:wrap(string,char,type,...)
let after = '' let after = ''
endif endif
let after = substitute(after ,'\n','\n'.initspaces,'g') let after = substitute(after ,'\n','\n'.initspaces,'g')
if type ==# 'V' || (special && type ==# "v") if type ==# 'V' || (a:special && type ==# "v")
let before = substitute(before,' \+$','','') let before = substitute(before,' \+$','','')
let after = substitute(after ,'^ \+','','') let after = substitute(after ,'^ \+','','')
if after !~ '^\n' if after !~ '^\n'
@ -259,7 +264,7 @@ function! s:wrap(string,char,type,...)
endif endif
if before !~ '\n\s*$' if before !~ '\n\s*$'
let before .= "\n" let before .= "\n"
if special if a:special
let before .= "\t" let before .= "\t"
endif endif
endif endif
@ -289,11 +294,10 @@ function! s:wrap(string,char,type,...)
return keeper return keeper
endfunction endfunction
function! s:wrapreg(reg,char,...) function! s:wrapreg(reg,char,removed,special)
let orig = getreg(a:reg) let orig = getreg(a:reg)
let type = substitute(getregtype(a:reg),'\d\+$','','') let type = substitute(getregtype(a:reg),'\d\+$','','')
let special = a:0 ? a:1 : 0 let new = s:wrap(orig,a:char,type,a:removed,a:special)
let new = s:wrap(orig,a:char,type,special)
call setreg(a:reg,new,type) call setreg(a:reg,new,type)
endfunction endfunction
" }}}1 " }}}1
@ -314,7 +318,7 @@ function! s:insert(...) " {{{1
set clipboard-=unnamed clipboard-=unnamedplus set clipboard-=unnamed clipboard-=unnamedplus
let reg_save = @@ let reg_save = @@
call setreg('"',"\r",'v') call setreg('"',"\r",'v')
call s:wrapreg('"',char,linemode) call s:wrapreg('"',char,"",linemode)
" If line mode is used and the surrounding consists solely of a suffix, " If line mode is used and the surrounding consists solely of a suffix,
" remove the initial newline. This fits a use case of mine but is a " remove the initial newline. This fits a use case of mine but is a
" little inconsistent. Is there anyone that would prefer the simpler " little inconsistent. Is there anyone that would prefer the simpler
@ -442,7 +446,7 @@ function! s:dosurround(...) " {{{1
call setreg('"',keeper,regtype) call setreg('"',keeper,regtype)
if newchar != "" if newchar != ""
let special = a:0 > 2 ? a:3 : 0 let special = a:0 > 2 ? a:3 : 0
call s:wrapreg('"',newchar, special) call s:wrapreg('"',newchar,removed,special)
endif endif
silent exe 'norm! ""'.pcmd.'`[' silent exe 'norm! ""'.pcmd.'`['
if removed =~ '\n' || okeeper =~ '\n' || getreg('"') =~ '\n' if removed =~ '\n' || okeeper =~ '\n' || getreg('"') =~ '\n'
@ -518,7 +522,7 @@ function! s:opfunc(type,...) " {{{1
let keeper = substitute(keeper,'\_s\@<!\s*$','','') let keeper = substitute(keeper,'\_s\@<!\s*$','','')
endif endif
call setreg(reg,keeper,type) call setreg(reg,keeper,type)
call s:wrapreg(reg,char,a:0 && a:1) call s:wrapreg(reg,char,"",a:0 && a:1)
if type ==# "v" && a:type !=# "v" && append != "" if type ==# "v" && a:type !=# "v" && append != ""
call setreg(reg,append,"ac") call setreg(reg,append,"ac")
endif endif