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

扩展html标记后的Vim光标位置,vim,indentation,Vim,Indentation,I大多数IDE和现代文本编辑器(升华文本3)在html标记之间插入换行符(也称为“扩展”标记)后,光标正确缩进: 之前: <div>|</div> | 按下CR键后: <div> | </div> | 但在Vim中,我得到的是: <div> |</div> | 我怎样才能在Vim中获得与大多数其他编辑器(见上文)相同的行为?@RandyMorris和@Romaill已经为您的确切问题发布了很好的解决方

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

之前:

<div>|</div>
|
按下CR键后:

<div>
    |
</div>

|
但在Vim中,我得到的是:

<div>
|</div>

|

我怎样才能在Vim中获得与大多数其他编辑器(见上文)相同的行为?

@RandyMorris和@Romaill已经为您的确切问题发布了很好的解决方案

如果您自己输入这些标记,您可能会对其他一些可能性感兴趣:有一个用于HTML/XML编辑的插件

使用ragtag.vim,您可以键入以下内容来创建“之前”的情况(在插入模式下):

div
要创建“之后”情况,您可以键入:

div<C-X><Enter>
div
因此,如果您事先知道要“展开”标记,只需键入元素名称和组合CtrlX,然后输入Enter就足够了

还有其他更高级的插件可以在编辑HTML时保存击键,例如and。

在插入模式下,
唯一正确的行为是在光标处断行

你想要的是一个增强的行为,你需要在你的配置中添加一些东西来获得它:一个映射、一个短函数或一个成熟的插件

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

inoremap <leader><CR> <CR><C-o>==<C-o>O
inoremap==O
我使用了
来保持
的正常行为


下面是一个小函数,它似乎可以实现您想要的功能:

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()
function!Expander()
let line=getline(“.”)
设col=col(“.”)
let first=行[col-2]
设第二个=行[col-1]
让第三个=行[列]
如果第一个=#“>”

如果second=#“这个小片段将在插入模式下重新映射Enter,以测试光标是否在
之间,如果在插入模式下,则执行相应的操作。根据缩进设置,可能需要删除代码\选项卡/代码。/p pIt将不会/em与其他可能也映射kbdEnter/kbd密钥的插件配合使用,因此请注意,如果您想要实现兼容性,可能还有更多工作要做。/p 预失效EnterOrIndentTag() let line=getline(“.”) 设col=getpos(“.”[2] let before=第[col-2]行 let after=行[col-1] 如果之前==“”&之后==“” 返回“\Enter\C-oO\Tab” 恩迪夫 返回“\Enter” 端功能 inoremap expr输入EnterOrIndentTag() /编码/预编码
pI只测试了简单的情况(行首、行尾、代码内部和外部>,因为没有人提到过,我会的。有一个优秀的插件可以做到这一点

试试这个:由于某些原因,我在这里回答这个问题时遇到困难(提交问题时不断出错)。我已经粘贴了我想要的答案。@RandyMorris我没有问题将其作为答案发布。再次尝试发布吗?@FDinoff没有骰子。感谢您尝试,我猜我的计算机或我的帐户上出现了故障。@FDinoff一定是我的工作机器。它在我的手机上工作。再次感谢您。兰迪。您的解决方案非常有用不错,但事实上我需要一些能与其他插件(如matchIt)配合使用的东西。你的代码让我开始考虑编写这样一个函数,谢谢!谢谢!不幸的是,这对我不起作用,尽管我已经安装了ragtag插件,并且经常使用它插入ruby标记(所以我知道它是有效的)非常感谢。你的解决方案起作用了,我会接受它作为答案。我宁愿看到一种更为自动化的行为,就像我在崇高的文本或文本中得到的那样。我可能会研究学习VimScript和扩展Randy Morris解决方案。FWIW,我使用SnpPad和SpkUp编写HTML。你应该考虑那些插件:这会帮你节省很多打字时间。非常感谢。你太棒了!
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()
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()