Vous pouvez définir votre abréviation sur "bit", puis tester si elle est précédée de "\", si c'est le cas, renvoyer le nouveau texte, ou "bit" dans le cas contraire.
function! s:Expr(default, repl)
if getline('.')[col('.')-2]=='\'
return "\<bs>".a:repl
else
return a:default
endif
endfunction
:inoreab bit <c-r>=<sid>Expr('bit', 'foobar')<cr>
C'est le genre de trucs que j'ai utilisé dans MapNoContext().
EDIT: voir :h abbreviations pour les raisons pour lesquelles ce que vous avez demandé ne peut pas être atteint directement.
EDIT2: Il peut être facilement encapsulées de cette façon:
function! s:DefIab(nore, ...)
let opt = ''
let i = 0
while i != len(a:000)
let arg = a:000[i]
if arg !~? '<buffer>\|<silent>'
break
endif
let opt .= ' '.arg
let i += 1
endwhile
if i+2 != len(a:000)
throw "Invalid number of arguments"
endif
let lhs = a:000[i]
let rhs = a:000[i+1]
exe 'i'.a:nore.'ab'.opt.' '.lhs.' <c-r>=<sid>Expr('.string(lhs).', '.string(rhs).')<cr>'
endfunction
command! -nargs=+ InoreabBSlash call s:DefIab('nore', <f-args>)
Et utilisé avec un simple:
InoreabBSlash <buffer> locbit foobar
ou
InoreabBSlash bit foobar
Aaarrgghh! C'est un cracker. Votre, j'ai appris, est une chose {rhs}. Dans le {lhs}, "\ b" (sans guillemets) fonctionne, mais le E474 est là quand un deuxième char est ajouté "\ bi". "\\" et "\\ b" sont acceptables, mais "\\ bi" ne l'est pas. '"\ bit"' (sans guillemets simples externes) fonctionne, mais les guillemets doubles font partie de l'ab. Comme je l'ai dit, "Aaarrgghh!" +1 –
si vous vous en tenez à une réponse @Ewan, je peux voter, et il sera plus facile de voir les citations. Ce sont des choses intéressantes ... – Peter