map =带有inoremap的vim中的空格

时间:2015-03-07 23:48:06

标签: vim

首先,我必须承认,我只是输入一个空格键,这是最简单的按键。但这是一次学习经历。所以请帮助我解决问题。

问题是,我希望当我在vim中输入" ="时,它会转换为" = ",所以,例如"k =" -> "k = " 所以我做了一个映射:

inoremap <expr> = getline(".")[col(".")-2] =~ '[[:blank:])]' ? "= " : "="

到目前为止一切都很好。 但是,当我需要" == "时会出现问题。有了上面的地图,我总会以" = = "结束,这不是我想要的。

我试图将其映射为:

inoremap <space>=<space>= <space>==<space>

这也很好,除了令人恼火的后果,每当按下<space>时,vim总是会等待下一个键。

vim_space_in_lhs开始,我也试过了

inoremap <C-V><C-V><space>=<C-V><C-V><space>= <space>==<space>

但这完全取消了映射,即"k ="仍然是第一张地图中的"k = ",而不是{{1}}。

我知道,我可以通过键入单个空格来解决所有问题,但我想解决它。

请帮助。

1 个答案:

答案 0 :(得分:1)

inoremap <expr> = getline(".")[col(".")-3] == '=' ? "<bs>= " : getline(".")[col(".")-2] =~ '\s' ? "= " : "="

应该这样做

编辑:

鉴于新的要求,这是一个功能和相关的映射,它们可以完成这项工作。

注意:这应该在ftplugins中定义:您不希望在<上以类似xml的语言触发此类映射。您可能还需要在函数上定义多个函数或第二个参数,以更精确地处理这些映射的行为。

function! s:InsertExpr(char)
  let line = getline('.')
  let col  = col('.')
  return 
        \   line[col-3] =~ '[=<>!~]' ? "\<bs>".a:char." "
        \ : line[col-2] =~ '\s\+'    ? a:char." "
        \ :                            a:char
endfunction
inoremap <buffer> <expr> = <sid>InsertExpr('=')
inoremap <buffer> <expr> < <sid>InsertExpr('<')
inoremap <buffer> <expr> > <sid>InsertExpr('>')