我大多数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()
这个小片段将重新映射 输入 在插入模式下测试光标是否介于两者之间 >
和 <
如果是,则采取相应行动。根据您的缩进设置而定 \<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()
我只测试了简单的情况(行的开头,行的结尾,内部和外部) ><
),可能有边缘情况,这将无法捕获。
@RandyMorris和@romainl为您的确切问题发布了很好的解决方案。
如果您自己输入这些标签,还有其他一些可能感兴趣的可能性:就是这样 ragtag.vim 用于HTML / XML编辑的插件。
同 ragtag.vim 你输入这个来创建你的“之前”情况(在插入模式下):
div<C-X><Space>
要创建“后”情况,您需要输入:
div<C-X><Enter>
因此,如果您事先知道要“扩展”标记,只需键入元素名称和组合 按CtrlX 其次是 输入 足够。
还有其他更高级的插件可以在编辑HTML时保存按键,例如 ZenCoding.vim 和 Sparkup。
既然没有人提到它我会的。有一个很好的插件可以做到这一点 delemitmate