2009-11-05 8 views
9

Je souhaite être en mesure d'écrire \bit et de l'étendre à quelque chose dans vim. Comment puis-je encoder un backslash dans le côté gauche d'une abréviation, cependant?Utilisation de barres obliques inverses dans les abréviations vim

J'ai essayé tous ces:

:iab \bit replacement_text 
:iab <Bslash>bit replacement_text 
:iab <bs>bit replacement_text 

mais nous avons eu E474: Invalid argument pour tout cela. L'aide-rubrique map_backslash suggère <Bslash>, mais cela ne semble pas fonctionner.

+0

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 –

+0

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

Répondre

9

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 
1

vous pouvez

inoremap \bit replacementtext 

Aussi, si vous ne aimez pas le décalage un leader alternatif comme backtick `(au-dessus de l'onglet pour moi)

:iab `f foobar 

si vous ne les utilisez pas dans votre code souvent

+0

Cela fonctionnerait, mais pas exactement de la même manière. Il y aurait une pause ennuyante après chaque attente du reste. Je ne vois pas vraiment comment contourner cela. – sykora

+0

ouais, j'ai essayé moi-même - et je n'ai pas aimé. – Peter

+0

Je l'ai pour quelques imaps (en utilisant = pour un traitement de fonction) vous obtenez au cours de la pause (il vous oblige à taper plus vite :) – michael

0

Vous ne pouvez utiliser une barre oblique inverse comme préfixe pour une abréviation si elle n'a qu'un seul caractère qui la suit, donc :iab \b replacementtext marchera.

2

Je suggère d'utiliser la barre oblique inverse des deux côtés, vim est heureux de cette façon:

inoreabbr \bit\ replacement_text 

Notez que j'utilise la version « Nore » de abbr, mieux d'être clair si vous ne comptez pas récursive expansion. J'utilise les abréviations ci-dessous depuis longtemps et ils fonctionnent très bien:

inoreabbr \time\ <C-R>=strftime("%d-%b-%Y @ %H:%M")<CR> 
inoreabbr \date\ <C-R>=strftime("%d-%b-%Y")<CR> 
+0

Alternative créative. La barre oblique inverse en fin de ligne transforme ceci en une abréviation autorisée. –

Questions connexes