diff --git a/notes/emacs-macos-build.org b/notes/emacs-macos-build.org index 5a528a6..7d8517d 100644 --- a/notes/emacs-macos-build.org +++ b/notes/emacs-macos-build.org @@ -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ě 5–15 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= diff --git a/notes/emacs-matrix.org b/notes/emacs-matrix.org index b26bb16..c4f014c 100644 --- a/notes/emacs-matrix.org +++ b/notes/emacs-matrix.org @@ -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 - - - - - Label - pantalaimon - ProgramArguments - - /usr/local/bin/pantalaimon - --config - /Users/martin/.config/pantalaimon/pantalaimon.conf - - RunAtLoad - - KeepAlive - - StandardOutPath - /tmp/pantalaimon.log - StandardErrorPath - /tmp/pantalaimon.log - - -#+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= diff --git a/notes/emacs-new-features.org b/notes/emacs-new-features.org new file mode 100644 index 0000000..06ec142 --- /dev/null +++ b/notes/emacs-new-features.org @@ -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 + +** 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í