map = with space in vim with inoremap

map = with space in vim with inoremap

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

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

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

到目前为止还不错。 但是,当我需要 " == " 时,问题就出现了。有了上面的地图,我总是会结束" = = ",这不是我想要的

我尝试将其映射为:

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

这也工作正常,除了一个恼人的后果,即 vim 将始终在按下 <space> 时等待下一个键。

vim_space_in_lhs开始我也试过了

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

但这会完全破坏映射,即 "k =" 保持原样,而不是第一个映射中的 "k = "

我知道,我输入一个就可以解决所有问题space,但我想解决它

请帮忙。

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