2012-03-16 12 views
5

Por lo tanto, digamos que tengo un trozo de códigoVim comentario continuación al final de la línea de

int i = 0; // Do some junk here<cursor is here> 

if(i == 0){ 
    blahblahblahblah; 
} 

blahblahblah; 

¿Es posible decir vim que cuando pulsa enter, quiero que tengan como contrapartida el siguiente:

int i = 0; // Do some junk here 
      // <cursor is here> 

if(i == 0){ 
    blahblahblahblah; 
} 

blahblahblah; 

Sé que hará esto para un comentario que está en una línea por sí mismo, pero no puedo entender de esta manera.

+0

¿Tiene algunos complementos para ese tipo de código instalado? ¿Es solo Java, C, C++, ...? – mliebelt

+0

Principalmente C. No hay complementos para hacer ningún manejo especial –

Respuesta

4

No sé si hay un complemento para esto (pero puede haber uno), pero el siguiente mapeo debería ser el truco para agregar una línea al presionar enter (hay muchas más formas de agregar la línea):

" Function that adds new line starting with comment symbol if line does not 
" start with comment, but contains it. 
function! s:NewLine(comsymb) 
    let line=getline('.') 
    " Check whether we are in comment. Assumes syntax highlighting is working 
    " correctly. Remove these lines if you never write “//” in a string literal 
    if empty(filter(synstack(line('.'), min([col('.'), col('$')-1])), 
       \ 'stridx(tolower(synIDattr(v:val, "name")), "comment")!=-1')) 
     return "\n" 
    endif 
    let cidx=stridx(line, a:comsymb) 
    if cidx==-1 
     " No comments 
     return "\n" 
    elseif cidx==0 || line[:(cidx-1)]!~#'\S' 
     " This assumes that vim own continuation works correctly: do not do work 
     " that can be done by something else 
     return "\n" 
    endif 
    " Preserve tab indentation if any, correctly replace non-indent tabs with 
    " spaces 
    let nextline=substitute(line[:(cidx-1)], '\v^(\s*)(\S.*)$', 
       \   '\=submatch(1).'. 
       \    'repeat(" ", strdisplaywidth(submatch(2), '. 
       \           indent('.').'))', 
       \   'g').a:comsymb 
    " Preserve presence of a space after comment start mark 
    if line[cidx+len(a:comsymb)] is# ' ' 
     let nextline.=' ' 
    endif 
    return "\n".((col('.')<col('$'))?("\e\"_c0"):("\<C-\>\<C-o>\"_d0")).nextline 
endfunction 

inoremap <expr> <CR> <SID>NewLine('//') 
+0

Excelente solución, ZyX, ¡bravo! –

+0

Eso es bastante sorprendente. ¡Gracias! Y perdón por la respuesta tardía. Muy ocupado –

Cuestiones relacionadas