首先,我必须承认,我只是输入一个空格键,这是最简单的按键。但这是一次学习经历。所以请帮助我解决问题。
问题是,我希望当我在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}}。
我知道,我可以通过键入单个空格来解决所有问题,但我想解决它。
请帮助。
答案 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('>')