let b:commentChar='//': To tworzy zmienną w vimie. btutaj odnosi się do zakresu, w tym przypadku jest zawarte w buforze, co oznacza, że obecnie otwarty plik. Znaki komentarza są ciągami znaków i muszą być zawinięte w cytaty, cytaty nie są częścią tego, co zostanie zastąpione podczas przełączania komentarzy.
autocmd BufNewFile,BufReadPost *...: Komendy automatyczne uruchamiają różne rzeczy, w tym przypadku są one uruchamiane, gdy nowy plik lub plik odczytu kończy się określonym rozszerzeniem. Po uruchomieniu wykonaj następujące polecenie, które pozwala nam zmienić commentCharzależnie od rodzaju pliku. Są na to inne sposoby, ale są bardziej mylące dla nowicjuszy (takich jak ja).
function! Docomment(): Funkcje są deklarowane, zaczynając od functioni kończąc na endfunction. Funkcje muszą zaczynać się od dużej. to !gwarantuje, że funkcja ta zastępuje wszystkie poprzednie funkcje zdefiniowane jak Docomment()z tą wersją Docomment(). Bez tego !miałem błędy, ale mogło to wynikać z tego, że definiowałem nowe funkcje za pomocą wiersza poleceń vim.
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Wykonaj wywołuje polecenie. W tym przypadku wykonujemy substitute, który może przyjmować zakres (domyślnie jest to bieżący wiersz), na przykład %dla całego bufora lub '<,'>podświetlonej sekcji. ^\s*jest wyrażeniem regularnym pasującym do początku linii, po której następuje dowolna ilość białych znaków, które są następnie dodawane do (z powodu &). .Tutaj służy do łańcuchów znaków, gdyż escape()nie może być owinięty w cudzysłowach. escape()pozwala na ucieczkę znaku, commentCharktóry pasuje do argumentów (w tym przypadku \i /), poprzedzając je znakiem \. Następnie ponownie łączymy się z końcem naszego substitutełańcucha, który maeflaga. Ta flaga pozwala nam po cichu zawieść, co oznacza, że jeśli nie znajdziemy dopasowania w danej linii, nie będziemy o tym krzyczeć. Jako całość, ten wiersz pozwala nam wstawić znak komentarza, po którym następuje spacja tuż przed pierwszym tekstem, co oznacza, że utrzymujemy poziom wcięcia.
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Jest to podobne do naszego ostatniego wielkiego długiego polecenia. Unikatowe dla tego, co mamy \v, zapewnia, że nie musimy uciekać przed naszym (), i 1które odnosi się do grupy, którą stworzyliśmy z naszą (). Zasadniczo dopasowujemy linię zaczynającą się od dowolnej ilości białych znaków, a następnie nasz znak komentarza, po którym następuje dowolna ilość białych znaków, i zachowujemy tylko pierwszy zestaw białych znaków. Ponownie, epo cichu zawiedźmy, jeśli nie mamy znaku komentarza w tym wierszu.
let l:line=getpos("'<")[1]: ustawia zmienną podobnie jak w przypadku naszego znaku komentarza, ale lodnosi się do zasięgu lokalnego (lokalnego dla tej funkcji). getpos()otrzymuje pozycję, w tym przypadku, początku naszego wyróżnienia i [1]oznacza, że dbamy tylko o numer linii, a nie o inne rzeczy, takie jak numer kolumny.
if match(getline(l:line), '^\s*'.b:commentChar)>-1: wiesz jak ifdziała. match()sprawdza, czy pierwsza rzecz zawiera drugą rzecz, więc chwytamy linię, od której zaczęliśmy wyróżnianie, i sprawdzamy, czy zaczyna się od białych znaków, po których następuje znak komentarza. match()zwraca indeks, w którym jest to prawda, i -1jeśli nie znaleziono żadnych dopasowań. Ponieważ ifocenia, że wszystkie niezerowe liczby są prawdziwe, musimy porównać nasze dane wyjściowe, aby zobaczyć, czy są większe niż -1. Porównanie vimzwraca 0, jeśli jest fałszem, i 1, jeśli jest prawdą, co ifchce zobaczyć, aby poprawnie ocenić.
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapoznacza odwzoruj następujące polecenie w trybie wizualnym, ale nie mapuj go rekurencyjnie (co oznacza, że nie zmieniaj żadnych innych poleceń, które mogłyby być użyte w inny sposób). Zasadniczo, jeśli jesteś początkującym vimem, zawsze używaj, noremapaby upewnić się, że nie psujesz rzeczy. <silent>oznacza „Nie chcę twoich słów, tylko twoje działania” i mówi, aby nie drukował niczego w wierszu poleceń. <C-r>to jest to, co mapujemy, czyli ctrl + r w tym przypadku (zwróć uwagę, że nadal możesz używać Cr normalnie do „ponawiania” w trybie normalnym z tym mapowaniem). C-ujest trochę mylące, ale zasadniczo zapewnia, że nie stracisz kontroli nad wizualnym podświetlaniem (zgodnie z tą odpowiedzią powoduje, że twoje polecenie zaczyna od '<,'>tego, czego chcemy).calltutaj po prostu każe vimowi wykonać funkcję, którą nazwaliśmy, i <cr>odnosi się do naciśnięcia enterprzycisku. Musimy go nacisnąć raz, aby faktycznie wywołać tę funkcję (w przeciwnym razie właśnie wpisaliśmy call function()wiersz poleceń i musimy nacisnąć go ponownie, aby nasze substytuty przeszły przez całą drogę (nie do końca pewni dlaczego, ale cokolwiek).
W każdym razie mam nadzieję, że to pomaga. Spowoduje to, że wszystko wyróżnione za pomocą v, Vlub C-vsprawdzi, czy pierwszy wiersz jest skomentowany, jeśli tak, spróbuj usunąć zaznaczenie wszystkich wyróżnionych linii, a jeśli nie, dodaj dodatkową warstwę znaków komentarza do każdej linii. To jest moje pożądane zachowanie; Nie chciałem tylko, aby przełączało się, czy każda linia w bloku była komentowana, czy nie, więc działa to idealnie dla mnie po zadaniu wielu pytań na ten temat.