2009-11-05 17 views
9

Quiero poder escribir \bit y ampliarlo a algo en vim. Sin embargo, ¿cómo codifico una barra inversa en el lado izquierdo de una abreviatura?Uso de barras diagonales inversas en abreviaturas vim

He intentado todos ellos:

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

pero tiene E474: Invalid argument para todos ellos.

El tema de ayuda map_backslash sugiere <Bslash>, pero parece que no funciona.

+0

Aaarrgghh! Es un cracker Su , me enteré, es una cosa {rhs}. En el {lhs}, funciona "\ b" (sin comillas), pero el E474 está allí cuando se agrega un segundo carácter "\ bi". "\\" y "\\ b" son aceptables, pero "\\ bi" no lo es. '"\ bit"' (sin comillas simples externas) funciona, pero las comillas dobles son parte del ab. Como dije, "¡Aaarrgghh!" +1 –

+0

si pega esto en una respuesta @Ewan, puedo votar esto y será más fácil ver las comillas. Esto es algo interesante ... – Peter

Respuesta

9

Puede definir su abreviatura en "bit", y luego probar si va precedida por "\", de ser así, devuelva el texto nuevo, o "bit" en 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> 

Esa es la clase de trucos que utilicé en MapNoContext().

EDITAR: vea :h abbreviations por las razones por las cuales no se puede lograr lo que usted solicitó directamente.

Edit2: Se puede encapsular fácilmente de esta manera:

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

y se utiliza con un simple:

InoreabBSlash <buffer> locbit foobar 

o

InoreabBSlash bit foobar 
1

usted podría

inoremap \bit replacementtext 

Además, si no te gusta el retraso de un líder alternativo como backtick `(por encima de la pestaña para mí)

:iab `f foobar 

si no está utilizando en su código menudo

+0

Esto funcionaría, pero no exactamente de la misma manera. Habría una pausa molesta después de cada \ esperando el resto. Aunque no veo una forma de evitarlo. – sykora

+0

Sí, lo intenté yo mismo, y no me gustó. – Peter

+0

Tengo esto para un par de imágenes (usando = para el procesamiento de algunas funciones) se supera la pausa (te obliga a escribir más rápido :) – michael

0

sólo se puede utilizar una barra invertida como una prefijo para una abreviatura si solo tiene un solo carácter que lo sigue, entonces :iab \b replacementtext trabajará.

2

sugiere emplear la barra invertida en ambos lados, vim es feliz así:

inoreabbr \bit\ replacement_text 

Tenga en cuenta que estoy usando el "Nore" versión de forma abreviada, mejor estar claro si usted no se propone una recursiva expansión. He estado utilizando las siguientes abreviaturas por un largo tiempo y funcionan muy bien:

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 invertida final convierte esto en una abreviatura _non-id_ permitida. –

Cuestiones relacionadas