Przejdź do treści

Autopary i inteligentne wcięcia

Podczas pisania edytor domyka za Ciebie nawiasy i cudzysłowy, utrzymuje wcięcie w nowych wierszach, otwiera bloki między klamrami i stosuje jedną spójną jednostkę wcięcia (tabulatory lub spacje) zarówno dla klawisza Tab, jak i cofania wcięcia Backspace'em oraz automatycznego wcinania. Wszystko to jest wbudowaną funkcją edytora; odpowiadające polecenia menu i ustawienie stylu wcięć pochodzą z dołączonej wtyczki Wcięcia.

Z założenia ma być niewidoczne — działa tylko na znaku, który właśnie wpisano, i wycofuje się wszędzie tam, gdzie przeszkadzałoby (wewnątrz komentarzy i łańcuchów, przed istniejącymi słowami, przy niewłaściwym znaku partnerskim).

Automatyczne parowanie nawiasów i cudzysłowów

Wpisanie otwierającego nawiasu lub cudzysłowu wstawia jego partnera i zostawia kursor między nimi:

Wpisujesz Otrzymujesz Kursor
( () pomiędzy
[ [] pomiędzy
{ {} pomiędzy
" "" pomiędzy
' '' pomiędzy

Kilka reguł sprawia, że nie jest to uciążliwe:

  • Przeskakiwanie. Wpisanie znaku zamykającego, gdy ten sam znak stoi już po prawej stronie kursora, przeskakuje go zamiast wstawiać drugi — pisząc „na wprost” przez () czy "", zostawiasz jedną, zbalansowaną parę.
  • Bez parowania przed słowem. Znak otwierający jest domykany tylko wtedy, gdy następny znak to biały znak, znak zamykający lub koniec wiersza — dodanie ( tuż przed istniejącym tekstem nie wstrzykuje zbędnego ) w jego środek.
  • Cudzysłowy świadome apostrofu. ' wpisany zaraz po literze (jak w don't) jest traktowany jako apostrof i nie jest parowany. Cudzysłowy parują się tylko w neutralnym kontekście (początek tokenu, po białym znaku lub operatorze).
  • Nawiasy kątowe tylko w znacznikach. <> parują się wyłącznie w dokumentach HTML/XML, gdzie < otwiera tag. Wszędzie indziej < to operator porównania lub przesunięcia i pozostaje nietknięty.

Owijanie zaznaczenia (wpisz, aby owinąć)

Gdy tekst jest zaznaczony, wpisanie znaku otwierającego nie zastępuje zaznaczenia — owija je:

select value  then type (        →   (value)
  • Działa z ( [ { " ' (nie z < — poza znacznikami to operator).
  • Wewnętrzny tekst pozostaje zaznaczony, więc owinięcia można łączyć: wpisz (, potem ", a otrzymasz ("value").
  • Przy wielu kursorach każde zaznaczenie jest owijane niezależnie — a cała operacja to jeden krok cofania.

Usuwanie pary

Naciśnięcie Backspace z kursorem między pustą automatycznie wstawioną parą ((|), [|], {|}, "|", '|' lub <|> w znacznikach) usuwa oba znaki za jednym razem, więc autoparę wycofasz jednym naciśnięciem klawisza. Gdy między parą pojawi się zawartość, Backspace zachowuje się normalnie.

Inteligentne wcięcia po Enterze

Naciśnięcie Enter przenosi początkowe białe znaki bieżącego wiersza do nowego, więc pozostajesz na tej samej głębokości bez ponownego wpisywania tabulatorów czy spacji:

  • Zachowanie wcięcia. Nowy wiersz zaczyna się z takim samym wcięciem jak wiersz, który opuszczasz.
  • Otwarcie o jeden poziom. Jeśli opuszczany wiersz kończy się znakiem otwierającym ({, [, (), nowy wiersz jest wcięty o jeden poziom głębiej.
  • Otwarcie bloku. Jeśli kursor stoi między znakiem otwierającym a jego parą, blok się rozkłada: nowy wiersz jest wcięty o poziom głębiej, a znak zamykający ląduje we własnym wierszu na głębokości znaku otwierającego.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Styl wcięć — tabulatory, spacje lub automatycznie

Jedna jednostka wcięcia steruje klawiszem Tab, cofaniem wcięcia Backspace'em i automatycznym wcinaniem powyżej, więc zawsze są zgodne. Wybierz ją w Preferencje ▸ Wtyczki ▸ Wcięcia:

Styl Zachowanie
Tabulatory (domyślne dla nowych plików) Jeden poziom to prawdziwy znak tabulacji; Spacji na wcięcie ustala jego szerokość wizualną.
Spacje Jeden poziom to Spacji na wcięcie znaków spacji.
Automatycznie (wykryj z dokumentu) Edytor skanuje istniejące wcięcia dokumentu i podąża za nimi — plik wcinany tabulatorami dalej używa tabulatorów, plik z 2 spacjami dalej używa dwóch spacji. Plik bez żadnych wcięć wraca do wartości domyślnej (tabulatory).

Nowe, niezatytułowane pliki domyślnie używają tabulatorów o szerokości 4.

Ręczna zmiana wcięć

Wtyczka Wcięcia dodaje dwa polecenia (także w Edycja ▸ Wcięcia), które wcinają lub cofają wcięcie każdego wiersza objętego zaznaczeniem — lub wiersza z kursorem, gdy nic nie zaznaczono:

Polecenie Skrót
Zwiększ wcięcie Ctrl+]
Zmniejsz wcięcie Ctrl+[

Domyślne ustawienia per język

Niektóre języki mają jedną, niemal powszechną konwencję wcięć i edytor dostarcza ją jako domyślną dla danego języka — świeżo otwarty plik tego typu wcina się poprawnie bez żadnej konfiguracji:

Język Domyślnie
Python 4 spacje (PEP 8)
Rust 4 spacje (rustfmt)
Markdown 4 spacje (zagnieżdżone listy)
YAML 2 spacje (tabulatory są niedozwolone)
JSON 2 spacje
Go tabulatory (gofmt)
C / C++ tabulatory

Każdy inny język celowo nie ma wartości domyślnej i podąża za Twoim globalnym ustawieniem wcięć. Ręczna zmiana języka dokumentu (menu Język) natychmiast stosuje odpowiadającą wartość domyślną.

Wartość domyślna mieszka w pliku definicji języka (colorizers/<id>.json, klucz "indent": { "style": "tabs|spaces", "width": N }). Zaawansowany użytkownik może zmienić dostarczoną wartość domyślną, umieszczając zmodyfikowaną kopię tego pliku w katalogu nadpisań użytkownika — katalog zastępuje definicje po identyfikatorze.

W planach: nadpisania per język w Preferencjach

Tabela ustawień do nadpisywania tych wartości domyślnych dla każdego języka (bez dotykania żadnego JSON-a) jest zaprojektowana i zaplanowana jako następny krok tej funkcji; dopóki nie trafi do edytora, sposobami sterowania wcięciami są powyższe nadpisanie JSON i warstwy opisane poniżej.

Skąd pochodzi jednostka wcięcia (pierwszeństwo)

Gdy kilka źródeł ma zdanie na temat wcięć, edytor rozstrzyga je w jednym miejscu i stosuje zwycięzcę, od najwyższego pierwszeństwa:

  1. Projektowy .editorconfig — gdy istnieje, a opcja „Stosuj ustawienia .editorconfig” jest włączona, indent_style / indent_size / tab_width projektu wygrywają dla pasujących plików.
  2. Dostarczona wartość domyślna języka — tabela powyżej, gdy język dokumentu ją deklaruje.
  3. Twoje globalne ustawienie wcięć — powyższy wybór Tabulatory / Spacje / Automatycznie.

Zatem projekt z własnym .editorconfig nadpisuje wszystko dla swoich plików; plik Pythona poza takim projektem wcina się spacjami wg PEP-8, nawet gdy Twoje globalne ustawienie to tabulatory; a wszystko inne podąża za ustawieniem globalnym. Wcięcia dokumentu zawsze możesz potem zmienić ręcznie.

Pierwszeństwo obowiązuje od chwili każdej zmiany: zastosowanie innego wyboru Tabulatory / Spacje / Automatycznie w Preferencjach natychmiast rozstrzyga na nowo otwarty dokument, więc plik rządzony przez .editorconfig lub domyślną wartość języka zachowuje swoje wcięcia bez przełączania kart.

Wiele kursorów

Wszystko powyższe działa przy każdym kursorze, gdy edytujesz z wieloma kursorami: wpisanie ( wstawia () przy każdym, Enter zachowuje wcięcie każdego wiersza, a Backspace między pustymi parami usuwa oba znaki przy każdym. Pojedyncze Cofnij wycofuje całą wielokursorową edycję w jednym kroku.

Backspace przy mieszanych kursorach

Backspace usuwa pary tylko wtedy, gdy każdy kursor stoi między pustą parą. Jeśli część kursorów jest gdzie indziej, Backspace wraca do normalnego zachowania przy wszystkich, więc nigdy nie usunie zbędnego znaku zamykającego przy jednym kursorze, gdy przy innym edytujesz słowo.

W komentarzach i łańcuchach

Gdy aktywny jest kolorizator składni, autoparowanie i otwieranie bloku po klamrze wycofują się wewnątrz komentarzy i literałów łańcuchowych/znakowych — tam { czy " to zwykły tekst, nie kod, więc edytor zostawia go dokładnie tak, jak wpisano. Zwykłe wcinanie (przenoszenie białych znaków poprzedniego wiersza) nadal działa. W dokumencie tekstowym bez kolorizatora nie ma czego wyciszać, więc parowanie działa wszędzie tak samo.

Powiązane