Co robi: ustaw tło = ciemne?

35

Nie umieściłem color xxxw moim .vimrc. Widzę to, kiedy po raz pierwszy otwieram .vimrc.

:colordaje mi defaulttutaj. Przed cokolwiek

Potem piszę :color darcula. I to się zmienia.

:colordaje mi darculatutaj (naturalnie). Zmień schemat kolorów

Potem piszę :set background=dark. I to się zmienia.

:colordaje mi defaulttutaj (zadziwiająco). Zmień tło

Moje pytanie brzmi: co dokładnie robi :set background=dark?

Próbowałem :h backgroundi nie znalazłem nic pomocnego. Rozumiem, że to polecenie tak naprawdę nie zmienia tła, tylko vim odpowiednio zmieni kolory. Ale nadal chcę zadać to pytanie. Ponieważ jestem naprawdę zadowolony z kolorem po :color darculai :set background=darktak zastanawiam się, jak napisać własny schemat kolorów bez konieczności umieścić set background=darkw moim .vimrc.

Wziąłem porady od @statox i umieściłem set background=darkw ostatnim wierszu mojego darcula.vim. Następnie color darculadaje mi trzeci zrzut ekranu. Jednak kiedy umieszczam go w pierwszej linii, color darculadaje mi drugi zrzut ekranu. set bg=darkZmienia również na trzeci zrzut ekranu.

Zakładając, że umieszczam go w pierwszym wierszu, mówię vimowi, że ten schemat kolorów został zaprojektowany na ciemnym tle. W przeciwieństwie do tego, umieszczając go w ostatniej linii, pozwalam vimowi założyć, że ten schemat kolorów jest przeznaczony do jasnego tła, a następnie sam dokonuję zmiany vima (podczas przetwarzania ostatniej linii).

Jeśli to, co zakładam, stało się prawdą, moje pytanie pozostaje bez odpowiedzi. Co dokładnie zmienił vim, kiedy używam set bg=darkPO załadowaniu jasnego schematu kolorów?

Moja cała konfiguracja vima jest dostępna na https://github.com/MichaelMa2014/.vim

Michael Ma
źródło
@muru Greetings! Przeczytałem to pytanie, zanim zadałem swoje. Wspomniano w tym poście, że :set bg=lighti :set bg=darknie są przeciwne, ale to, czym dokładnie są, nie zostało wyjaśnione. Również, że post jest dlaczego chcę uniknąć :set background=darkw moim .vimrc.
Michael Ma

Odpowiedzi:

32

Co się stanie, kiedy ty :set background

Podstawowy mechanizm, dzięki któremu :set backgrounddziała, jest w rzeczywistości dość prosty i jest udokumentowany (choć nie szczególnie wyraźnie) w :help 'background'.

Po ustawieniu „tła” Vim dostosuje domyślne grupy kolorów dla nowej wartości. Ale kolory użyte do podświetlania składni nie zmienią się. g: nazwa_koloru
Po załadowaniu schematu kolorów (ustawiona jest zmienna „g: nazwa_koloru”) ustawienie „tło” spowoduje ponowne załadowanie schematu kolorów. Jeśli schemat kolorów dostosuje się do wartości „tła”, to zadziała. Jeśli jednak schemat kolorów sam określa „tło”, efekt może zostać cofnięty.

Tak więc to, co faktycznie dzieje się po 'background'zmianie opcji, jest następujące:

Jeśli nie jest aktualnie załadowany żaden schemat kolorów

Vim ponownie ładuje kolory domyślne, używając kolorów pierwszego planu uznanych za odpowiednie dla nowego ustawienia 'background'

Jeśli schemat kolorów jest aktualnie załadowany

Vim ponownie ładuje schemat kolorów. Po załadowaniu schematu kolorów albo schemat kolorów ustawia kolory odpowiednie dla nowego ustawienia 'background', albo schemat kolorów resetuje 'background' się do starej wartości.

Jak już opisałeś, 'background'opcja ta nie ma na celu ustawienia tła, ale poinformowanie Vima, czy tło jest ciemne czy jasne.

