2011-08-25 25 views
20

¿Hay un complemento Vim que pueda manejar la inserción inteligente de punto y coma, como la de Eclipse?Vim insertar punto y coma inteligente

Ejemplo (carácter de canalización es cursor de inserción):

foobar(|) 

escribo un punto y coma:

foobar();| 

parecida:

foobar("blah|") 

escribo un punto y coma:

foobar("blah");| 

Si quiero un punto y coma en la posición original del cursor, se presiona la tecla de retroceso después de la re-posición inteligente:

foobar("hello|") 
foobar("hello");| 
foobar("hello;|") 
+1

¿Y qué pasa si realmente quiere tener un punto y coma dentro de la cadena literal? –

+2

En Eclipse presionando el espacio de retroceso después de un inserto de punto y coma inteligente colocará el punto y coma en la posición original del cursor. – dteoh

+4

La solución ideal: use Python. Entonces no necesitas preocuparte por los puntos y comas ;-) –

Respuesta

24

utilizo este mapeo:

inoremap <leader>; <C-o>A; 

No es ; porque utilizo punto y coma a menudo y en más de un contexto.

  • <C-o> se utiliza para ingresar un solo comando de modo normal.
  • A; significa "agregar un ; al final de la línea".
+3

@dansomething: ¡Oh, sí! Desde esa respuesta, he modificado esa línea muchas veces en mi '~/.vimrc'. Aquí está la encarnación actual: inoremap ; m' A; '' – romainl

+0

Con su asignación, vim espera un segundo caracter en cada tecla presionada. – Koshimitsu

+0

@Koshimitsu esto es un comportamiento estándar y lo notas solo si te detienes. – romainl

0
" ftplugin/c/c_snippet.vim 
inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~')$' ? '<right>;' : ';' 

Esta versión no se plantean problemas con for si su motor fragmentos se expande en

for (...|) { 
    <+code+> 
}<++> 

Si el soporte es abierta en una nueva línea, será liar las cosas.

Puede cambiar fácilmente la expresión regular a '"\=)\+$' para responder a su pregunta inicial.

inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~'"\=)\+$' ? '<end>;' : ';' 

Sin embargo, no creo que sea una buena idea. En ese caso, la asignación para <bs> será:

inoremap <expr> <buffer> <bs> getline('.')[:col('.')-2] =~ '.*")\+;$' ? '<bs><c-o>F";' : '<bs>' 
10

quiero hacer lo mismo, que trabaja en ella toda la noche, un montón de código, pero al fin, tengo una solución simple.

inoremap ;<cr> <end>;<cr> 

y si estoy en un aparato ortopédico, quiero añadir un punto y coma o un punto al final, como este

foo({ 
    | 
}) 

presiono ;;<cr> o ..<cr> hacer esto

inoremap ;<cr> <end>;<cr> 
inoremap .<cr> <end>. 
inoremap ;;<cr> <down><end>;<cr> 
inoremap ..<cr> <down><end>. 
2

Utilizo la siguiente función y una asignación para insertar un punto y coma al final de la línea y eliminar los espacios de remanchización:

imap <leader>. <C-R>=Semicolonfun()<CR> 
fun! Semicolonfun() "{{{ 
    call setline(line('.'), substitute(getline('.'), '\s*$', ';', '')) 
    return "\<End>" 
endfunction "}}} 

lo que si tiene algo como:

log.warning("you miss the |identifier") 

presionar. o, Si reasigna el líder, se obtiene lo siguiente:

log.warning("you miss the identifier");| 
Cuestiones relacionadas