Continuing Vim comment at end of line

So let's say I have a piece of code

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

if(i == 0){
  blahblahblahblah;
}

blahblahblah;

Is it possible to tell vim that when I press enter, I want this to lead to the following:

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

if(i == 0){
  blahblahblahblah;
}

blahblahblah;

I know that this will do this for a comment that is on the line all by itself, but I can not understand this way.

+5
source share
1 answer

I don’t know if there is a plugin for this (but there can be one), but the following comparison should do the trick to add a line by pressing the enter key (there are many more ways to add a line):

" 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('//')
+4
source

All Articles