Vim: comentário automático em nova linha

9

O Vim insere automaticamente um comentário quando inicio uma nova linha a partir de uma linha comentada, porque defini formatoptions=tcroql . Por exemplo (o cursor é * ):

// this is a comment*

e depois de atingir <Enter> (modo de inserção) ou o (modo normal), fica com:

// this is a comment
// *

Esse recurso é muito útil ao escrever comentários de várias linhas, mas muitas vezes eu só quero um comentário de linha única. Agora, se eu quiser terminar a série de comentários, tenho várias opções:

  • clique em <Esc>S
  • pressione <BS> três vezes

Ambos fornecem três pressionamentos de teclas, em conjunto com o <Enter> , o que significa quatro pressionamentos de teclas para uma nova linha, o que eu acho que é demais. Idealmente, gostaria de acertar <Enter> pela segunda vez para ficar com:

// this is a comment
*

É importante que a solução também trabalhe com diferentes níveis de recuo, ou seja,

int main(void) {
    // this is a comment*
}

clique em <Enter>

int main(void) {
    // this is a comment
    // *
}

clique em <Enter>

int main(void) {
    // this is a comment
    *
}

Eu acho que vi esse recurso em algum editor de texto há alguns anos, mas não me lembro qual deles era. Alguém está ciente de uma solução que vai fazer isso por mim no Vim? Os ponteiros na direção certa sobre como implementar minha própria solução também são muito bem-vindos.

    
por Patrick Oscity 01.11.2013 / 17:08

3 respostas

3

Tente isto:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()
    
por 01.11.2013 / 22:55
3

Eu estendi a resposta do @romainl para trabalhar com linguagens arbitrárias gerando o regex do &commentstring do Vim:

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

No entanto, não consigo remapear <CR> , mas isso não funciona. Por enquanto, eu uso <CR><CR> até que esse problema seja resolvido.

    
por 02.11.2013 / 14:01
1

Remova r de "formatações". Isso é o que essa opção faz. Desligá-lo significa que você nunca obterá o vim fazendo isso por você, o que significa que você precisará adicionar os marcadores de comentário principais quando realmente quiser, mas essa é a troca.

    
por 01.11.2013 / 17:12