从函数插入回车时Vim不会缩进?

时间:2014-08-25 09:46:21

标签: vim

所以我试着编写一个能让插入半冒号更加愉快的功能:

        inoremap <leader>; <esc>:call InsertSemiColin()<cr>

基本上它检查我是否站在当前行的末尾,如果是,我自动格式化代码,在末尾插入分号并分解到下一行(回车) )

fun! InsertSemiColin()
    if (!IsEOL()) | exec "normal! a;" | return | endif
    exec "normal! \<esc>:OmniSharpCodeFormat\<cr>A;\<cr>"
endf:

fun! IsEOL()
    " col number == length of current line?
    return col('.') == strlen(getline(line('.'))) " or just getline('.')
endf

期望:

enter image description here

结果:

enter image description here

要自行尝试,可以删除代码格式,然后执行以下操作:

    exec "normal! a;\<cr>"

我的缩进设置:

set smartindent
set tabstop=4
set shiftwidth=4
filetype plugin indent on

奇怪的是,如果我没有从函数中插入回车符,它会按预期工作!

inoremap <leader>; ;<cr>

为什么会这样?我怎样才能得到我期待的结果?

非常令人沮丧,任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:1)

我会避免离开并通过:help :map-expr重新进入插入模式:

inoremap <expr> <leader>; ';' . (IsEOL() ? '<esc>:OmniSharpCodeFormat<cr>A<cr>' : '')

为此,您需要更改IsEOL()功能中的比较:

fun! IsEOL()
    " col number == length of current line?
    return col('.') > strlen(getline(line('.'))) " or just getline('.')
endf

这也解决了缩进问题。