e6efd03a434b

vim: tag closing
[view raw] [browse files]
author Steve Losh <steve@dwaiter.com>
date Wed, 16 Jun 2010 15:34:44 -0400
parents 85ea7f03b9be
children 985b6818cbfa 8c36821d14d5
branches/tags (none)
files vim/.vimrc vim/ftplugin/html/closetags.vim vim/ftplugin/htmldjango/closetags.vim

Changes

--- a/vim/.vimrc	Sun Jun 13 02:47:04 2010 -0400
+++ b/vim/.vimrc	Wed Jun 16 15:34:44 2010 -0400
@@ -148,3 +148,7 @@
 
 " Easier linewise reselection
 map <leader>v V`]
+
+" HTML tag closing
+imap <C-_> <Space><BS><Esc>:call InsertCloseTag()<CR>a
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vim/ftplugin/html/closetags.vim	Wed Jun 16 15:34:44 2010 -0400
@@ -0,0 +1,58 @@
+function! InsertCloseTag()
+" inserts the appropriate closing HTML tag; used for the \hc operation defined
+" above;
+" requires ignorecase to be set, or to type HTML tags in exactly the same case
+" that I do;
+" doesn't treat <P> as something that needs closing;
+" clobbers register z and mark z
+" 
+" by Smylers  http://www.stripey.com/vim/
+" 2000 May 3
+
+  if &filetype == 'html'
+  
+    " list of tags which shouldn't be closed:
+    let UnaryTags = ' Area Base Br DD DT HR Img Input Link Meta Param '
+
+    " remember current position:
+    normal mz
+
+    " loop backwards looking for tags:
+    let Found = 0
+    while Found == 0
+      " find the previous <, then go forwards one character and grab the first
+      " character plus the entire word:
+      execute "normal ?\<LT>\<CR>l"
+      normal "zyl
+      let Tag = expand('<cword>')
+
+      " if this is a closing tag, skip back to its matching opening tag:
+      if @z == '/'
+        execute "normal ?\<LT>" . Tag . "\<CR>"
+
+      " if this is a unary tag, then position the cursor for the next
+      " iteration:
+      elseif match(UnaryTags, ' ' . Tag . ' ') > 0
+        normal h
+
+      " otherwise this is the tag that needs closing:
+      else
+        let Found = 1
+
+      endif
+    endwhile " not yet found match
+
+    " create the closing tag and insert it:
+    let @z = '</' . Tag . '>'
+    normal `z"zp
+
+  else " filetype is not HTML
+    echohl ErrorMsg
+    echo 'The InsertCloseTag() function is only intended to be used in HTML ' .
+      \ 'files.'
+    sleep
+    echohl None
+  
+  endif " check on filetype
+
+endfunction " InsertCloseTag()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vim/ftplugin/htmldjango/closetags.vim	Wed Jun 16 15:34:44 2010 -0400
@@ -0,0 +1,1 @@
+/Users/sjl/lib/dotfiles/vim/ftplugin/html/closetags.vim
\ No newline at end of file