2011-07-01 10 views
5

En Intellij Idea, hay una característica. Digamos que he usado una variable myCamelCase en algún lugar de mi código. Luego, si escribo mCC y presiono Ctrl - Ingrese o alguna combinación de teclas similar, se expande a myCamelCase. ¿Hay algo similar en Vim?CamelCase Expansion in Vim like Intellij Idea?

Respuesta

8

Bien, perdónenme por responder dos veces, pero como mi primer intento no fue el objetivo, tendré otra oportunidad. Esto es más complicado de lo que pensaba, pero posiblemente no tan complicado como lo he hecho (!).

Esto ahora se ha modificado para sugerir todos los nombres de variables coincidentes.

En primer lugar, aquí es una función para generar la abreviatura 'MCC' de la cadena 'myCamelCase':

function! Camel_Initials(camel) 
    let first_char = matchstr(a:camel,"^.") 
    let other_char = substitute(a:camel,"\\U","","g") 
    return first_char . other_char 
endfunction 

Ahora, he aquí una función que toma una abreviatura ('MCC') y escanea el búfer actual (hacia atrás desde la línea actual) para "palabras" que tienen esta abreviatura. se devuelve Una lista de todos los partidos:

function! Expand_Camel_Initials(abbrev) 
    let winview=winsaveview() 
    let candidate=a:abbrev 
    let matches=[] 
    try 
     let resline = line(".") 
     while resline >= 1 
      let sstr = '\<' . matchstr(a:abbrev,"^.") . '[a-zA-Z]*\>' 
      keepjumps let resline=search(sstr,"bW") 
      let candidate=expand("<cword>") 
      if candidate != a:abbrev && Camel_Initials(candidate) == a:abbrev 
       call add(matches, candidate) 
      endif 
     endwhile 
    finally 
     call winrestview(winview) 
     if len(matches) == 0 
      echo "No expansion found" 
     endif 
     return sort(candidate) 
    endtry 
endfunction 

A continuación, he aquí una función personalizada-realización que se lee la palabra bajo el cursor y sugiere los partidos devueltos por las funciones anteriores:

function! Camel_Complete(findstart, base) 
    if a:findstart 
     let line = getline('.') 
     let start = col('.') - 1 
     while start > 0 && line[start - 1] =~ '[A-Za-z_]' 
      let start -= 1 
     endwhile 
     return start 
    else 
     return Expand_Camel_Initials(a:base) 
    endif 
endfunction 

para hacer uso de esto, se debe definir el "completefunc":

setlocal completefunc=Camel_Complete 

para usar finalización-modo de inserción, el tipo CTRL-XCTRL-T, pero por lo general asignar este a CTRL-L:

inoremap <c-l> <c-x><c-u> 

Con este código en su vimrc que debe encontrar que escribir el mCC seguido de CTRL-L hará el reemplazo esperado. Si no se encuentra una expansión coincidente, la abreviatura no cambia.

El código no es hermético, pero funciona en todos los casos simples que probé. Espero eso ayude. Avíseme si algo necesita esclarecimiento.

+0

¡Increíble! Esto es todo lo que puedo decir. Todavía soy lo suficientemente codicioso/flojo como para pedirte más. Si hay más de una expansión posible: p. myCamelCase myCamelCart, el último es elegido. En cambio, ¿se puede hacer que se comporte como la finalización de la palabra clave Ctrl-P en vim? De nuevo, increíble! – dharm0us

+0

¡Me alegra que funcionó! El manejo de múltiples coincidencias debería ser solo cuestión de obtener Expand_Camel_Initials() para devolver una lista de soluciones y luego configurar 'completefunc' para que pueda elegir entre ellas. Trataré de echarle un vistazo más adelante esta semana. –

+0

De acuerdo, no fue tan doloroso como pensé ... He editado mi respuesta y ahora debería funcionar como lo desees. Avíseme si tiene algún problema (no he tenido la oportunidad de probarlo correctamente). –

0

Hay un complemento para esto en Vim llamado vim-abolish. Usa el mapa crc para expandir a camel case.