Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
Martin Sukany
2026-02-23 18:23:42 +01:00
3 changed files with 461 additions and 237 deletions

View File

@@ -2,179 +2,282 @@
#+AUTHOR: Martin Sukaný
#+DATE: 2026-02-23
#+STARTUP: overview
#+include: ~/org/templates/document.org
* Emacs macOS Build s macOS Zoom Accessibility
Návod na buildování GNU Emacs pro macOS s patchem pro =UAZoomChangeFocus=,
který opravuje sledování kurzoru v macOS Zoom "Follow keyboard focus".
Návod na sestavení GNU Emacs pro macOS s patchem, který opravuje sledování
kurzoru při zapnutém macOS Zoom ("Follow keyboard focus"). Postup vychází
z reálné zkušenosti z buildu v únoru 2026.
[[./attachments/image-20260223-145400.png]]
** Proč je to potřeba
** Kontext
macOS Zoom funguje jako magnifier přes celou obrazovku nebo v okně. Režim
"Follow keyboard focus" by měl automaticky posouvat viewport za textovým
kurzorem. Ve vanilla GNU Emacs to ale nefunguje.
macOS Zoom "Follow keyboard focus" ve vanilla GNU Emacs nefunguje. Root cause:
Emacs nemá implementovanou NSAccessibility pro vlastní NSView a hlavně
nevolá =UAZoomChangeFocus()= z =HIServices/UniversalAccess.h=.
Příčina: Emacs má vlastní NSView, který neimplementuje NSAccessibility protokol
a hlavně nevolá =UAZoomChangeFocus()= z =HIServices/UniversalAccess.h=. Tuto funkci
volají iTerm2 (=PTYTextView.m=) i Chromium (=render_widget_host_view_mac.mm=) a
je to jediný spolehlivý způsob, jak Zoom přinutit sledovat kurzor v custom view.
Patch je v repozitáři [[https://git.apps.sukany.cz/martin/emacs-doom][martin/emacs-doom]]
v =patches/0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch=.
Standardní NSAccessibility notifikace samy o sobě nestačí — Zoom je event-driven
a potřebuje explicitní volání =UAZoomChangeFocus()= s aktuální pozicí kurzoru
v souřadnicích AX obrazovky (origin vlevo nahoře, tzn. y-osa je otočená oproti
Cocoa, kde origin je vlevo dole).
** Prerekvizity
Patch je uložený v repozitáři =martin/emacs-doom= na Giteě:
=patches/0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch=
** Krok 1: Prerekvizity
Nejprve nainstaluj Xcode Command Line Tools (nutné pro kompilaci):
#+begin_src sh
# Xcode Command Line Tools
xcode-select --install
# Homebrew závislosti
brew install autoconf libgmp texinfo pkg-config gnutls libxml2 \
jansson tree-sitter librsvg imagemagick
# Volitelné ale doporučené
brew install libgccjit # native compilation
#+end_src
** Stažení zdrojů
Pak nainstaluj závislosti přes Homebrew:
#+begin_src sh
brew install autoconf libgmp texinfo pkg-config gnutls libxml2 jansson tree-sitter librsvg imagemagick
#+end_src
Pro native compilation (volitelné, výrazně rychlejší Emacs):
#+begin_src sh
brew install libgccjit
#+end_src
** Krok 2: Stažení zdrojového kódu Emacs
#+begin_src sh
git clone https://github.com/emacs-mirror/emacs.git
cd emacs
# Doporučená stable větev (aktuálně emacs-30)
git checkout emacs-30
git checkout emacs-31
#+end_src
** Aplikace accessibility patche
Větev =emacs-31= je aktuálně doporučená stable větev. Až bude k dispozici =emacs-32=,
použij tu.
** Krok 3: Aplikace accessibility patche
Stáhni config repozitář s patchem:
#+begin_src sh
# Stáhni patch z martin/emacs-doom
git clone https://git.apps.sukany.cz/martin/emacs-doom.git /tmp/emacs-doom-config
#+end_src
# Aplikuj patch
Aplikuj patch:
#+begin_src sh
git am /tmp/emacs-doom-config/patches/0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch
#+end_src
# Ověř aplikaci
Ověř, že patch byl aplikovaný:
#+begin_src sh
grep "UAZoomChangeFocus" src/nsterm.m | head -3
#+end_src
Patch implementuje:
- =UAZoomChangeFocus()= — přímé volání Zoom API po každém pohybu kurzoru
- =NSAccessibilitySelectedTextChangedNotification= — standardní AX notifikace
- =NSAccessibilityFocusedUIElementChangedNotification= — notifikace při focusu
- =accessibilityBoundsForRange:= — nová NSAccessibilityProtocol API
- =AXBoundsForRange= — starší fallback API
- =NSAccessibilityTextAreaRole= — správná role pro Emacs view
Výsledkem by mělo být několik řádků s voláním =UAZoomChangeFocus=. Pokud grep
nic nevrátí, patch se neaplikoval správně.
** Konfigurace a Build
Co patch přidává do =src/nsterm.m=:
- Volání =UAZoomChangeFocus()= po každém pohybu kurzoru — koordináty jsou
přepočítány z Cocoa (origin vlevo dole) do AX prostoru (origin vlevo nahoře)
ručním y-flipem: =primaryH - y - height=
- =NSAccessibilitySelectedTextChangedNotification= — notifikace po pohybu kurzoru
- =NSAccessibilityFocusedUIElementChangedNotification= — notifikace při zaměření okna
- =accessibilityBoundsForRange:= — nové API (macOS 10.10+)
- Fallback přes starší =AXBoundsForRange= pro starší verze
- =NSAccessibilityTextAreaRole= pro EmacsView
** Krok 4: Konfigurace
Spusť autogen a pak configure. Základní konfigurace (bez native compilation):
#+begin_src sh
./autogen.sh
#+end_src
#+begin_src sh
./configure \
--with-ns \
--with-tree-sitter \
--with-gnutls \
--with-xml2 \
--with-json \
--with-imagemagick \
--with-rsvg \
--with-mailutils \
--without-x \
--without-dbus \
CFLAGS="-O2 -g3"
--with-ns \
--with-tree-sitter \
--with-gnutls \
--with-xml2 \
--with-json \
--with-imagemagick \
--with-rsvg \
--with-mailutils \
--without-x \
--without-dbus \
CFLAGS="-O2 -g3"
#+end_src
# Build — -j počet CPU jader
S native compilation (pokud máš libgccjit):
#+begin_src sh
./configure \
--with-ns \
--with-native-compilation=aot \
--with-tree-sitter \
--with-gnutls \
--with-xml2 \
--with-json \
--without-x \
CFLAGS="-O2 -g3"
#+end_src
** Krok 5: Build
#+begin_src sh
make -j$(sysctl -n hw.ncpu)
#+end_src
# Vytvoří nextstep/Emacs.app
Parametr =-j$(sysctl -n hw.ncpu)= použije všechna dostupná jádra. Build trvá
přibližně 515 minut podle hardwaru.
Po dokončení build vytvoří =nextstep/Emacs.app=:
#+begin_src sh
make install
#+end_src
*** Volitelně: s native compilation (rychlejší Emacs)
** Krok 6: Instalace
Přesuň Emacs.app do /Applications:
#+begin_src sh
./configure \
--with-ns \
--with-native-compilation=aot \
--with-tree-sitter \
--with-gnutls \
--with-xml2 \
--with-json \
--without-x \
CFLAGS="-O2 -g3"
#+end_src
** Instalace
#+begin_src sh
# Přesuň Emacs.app do /Applications
cp -r nextstep/Emacs.app /Applications/Emacs.app
# Vytvoř wrapper script (NE symlink — Emacs nenajde data přes symlink)
sudo tee /usr/local/bin/emacs << 'EOF'
#!/bin/sh
exec /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
EOF
sudo chmod +x /usr/local/bin/emacs
# Ověření
emacs --version
#+end_src
*** Proč wrapper script, ne symlink
Vytvoř wrapper script. Pozor: použij wrapper script, ne symlink. Symlink nefunguje
správně — Emacs počítá cesty k Lisp souborům z =argv[0]=, a přes resolved symlink
je najde špatně. Projeví se to chybami jako:
Symlink (/usr/local/bin/emacs → .../Emacs.app/Contents/MacOS/Emacs) nefunguje
správně. Emacs počítá cesty k Lisp souborům z =argv[0]=, ne přes resolved symlink.
Výsledkem jsou chyby:
#+begin_example
Warning: arch-dependent data dir 'Contents/MacOS/libexec/': No such file or directory
Warning: Lisp directory 'Contents/Resources/lisp': No such file or directory
#+end_example
Wrapper script předává správnou cestu.
** macOS Accessibility nastavení
Po každém novém buildu (nový binary) je potřeba znovu udělit permission:
1. System Settings → Privacy & Security → Accessibility
2. Přidat nové =/Applications/Emacs.app=
3. Zapnout toggle
Bez tohoto kroku =UAZoomChangeFocus()= neovlivní Zoom viewport.
** Doom Emacs sync
Správné řešení — wrapper script:
#+begin_src sh
# Po instalaci
~/.emacs.d/bin/doom sync
sudo tee /usr/local/bin/emacs > /dev/null << 'EOF'
#!/bin/sh
exec /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
EOF
sudo chmod +x /usr/local/bin/emacs
#+end_src
# Pokud doom hledá emacs v jiné cestě
which emacs # musí vrátit /usr/local/bin/emacs
Ověření:
#+begin_src sh
which emacs
emacs --version
#+end_src
** Ověření Zoom funkcionality
Výstup =which emacs= musí být =/usr/local/bin/emacs=.
1. System Settings → Accessibility → Zoom → zapnout "Use keyboard shortcut to zoom"
2. Zoom mode: Full Screen nebo Split Screen
3. Advanced → Zoom follows: =Keyboard focus=
4. Otevři Emacs, začni psát
5. Zoom viewport by měl sledovat kurzor
** Krok 7: Accessibility permission
** Časté problémy
Po každém novém buildu (nový binární soubor) je potřeba znovu udělit oprávnění.
Bez toho =UAZoomChangeFocus()= neovlivní Zoom viewport — volání proběhne, ale
macOS ho ignoruje bez Accessibility přístupu.
| Problém | Příčina | Řešení |
|------------------------------------+---------------------------------------+-----------------------------------------------|
| doom sync: "emacs not found" | Wrapper script chybí nebo není v PATH | Viz sekce Instalace |
| Zoom nesleduje kurzor | Accessibility permission chybí | Přidat Emacs.app znovu do Privacy & Security |
| Zoom nesleduje kurzor | Patch nebyl aplikován | Ověřit: =grep UAZoomChangeFocus src/nsterm.m= |
| Build selže na nsterm.m | Chybí Xcode CLT nebo závislosti | =xcode-select --install= + brew install |
| "Contents/MacOS/libexec not found" | Symlink místo wrapper scriptu | Nahradit wrapper scriptem |
Postup:
1. Otevři System Settings → Privacy & Security → Accessibility
2. Přidej =/Applications/Emacs.app=
3. Zapni toggle vedle Emacs
Pokud Emacs v seznamu už je (ze starého buildu), odeber ho a přidej znovu —
macOS identifikuje aplikace i podle binary hash a starý záznam neplatí.
** Krok 8: Doom Emacs sync
Pokud používáš Doom Emacs, spusť sync po instalaci nového Emacsu:
#+begin_src sh
~/.emacs.d/bin/doom sync
#+end_src
Pokud doom hlásí, že nenajde Emacs, zkontroluj:
#+begin_src sh
which emacs
#+end_src
Musí vrátit =/usr/local/bin/emacs=. Pokud vrátí jinou cestu, je problém
s PATH nebo chybí wrapper script.
** Krok 9: Ověření Zoom funkcionality
Nastav Zoom v System Settings:
1. System Settings → Accessibility → Zoom
2. Zapni "Use keyboard shortcut to zoom" nebo "Use scroll gesture with modifier keys to zoom"
3. Zoom style: Full Screen nebo Window (obojí funguje)
4. Klikni na "Advanced..." → záložka "Zoom Follows the Cursor"
5. Nastav "Zoom follows: Keyboard focus"
Otevři Emacs a začni psát. Zoom viewport by měl automaticky sledovat textový
kurzor při každém pohybu (šipky, PageUp/Down, přechod mezi buffery).
** Řešení problémů
*Zoom nesleduje kurzor*
Nejčastější příčiny jsou dvě. Za prvé, chybí Accessibility permission — viz Krok 7.
Za druhé, patch nebyl správně aplikovaný. Ověření:
#+begin_src sh
grep "UAZoomChangeFocus" /Applications/Emacs.app/Contents/MacOS/../../../src/nsterm.m 2>/dev/null || \
echo "Zkontroluj zdrojový kód nebo přelož znovu"
#+end_src
Nebo v build adresáři:
#+begin_src sh
grep "UAZoomChangeFocus" src/nsterm.m | wc -l
#+end_src
Pokud výsledek je 0, patch chybí. Aplikuj znovu a přelož.
*Build selže na nsterm.m*
Zkontroluj, zda jsou nainstalované Xcode Command Line Tools:
#+begin_src sh
xcode-select -p
#+end_src
Pokud cesta neexistuje nebo vrátí chybu, spusť =xcode-select --install= znovu.
*doom sync hlásí "emacs not found"*
Zkontroluj wrapper script:
#+begin_src sh
cat /usr/local/bin/emacs
#+end_src
Soubor musí existovat a obsahovat =exec /Applications/Emacs.app/Contents/MacOS/Emacs "$@"=.
Pokud neexistuje, viz Krok 6.
*Chyby "libexec not found" nebo "lisp not found" při startu*
Příčina je symlink místo wrapper scriptu. Zkontroluj:
#+begin_src sh
ls -la /usr/local/bin/emacs
#+end_src
Pokud výstup ukazuje =->= (symlink), smaž ho a vytvoř wrapper script podle Kroku 6.
** Reference
- Patch repo: [[https://git.apps.sukany.cz/martin/emacs-doom][martin/emacs-doom]]
- Ghostty issue (stejný problém): https://github.com/nicowillis/Ghostty/issues/4053
- iTerm2 implementace: =PTYTextView.m:refreshAccessibility=
- Chromium implementace: =render_widget_host_view_mac.mm:OnSelectionBoundsChanged=
- Patch repozitář: [[https://git.apps.sukany.cz/martin/emacs-doom][martin/emacs-doom]]
- Podobný problém v Ghostty: https://github.com/nicowillis/Ghostty/issues/4053
- Stejný přístup v iTerm2: =src/PTYTextView.m=, funkce =refreshAccessibility=
- Stejný přístup v Chromium: =render_widget_host_view_mac.mm=, funkce =OnSelectionBoundsChanged=

View File

@@ -6,7 +6,7 @@
* Matrix v Emacsu — Ement.el
Ement.el je nativní Matrix klient pro Emacs. Plná integrace s Doom Emacs
přes prefix =SPC o M=.
přes prefix =SPC o M= (uppercase M — =SPC o m= je obsazeno mu4e).
** Instalace
@@ -20,154 +20,106 @@ Po přidání spustit:
~/.emacs.d/bin/doom sync
#+end_src
** Připojení (bez E2EE)
** Server a účet
Spusť =SPC o M c= nebo =M-x ement-connect=:
- Homeserver: =https://matrix.apps.sukany.cz=
- User ID: =@martin:sukany.cz=
- E2EE: *zakázáno na straně serveru* (=encryption: false= v OpenClaw config) — Pantalaimon se nepoužívá a není potřeba
** Automatické připojení
Emacs se automaticky připojí při startu (=doom-after-init-hook=) pomocí
uložené session. Nepotřebuješ zadávat heslo — token je uložen v souboru:
#+begin_example
~/.doom.d/ement-sessions.el
#+end_example
Při prvním použití (nebo po výmazu session souboru) spusť =SPC o M c=
a zadej:
#+begin_example
Homeserver URL: https://matrix.apps.sukany.cz
User ID: @martin:sukany.cz
Password: (zadej interaktivně)
Password: (interaktivně)
#+end_example
Po prvním připojení se session uloží do =~/.cache/emacs/ement.el= (token).
Příště se připojí automaticky.
Po úspěšném připojení se session uloží a příště je připojení automatické.
** Klávesové zkratky (SPC o M)
| Zkratka | Funkce |
|-----------|----------------------------|
| =SPC o M c= | Připojit (ement-connect) |
| =SPC o M C= | Odpojit |
| =SPC o M l= | Seznam místností |
| =SPC o M r= | Otevřít místnost |
| =SPC o M d= | Přímá zpráva uživateli |
| =SPC o M j= | Připojit se k místnosti |
| =SPC o M n= | Notifikace (nové zprávy) |
| =SPC o M m= | Zmínky (@martin) |
| =SPC o M s= | Manuální sync |
| Zkratka | Funkce |
|-------------|-----------------------------------------------|
| =SPC o M o= | Otevřít panel (inteligentní — viz níže) |
| =SPC o M c= | Připojit (ement-connect) |
| =SPC o M C= | Odpojit |
| =SPC o M l= | Seznam místností |
| =SPC o M r= | Otevřít místnost |
| =SPC o M d= | Přímá zpráva uživateli |
| =SPC o M j= | Připojit se k místnosti |
| =SPC o M n= | Notifikace (nové zprávy) |
| =SPC o M m= | Zmínky (@martin) |
*** Inteligentní otevření panelu (SPC o M o)
=my/ement-open= se chová podle aktuálního stavu:
- Již připojeno → okamžitě otevře seznam místností
- Session soubor existuje → obnoví bez zadání hesla, po sync otevře místnosti
- Žádná session → interaktivní =ement-connect=, pak otevře místnosti
*** V místnosti (room buffer)
| Klávesa | Akce |
|-----------|---------------------------------|
| =RET= | Napsat zprávu |
| =M-RET= | Compose buffer (pro delší text) |
| =S-RET= | Odpovědět na zprávu na pointu |
| =n= / =p= | Další / předchozí zpráva |
| =SPC= | Scroll dolů + označit přečtené |
| =?= | Transient menu (všechny akce) |
| =s r= | Reakce (emoji) |
| =C-k= | Smazat vlastní zprávu |
| =r m= | Seznam členů |
| =M-g M-l= | Přejít na seznam místností |
| Klávesa | Akce |
|-------------|---------------------------------|
| =RET= | Napsat zprávu |
| =M-RET= | Compose buffer (pro delší text) |
| =S-RET= | Odpovědět na zprávu na pointu |
| =n= / =p= | Další / předchozí zpráva |
| =SPC= | Scroll dolů + označit přečtené |
| =?= | Transient menu (všechny akce) |
| =s r= | Reakce (emoji) |
| =C-k= | Smazat vlastní zprávu |
| =r m= | Seznam členů |
| =M-g M-l= | Přejít na seznam místností |
** E2EE — šifrované místnosti přes Pantalaimon
** E2EE
Ement.el sám o sobě E2EE nepodporuje. Řešení: [[https://github.com/matrix-org/pantalaimon][Pantalaimon]] — lokální proxy
démon, který transparentně šifruje/dešifruje zprávy.
E2EE je na serveru *zakázáno* — veškerá komunikace mezi Emacs klientem
a homeserverem probíhá nešifrovaně (ale přes HTTPS). Toto je záměrné
rozhodnutí: Megolm session errors způsobovaly nečitelné zprávy na iOS zařízeních,
spolehlivost je důležitější.
*** Instalace Pantalaimon
Pantalaimon *se nepoužívá* a není potřeba instalovat.
#+begin_src sh
# macOS
brew install pantalaimon
** Konfigurace v config.el
# nebo přes pip
pip3 install pantalaimon
#+end_src
Relevantní sekce (viz =~/.doom.d/config.el=):
- =ement-sessions-file= — nastaven na =~/.doom.d/ement-sessions.el= (před načtením balíčku)
- =ement-save-sessions t= — session se uloží při =kill-emacs=
- =ement-auto-sync t= — na pozadí se synchronizuje automaticky
- =ement-room-show-avatars nil= — avatary jsou vypnuty (výkon)
- =ement-notify-mentions-p t= — notifikace při zmínkách
*** Konfigurace
** Místnosti
Vytvoř =~/.config/pantalaimon/pantalaimon.conf=:
#+begin_src ini
[sukany]
Homeserver = https://matrix.apps.sukany.cz
ListenAddress = localhost
ListenPort = 8009
SSL = yes
#+end_src
*** Spuštění
#+begin_src sh
# Spustit na pozadí
pantalaimon --config ~/.config/pantalaimon/pantalaimon.conf &
# Nebo jako launchd service (macOS) — viz níže
#+end_src
*** Připojení ement přes Pantalaimon
Při =SPC o M c= (ement-connect) zadej jako homeserver proxy URL:
#+begin_example
Homeserver URL: http://localhost:8009
User ID: @martin:sukany.cz
Password: (stejné jako normálně)
#+end_example
Pantalaimon transparentně přepošle vše na =matrix.apps.sukany.cz=
a zašifruje/dešifruje E2EE místnosti.
*** Automatický start Pantalaimon (macOS LaunchAgent)
Vytvoř =~/Library/LaunchAgents/pantalaimon.plist=:
#+begin_src xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>pantalaimon</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/pantalaimon</string>
<string>--config</string>
<string>/Users/martin/.config/pantalaimon/pantalaimon.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/pantalaimon.log</string>
<key>StandardErrorPath</key>
<string>/tmp/pantalaimon.log</string>
</dict>
</plist>
#+end_src
#+begin_src sh
launchctl load ~/Library/LaunchAgents/pantalaimon.plist
#+end_src
*** Poznámka k E2EE ověření klíčů
Při prvním připojení přes Pantalaimon se zobrazí výzva k ověření zařízení
(cross-signing). Ověř v Element nebo jiném klientu — bez toho ement
nemusí zobrazovat zprávy v E2EE místnostech.
** Konfigurace uložena v
- Ement session (token): =~/.cache/emacs/ement.el=
- Pantalaimon data (E2EE klíče): =~/.local/share/pantalaimon/=
- Pantalaimon konfig: =~/.config/pantalaimon/pantalaimon.conf=
| Název | Room ID | Použití |
|----------------------|-----------------------------------------|-----------------------|
| Daneel - AI assistant | =!bVBXrchJJVQRoyHQwU:sukany.cz= | Hlavní DM s Daneel |
| Email summaries | =!okPPZiCqKrzZeGkpzv:sukany.cz= | Email notifikace |
| Nakopni se (Daneel) | =!moHRlJaLrwEBYDDzGg:sukany.cz= | Nakopni se kurz |
| Sprava serveru | =!NmZsNYaigZZensbSIi:sukany.cz= | Infra01 monitoring |
| Weekly review | =!rHpupKCgxNRJoomtij:sukany.cz= | Týdenní přehledy |
** Časté problémy
| Problém | Příčina | Řešení |
|---|---|---|
| "Invalid homeserver" | Špatná URL | Zkontrolovat https://matrix.apps.sukany.cz |
| E2EE místnosti prázdné | Pantalaimon neběží | =pantalaimon &= |
| Zprávy se nezobrazují | Cross-signing neproběhlo | Ověřit zařízení v Element |
| Auto-sync nefunguje | Session nebyla uložena | =SPC o M c= znovu |
| "Unverified device" | Nové zařízení | Ověřit v Element → Settings → Devices |
| Problém | Příčina | Řešení |
|--------------------------------|--------------------------------|-------------------------------------------------|
| Auto-connect nefunguje | Session soubor chybí nebo poškozený | =SPC o M c= pro nové přihlášení |
| "Invalid homeserver" | Špatná URL | Zkontrolovat =https://matrix.apps.sukany.cz= |
| Zprávy se nezobrazují | Session expirovala | =SPC o M C= → =SPC o M c= |
| Pomalý start | Avatary zapnuty | =(setq ement-room-show-avatars nil)= |
** Reference
- [[https://github.com/alphapapa/ement.el][ement.el GitHub]]
- [[https://github.com/matrix-org/pantalaimon][Pantalaimon GitHub]]
- Konfigurace: =~/.doom.d/config.el= (sekce MATRIX)
- Session soubor: =~/.doom.d/ement-sessions.el=

View File

@@ -0,0 +1,169 @@
#+TITLE: Doom Emacs — testovací průvodce novými featurami
#+DATE: 2026-02-23
#+STARTUP: showall
* link-hint — rychlá navigace po odkazech
Umožňuje otevřít nebo zkopírovat jakýkoli odkaz v bufferu pomocí avy-style přeskakování.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Buffer obsahuje alespoň jeden odkaz (org link, URL, file path)
** Jak otestovat
1. Otevři libovolný org soubor s odkazy (např. =inbox.org=)
2. Stiskni =SPC j k= — měly by se objevit avy hinty na všech odkazech
3. Vyber hint → odkaz se otevře v prohlížeči/Emacsu
4. Stiskni =SPC j K= → vyber odkaz → URL se zkopíruje do clipboard
** Ověření
- =SPC j k= zobrazí hinty a odkaz se otevře
- =SPC j K= zkopíruje URL (ověř přes =C-y= / paste)
* Avy keybindings — skoky na znaky a řádky
Rozšířené avy bindingy pod =SPC j= pro rychlou navigaci v bufferu.
** Prerekvizity
- =doom sync= proběhl úspěšně
** Jak otestovat
1. Otevři libovolný soubor s textem
2. =SPC j j= → zadej 2 znaky → avy zobrazí hinty na výskytech
3. Vyber hint → kurzor skočí na pozici
4. =SPC j l= → avy zobrazí hinty na řádcích → vyber řádek
** Ověření
- Kurzor se přesune na vybranou pozici
* olivetti-mode — distraction-free psaní
Centruje text na šířku 90 znaků pro pohodlné čtení a psaní.
** Prerekvizity
- =doom sync= proběhl úspěšně
** Jak otestovat
1. Otevři org soubor — olivetti se zapne automaticky (hook)
2. Ověř, že text je vycentrovaný s okraji po stranách
3. Otevři markdown soubor — stejné chování
4. V jiném režimu (např. elisp): =SPC t o= pro manuální toggle
** Ověření
- Org/markdown buffery mají centrovaný text na ~90 znaků
- =SPC t o= zapíná/vypíná olivetti v libovolném bufferu
* org-modern — vizuální vylepšení org-mode
Nahrazuje hvězdičky nadpisů symboly (◉○✸✿), vylepšuje tabulky a checkboxy.
** Prerekvizity
- =doom sync= proběhl úspěšně
** Jak otestovat
1. Otevři org soubor s nadpisy různých úrovní
2. Zkontroluj, že =*= jsou nahrazeny symboly ◉, ○, ✸, ✿
3. Vytvoř tabulku — měla by mít vylepšený vizuální styl
4. Vytvoř checkbox =[X]= / =[ ]= — měl by být stylizovaný
** Ověření
- Nadpisy používají Unicode symboly místo hvězdiček
- Tabulky a checkboxy vypadají vizuálně lépe
* org-fragtog — automatický render LaTeX fragmentů
Při přesunutí kurzoru na/z LaTeX fragmentu se automaticky zobrazí/skryje náhled.
** Prerekvizity
- =doom sync= proběhl úspěšně
- LaTeX nainstalovaný (=latexmk= v PATH)
** Jak otestovat
1. Otevři org soubor a vlož LaTeX fragment: =$E = mc^2$=
2. Přesuň kurzor pryč z fragmentu → měl by se vyrenderovat jako obrázek
3. Přesuň kurzor zpět na fragment → zobrazí se zdrojový kód
** Ověření
- LaTeX fragmenty se automaticky renderují/skrývají při pohybu kurzoru
* org-super-agenda — skupiny v agenda view
Rozděluje agenda view do pojmenovaných skupin: Dnes, Brzy, Čekám, Kyndryl, ZTJ, Ostatní.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Existují org soubory s TODO položkami (různé stavy, tagy, deadlines)
** Jak otestovat
1. Přidej několik TODO s různými vlastnostmi:
- =TODO= s deadline dnes
- =TODO= s deadline za 2 dny
- =WAIT= položka
- =TODO= s tagem =:kyndryl:=
- =TODO= s tagem =:ztj:=
2. Otevři agenda: =SPC o A a= (nebo =M-x org-agenda=, volba =a=)
3. Zkontroluj, že položky jsou rozděleny do skupin
** Ověření
- Agenda zobrazuje sekce: Dnes, Brzy, Čekám, Projekt Kyndryl, ZTJ, Ostatní
* org-noter — PDF anotace
Umožňuje vytvářet org poznámky synchronizované s pozicí v PDF dokumentu.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Existuje PDF soubor k anotování
** Jak otestovat
1. Otevři PDF soubor v Emacsu (=pdf-view-mode=)
2. =SPC o n= → spustí org-noter session (vytvoří/otevře org soubor)
3. Naviguj na stránku v PDF
4. =SPC o N= → vloží poznámku na aktuální pozici
** Ověření
- Emacs se rozdělí horizontálně (PDF vlevo, org vpravo)
- Poznámky jsou provázané s pozicí v PDF
* GPTel rewrite — vylepšení textu přes AI
Odešle vybraný region do GPTel s instrukcí "vylepši" a nahradí odpovědí.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Env proměnná =OPENWEBUI_API_KEY= je nastavena
- AI backend (ai.apps.sukany.cz) je dostupný
** Jak otestovat
1. Otevři soubor s textem
2. Označ region (=v= + pohyb v evil normal mode)
3. =SPC o g r= → region se odešle do GPTel → odpověď nahradí region
4. V org souboru: umísti kurzor na heading, =SPC o g p= → heading + obsah se odešle jako kontext do GPTel chatu
** Ověření
- =SPC o g r= nahradí vybraný text vylepšenou verzí
- =SPC o g p= otevře GPTel chat s obsahem heading jako kontextem
* git-link — kopírování URL na Gitea
Generuje webový odkaz na aktuální soubor/řádek v Gitea repozitáři.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Soubor je v git repozitáři s remote na =git.apps.sukany.cz=
** Jak otestovat
1. Otevři soubor v git repozitáři (např. v emacs-doom)
2. =SPC g y= → zkopíruje URL na aktuální soubor/řádek do clipboard
3. =SPC g Y= → zkopíruje URL na aktuální commit
** Ověření
- URL v clipboard ukazuje na =git.apps.sukany.cz/...= a je funkční v prohlížeči
* Forge — Gitea integrace v Magitu
Přidává podporu pro Gitea issues, PRs a notifikace přímo v Magit.
** Prerekvizity
- =doom sync= proběhl úspěšně
- Gitea API token vytvořen a uložen v =~/.authinfo=:
: machine git.apps.sukany.cz login daneel^forge password <TOKEN>
** Jak otestovat
1. Otevři Magit v repozitáři hostovaném na Gitea: =SPC g g=
2. Stiskni =N= (forge notifications) nebo ='= (forge dispatch)
3. =@ l l= — list issues
** Ověření
- Forge se připojí ke Gitea API a zobrazí issues/PRs
- Pokud token chybí, Forge zobrazí chybu s instrukcí