2012-03-16 22 views
5

So, powiedzmy, że mam kawałek koduVim komentarz kontynuacja na końcu linii

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

if(i == 0){ 
    blahblahblahblah; 
} 

blahblahblah; 

Czy można powiedzieć, vim, że kiedy uderzę wprowadzić, chcę to zrobić następujące skutki:

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

if(i == 0){ 
    blahblahblahblah; 
} 

blahblahblah; 

Wiem, że zrobi to dla komentarza, który jest na linii wszystko na własną rękę, ale nie mogę wymyślić w ten sposób.

+0

Czy masz jakieś wtyczki do tego rodzaju kodu? Czy to tylko Java, C, C++, ...? – mliebelt

+0

Przede wszystkim C. Brak wtyczek do jakiejkolwiek specjalnej obsługi –

Odpowiedz

4

Nie wiem, czy istnieje wtyczka do tego (ale może być), ale poniższe mapowanie powinno wystarczyć do dodania linii przez naciśnięcie klawisza Enter (istnieje jednak wiele innych sposobów na dodanie linii):

" 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

Doskonałe rozwiązanie, ZyX, brawo! –

+0

To jest niesamowite. Dziękuję Ci! I przepraszam za opóźnioną odpowiedź. Bardzo zajęty –

Powiązane problemy