VIM - digrafy

Andrzej Galiński · 2021-02-15

Jak wprowadzać w VIMie specjalne symbole (np. matematyczne)?

VIM pozwala wpisywać symbole specjalne za pomocą dwuliterowych skrótów. Digrafy wprowadza się w trybie edycji, <ctrl>K<znak><znak>. Dodatkowo, można włączyć opcję digraph, która umożliwia wprowadzanie digrafów za pomocą backspace: <znak><bs><znak2>.

Komenda :digraphs wyświetla listę obecnie zdefiniowanych digrafów.

:digraphs
NU ^@  10    SH ^A   1    SX ^B   2    EX ^C   3
ET ^D   4    EQ ^E   5    AK ^F   6    BL ^G   7
BS ^H   8    HT ^I   9    LF ^@  10    VT ^K  11
FF ^L  12    CR ^M  13    SO ^N  14    SI ^O  15
DL ^P  16    D1 ^Q  17    D2 ^R  18    D3 ^S  19
(...)
-o º  186    >> »  187    14 ¼  188    12 ½  189
34 ¾  190    ?I ¿  191    A! À  192    A' Á  193
A> Â  194    A? Ã  195    A: Ä  196    AA Å  197
AE Æ  198    C, Ç  199    E! È  200    E' É  201
(...)
Om Ω  8486   AO Å  8491   13 ⅓  8531   23 ⅔  8532
15 ⅕  8533   25 ⅖  8534   35 ⅗  8535   45 ⅘  8536
16 ⅙  8537   56 ⅚  8538   18 ⅛  8539   38 ⅜  8540

Znaki diakrytyczne i alfabety

Bardzo dużo domyślnych digrafów służy do dodawania znaków diakrytycznych do liter łacińskich i pisania w niełacińskich systemach pisma (alfabetach, sylabariuszach):

!	(a! → à) grawis 
'	(a' → á) akut
>	(a> → â) cyrkumfleks (naprawdę tak się nazywa!)
?	(a? → ã) tylda
-	(a- → ā) makron
(	(a( → ă) brewis
.	(z. → ż) kropka 
:	(a: → ä) umlaut
;	(a; → ą) ogonek
<	(s< → š) haczek
/	(l/ → ł) przekreślenie
=	(b= → б) cyrylica
*	(a* → α) grecki
%	(%Z → Ж) nietypowe litery greckie/cyrylica 

Domyślnie dostępne są jeszcze zestawy znaków sylabariuszy japońskich, alfabetów hebrajskiego, arabskiego, itd.

Znaki kontrolne

Znaki z początku tabeli ASCII też mają swoje digrafy:

NU (0, NULL, w VIMie oznaczany jako ^@)
BS (8, Backspace, w VIMie ^H)
HT (9, [Horizontal] Tab, w VIMie ^I albo po prostu tab)
LF (10, Line Feed, \n, w VIMie ^M)
CR (13, Carriage Return, \r, w VIMie ^@)
itd.

Uwagi:

  • tak wstawiona tabulacja nie zostanie przetłumaczona przez expandtab
  • CR/LF - jeśli potrzebny jest konkretny, a nie pamiętamy czy to 10, czy 13
  • NULL - np. do przykładów w C :)
  • Znaki takie jak null czy tab prościej jest wstawiać w trybie wklejania dosłownego (^V<znak> / ^V<decimal/hex>): ^V009 = ^Vx09. W ten sposób można też szybko zdekodować znak o znanym kodzie ASCII: ^V088 -> X.

Różne symbole (matematyczne i nie tylko)

14 ¼ (58 → ⅝ itd.)
+- ±
>> »
<< «
-> →
<- ←
-v ↓
-! ↑
<> ↔
=> ⇒
<= ⇐
== ⇔
FA ∀ (For All)
TE ∃ (There Exists)
AN ∧
OR ∨
NO ¬
-) ∋
(- ∈
!= ≠
(U ∩
)U ∪
>= ≥
=< ≤
RT √
DG ° (degree)
%0 ‰
Pd £
Eu €
SE §
Co ©
My µ
TM ™
Om Ω
AO Å
2S ² (Superscript)
4s ₄ (subscript)
:9 i "9 → „” cudzysłowy drukarskie

Digrafami można też rysować ramki - ale czy na pewno powinno się to robić?

dr hh hh hh hh dl
vv             vv
ur hh hh hh hh ul

┌─────┐
│     │
└─────┘

Księżyc, gwiazdy i wiele, wiele innych:

0m ○
0R ◑
0M ●
0L ◐
*1 ☆
*2 ★
SU ☼
<H ☜
>H ☞
0u ☺
0U ☻
Fm ♀
Ml ♂
Md ♩
M8 ♪
M2 ♫
...

Definiowanie własnych digrafów

Jeśli jakiegoś mapowania nie ma na domyślnej liście, można je dodać poleceniem :digraph <znak><znak> <kod>. Np. dla gruzińskiej litery “Doni”:

(unicode)
10D3	GEORGIAN LETTER DON

(bash)
$ echo 'ibase=16; 10D3' | bc   # bash-calculator może konwertować hex->dec
4307

(vim)
:digraph gd 4307
^Kgd → დ

Można definiować digrafy z podstawowego zakresu Unicode… ale nie tylko. Emotki też można dodać (przynajmniej te jednoznakowe):

0x1F600 128512 - grinning face
0x1F44D 128077 - thumbs up

:digraph :) 128512
:digraph tu 128077
😀👍

Rozmaitości

  • Jeśli musimy pracować na klawiaturze bez polskich znaków, ale mamy VIMa skompilowanego z opcją +digraph, to możemy pisać po polsku za pomocą digrafów. Można też poświęcić jakiś rzadko używany znak i dodać mapowania takie jak :inoremap qa ą, żeby nie musieć co chwilę wciskać ^K.
  • Wpisywanie znaków diakrytycznych z innych języków jest kłopotliwe, prościej zainstalować sobie inną klawiaturę. Ale jeśli potrzebny jest tylko jeden znak specjalny, warto mieć w głowie mnemoniki.
  • Włączenie trybu digraph początkującemu Vimowcowi byłoby pewnie bardziej frustrujące niż klasyczny problem z wyjściem z edytora.
  • Wpisywanie liter z innych alfabetów może być ryzykowne - np. duża grecka Alfa, Α wygląda całkiem jak łacińskie A, ale nie da się jej wyszukać. Można to sprawdzić nawet na tej stronie: Aa ≠ Αα.
  • Nie ma co być zbyt sprytnym - często lepiej mieć w pliku H2SO4 i możliwość wyszukania po fragmencie tekstu, niż ładniejsze, ale trudne do automatycznego przetwarzania znaki w H₂SO₄.
  • Są wygodniejsze metody wprowadzania emotek niż rzeźbienie w digrafach (junegunn/vim-emoji).
  • “Digraph” to po polsku dwuznak, czyli dwa znaki czytane wspólnie, jako jedna głoska. Digrafy w VIMie to coś innego - służą do zastępowania dwuliterowego skrótu innym symbolem, na dodatek nie mającym nic wspólnego z fonetyką (jak przeczytać “>>”?) - dlatego stosuję spolszczenie pisowni zamiast tłumaczenia. 😀

Linki