This commit is contained in:
Martin Sukany
2026-02-23 18:17:47 +01:00
parent a03961d781
commit 6f964958c9
15 changed files with 920 additions and 327 deletions

272
notes/emacs-macos-build.tex Normal file
View File

@@ -0,0 +1,272 @@
% Created 2026-02-23 Mon 15:25
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper,11pt]{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{tabularx}
\usepackage[czech, english]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{microtype}
\sloppy
\usepackage{helvet}
\renewcommand{\familydefault}{\sfdefault}
\usepackage[a4paper,margin=2.2cm]{geometry}
\usepackage[table,x11names]{xcolor}
\definecolor{kyndrylRed}{RGB}{196,0,0}
\definecolor{linkcolor}{RGB}{196,0,0}
\definecolor{tableOdd}{RGB}{252,252,252}
\definecolor{tableEven}{RGB}{237,237,237}
\usepackage{hyperref}
\hypersetup{colorlinks=true,linkcolor=linkcolor,urlcolor=linkcolor,citecolor=linkcolor}
\usepackage{xurl}
\usepackage{graphicx}
\usepackage{array}
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{ltablex}
\keepXColumns
\usepackage{booktabs}
\usepackage{colortbl}
\usepackage{etoolbox}
\usepackage{ragged2e}
\AtBeginEnvironment{longtable}{\rowcolors{1}{tableOdd}{tableEven}}
\AtBeginEnvironment{tabularx}{\rowcolors{1}{tableOdd}{tableEven}}
\AtBeginEnvironment{tabular}{\rowcolors{1}{tableOdd}{tableEven}}
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}
\newcolumntype{Z}{>{\Centering\arraybackslash}X}
\newcolumntype{R}{>{\RaggedLeft\arraybackslash}X}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{\small\nouppercase{\leftmark}}
\rhead{\small\thepage}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\headrule}{\hbox to\headwidth{\color{kyndrylRed}\leaders\hrule height \headrulewidth\hfill}}
\usepackage{listings}
\lstset{backgroundcolor=\color{yellow!20},basicstyle=\ttfamily\small,breaklines=true,frame=single}
\usepackage{titling}
\renewcommand{\maketitle}{%
\begin{titlepage}\centering\vspace*{\fill}%
{\LARGE\bfseries\thetitle\par}\vspace{1em}%
{\large\theauthor\par}\vspace{2em}%
{\normalsize\itshape\thedate\par}\vspace{2em}%
\includegraphics[width=0.30\textwidth]{~/org/templates/logo.png}\par%
\vspace*{\fill}\end{titlepage}}
\author{Martin Sukaný Martin Sukany}
\date{2026-02-23 \today}
\title{Emacs macOS Build — UAZoom Accessibility Patch}
\hypersetup{
pdfauthor={Martin Sukaný Martin Sukany},
pdftitle={Emacs macOS Build — UAZoom Accessibility Patch},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 31.0.50 (Org mode 9.7.11)},
pdflang={English}}
\usepackage{biblatex}
\begin{document}
\maketitle
\setcounter{tocdepth}{2}
\tableofcontents
\part{Emacs macOS Build s macOS Zoom Accessibility}
\label{sec:orgbc265a8}
Návod na buildování GNU Emacs pro macOS s patchem pro \texttt{UAZoomChangeFocus},
který opravuje sledování kurzoru v macOS Zoom ``Follow keyboard focus''.
\begin{center}
\includegraphics[width=.9\linewidth]{./attachments/image-20260223-145400.png}
\end{center}
\chapter{Kontext}
\label{sec:orgedb4055}
macOS Zoom ``Follow keyboard focus'' ve vanilla GNU Emacs nefunguje. Root cause:
Emacs nemá implementovanou NSAccessibility pro vlastní NSView a hlavně
nevolá \texttt{UAZoomChangeFocus()} z \texttt{HIServices/UniversalAccess.h}.
Patch je v repozitáři \href{https://git.apps.sukany.cz/martin/emacs-doom}{martin/emacs-doom}
v \texttt{patches/0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch}.
\chapter{Prerekvizity}
\label{sec:org4f3757f}
\begin{verbatim}
# 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{verbatim}
\chapter{Stažení zdrojů}
\label{sec:org89bef97}
\begin{verbatim}
git clone https://github.com/emacs-mirror/emacs.git
cd emacs
# Doporučená stable větev (aktuálně emacs-30)
git checkout emacs-30
\end{verbatim}
\chapter{Aplikace accessibility patche}
\label{sec:orgc3ebf97}
\begin{verbatim}
# Stáhni patch z martin/emacs-doom
git clone https://git.apps.sukany.cz/martin/emacs-doom.git /tmp/emacs-doom-config
# Aplikuj patch
git am /tmp/emacs-doom-config/patches/0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch
# Ověř aplikaci
grep "UAZoomChangeFocus" src/nsterm.m | head -3
\end{verbatim}
Patch implementuje:
\begin{itemize}
\item \texttt{UAZoomChangeFocus()} — přímé volání Zoom API po každém pohybu kurzoru
\item \texttt{NSAccessibilitySelectedTextChangedNotification} — standardní AX notifikace
\item \texttt{NSAccessibilityFocusedUIElementChangedNotification} — notifikace při focusu
\item \texttt{accessibilityBoundsForRange:} — nová NSAccessibilityProtocol API
\item \texttt{AXBoundsForRange} — starší fallback API
\item \texttt{NSAccessibilityTextAreaRole} — správná role pro Emacs view
\end{itemize}
\chapter{Konfigurace a Build}
\label{sec:orga135a39}
\begin{verbatim}
./autogen.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"
# Build — -j počet CPU jader
make -j$(sysctl -n hw.ncpu)
# Vytvoří nextstep/Emacs.app
make install
\end{verbatim}
\section{Volitelně: s native compilation (rychlejší Emacs)}
\label{sec:orgc6ab781}
\begin{verbatim}
./configure \
--with-ns \
--with-native-compilation=aot \
--with-tree-sitter \
--with-gnutls \
--with-xml2 \
--with-json \
--without-x \
CFLAGS="-O2 -g3"
\end{verbatim}
\chapter{Instalace}
\label{sec:org41b25a4}
\begin{verbatim}
# 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{verbatim}
\section{Proč wrapper script, ne symlink}
\label{sec:orgaf28f28}
Symlink (/usr/local/bin/emacs → \ldots{}/Emacs.app/Contents/MacOS/Emacs) nefunguje
správně. Emacs počítá cesty k Lisp souborům z \texttt{argv[0]}, ne přes resolved symlink.
Výsledkem jsou chyby:
\begin{verbatim}
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{verbatim}
Wrapper script předává správnou cestu.
\chapter{macOS Accessibility nastavení}
\label{sec:org8c7a25a}
Po každém novém buildu (nový binary) je potřeba znovu udělit permission:
\begin{enumerate}
\item System Settings → Privacy \& Security → Accessibility
\item Přidat nové \texttt{/Applications/Emacs.app}
\item Zapnout toggle
\end{enumerate}
Bez tohoto kroku \texttt{UAZoomChangeFocus()} neovlivní Zoom viewport.
\chapter{Doom Emacs sync}
\label{sec:orgc761c2d}
\begin{verbatim}
# Po instalaci
~/.emacs.d/bin/doom sync
# Pokud doom hledá emacs v jiné cestě
which emacs # musí vrátit /usr/local/bin/emacs
emacs --version
\end{verbatim}
\chapter{Ověření Zoom funkcionality}
\label{sec:org958f18c}
\begin{enumerate}
\item System Settings → Accessibility → Zoom → zapnout ``Use keyboard shortcut to zoom''
\item Zoom mode: Full Screen nebo Split Screen
\item Advanced → Zoom follows: \texttt{Keyboard focus}
\item Otevři Emacs, začni psát
\item Zoom viewport by měl sledovat kurzor
\end{enumerate}
\chapter{Časté problémy}
\label{sec:orge650202}
\begin{center}
\begin{tabularx}{\linewidth}{lYY}
Problém & Příčina & Řešení\\
\hline
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: \texttt{grep UAZoomChangeFocus src/nsterm.m}\\
Build selže na nsterm.m & Chybí Xcode CLT nebo závislosti & \texttt{xcode-select -{}-{}install} + brew install\\
``Contents/MacOS/libexec not found'' & Symlink místo wrapper scriptu & Nahradit wrapper scriptem\\
\end{tabularx}
\end{center}
\chapter{Reference}
\label{sec:org4660c16}
\begin{itemize}
\item Patch repo: \href{https://git.apps.sukany.cz/martin/emacs-doom}{martin/emacs-doom}
\item Ghostty issue (stejný problém): \url{https://github.com/nicowillis/Ghostty/issues/4053}
\item iTerm2 implementace: \texttt{PTYTextView.m:refreshAccessibility}
\item Chromium implementace: \texttt{render\_widget\_host\_view\_mac.mm:OnSelectionBoundsChanged}
\end{itemize}
\end{document}