Se você quiser comentar um idioma específico, precisará de um plugin como o nerdcommenter .
Como alternativa, embora não responda à sua pergunta real, você pode usar ações internas do vim e seu conhecimento dos caracteres de comentário de cada idioma ...
Opção 1: blocos em V
:1
Enter (Vá para a linha 1)
- Ctrl-V (modo V-Block)
jjj
(Abaixo mais 3 linhas)
- Shift-I (Entre no modo de inserção antes do bloco)
#
(Insira um '#')
- Esc (Voltar ao modo normal)
Opção 2: Substituição
:1,4s/^/#/
Demolir:
:
O comando ex segue
1,4
nas linhas de 1 a 4
s
substituto
/
separador para partes do comando de substituição.
(Você também pode usar um caractere diferente, por exemplo :
)
^
começo da linha
/
separador
#
o caractere de comentário para python
/
separador final
Opção 3: repetir a aplicação de uma macro ( origem )
:1
Enter (Vá para a linha 1)
qa
(Comece a gravar no registro a
)
- Shift-I (Entre no modo de inserção no início da linha
#
(Adicione um '#' no início da linha)
- Esc (Voltar ao modo normal)
q
(Pare de gravar)
:2,4 normal @a
(execute novamente a macro gravada para registrar a
nas linhas entre 2 e 4)
OU
você pode selecionar as linhas no modo visual e pressionar :
para preencher automaticamente a linha Ex com :'<,'>
(um intervalo do início ao final da seleção visual) e digitar normal @a
e pressionar Enter( fonte ).
Agora, sempre que você quiser comentar algumas linhas, basta executar novamente a macro gravada para se registrar a
nessas linhas:
:9,22 normal @a (comment out lines 9-22)
:9,22 normal I#
conforme minha resposta.normal
comando antes de escrever esta resposta. Você está certo;:9,22 normal I#
irá funcionar também.Usando o modo Visual Block ( CtrlV), selecione o início das linhas. Em seguida, pressione I#(que é uma letra maiúscula
I
) para inserir o caractere de hash em cada uma dessas linhas. Em seguida, pressione Escpara retornar do modo de inserção para o modo normal.fonte
ctrl
? Porquectrl+v
é uma coisa diferente de apenasv
.I
. Quando eu pressionarI
, o#
item será colocado apenas na frente da primeira linha.Esc
após o procedimento descrito.Esc
no final.Se você só precisa de uma solução rápida para o idioma em que está atualmente e já tem o texto selecionado no modo visual,
faz o trabalho. (Para cada linha, no modo normal, vá para a primeira coluna e insira
#
. O uso:norm I#
será inserido antes do primeiro caractere que não seja um espaço em branco, que pode não ser o que você deseja.) O uso:norm i#
também funcionará, porque:norm
começa no início do linha, mas é menos explícito e menos claro se você não sabe disso.Obviamente, se você pretende fazer isso com frequência, convém configurar um mapeamento ou procurar um plug-in.
fonte
normal
comando é executado com o cursor no início da linha.Para fazer isso automaticamente, você deve adicionar algo como o seguinte ao seu
vimrc
arquivo ( fonte ):Usando ,cpara comentar uma região e ,udescomentar uma região. Isso define manualmente os símbolos de comentários para diferentes idiomas.
A segunda opção é usar um plugin como tcomment , vim-commentary ou comments.vim . Eu mesmo uso esse comentário. Por favor, leia as instruções sobre uso e instalação em suas páginas, pois acredito que estão além do tópico da pergunta.
Eu sugiro que você use um plug-in (um dos links acima ou outro), pois isso é muito mais fácil do que manter um pedaço de código em seu
vimrc
arquivo.Edit: Eu removi a maneira manual, pois a pergunta foi alterada e a maneira correta foi respondida por 200_success.
fonte
//
(apenas/* */
).:s
comandos mostrados no trecho da resposta. O cheque em si seria algo parecidogetline('.') =~ "^" . escape(b:comment_leader, '\/')
. Se for realmente descomentado, comente. Isso não foi testado e deve servir apenas como exemplo.Eu uso scrooloose / nerdcommenter para isso.
Com este plugin, você pode selecionar visualmente suas linhas e pressionar leader+ cpara alternar os comentários. Dependendo do tipo de arquivo, ele usará símbolos diferentes para comentar.
fonte
Depois de selecionar as linhas, basta digitar
:
colocará automaticamente'<,'>
na sua linha de comando, que é um intervalo desde o início da sua seleção até o final;norm
executa um comando no modo normal e atua nesse intervalo;I#
é o comando do modo normal que insere um '#' no início da linha.fonte
Sou um grande fã do TComment por isso; não só posso criar estilos de comentários específicos do tipo de arquivo, mas também especificar bloco x por linha para idiomas que suportam comentários em bloco.
fonte
Acho que o plugin vim-commentary é de longe a maneira mais fácil de fazer isso. Selecione um intervalo de linhas e pressione gc. Ele usará um caractere de comentário apropriado para o tipo de arquivo que você abriu. É possível, mesmo sem nenhuma seleção visual, descomentar as linhas comentadas adjacentes com gcuou gcgc.
fonte
Supondo que você queira adicionar prefixo a 5 linhas no início da linha, use a opção Pesquisar e substituir :
ou no final das linhas:
Ou use o modo visual (Ctrl + v) para selecionar o bloco vertical de texto, entre no modo de inserção ( I) e digite algo e pressione Escpara confirmar e aplicar as alterações em outras linhas.
Palavras-chave:
fonte
Esta resposta está aqui para 1) mostrar o código correto para colar em um
.vimrc
para obtervim 7.4+
fazer bloco comentando / descomentando mantendo nível de recuo com um atalho no modo visual e 2) para explicá-lo.Aqui está o código:
Como funciona:
let b:commentChar='//'
: Isso cria uma variável no vim. ob
aqui refere-se ao âmbito de aplicação, que neste caso está contido no tampão, o que significa que o ficheiro que está aberto. Os caracteres de seu comentário são cadeias de caracteres e precisam ser colocados entre aspas; as aspas não fazem parte do que será substituído ao alternar os comentários.autocmd BufNewFile,BufReadPost *...
: Os comandos automáticos são acionados em diferentes coisas; nesse caso, são acionadas quando um novo arquivo ou o arquivo lido termina com uma certa extensão. Uma vez acionado, execute o seguinte comando, o que nos permite alterar ocommentChar
tipo de arquivo dependendo. Existem outras maneiras de fazer isso, mas elas são mais confusas para iniciantes (como eu).function! Docomment()
: As funções são declaradas iniciandofunction
e terminando comendfunction
. As funções devem começar com uma capital. os!
garante que esta função substitui qualquer funções anteriores como definidosDocomment()
com esta versãoDocomment()
. Sem o!
, tive erros, mas isso pode ser porque eu estava definindo novas funções através da linha de comando do vim.execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Executar chama um comando. Nesse caso, estamos executandosubstitute
, o que pode assumir um intervalo (por padrão, esta é a linha atual), como%
para todo o buffer ou'<,'>
para a seção destacada.^\s*
é regex para corresponder ao início de uma linha seguida por qualquer quantidade de espaço em branco, que é então anexado a (devido a&
). O.
aqui é usado para concatenação de cadeias, poisescape()
não pode ser colocado entre aspas.escape()
permite que você escape um caracterecommentChar
que corresponda aos argumentos (nesse caso,\
e/
), acrescentando-os com a\
. Depois disso, concatenamos novamente com o final da nossasubstitute
string, que tem oe
bandeira. Essa bandeira nos deixa falhar silenciosamente, o que significa que, se não encontrarmos uma correspondência em uma determinada linha, não gritaremos sobre isso. Como um todo, essa linha nos permite colocar um caractere de comentário seguido por um espaço antes do primeiro texto, o que significa que mantemos nosso nível de indentação.execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Isso é semelhante ao nosso último grande e longo comando. Exclusivo para este, temos\v
, o que garante que não temos que escapar do nosso()
, e1
, que se refere ao grupo que fizemos com o nosso()
. Basicamente, estamos combinando uma linha que começa com qualquer quantidade de espaço em branco e, em seguida, nosso caractere de comentário seguido por qualquer quantidade de espaço em branco, e estamos mantendo apenas o primeiro conjunto de espaços em branco. Novamente,e
vamos falhar silenciosamente se não tivermos um caractere de comentário nessa linha.let l:line=getpos("'<")[1]
: define uma variável como fizemos com o nosso caractere de comentário, masl
refere-se ao escopo local (local para esta função).getpos()
obtém a posição de, neste caso, o início de nosso destaque e o[1]
meios que nos importam apenas com o número da linha, e não com outras coisas como o número da coluna.if match(getline(l:line), '^\s*'.b:commentChar)>-1
: você sabe comoif
funciona.match()
verifica se a primeira coisa contém a segunda, então pegamos a linha na qual começamos o destaque e verificamos se ela começa com espaço em branco seguido pelo caractere de comentário.match()
retorna o índice onde isso é verdade e-1
se nenhuma correspondência foi encontrada. Comoif
avalia todos os números diferentes de zero como verdadeiros, precisamos comparar nossa saída para ver se é maior que -1. Comparação nosvim
retornos 0 se falso e 1 se verdadeiro, que é o queif
deseja ver para avaliar corretamente.vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
significa mapear o seguinte comando no modo visual, mas não o mapeie recursivamente (ou seja, não altere nenhum outro comando que possa ser usado de outras maneiras). Basicamente, se você é um novato em vim, sempre usenoremap
para se certificar de não quebrar as coisas.<silent>
significa "Não quero suas palavras, apenas suas ações" e diz para não imprimir nada na linha de comando.<C-r>
é o que estamos mapeando, que é ctrl + r nesse caso (observe que você ainda pode usar Cr normalmente para "refazer" no modo normal com esse mapeamento).C-u
é meio confuso, mas basicamente garante que você não perca o realce visual (de acordo com esta resposta , o comando começa com'<,'>
o que queremos).call
aqui, basta dizer ao vim para executar a função que chamamos e<cr>
refere-se a pressionar oenter
botão. Temos que apertar uma vez para realmente chamar a função (caso contrário, apenas digitamoscall function()
na linha de comando, e temos que apertá-la novamente para que nossos substitutos passem por todo o caminho (não sei ao certo por que, mas tanto faz).Enfim, espero que isso ajude. Isso vai levar nada destacou com
v
,V
ouC-v
, cheque se a primeira linha é comentada, se sim, tentar tire todas as linhas destacadas, e se não, adicionar uma camada extra de caracteres de comentário para cada linha. Este é o meu comportamento desejado; Eu não queria apenas alternar se cada linha do bloco era comentada ou não, por isso funciona perfeitamente para mim depois de fazer várias perguntas sobre o assunto.fonte