扩展html标签后的Vim光标位置

时间:2013-08-05 11:49:49

标签: vim indentation

我的大多数IDE和现代文本编辑器(Sublime Text 3)在html标记(也称为“扩展”标记)之间插入换行符后,光标正确缩进:

在:

<div>|</div>

按下CR后:

<div>
    |
</div>

但在Vim,这就是我得到的:

<div>
|</div>

如何在Vim中获得与大多数其他编辑器相同的行为(见上文)?

4 个答案:

答案 0 :(得分:8)

插入模式下<CR>的唯一正确行为是打破光标处的行。

你想要的是一个增强的行为,你需要在你的配置中添加一些内容来获取它:一个映射,一个简短的函数或一个完整的插件。

当我开始使用vim时,这种行为实际上是我添加到vimrc的第一件事。我过去曾多次改变它,但这种映射已经相当稳定了一段时间:

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

我已使用<leader><CR>来保持<CR>的正常行为。


这是一个似乎可以做你想做的小功能:

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()

答案 1 :(得分:3)

这个小片段将在插入模式下重新映射 Enter ,以测试光标是否在><之间,如果是,则进行相应的操作。根据您的缩进设置,可能需要删除\<Tab>

与其他可能也映射 Enter 键的插件一起玩得很好所以请注意,如果你想要兼容性,可能还有更多工作要做

function EnterOrIndentTag()
  let line = getline(".")
  let col = getpos(".")[2]
  let before = line[col-2]
  let after = line[col-1]

  if before == ">" && after == "<"
    return "\<Enter>\<C-o>O\<Tab>"
  endif
   return "\<Enter>"
endfunction

inoremap <expr> <Enter> EnterOrIndentTag()

我只测试了简单的情况(行的开头,行的末尾,><的内部和外部),可能有边缘情况,这是无法捕获的。

答案 2 :(得分:2)

@RandyMorris和@romainl为您的确切问题发布了很好的解决方案。

如果您自己输入这些标签,还有其他一些可能感兴趣的可能性:还有用于HTML / XML编辑的ragtag.vim插件。

使用 ragtag.vim 键入此选项以创建“之前”状态(在插入模式下):

div<C-X><Space>

要创建“之后”情况,您需要输入:

div<C-X><Enter>

因此,如果您事先知道要“扩展”标签,只需键入元素名称和组合 Ctrl X ,然后输入 Enter < / kbd>就够了。

还有其他更高级的插件可以在编辑HTML时保存按键,例如ZenCoding.vimSparkup

答案 3 :(得分:0)

因为没有人提到它我会的。有一个很好的插件可以做到这一点 delemitmate