【问题标题】:Vim cursor position after expanding html tag展开 html 标签后的 Vim 光标位置
【发布时间】:2013-08-05 11:49:48
【问题描述】:

在大多数 IDE 和现代文本编辑器(Sublime Text 3)中,在 html 标签之间插入换行符(又名“扩展”标签)后,光标会正确缩进:

之前:

<div>|</div>

按CR后:

<div>
    |
</div>

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

<div>
|</div>

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

【问题讨论】:

  • 试试这个:github.com/othree/xml.vim
  • 由于某种原因,我无法在这里回答这个问题(提交时不断出错)。我已将我想要的答案粘贴到this gist
  • @RandyMorris 我将它作为答案发布没有问题。再发一次试试?
  • @FDinoff 没有骰子。不过感谢您试用,我猜我的电脑或帐户上有些东西被破坏了。
  • @FDinoff 一定是我的工作机器。它在我的手机上工作。再次感谢。

标签: vim indentation


【解决方案1】:

&lt;CR&gt; 在插入模式下唯一的正确行为是在光标处换行。

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

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

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

我使用&lt;leader&gt;&lt;CR&gt; 来保持&lt;CR&gt; 的正常行为。


这是一个小功能,似乎可以满足您的需求:

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

【讨论】:

  • 非常感谢 - 您的解决方案有效,我会接受它作为答案。我宁愿看到更自动的行为,就像我在 Sublime Text 或 Textmate 中得到的那样。我可能会在下面研究学习 vimscript 和扩展 Randy Morris 解决方案。
  • FWIW,我使用 SnipMate 和 Sparkup 编写 HTML。您应该考虑使用这些插件:它们将帮助您节省大量的打字时间。
  • 非常感谢。你太棒了!
【解决方案2】:

这个小sn-p 将在插入模式下重新映射Enter 以测试光标是否在&gt;&lt; 之间,如果是则采取相应的行动。根据您的缩进设置,\&lt;Tab&gt; 可能需要删除。

不会与其他可能也映射 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()

我只测试了简单的情况(行首、行尾、&gt;&lt; 的内部和外部),可能有一些边缘情况无法捕获。

【讨论】:

  • 谢谢兰迪。您的解决方案非常好,但实际上我需要一些可以与 matchIt 等其他插件配合使用的东西。不过,您的代码让我开始考虑编写这样的函数,谢谢!
【解决方案3】:

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

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

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

div<C-X><Space>

要创建您的“之后”情况,您可以输入:

div<C-X><Enter>

因此,如果您事先知道要“扩展”标签,只需键入元素名称和组合 CtrlX 后跟 Enter 就够了。

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

【讨论】:

  • 谢谢!不幸的是,这对我不起作用,虽然我已经安装了 ragtag-plugin 并且经常使用它来插入 ruby​​ 标签(所以我知道它有效)。
【解决方案4】:

由于没有人提到它,我会。有一个出色的插件可以做到这一点 delemitmate

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2011-11-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多