在大多数 IDE 和现代文本编辑器(Sublime Text 3)中,在 html 标签之间插入换行符后光标正确缩进(又名“扩展”标签):
前:
<div>|</div>
按 CR 后:
<div>
|
</div>
但在 Vim 中,这就是我得到的:
<div>
|</div>
如何在 Vim 中获得与大多数其他编辑器相同的行为(见上文)?
在大多数 IDE 和现代文本编辑器(Sublime Text 3)中,在 html 标签之间插入换行符后光标正确缩进(又名“扩展”标签):
前:
<div>|</div>
按 CR 后:
<div>
|
</div>
但在 Vim 中,这就是我得到的:
<div>
|</div>
如何在 Vim 中获得与大多数其他编辑器相同的行为(见上文)?
在插入模式下唯一正确的行为是<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()
这个小片段将在插入模式下重新映射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()
我只测试了简单的情况(行首、行尾、内部和外部><
),可能有一些边缘情况无法捕捉。
@RandyMorris 和 @romainl 为您的确切问题发布了很好的解决方案。
如果您自己输入这些标签,您可能会对其他一些可能性感兴趣:有用于 HTML/XML 编辑的ragtag.vim插件。
使用ragtag.vim你可以输入这个来创建你的“之前”情况(在插入模式下):
div<C-X><Space>
要创建您的“之后”情况,您可以输入:
div<C-X><Enter>
因此,如果您事先知道要“扩展”标签,只需输入元素名称和CtrlX后面的组合Enter就足够了。
还有其他更高级的插件可以在编辑 HTML 时保存击键,例如ZenCoding.vim和Sparkup。
由于没有人提到它,我会的。有一个优秀的插件可以做到这 一点