Como comentar um bloco de código Python no Vim

186

Fiquei me perguntando se havia algum mapeamento de teclas no Vim para permitir a recuo de certas linhas de código (se essas linhas foram selecionadas no modo visual ou n linhas acima / abaixo da posição atual do cursor).

Então, basicamente, algo que converte o seguinte

def my_fun(x, y):
    return x + y

para

#def my_fun(x, y):
#    return x + y

Eu estou bem em usar um #ou """para comentar as linhas relevantes. Idealmente, eu também gostaria que o mesmo mapeamento de teclas descomente as linhas se as linhas especificadas tiverem sido comentadas.

Rishabh Manocha
fonte
Não há necessidade de reinventar a roda, existe um plugin: tComment para você, que suporta o (des) comentário de código para vários idiomas.
Miau

Respostas:

411

Etapa 1: vá para a primeira coluna da primeira linha que deseja comentar.

Estado inicial

Etapa 2: pressione: Ctrl+ ve selecione as linhas que deseja comentar:

Selecionar linhas

Etapa 3: Shift - I#space(Entre no modo Inserir à esquerda, digite chars para inserir. A seleção desaparecerá, mas todas as linhas dentro dela serão modificadas após a Etapa 4.)

Comente

Passo 4: Esc

<Esc>

theosp
fonte
4
Comentar as linhas dessa maneira funciona muito bem. Existe alguma maneira de descomentar essas linhas? Shift-I # <ESC>não funcionou (talvez eu esteja fazendo errado).
Rishabh Manocha
41
@ rishabh-manocha: use o bloco visual (Ctrl-V) para selecionar todos os # adicionados e digite x para excluí-los.
theosp
3
Você deve se lembrar que Shift-I significa "inserir no primeiro espaço em branco da linha", para que não possa ser usado para excluir. Fazer uma seleção visual com Ctrl-V marca os caracteres a serem modificados e "x" exclui um caractere na área selecionada, acabando excluindo os caracteres '#'. Consulte ": h I" e ": h CTRL-V" no vim para obter mais informações.
the Tin Man
5
@Samaursa Ctrl-V provavelmente não está funcionando no Windows. Tente Ctrl-Q.
AZ.
1
Para excluir 2 caracteres (se você inseriu '#'), localize o cursor na linha superior que deseja modificar, pressione ctrl-v para entrar no modo de bloco visual, pressione j (ou seta para baixo) para destacar todas as linhas a serem modificadas, pressione l (ou seta para a direita) para realçar uma largura de 2 caracteres (pressione uma vez por coluna para realçar) e, em seguida, pressione d para excluir o texto realçado.
thinkmassive
72

uma maneira manualmente

:set number
:10,12s/^/#
ghostdog74
fonte
4
como você os remove?
Charlie Parker
15
@CharlieParker::10,12s/^#//
bstpierre
1
Thumbs up for ex answer (old school :)
mlv
Isso não funciona para código recuado
Andrés Pérez-Albela H.
49

Você pode adicionar o seguinte mapeamento ao seu .vimrc

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Destaque seu bloco com:

Shift+v

# para comentar suas linhas da primeira coluna.

-# descomentar da mesma maneira.

cdated
fonte
5
Simples é brilhante! Te agradece!
I159
1
@architectonic ele não tem efeito, a menos que você esteja no modo visual e '#' não esteja vinculado no modo visual vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
publicado em
1
Modifiquei um pouco: Ctrl + k para comentar "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u para descomentar: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das
1
@ JonathanHartley você não precisa usar '/' neste caso '#' é o delimitador. Então: s / ^ / # / e: s / ^ # // são as substituições equivalentes. Portanto, substitua o início da linha por '#' e substitua '#' na primeira coluna por ''. <cr>: noh <cr> apenas limpa a string de pesquisa para que nada fique destacado quando você terminar.
cdated
1
@ JonathanHartley, honestamente, acho que apenas segui um padrão sem pensar nisso. Agora estou surpreso # vs / não aparecer mais cedo. A resposta foi alterada com base no senso comum. Obrigado!
cdated
26

