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


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

之前:

<div>|</div>

按下CR后:

<div>
    |
</div>

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

<div>
|</div>

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


3981
2017-08-05 11:49


起源

尝试这个: github.com/othree/xml.vim - Kent
我出于某种原因在这里回答这个问题时遇到了麻烦(在提交错误时不断收到错误)。我已经粘贴了我想要的答案 这个要点。 - Randy Morris
@RandyMorris我把它作为答案发布没有问题。尝试再次发布它? - FDinoff
@FDinoff没有骰子。谢谢你尝试一下,我想我的电脑或帐户上都有一些东西被破坏了。 - Randy Morris
@FDinoff一定是我的工作机器。它可以通过我的手机使用。再次感谢。 - Randy Morris


答案:


唯一的 正确 的行为 <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()

8
2017-08-05 19:54



非常感谢 - 您的解决方案有效,我会接受它作为答案。我宁愿喜欢看到更自动的行为,比如我在Sublime Text或Textmate中获得它。我可能会调查学习vimscript并在下面扩展Randy Morris解决方案。 - Daniel Lang
FWIW,我使用SnipMate和Sparkup编写HTML。你应该考虑那些插件:它们会帮助你节省 很多 打字。 - romainl
@DanielLang,请看我的编辑。 - romainl
非常感谢。你真了不起! - Daniel Lang


这个小片段将重新映射 输入 在插入模式下测试光标是否介于两者之间 > 和 < 如果是,则采取相应行动。根据您的缩进设置而定 \<Tab> 可能需要删除。

它会  与其他可能也正在映射的插件一起玩得很好 输入 密钥因此请注意,如果您想要兼容性,可能还有更多工作要做。

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

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


3
2017-08-05 20:06



谢谢兰迪。你的解决方案非常好,但事实上我需要一些与其他插件如matchIt相配的东西。你的代码让我考虑编写这样一个函数,谢谢! - Daniel Lang


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

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

ragtag.vim 你输入这个来创建你的“之前”情况(在插入模式下):

div<C-X><Space>

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

div<C-X><Enter>

因此,如果您事先知道要“扩展”标记,只需键入元素名称和组合 按CtrlX 其次是 输入 足够。

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


2
2017-08-05 19:52



谢谢!不幸的是,这对我不起作用,虽然我已经安装了ragtag-plugin并且使用它来插入ruby标签(所以我知道它有效)。 - Daniel Lang


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


0
2018-03-01 11:50