Vim cursor position after expanding html tag

indentation, vim

Solution

The only correct behavior of `<CR>` in insert mode is to break the line at the cursor.

What you want is an enhanced behavior and you need to add something to your config to get it: a mapping, a short function or a full fledged plugin.

When I started to use vim, that behavior was actually one of the first things I added to my vimrc. I've changed it many times in the past but this mapping has been quite stable for a while:

inoremap <leader><CR> <CR><C-o>==<C-o>O

I've used `<leader><CR>` to keep the normal behavior of `<CR>`.

Here is a small function that seems to do what you want:

function! Expander()
  let line   = getline(".")
  let col    = col(".")
  let first  = line[col-2]
  let second = line[col-1]
  let third  = line[col]

  if first ==# ">"
    if second ==# "<" && third ==# "/"
      return "\<CR>\<C-o>==\<C-o>O"

    else
      return "\<CR>"

    endif

  else
    return "\<CR>"

  endif

endfunction

inoremap <expr> <CR> Expander()

Problem

I most IDEs and modern text editors (Sublime Text 3) the cursor is correctly indented after inserting a newline in between an html tag (aka 'expanding" the tag): Before: ``` <div>|</div> ``` After pressing CR: ``` <div> | </div> ``` But in Vim, this is what I get: ``` <div> |</div> ``` How can I get the same behaviour in Vim like in most other editors (see above)?

Original source