Jak skomentować blok kodu Pythona w Vimie

186

Zastanawiałem się, czy w Vimie było jakieś mapowanie klawiszy, które pozwoliło mi na wcięcie niektórych linii kodu (czy te linie zostały wybrane w trybie wizualnym, czy n linii powyżej / poniżej aktualnej pozycji kursora).

Więc w zasadzie coś, co przekształca następujące

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

do

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

Jestem w porządku z zastosowaniem jednej #lub """dla zakomentowanie odpowiednie linie. Idealnie, chciałbym również tego samego mapowania klawiszy, aby odkomentować linie, jeśli dane linie zostały skomentowane.

Rishabh Manocha
źródło
Nie musisz wymyślać koła na nowo, istnieje wtyczka: tComment , która obsługuje (nie) kod komentarza dla wielu języków.
Miau

Odpowiedzi:

411

Krok 1: Przejdź do pierwszej kolumny pierwszego wiersza, który chcesz skomentować.

Stan początkowy

Krok 2: Naciśnij: Ctrl+ vi wybierz linie, które chcesz skomentować:

Wybierz linie

Krok 3: Shift - I#space(Wejdź w tryb wstawiania po lewej, wpisz znaki, aby wstawić. Wybór zniknie, ale wszystkie wiersze w nim zostaną zmodyfikowane po kroku 4.)

Komentarz

Krok 4: Esc

<Esc>

