new
This commit is contained in:
BIN
notes/attachments/image-20260223-145400.png
Normal file
BIN
notes/attachments/image-20260223-145400.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 200 KiB |
0
notes/emacs-macos-build.bbl
Normal file
0
notes/emacs-macos-build.bbl
Normal file
@@ -2,12 +2,15 @@
|
||||
#+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".
|
||||
|
||||
[[./attachments/image-20260223-145400.png]]
|
||||
|
||||
** Kontext
|
||||
|
||||
macOS Zoom "Follow keyboard focus" ve vanilla GNU Emacs nefunguje. Root cause:
|
||||
@@ -161,13 +164,13 @@ emacs --version
|
||||
|
||||
** Časté problémy
|
||||
|
||||
| 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 |
|
||||
| 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 |
|
||||
|
||||
** Reference
|
||||
|
||||
|
||||
BIN
notes/emacs-macos-build.pdf
Normal file
BIN
notes/emacs-macos-build.pdf
Normal file
Binary file not shown.
272
notes/emacs-macos-build.tex
Normal file
272
notes/emacs-macos-build.tex
Normal 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}
|
||||
Reference in New Issue
Block a user