Jeśli więc schemat kolorów zostanie zresetowany 'background', Vim oznacza to, że schemat kolorów po prostu nie obsługuje nowego ustawienia 'background'. Ponieważ użytkownik zaznaczył, że używa takiego tła, oznacza to, że bieżący schemat kolorów nie jest już odpowiedni, a więc Vim resetuje, g:colors_namea następnie ponownie ładuje domyślne kolory.

Jeśli chcesz poznać rzeczywisty kod, który jest uruchamiany, gdy 'background'jest ustawiony, możesz zacząć tutaj .

Co dzieje się w twojej instalacji

Dziwne zachowanie, które opisujesz (w pierwszej wersji twojego pytania) można wyjaśnić tym wierszem w cytowanej powyżej dokumentacji:

Po załadowaniu schematu kolorów (ustawiana jest zmienna „g: colors_name”)

Problem polega na tym, że colors/darcula.vimplik nie ustawia tej wartości, więc nawet jeśli kolory się zmieniły po wywołaniu :color darcula, Vim nie uważa, że ​​schemat kolorów jest aktualnie ładowany.

Dlatego po wywołaniu :set background=darkVima wykonaj powyższy krok w sekcji „Jeśli żaden schemat kolorów nie jest aktualnie załadowany” i ustaw domyślne kolory ciemnego tła. To wyjaśnia, dlaczego :colornastępnie raporty default.

(Należy jednak pamiętać, że ustawienie domyślne kolory czy nie , jak można się spodziewać, usunąć wszystkie kolory, które wcześniej zostały ustalone, a to dlatego skończyć z wyników widać, zamiast kolorów, które są wyświetlane po najpierw załóż Vima. Tutaj jest trochę dyskusji na ten temat )

Krótko mówiąc, schemat kolorów jest źle skonfigurowany: zobacz :edit $VIMRUNTIME/colors/README.txt(w szczególności sekcję u dołu), aby uzyskać więcej informacji na ten temat oraz interakcji między 'background'schematami kolorów.

Bogaty
źródło
Dziękuję bardzo! Czuję się całkowicie zrozumiany, kiedy mówisz, że „nie usuwa, jak można się spodziewać, wszystkich wcześniej ustawionych kolorów”. Na pewno będę czytać dyskusje!
Michael Ma
4

Dokument w :h 'background' powinien zawierać wszystkie potrzebne informacje:

Po ustawieniu na „ciemny”, Vim spróbuje użyć kolorów, które dobrze wyglądają na ciemnym tle. Po ustawieniu na „jasne”, Vim spróbuje użyć kolorów, które dobrze wyglądają na jasnym tle. Wszelkie inne wartości są nielegalne.

Twój schemat kolorów definiuje 2 grupy kolorów: te używane na jasnym tle i te używane na ciemnym tle. Ta backgroundopcja powie vimowi, która grupa kolorów zdefiniowana przez twój schemat kolorów powinna zostać użyta.

Ustawienie tej opcji nie zmienia koloru tła, mówi Vimowi, jak wygląda kolor tła. Aby zmienić kolor tła, patrz :h :hi-normal.

Po ustawieniu „tła” Vim dostosuje domyślne grupy kolorów dla nowej wartości. Ale kolory użyte do podświetlania składni nie zmienią się.

Jest to kontynuacja poprzedniego akapitu: to schemat kolorów, który definiuje grupy kolorów i backgroundwybiera jedną z tych grup.

Wreszcie, jeśli chcesz napisać swój własny schemat kolorów bez konieczności umieścić set background=darkw vimrc, należy pamiętać, że colorscheme jest niczym więcej niż program w vimscript, więc nic nie stoi na przeszkodzie, używając polecenia bezpośrednio w kodzie swojej colorscheme jak np żelki lub uczeń

statox
źródło
1
Dziękuję Ci! Kładę set background=darksię darcula.vimi wyprodukował sam efekt jak kiedy kładę go .vimrc. Ale nadal jestem ciekawy, w jaki sposób Vim „próbuje używać kolorów, które dobrze wyglądają na ciemnym tle”? Czy jest gdzieś zdefiniowane mapowanie lub coś takiego?
Michael Ma