theosp
źródło
4
Komentowanie linii w ten sposób działa świetnie. Czy jest jakiś sposób, aby odkomentować te linie? Shift-I # <ESC>nie działał (może robię to źle).
Rishabh Manocha
41
@ rishabh-manocha: użyj bloku wizualnego (Ctrl-V), aby zaznaczyć wszystkie dodane # i wpisz x, aby je usunąć.
theosp
3
Musisz pamiętać, że Shift-I oznacza „wstaw przy pierwszym niepustym wierszu”, więc nie można go użyć do usunięcia. Dokonanie wizualnego wyboru za pomocą Ctrl-V oznacza znaki do zmodyfikowania, a następnie „x” usuwa jeden znak z wybranego obszaru, co kończy się usunięciem znaków „#”. Aby uzyskać więcej informacji, zobacz „: h I” i „: h CTRL-V” w vimie.
Tin Man
5
@Samaursa Ctrl-V prawdopodobnie nie działa w systemie Windows. Zamiast tego spróbuj Ctrl-Q.
AZ.
1
Aby usunąć 2 znaki (jeśli wstawiłeś „#”), zlokalizuj kursor w górnym wierszu, który chcesz zmodyfikować, naciśnij ctrl-v, aby przejść do trybu blokowania wizualnego, naciśnij j (lub strzałkę w dół), aby podświetlić wszystkie linie do modyfikacji, naciśnij l (lub strzałka w prawo), aby podświetlić szerokość 2 znaków (naciśnij jeden raz, aby podświetlić kolumnę), a następnie naciśnij d, aby usunąć podświetlony tekst.
myślący
72

w jedną stronę ręcznie

:set number
:10,12s/^/#
ghostdog74
źródło
4
jak je usunąć?
Charlie Parker,
15
@CharlieParker::10,12s/^#//
bstpierre
1
Kciuki w górę za ex odpowiedź (stara szkoła :)
mlv
To nie działa dla wciętego kodu
Andrés Pérez-Albela H.
49

Możesz dodać następujące mapowanie do swojego .vimrc

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

Podświetl swój blok za pomocą:

Shift+v

# aby skomentować twoje linie z pierwszej kolumny.

-# odkomentować w ten sam sposób.

cdated
źródło
5
Proste jest genialne! Dzięki Ci!
I159
1
@architectonic nie działa, chyba że jesteś w trybie wizualnym, a „#” nie jest powiązany
cd
1
Zmodyfikowałem trochę: Ctrl + k dla komentarza „vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u dla komentarza: „vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das
1
@JonathanHartley nie musisz używać „/” w tym przypadku „#” jest ogranicznikiem. Zatem: s / ^ / # / i: s / ^ # // są równoważnymi podstawieniami. Więc zamień początek linii na „#” i zamień „#” w pierwszej kolumnie na „”. <cr>: noh <cr> po prostu usuwa szukany ciąg, więc nic nie jest podświetlone, gdy skończysz.
cd.
1
@JonathanHartley szczerze myślę, że po prostu podążyłem za wzorem, nie myśląc o tym. Teraz jestem zaskoczony # vs / nie pojawił się wcześniej. Zmieniłem odpowiedź w oparciu o zdrowy rozsądek. Dzięki!
cd.
26

Podświetl swój blok za pomocą: ShiftV

Skomentuj wybrany blok za pomocą: :norm i# (małe litery i)

Aby anulować komentarz, ponownie zaznacz blok i odkomentuj: :norm ^x

:normPolecenie wykonuje czynność dla każdej wybranej linii. Komentowanie wstawi znak #na początku każdej linii, a anulowanie komentarza spowoduje jego usunięcie #.

użytkownik2437225
źródło
Z aktualnym Vimem i prostą konfiguracją, wybieranie linii w trybie wizualnym (z Shift+v), a następnie używanie :norm i#tylko zmienia pierwszą wybraną linię. To działa dla mnie, aby komentować wiersze od 389 do 391::389,391norm i #
mmell
22

Zwykle usuwam blok wizualny ( <C-V>), a następnie szukam i zastępuję pierwszy znak:

:'<,'>s/^/#

(Wejście w tryb poleceń z zaznaczonym blokiem wizualnym powoduje automatyczne umieszczenie „<,”> w wierszu poleceń). Następnie mogę anulować komentarz, usuwając ten sam blok wizualny i:

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

źródło
19

Istnieje kilka dobrych wtyczek, które pomagają w komentarzach / komentarzach. Na przykład komentator NERD .

Geoff Reedy
źródło
9

Mam następujące wiersze w moim .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

Skróty zachowują pozycję kursora i komentarze tak długo, jak się zaczynają #(po # jest spacja). Na przykład:

# variable x
x = 0

Po komentowaniu:

# variable x
#x = 0

Po niewygodnym:

# variable x
x = 0
Lukas Cenovsky
źródło
Fajnie, ale myślę, że lepiej byłoby użyć prostszego s/^/#/wyrażenia regularnego. Wolę, aby znak komentarza pojawiał się na początku wiersza ... ale co ważniejsze, „komentowanie komentarzy” jest naprawdę dość ważne. Odrzuciłbym również au BufEnter *.py, ponieważ #komentarze są na tyle ogólne, że polecenia mogą być domyślnie używane we wszystkich buforach.
travc
5

Szczerze mówiąc używam wtyczki Tcomment dla tego linku . Obsługuje prawie każdą składnię. Definiuje ładne ruchy, używając go z niektórymi dopasowaniami bloków tekstu specyficznymi dla Pythona, czyni go potężnym narzędziem.

Darek
źródło
5

NERDcommenter to doskonała wtyczka do komentowania, która automatycznie wykrywa wiele typów plików i powiązanych z nimi znaków komentarzy. Śmiesznie łatwy w instalacji za pomocą Pathogen .

Skomentuj za pomocą <leader>cc . Niezomowanie się z <leader>cu. I przełączaj komentarze za pomocą<leader>c<space> .

(Domyślny <leader>klucz w vimie to \)

Abid H. Mujtaba
źródło
3

Istnieje wiele wtyczek komentarzy do vima - wiele z nich jest wielojęzycznych - nie tylko python. Jeśli używasz menedżera wtyczek, takiego jak Vundle, możesz je wyszukać (po zainstalowaniu Vundle), używając np .:

:PluginSearch comment

I pojawi się okno wyników. Alternatywnie możesz po prostu przeszukać skrypty vim w poszukiwaniu wtyczek komentarzy .

Pierz
źródło
3

Nie wymaga żadnych wtyczek ani mapowań. Wypróbuj wbudowaną komendę „norm”, która dosłownie wykonuje wszystko, co chcesz w każdej wybranej linii.

Dodaj Komentarze

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

Usuń # komentarze

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

Lub jeśli twoje komentarze są wcięte, możesz to zrobić :norm ^x

Zauważ, że są to zwykłe polecenia vima poprzedzone przez „: norm”, aby wykonać je w każdej linii.

Bardziej szczegółowa odpowiedź na użycie polecenia „norm” w jednej z odpowiedzi tutaj

Jaki jest szybki sposób komentowania / usuwania komentarzy w Vimie?

Magnus
źródło
1

Bardzo minimalna lekka wtyczka : komentarz vim.

gccaby skomentować linię
gcgcdo komentarza. sprawdź stronę wtyczki, aby uzyskać więcej.

v+k/jzaznacz blok, a następnie gccskomentuj ten blok.

Yantaq
źródło
0

CtrlK do komentarza (tryb wizualny):

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

CtrlU za odkomentowanie (tryb wizualny):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Pradip Das
źródło