Come commentare un blocco di codice Python in Vim


186

Mi chiedevo se ci fosse qualche mappatura dei tasti in Vim per permettermi di indentare alcune righe di codice (se quelle linee sono state selezionate in modalità visiva, o n righe sopra / sotto la posizione corrente del cursore).

Quindi in sostanza qualcosa che converte il seguente

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

per

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

Sono d'accordo con l'utilizzo di #o """per commentare le righe pertinenti. Idealmente, vorrei anche lo stesso keymapping per decommentare le righe se le righe fornite sono state commentate.


Non c'è bisogno di reinventare la ruota, c'è un plugin: tComment per te, che supporta il codice di commento (un) per più lingue.
Meow,

Risposte:


411

Passaggio 1: vai alla prima colonna della prima riga che desideri commentare.

Stato iniziale

Passaggio 2: premere: Ctrl+ ve selezionare le righe che si desidera commentare:

Seleziona le linee

Passaggio 3: Shift - I#space(Entra nella modalità Inserisci a sinistra, digita i caratteri da inserire. La selezione scomparirà, ma tutte le righe al suo interno verranno modificate dopo il passaggio 4.)

Commento

Step 4: Esc

<Esc>


4
Commentare le righe in questo modo funziona alla grande. C'è un modo per decommentare queste righe? Shift-I # <ESC>non ha funzionato (forse sto sbagliando).
Rishabh Manocha,

41
@ rishabh-manocha: usa il blocco visivo (Ctrl-V) per selezionare tutti i # aggiunti e digitare x per eliminarli.
theosp

3
Devi ricordare che Shift-I significa "inserisci nel primo non vuoto nella riga", quindi non può essere usato per cancellare. Effettuare una selezione visiva con Ctrl-V contrassegna i caratteri da modificare, quindi "x" cancella un carattere nell'area selezionata, finendo per eliminare i caratteri '#'. Vedi ": h I" e ": h CTRL-V" in vim per maggiori informazioni.
Tin Man,

5
@Samaursa Ctrl-V probabilmente non funziona su Windows. Prova invece Ctrl-Q.
AZ.

1
Per eliminare 2 caratteri (se è stato inserito '#'), individuare il cursore sulla riga superiore che si desidera modificare, premere ctrl-v per accedere alla modalità blocco visivo, premere j (o freccia giù) per evidenziare tutte le righe da modificare, premere l (o freccia destra) per evidenziare una larghezza di 2 caratteri (premere una volta per colonna per evidenziare), quindi premere d per eliminare il testo evidenziato.
thinkmassive,


49

Puoi aggiungere il seguente mapping al tuo .vimrc

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

Evidenzia il tuo blocco con:

Shift+v

# per commentare le tue righe dalla prima colonna.

-# decommentare allo stesso modo.


5
Semplice è geniale! Grazie!
I159,

1
@architectonic non ha alcun effetto a meno che tu non sia in modalità visiva e '#' non è associato in
cdated

1
Ho modificato un po ': Ctrl + k per il commento "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u per il commento: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das

1
@JonathanHartley non devi usare '/' in questo caso '#' è il delimitatore. Quindi: s / ^ / # / e: s / ^ # // sono le sostituzioni equivalenti. Quindi sostituisci l'inizio della riga con '#' e sostituisci '#' nella prima colonna con ''. <cr>: noh <cr> cancella semplicemente la stringa di ricerca in modo che nulla sia lasciato evidenziato quando hai finito.
registrato il

1
@JonathanHartley onestamente penso di aver appena seguito uno schema senza pensarci. Ora sono sorpreso # vs / non è venuto prima. Modificata la risposta in base al buon senso. Grazie!
cd

26

Evidenzia il tuo blocco con: ShiftV

Commenta il blocco selezionato con: :norm i#(minuscola i)

Per rimuovere il commento, evidenziare nuovamente il blocco e rimuovere il commento con: :norm ^x

Il :normcomando esegue un'azione per ogni linea selezionata. Commentando verrà inserito un #all'inizio di ogni riga e il commento verrà eliminato #.


Con un Vim aggiornato e una semplice configurazione, selezionando le linee in modalità visiva (con Shift+v) e quindi usando, :norm i#cambia solo la prima linea selezionata. Questo funziona per me commentare le righe da 389 a 391::389,391norm i #
mmell

22

Di solito spazzare un blocco visivo ( <C-V>), quindi cercare e sostituire il primo carattere con:

:'<,'>s/^/#

(L'accesso alla modalità di comando con un blocco visivo selezionato posiziona automaticamente '<,'> sulla riga di comando) Posso quindi decommentare il blocco spazzando lo stesso blocco visivo e:

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


9

Ho le seguenti righe nel mio .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

Le scorciatoie mantengono la posizione del cursore e i commenti finché iniziano #(c'è spazio dopo #). Per esempio:

# variable x
x = 0

Dopo aver commentato:

# variable x
#x = 0

Dopo l'incredibile:

# variable x
x = 0

Bello, ma penso che staresti meglio usando la s/^/#/regexp più semplice . Preferisco che il carattere di commento si verifichi all'inizio della riga ... ma ancora più importante, "commentare i commenti" è davvero piuttosto importante. Vorrei anche rilasciare il au BufEnter *.py, poiché i #commenti sono abbastanza generali per i comandi da utilizzare in tutti i buffer per impostazione predefinita.
travc,

5

Francamente uso un plugin tcomment per quel link . Può gestire quasi ogni sintassi. Definisce bei movimenti, usandolo con alcuni abbinatori di blocchi di testo specifici per Python lo rende uno strumento potente.


5

NERDcommenter è un plug-in eccellente per i commenti che rileva automaticamente un numero di tipi di file e i loro caratteri di commento associati. Ridicolmente facile da installare usando Pathogen .

Commenta con <leader>cc. Uncomment con <leader>cu. E attiva / disattiva i commenti con <leader>c<space>.

(La <leader>chiave predefinita in vim è \)


3

Ci sono molti plugin di commenti per Vim - alcuni dei quali sono multilingue - non solo Python. Se usi un gestore di plug-in come Vundle , puoi cercarli (dopo aver installato Vundle) usando ad esempio:

:PluginSearch comment

E otterrai una finestra di risultati. In alternativa, puoi semplicemente cercare vim-script per plugin di commenti .


3

Nessun plug-in o mapping richiesto. Prova il comando "norm" incorporato, che esegue letteralmente tutto ciò che desideri su ogni linea selezionata.

Aggiungi # commenti

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

Rimuovi # commenti

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

O se i tuoi commenti sono rientrati puoi farlo :norm ^x

Si noti che questi sono solo normali comandi di vim preceduti da ": norm" per eseguirli su ogni riga.

Risposta più dettagliata per l'utilizzo del comando "norm" in una delle risposte qui

Qual è un modo rapido per commentare / commentare le righe in Vim?


1

Un plug -in leggero e minimale : vim-commentary.

gccper commentare una riga
gcgcin commento. controlla la pagina dei plugin per ulteriori informazioni.

v+k/jevidenziare il blocco quindi gcccommentare quel blocco.


0

CtrlK per commento (modalità visiva):

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

CtrlU per decommentare (modalità visiva):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.