2010-07-23 30 views
10

¿Hay alguna forma de decirle a VIM que coloque el cursor en alguna posición después de la expansión de la abreviatura? Digamos que tiene algo como esto en .gvimrcPosición del cursor en la abreviatura VIM

iabberv <? <?=|?> 

y que desea colocar el cursor en el carácter de barra vertical es automática.

Respuesta

10

Una solución rápida que me gustaría usar en este caso es insertar algunas pulsaciones de teclas a la abreviatura:

iabbrev <? <?=?><Left><Left> 

colocaría el cursor dos lugares a la izquierda, después de la =.

De esta manera, puede usar varias teclas de movimiento tales como <End>, <Home>, o incluso volver al modo normal con <Esc> y mandar comandos usuales en modo normal. El ejemplo sería entonces

iabbrev <? <?=?><Esc>hha 

y hace lo mismo que en el primer ejemplo. Si expandes una abreviatura con espacio, tendrá un espacio extra. del que puede deshacerse usando un <BS> (retroceso) en la abreviatura. O expanda con <C-]> que no dejará espacio.

Corrección: ya que la abreviatura se expandió primero, y después de que el espacio insertado, se necesita una pequeña función que se encuentra en la ayuda (MAP.TXT):

func Eatchar(pat) 
    let c = nr2char(getchar(0))  
    return (c =~ a:pat) ? '' : c  
endfunc 

Esto es mejor poner en .vimrc. Ahora la siguiente abreviatura va a funcionar plenamente como intented:

:iabbrev <silent> <? <?=?><Left><Left><C-R>=Eatchar('\s')<CR> 

Es un poco desordenado, pero tiene una llamada a la función externa que elimina el espacio en blanco y debería funcionar bien.

+0

me trataron iabbrev HHA pero elimina carácter "=" :) donde debo colocar ? Es exactamente lo que quiero, excepto este problema . – ivan73

+0

Realmente lo siento por no probar la funcionalidad '' antes de responder. Edité en una solución adecuada. – progo

+0

fresco, funciona, aceptando esta respuesta :) lo estoy usando como esto: ' iabbrev HHA = Eatchar ('\ s') ' – ivan73

0

Se puede hacer con lh-map-tools:

" 
" in {rtp}/ftpluvin/vim/vim_snippets.vim 
inoreab <buffer> <silent> if  
     \ <C-R>=InsertSeq('if', 'if!cursorhere!\nendif!mark!')<CR> 

Otros plugins ofrecen una función similar.

4

Lo que quiere son fragmentos. Yo uso snipmate para eso.

+0

vote up, gracias por la punta Daenyth – ivan73

+0

debería echar un vistazo en [UltiSnips] (https://github.com/SirVer/ultisnips), ¡es simplemente increíble! – aymericbeaumet

Cuestiones relacionadas