Destaque seu bloco com: ShiftV

Comente o bloco selecionado com: :norm i# (minúsculas i)

Para descomentar, realce seu bloqueio novamente e descomente com: :norm ^x

O :normcomando executa uma ação para cada linha selecionada. Os comentários inserirão um #no início de cada linha e os comentários serão excluídos #.

user2437225
fonte
Com um Vim atualizado e uma configuração simples, selecionar linhas no modo visual (com Shift+v) e, em seguida, usar :norm i#apenas altera a primeira linha selecionada. Isso funciona para eu comentar as linhas 389 a 391::389,391norm i #
mmell 05/11
22

Normalmente, varro um bloco visual ( <C-V>), depois procuro e substituo o primeiro caractere por:

:'<,'>s/^/#

(Entrar no modo de comando com um bloco visual selecionado automaticamente coloca '<,'> na linha de comando). Em seguida, posso descomentar o bloco varrendo o mesmo bloco visual e:

:'<,'>s/^#//

fonte
19

Existem alguns bons plugins para ajudar a comentar / remover comentários. Por exemplo, o NERD Commenter .

Geoff Reedy
fonte
9

Eu tenho as seguintes linhas no meu .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Os atalhos preservam a posição do cursor e os comentários desde que iniciem #(há espaço após #). Por exemplo:

# variable x
x = 0

Após comentar:

# variable x
#x = 0

Depois de descompactar:

# variable x
x = 0
Lukas Cenovsky
fonte
Legal, mas acho que seria melhor usar o s/^/#/regexp mais simples . Prefiro que o caractere de comentário ocorra no início da linha ... mas muito mais importante, 'comentar comentários' é realmente bastante importante. Eu também descartaria o au BufEnter *.py, pois os #comentários são gerais o suficiente para que os comandos sejam usados ​​em todos os buffers por padrão.
travc
5

Francamente, eu uso um plugin tcomment para esse link . Ele pode lidar com quase todas as sintaxes. Ele define movimentos agradáveis, usando-o com alguns correspondentes de blocos de texto específicos para python, o torna uma ferramenta poderosa.

Darek
fonte
5

O NERDcommenter é um excelente plugin para comentários, que detecta automaticamente vários tipos de arquivos e seus caracteres de comentários associados. Ridiculamente fácil de instalar usando o Pathogen .

Comente com <leader>cc. Não comentar com <leader>cu. E alterne os comentários com <leader>c<space>.

(A <leader>chave padrão no vim é \)

Abid H. Mujtaba
fonte
3

Existem muitos plugins de comentários para o vim - alguns dos quais são multilíngues - não apenas python. Se você usa um gerenciador de plugins como o Vundle , pode procurá-los (depois de instalar o Vundle) usando, por exemplo:

:PluginSearch comment

E você terá uma janela de resultados. Como alternativa, você pode simplesmente procurar vim-scripts para plugins de comentários .

Pierz
fonte
3

Não são necessários plugins ou mapeamentos. Experimente o comando "norma" interno, que literalmente executa o que você deseja em cada linha selecionada.

Adicione comentários

1. shift V to visually select lines
2. :norm i#

Remover # comentários

1. visually select region as before
2. :norm x

Ou, se seus comentários forem recuados, você poderá fazer :norm ^x

Observe que estes são apenas comandos vim comuns sendo precedidos por ": norm" para executá-los em cada linha.

Resposta mais detalhada para o uso do comando "norma" em uma das respostas aqui

O que é uma maneira rápida de comentar / descomentar linhas no Vim?

Magnus
fonte
1

Um plugin de peso leve muito mínimo : vim-commentary.

gcccomentar uma linha
gcgcpara descomentar. confira a página do plugin para mais.

v+k/jrealce o bloco e gcccomente-o.

yantaq
fonte
0

CtrlK para comentar (Modo Visual):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU para descomentar (modo visual):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Pradip Das
fonte