2009-11-05 27 views
9

Desidero poter scrivere \bit e farlo espandere a qualcosa in vim. Come faccio a codificare una barra rovesciata sul lato sinistro di un'abbreviazione, però?Utilizzo delle barre rovesciate nelle abbreviazioni vim

ho provato tutti questi:

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

ma ottenuto E474: Invalid argument per tutti questi.

L'argomento di guida map_backslash suggerisce <Bslash>, ma questo non sembra funzionare.

+0

Aaarrgghh! È un cracker. Il tuo , ho imparato, è una cosa di {rhs}. In {lhs}, "\ b" (senza virgolette) funziona, ma l'E474 è presente quando viene aggiunto un secondo carattere "\ bi". "\\" e "\\ b" sono accettabili, ma "\\ bi" non lo è. '"\ bit"' (senza le virgolette esterne) funziona, ma le virgolette sono parte di ab. Come ho detto, "Aaarrgghh!" +1 –

+0

se si configura questo in una risposta @Ewan Posso votare questo, e sarà più facile vedere le virgolette. Questa è roba interessante ... – Peter

risposta

9

È possibile definire la propria abbreviazione su "bit", quindi verificare se è preceduta da "\", in tal caso, restituire il nuovo testo o "bit" in caso contrario.

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> 

Questo è il tipo di trucchi che ho usato in MapNoContext().

MODIFICA: vedere :h abbreviations per i motivi per cui ciò che è stato chiesto non può essere raggiunto direttamente.

EDIT2: Si può facilmente essere incapsulato in questo modo:

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

e utilizzato con un semplice:

InoreabBSlash <buffer> locbit foobar 

o

InoreabBSlash bit foobar 
1

si potrebbe

inoremap \bit replacementtext 

anche se non vi piace il ritardo un leader alternativo come apice inverso `(sopra la scheda per me)

:iab `f foobar 

se si sta non li utilizza nel codice spesso

+0

Funzionerebbe, ma non esattamente allo stesso modo. Ci sarebbe una pausa fastidiosa dopo ogni \ in attesa del resto. Però non riesco proprio a capirlo. – sykora

+0

sì, ci ho provato anch'io - e non mi è piaciuto. – Peter

+0

Ho questo per un paio di imaps (utilizzando = per l'elaborazione di alcune funzioni) durante la pausa (ti costringe a digitare più velocemente :) – michael

0

è possibile utilizzare solo una barra rovesciata come prefisso per un'abbreviazione se ha un solo carattere che lo segue, quindi :iab \b replacementtext funzionerà.

2

Io suggerisco di usare backslash su entrambi i lati, vim è felice in questo modo:

inoreabbr \bit\ replacement_text 

Si noti che sto usando la versione "Nore" del abbr, meglio essere chiari, se non si intende una ricorsiva espansione. Ho usato le abbreviazioni di seguito per molto tempo e funzionano benissimo:

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

Alternativa creativa. La barra retroversa finale lo trasforma in un'abbreviazione _non-id_ consentita. –

Problemi correlati