Eu tenho um arquivo de código Ruby aberto no vi, existem linhas comentadas com #
:
class Search < ActiveRecord::Migration
def self.up
# create_table :searches do |t|
# t.integer :user_id
# t.string :name
# t.string :all_of
# t.string :any_of
# t.string :none_of
# t.string :exact_phrase
#
# t.timestamps
# end
end
def self.down
# drop_table :searches
end
end
Digamos que eu queira descomentar todas as linhas da primeira def ... end
seção. Qual é uma maneira eficiente de fazer isso no Vim?
Em geral, estou procurando uma maneira fácil e fluida de comentar e comentar comentários. Aqui estou lidando com o código Ruby, mas pode ser JavaScript ( //
) ou Haml ( -#
).
Respostas:
Eu uso o script NERD Commenter . Permite comentar, descomentar ou alternar comentários com facilidade no seu código.
Como mencionado nos comentários :
fonte
=begin
e=end
comenta várias linhas em vez de tags de hash.Para essas tarefas, uso a maior parte da seleção de blocos de tempo .
Coloque o cursor no primeiro
#
caractere, pressione CtrlV(ou CtrlQpara gVim) e desça até a última linha comentada e pressione x, que excluirá todos os#
caracteres na vertical.Para comentar um bloco de texto é quase o mesmo:
VISUAL BLOCK
modo.INSERT
modo e depois pressione# . Isso adicionará um hash à primeira linha.#
caractere em todas as outras linhas selecionadas.Para a versão simplificada do vim enviada com o debian / ubuntu por padrão, digite
: s/^/#
a terceira etapa (qualquer destaque restante do primeiro caractere de cada linha pode ser removido com:nohl
).Aqui estão duas pequenas gravações de tela para referência visual.
Comente:
Descomentar:
fonte
n
(onde n é um número de linhas - 1), j,n
(onde n num número de comprimento da sequência de caracteres do comentário - 1), l, x.Para comentar os blocos no vim:
%
Para remover o comentário de blocos no vim:
Se você deseja selecionar vários caracteres, use um ou combine estes métodos:
fonte
Às vezes, estou dentro de uma caixa remota onde meus plugins e .vimrc não podem me ajudar, ou às vezes o NerdCommenter erra (por exemplo, JavaScript incorporado no HTML).
Nesses casos, uma alternativa de baixa tecnologia é o
norm
comando interno, que apenas executa qualquer comando arbitrário do vim em cada linha no intervalo especificado. Por exemplo:Comentando com
#
:Isso insere "#" no início de cada linha. Observe que, quando você digita: o intervalo será preenchido, então parecerá realmente
:'<,'>norm i#
Sem comentários
#
:Isso exclui o primeiro caractere de cada linha. Se eu tivesse usado um comentário de 2 caracteres, como //, simplesmente faria
:norm xx
para excluir os dois caracteres.Se os comentários forem recuados como na pergunta do OP, você poderá ancorar sua exclusão desta forma:
o que significa "vá para o primeiro caractere não espacial e exclua um caractere". Observe que, diferentemente da seleção de blocos, essa técnica funciona mesmo que os comentários tenham recuo desigual!
Nota : Como
norm
literalmente está apenas executando comandos regulares do vim, você não se limita a comentários, também pode fazer algumas edições complexas em cada linha. Se você precisar do caractere de escape como parte de sua sequência de comandos, digite ctrl-v e pressione a tecla Escape (ou mais fácil, basta gravar uma macro rápida e usar a norma para executar essa macro em cada linha).Nota 2 : Obviamente, você também pode adicionar um mapeamento se estiver usando
norm
muito. Por exemplo, colocar a seguinte linha em ~ / .vimrc permite digitar emctrl-n
vez de:norm
depois de fazer sua seleção visualNota 3 : Às vezes, o bare-vim vim não possui o
norm
comando compilado, portanto, certifique-se de usar a versão atualizada, ou seja, normalmente / usr / bin / vim, não / bin / vi(Obrigado a @Manbroski e @rakslice pelas melhorias incorporadas a esta resposta)
fonte
:norm ^x
. Este método em geral tem a vantagem de trabalhar com seleções de região (por exemplovi{
, selecionará dentro de chaves). Esses seletores de objeto de texto não funcionamVisual Block
./bin/vi
is vim 7.2, mas é uma compilação diferente/usr/bin/vim
e possui recursos como este desativados.vip
para selecionar um parágrafo inteiro.Eu tenho o seguinte no meu
.vimrc
:Agora você pode digitar
,cc
para comentar uma linha e,cu
remover o comentário de uma linha (funciona no modo normal e visual).(Eu o roubei de algum site há muitos anos, então não posso mais explicar completamente como ele funciona :). Há um comentário onde é explicado.)
fonte
Especifique quais linhas comentar no vim:
Revele os números das linhas:
então
ou isto:
fonte
:%s/^/#/g
que comentará todas as linhas? Eu queria saber o sinal de porcentagem%
va{
ou comvar
para ruby.Aqui está como eu faço isso:
Vá para o primeiro caractere na primeira linha que deseja comentar.
Pressione Ctrl+ qno GVIM ou Ctrl+ vno VIM e desça para selecionar o primeiro caractere nas linhas a comentar.
Em seguida c, pressione e adicione o caractere de comentário.
A remoção de comentários funciona da mesma maneira, basta digitar um espaço em vez do caractere de comentário.
fonte
c
exclui o primeiro caractere também. A resposta de CMS tem direito ou seja, pressionandoI
em seguida, digitando o caractere de comentário (s) e depoisEsc
(isto é em janelas VIM)ESC
duas vezes depois de pressionarc
e que deve fazer o truqueEu vim com uma adição simples ao meu arquivo .vimrc, que funciona muito bem e pode ser estendido facilmente. Você simplesmente adiciona um novo tipo de arquivo ao comment_map e seu líder de comentários.
Adicionei um mapeamento aos modos normal e visual, mas você pode remapear para o que quiser. Prefiro apenas ter uma função de estilo 'alternar'. Um suporta ter vários mapeamentos etc.
Nota:
Eu não uso nenhum retorno de chamada ou gancho nos tipos de arquivo / carregamento, porque acho que eles atrasam a inicialização do Vim mais do que a
.vimrc
função / mapa estático, mas essa é apenas a minha preferência. Eu também tentei mantê-lo simples e com bom desempenho. Se você usa comandos automáticos, é necessário colocá-los em um grupo de comandos automáticos, caso contrário, os retornos de chamada serão adicionados ao tipo de arquivo várias vezes por arquivo carregado e causam muita degradação no desempenho.fonte
<leader><Space>
declaração na parte inferior?\zs
e\ze
truque regex, o código tornou-se um pouco menor. você pode vê-lo aquiAlternar comentários
Se tudo o que você precisa é alternar os comentários , prefiro ir com commentary.vim pelo tpope .
Instalação
Patógeno:
vim-plug:
Vundle:
Personalização adicional
Adicione isso ao seu arquivo .vimrc:
noremap <leader>/ :Commentary<cr>
Agora você pode alternar os comentários pressionando
Leader
+/
, como Sublime e Atom.fonte
Use Control-V para selecionar retângulos de texto: vá para o primeiro
#
caractere, digite Ctrl+ V, mova para a direita uma vez e depois para baixo, até o final dos comentários. Agora digitex
: você está excluindo todos os#
caracteres seguidos por um espaço.fonte
Aqui está uma seção do meu
.vimrc
:No modo normal e no visual, isso permite que eu pressione ,icpara inserir e ,rcremover comentários.
fonte
.vimrc
.map
tampas normais e modos visuais, então você não precisa asvmap
linhasafter/ftplugin/ruby.vim
.<leader>ic
e<leader>rc
Eu uso o vim 7.4 e isso funciona para mim.
Supondo que estamos comentando / descomentando 3 linhas.
Comentar:
Se a linha não tem guia / espaço no início:
ctrl + V
em seguida,jjj
em seguida,shift + I (cappital i)
em seguida,//
em seguida,esc esc
se a linha tem guia / espaço no início você ainda pode fazer o acima ou permuta por
c
:ctrl + V
em seguida,jjj
em seguida,c
em seguida,//
em seguida,esc esc
para remover o comentário:
se as linhas não têm nenhum guia / espaço no início:
ctrl + V
em seguida,jjj
em seguida,ll (lower cap L)
em seguida,c
se as linhas têm guia / espaço no início, então você um espaço de mais e
esc
ctrl + V
, em seguida,jjj
em seguida,ll (lower cap L)
em seguida,c
em seguida,space
em seguida,esc
fonte
Eu gosto de usar o plugin tcomment: http://www.vim.org/scripts/script.php?script_id=1173
Mapeei gc e gcc para comentar uma linha ou um bloco de código destacado. Ele detecta o tipo de arquivo e funciona muito bem.
fonte
Com 30 respostas à minha frente, tentarei fornecer uma solução ainda mais fácil: insira um
#
no início da linha. Em seguida, desça uma linha e pressione ponto (.
). Para repetir, nãoj
,.
,j
,.
, etc ... para remover o comentário, remover um#
(você pode baterx
sobre a#
), e fazer o uso reversok
,.
etc ...fonte
I#<Esc>j
no buffer - digamosc
- - e, em seguida10@c
, executar , ou qualquer número de linhas que mais lhe convier.Como descomentar as três linhas a seguir no vi:
Coloque o cursor sobre o
#
símbolo superior esquerdo e pressione CtrlV. Isso coloca você no modo de bloqueio visual. Pressione a seta para baixo ou Jtrês vezes para selecionar as três linhas. Então pressione D. Todos os comentários desaparecem. Para desfazer, pressione U.Como comentar as seguintes três linhas no vi:
Coloque o cursor sobre o caractere superior esquerdo, pressione CtrlV. Isso coloca você no modo de bloqueio visual. Pressione ↓ou Jtrês vezes para selecionar as três linhas. Então aperte:
I//Esc
Isso é um capital I, // e Escape.
Ao pressionar ESC, todas as linhas selecionadas receberão o símbolo de comentário especificado.
fonte
Sim, já existem 33 respostas (principalmente repetitivas) para esta pergunta.
Aqui está outra abordagem de como comentar linhas no Vim: movimentos . A idéia básica é comentar ou remover o comentário de linhas usando o mesmo método que puxar um parágrafo digitando
yip
ou excluindo 2 linhas digitandodj
.Essa abordagem permitirá que você faça coisas como:
ccj
comentar as próximas 2 linhas ecuk
descomentá-las;cci{
comentar um bloco ecui{
descomentá-lo;ccip
comentar um parágrafo inteiro ecuip
removê-lo do comentário.ccG
comentar tudo até a última linha ecugg
descomentar tudo até a primeira linha.Tudo o que você precisa são 2 funções que operam sobre movimentos e 2 mapeamentos para cada função. Primeiro, os mapeamentos:
(Veja o manual sobre o
g@
operador e aoperatorfunc
variável.)E agora as funções:
Modifique as expressões regulares acima para se adequar ao seu gosto e onde
#
deve estar:fonte
Se você já conhece os números das linhas,
n,ms/# //
funcionaria.fonte
Marquei a primeira e a última linha (ma e mb) e depois faço: 'a,' bs / ^ # //
fonte
Eu uso EnhancedCommentify . Ele comenta tudo o que eu precisava (linguagens de programação, scripts, arquivos de configuração). Eu o uso com ligações de modo visual. Basta selecionar o texto que deseja comentar e pressionar co / cc / cd.
fonte
Combinei a resposta de Phil e jqno e fiz comentários descompactados com espaços:
fonte
Existe esse plugin de mudança de vida
tpope
chamadovim-commentary
https://github.com/tpope/vim-commentary
Este plugin fornece :
Uso :
:<,'>
:<,'>Commentary
e pressione Enter.fonte
vim-commentary
(como todos os plugins do tpope) tem o bônus de ser vim idiomático.gc
= "vá comentar",gcap
= "vá comentar um parágrafo", etc.Essa resposta é mais útil se você não conseguir instalar plug-ins, mas ainda deseja que seus caracteres de comentário sigam os níveis de recuo existentes.
Esta resposta está aqui para 1) mostram o código correto para colar em uma
.vimrc
para conseguirvim 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 do seu comentário são cadeias de caracteres e precisam ser agrupados 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 de 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, nesse caso, o início de nosso destaque e os[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 destaque visual (de acordo com esta resposta, ele inicia seu comando aqui, apenas informa ao vim para executar a função que chamamos, e'<,'>
o que queremos).call
<cr>
clique noenter
botão).call function()
na linha de comando, e precisamos pressioná-lo 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
Eu uso o plug - in de comentários do Tim Pope .
fonte
Você pode usar o vim-commentary por tpope ( https://github.com/tpope/vim-commentary ), você pode usá-lo da seguinte maneira:
Entre no modo visual pressionando
Então aperte
Agora tudo o que você tem a ver com a seleção é inserir teclas:
Isso irá comentar toda a seleção, para descomentar as teclas de repetição:
fonte
A seguir, um one-liner básico com base no método
C-v
seguidoI
descrito acima.Este comando (
:Comment
) adiciona uma sequência escolhida ao início de qualquer linha selecionada.Inclua essa linha no seu
.vimrc
para criar um comando que aceite um único argumento e coloque o argumento no início de cada linha na seleção atual.Por exemplo, se o seguinte texto for selecionado:
e você executa isso:,
:Comment //
o resultado será:fonte
Começando com as idéias nas respostas aqui, iniciei minha própria função de comentário. Ativa e desativa comentários. Ele pode lidar com coisas como
//print('blue'); //this thing is blue
e apenas alterna o primeiro comentário. Além disso, ele adiciona comentários e um único espaço exatamente onde está o primeiro espaço em branco e não no início da linha. Além disso, ele não copia desnecessariamente os espaços em branco, mas usa os zooms (: h \ zs para obter ajuda) para evitar esse trabalho extra ao comentar e recuar linhas. Espero que ajude alguns minimalistas por aí. Sugestões são bem vindas.fonte
Eu uso comments.vim de Jasmeet Singh Anand (encontrado em vim.org),
Funciona com C, C ++, Java, PHP [2345], proc, CSS, HTML, HTML, HTML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, arquivos vhdl, haskel e normais
Ele comenta e remove comentários de linhas em diferentes arquivos de origem, tanto no modo normal quanto no visual
Uso:
fonte
O método mais rápido e mais intuitivo de todos eles é remapear
)
para comentários de linhas e depois(
para descomentar. Experimente e você não voltará.Em Ruby ou Bash , com recuos de 2 espaços:
Em C / C ++ ou PHP , com recuos de 4 espaços:
As desvantagens são as perdas
(
e)
os movimentos das frases (masdas
podem ser preenchidas lá) e, ocasionalmente, você recorre à seleção e substituição ou CtrlVao lidar com seções longas. Mas isso é muito raro.E para o estilo C, os comentários longos são mais bem tratados com:
... O que combina bem com o uso
V[move]gq
para refazer a quebra de linha.fonte
Este snippet simples é do meu .vimrc:
É para // - Comentários, mas você pode adaptá-lo facilmente para outros personagens. Você pode usar o autocmd para definir um líder como o jqno sugeriu.
Essa é uma maneira muito simples e eficiente de trabalhar com intervalos e modo visual naturalmente.
fonte
Eu gosto
/* ... */
(comentários), então aqui está o meu truque para você. Você pode adaptá-lo para uso em diferentes casos, é claro.Comentar com / * ... * /
Selecione o texto (vá para o início, inicie o bloco visual, pule com
}
):Digite o comando a ser aplicado na seleção
O comando será semelhante a:
:'<,'>norm i /* ^[$a */
Veja (i *) para detalhes.
Remova o comentário de / * ... * /
Selecione o texto (como antes ou da maneira que desejar):
Digite o comando a ser aplicado na seleção
O comando será semelhante a:
:'<,'>norm :s-\s*/\*\s*-^M$bbld$
Veja (ii *) para detalhes.
Resultado
Efeito é comentários linha por linha:
Torna-se (e vice-versa):
É melhor salvá-lo como alguns
map
ou@reg
no seu.vimrc
, porque é muito para digitar. Se você preferir um bloco único/*
e*/
para todo, use:Comente com um único / * * / todo o bloco
Salve-o em um registro gravando com, digamos
qc
, então, no início de um parágrafo, para comentar:e não se esqueça
q
novamente, para terminar o registro.Veja (iii *) para detalhes.
Descomente um único / * * / de um bloco
Salve-o no registro, digamos
@u
,. Coloque o cursor em qualquer lugar dentro do bloco e:Salve o registro finalizando
q
comando.Veja (iv *) para detalhes.
Resultado
Effect é um único comentário para várias linhas:
Torna-se (e vice-versa):
Explicações
(i *) Funciona usando o
norm
qual aplica o mesmo comando repetidamente em todas as linhas selecionadas. O comando simplesmente insere a/*
, localiza o final dessa linha e termina inserindo um*/
(ii *) Também é usado
norm
para repetir a pesquisa / substituição em todas as linhas. Procurespaces /* spaces
e substitua por nada. Depois disso, encontra o final da linha, retorne duas palavras, uma letra à direita, exclua até o final.(iii *) Seleciona o parágrafo
v}
, exclua-o, insira um comentário para abrir e fechar, vá para o meio e cole o bloco excluído.(iv *) Em qualquer lugar do meio, encontra a para trás a
/*
e apaga; localiza a frente a*/
, exclui-a.fonte