0Pricing
Lua Academy · Lekcja

Bufory i okna

Będzie Pan/Pani manipulować edytorem.

Bufory i okna to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Bufory, okna i karty

Neovim oddziela treść od sposobu jej wyświetlania. Bufor przechowuje tekst w pamięci, okno jest widokiem na bufor, a karta stanowi układ okien.

Jeden bufor może być wyświetlany w wielu oknach. Wtyczki operują na tych uchwytach, będących liczbami całkowitymi, za pośrednictwem rodzin API nvim_buf_* i nvim_win_*.

local buf = vim.api.nvim_get_current_buf()
local win = vim.api.nvim_get_current_win()
print(buf, win)

Odczytywanie wierszy bufora

nvim_buf_get_lines(buf, start, end_, strict) zwraca wiersze jako listę. Indeksy są numerowane od zera, a koniec zakresu jest wyłączny; należy przekazać -1 jako koniec, aby objąć ostatni wiersz.

Ustawienie strict_indexing na false pozwala tolerować indeksy spoza zakresu zamiast zgłaszać błąd.

local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
print('line count: ' .. #lines)

Zapisywanie wierszy bufora

nvim_buf_set_lines zastępuje zakres nowym tekstem. Aby dodać tekst na końcu, należy ustawić zarówno początek, jak i koniec na -1. Aby nadpisać całą zawartość, należy użyć 0, -1.

Zastępowana zawartość to lista Lua złożona z ciągów znaków, po jednym na wiersz, bez końcowych znaków nowej linii.

vim.api.nvim_buf_set_lines(0, -1, -1, false, {
  '-- appended line',
})

Bufory scratch

Niezarejestrowany, jednorazowy bufor można utworzyć za pomocą nvim_create_buf(listed, scratch). Przekazanie false, true tworzy bufor scratch idealny dla interfejsu wtyczki.

Należy ustawić bufhidden = 'wipe', aby bufor znikał po zamknięciu jego okna i nie pozostawiał zbędnych buforów.

local buf = vim.api.nvim_create_buf(false, true)
vim.bo[buf].bufhidden = 'wipe'
vim.api.nvim_buf_set_lines(buf, 0, -1, false, { 'Panel' })

Opcje lokalne dla bufora

Aby ustawić opcje lokalne dla konkretnego uchwytu bufora, należy użyć indeksu vim.bo[buf]. Typowe ustawienia wtyczek to modifiable = false i buftype = 'nofile'.

Ustawienie bufora wyświetlania jako niemodyfikowalnego zapobiega przypadkowemu edytowaniu generowanej zawartości przez użytkownika.

vim.bo[buf].modifiable = false
vim.bo[buf].buftype = 'nofile'
vim.bo[buf].filetype = 'myplugin'

Otwieranie okien pływających

nvim_open_win(buf, enter, config) umieszcza bufor w oknie pływającym. Konfiguracja określa relative, row, col, width, height i border.

Okna pływające stanowią podstawę nowoczesnego interfejsu, takiego jak dokumentacja wyświetlana po najechaniu, selektory i powiadomienia.

local win = vim.api.nvim_open_win(buf, true, {
  relative = 'editor', row = 5, col = 10,
  width = 40, height = 10, border = 'rounded',
})

Konfiguracja okna

Otwarte okno pływające można dostosować za pomocą nvim_win_set_config, co przydaje się do zmiany rozmiaru po zdarzeniu VimResized. Bieżący układ można odczytać za pomocą nvim_win_get_config.

Opcje lokalne dla okna ustawia się przez vim.wo[win], na przykład ukrywając wiersz kursora lub wyłączając kolumny numerów w panelach interfejsu.

vim.wo[win].number = false
vim.wo[win].cursorline = true
vim.api.nvim_win_set_config(win, { width = 50 })

Kursor i pozycja

Kursor można przesunąć za pomocą nvim_win_set_cursor(win, {row, col}). Należy pamiętać, że wiersz jest numerowany od jedynki, a kolumna od zera — to częsta przyczyna błędów o jeden.

Pozycję można odczytać ponownie za pomocą nvim_win_get_cursor, aby zapamiętać i przywrócić położenie użytkownika po wykonaniu operacji.

local pos = vim.api.nvim_win_get_cursor(0)
vim.api.nvim_win_set_cursor(0, { pos[1], 0 })

Sprawdzanie poprawności i sprzątanie

Uchwyty mogą stać się nieaktualne. Przed użyciem zapisanych uchwytów należy sprawdzić je za pomocą nvim_buf_is_valid i nvim_win_is_valid.

Okna należy zamykać za pomocą nvim_win_close(win, force), a bufory usuwać przez nvim_buf_delete(buf, { force = true }). Zawsze należy najpierw sprawdzić poprawność uchwytu, aby uniknąć błędów.

if vim.api.nvim_win_is_valid(win) then
  vim.api.nvim_win_close(win, true)
end

Extmarki i przestrzenie nazw

Extmarki przypinają metadane do tekstu, który przesuwa się podczas edycji. Utwórz przestrzeń nazw za pomocą nvim_create_namespace, a następnie dodaj tekst wirtualny lub wyróżnienia.

nvim_buf_set_extmark obsługuje virt_text, kolumny znaków i wyróżnienia w tekście — to mechanizm używany przez podpowiedzi w tekście oraz wtyczki git blame.

local ns = vim.api.nvim_create_namespace('myplugin')
vim.api.nvim_buf_set_extmark(0, ns, 0, 0, {
  virt_text = { { ' hint', 'Comment' } },
})

Listowanie i iterowanie

nvim_list_bufs i nvim_list_wins zwracają wszystkie aktualne uchwyty. Można je filtrować za pomocą nvim_buf_is_loaded lub przez sprawdzanie opcji.

Iterowanie pozwala wtyczce działać w całej sesji, na przykład zamknąć każde pływające okno albo odświeżyć każdy bufor określonego typu pliku.

for _, b in ipairs(vim.api.nvim_list_bufs()) do
  if vim.api.nvim_buf_is_loaded(b) then print(b) end
end

Szybki test

Sprawdźmy, czego nauczyli się Państwo o buforach i oknach.

Podsumowanie: bufory i okna

Bufory przechowują tekst, okna go wyświetlają, a uchwyty są liczbami całkowitymi, które należy sprawdzić przed użyciem. Można odczytywać i zapisywać wiersze, tworzyć bufory tymczasowe oraz ustawiać opcje lokalne dla bufora.

Pływające okna otwierane za pomocą nvim_open_win, sterowanie kursorem, extmarki i interfejsy API do listowania zapewniają wszystko, czego potrzeba do budowania rozbudowanych interfejsów wtyczek zachowujących stan.

Często zadawane pytania

Czy lekcja „Bufory i okna” jest bezpłatna?

Tak — pełny tekst „Bufory i okna” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Bufory i okna”?

Będzie Pan/Pani manipulować edytorem. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Bufory i okna”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. API Lua Neovima
  2. Polecenia i mapowania klawiszy
  3. Bufory i okna
  4. Pakowanie pluginu
← Powrót do Lua Academy