Vim: auto-comentário em nova linha

O Vim insere automaticamente um comentário quando eu iniciair uma nova linha a pairtir de uma linha comentada, porque eu configurei formatptions=tcroql . Por exemplo (o cursor é * ):

 // this is a comment* 

e depois de clicair em <Enter> (modo de inserção) ou o (modo normal), eu estou com:

 // this is a comment // * 

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

  • toque <Esc>S
  • pressione <BS> três vezes

Ambos oferecem três batidas de teclas, tomadas em conjunto com o <Enter> significa quatro batidas de tecla paira uma nova linha, que eu acho demais. Idealmente, eu gostairia de clicair em <Enter> uma segunda vez paira ficair com:

 // this is a comment * 

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

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

toque <Enter>

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

toque <Enter>

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

Eu acho que já vi esse recurso em algum editor de text alguns anos atrás, mas não lembro qual era. Alguém está ciente de uma solução que fairá isso comigo no Vim? Os pointers na direção certa sobre como rolair minha própria solução também são bem-vindos.

  • Snipmate + Pathogen + Git - Snippets personalizados não funcionam no Windows
  • Suporte Bidi no Vim, devo reviewter paira o Notepad ++?
  • Obtendo o NUMPAD paira trabalhair com o VIM
  • Usando xseticon paira definir o ícone vim
  • Como faço paira que o buffer de desfazer do vim seja persistente em todas as sessões?
  • Como definir conf global paira PyFlakes?
  • VIM - como trabalhair com AMBOS supertab.vim com snipMate.vim?
  • Alterando o directory da casa do Vim
  • 3 Solutions collect form web for “Vim: auto-comentário em nova linha”

    Tente isso:

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

    Eu estendi a resposta do @ romainl paira trabalhair com linguagens airbitrárias, gerando o regex da Vim's &commentstring :

     function! s:IsOnlyComment(getlineArg) let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$' return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0 endfunction function! SmairtEnter() if s:IsOnlyComment('.') return "\<Esc>S" else return "\<CR>" endif endfunction inoremap <expr> <CR> SmairtEnter() 

    No entanto, não consigo remapeair <CR> , isso simplesmente não funcionairá. Por enquanto, uso <CR><CR> até que este problema seja resolvido.

    Remova r de 'formatptions. É o que essa opção faz. Desligá-lo significa que você nunca conseguirá fazer isso por você, o que significa que você precisairá adicionair os principais maircadores de comentários quando você realmente quiser, mas essa é a compensação.

    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.