Запись обновлена в июле 2026.
Связать редактор и просмотрщик PDF в обе стороны:
.tex подсветить
соответствующее место в zathura (Ctrl+Enter);Ctrl+клик в zathura переносит на нужную
строку в ту инстанцию MacVim, где этот .tex уже открыт; если он не
открыт нигде — открывает новую инстанцию.Forward-поиск завязан на D-Bus, которого в macOS нет. Чтобы
zathura --synctex-forward нашёл уже открытое окно с нужным PDF, zathura
общается с ним через freedesktop D-Bus session bus. В macOS такой шины
нет, и попытка форварда падает:
1 | error: Could not connect to session bus: Could not connect: Connection refused |
Решение — session-шина как launchd-агент (идёт в комплекте homebrew-пакета
dbus). Шина одна на весь логин-сеанс и общая для всех приложений: zathura,
запущенная хоть из vim, хоть из терминала, видна форварду.
Поднимать свой dbus-daemon из vim хуже: zathura, открытая не из vim,
оказывается на другой шине, forward её не находит и будет дублировать окна.
Backward-поиск на MacVim.
mvim --remote-silent шлёт файл в «дефолтный» сервер — то есть в первую
попавшуюся инстанцию MacVim, где :drop молча заменяет активную вкладку
чем-то посторонним. Значит, редактор-команда должна сама найти инстанцию,
в которой файл открыт, а если такой нет — открыть новую. Это делает
скрипт-обёртка (см. ниже).
Установите zathura с поддержкой synctex на Mac OS.
1 | brew tap zegervdv/zathura |
Запустите D-Bus session-шину как launchd-агент (сам dbus уже стоит как
зависимость zathura):
1 | brew services start dbus |
Это регистрирует агент org.freedesktop.dbus-session с socket-активацией:
launchd сам создаёт сокет и публикует его путь в переменной
DBUS_LAUNCHD_SESSION_BUS_SOCKET — откуда мы его и заберём в vimrc.
Также, разумеется, установите LaTeX и MacVim.
~/.config/zathura/zathurarc:
1 | set dbus-service true |
dbus-service true включает D-Bus-интерфейс (нужен для forward). Для backward
вместо голого mvim вызывается скрипт-обёртка.
1 | " forward-search zathura ищет открытое окно через D-Bus session bus. В macOS |
Несколько пояснений, почему именно так:
job_start, а не :!...&. В MacVim :! синхронный (блокирует ввод до
закрытия программы), а фоновый & из GUI-MacVim часто гибнет от SIGHUP, когда
завершается породивший его временный шелл. job_start запускает zathura как
настоящий асинхронный процесс, которым управляет сам vim, — окно появляется,
управление возвращается мгновенно.realpath). SyncTeX и zathura сопоставляют
файлы по строке пути: open и forward обязаны передавать одну и ту же
строку, иначе zathura не узнаёт уже открытый PDF и открывает второе окно.
Заодно realpath спасает от расхождений в регистре и симлинков.launchctl getenv возвращает сокет
launchd-агента; vim лишь прописывает его в DBUS_SESSION_BUS_ADDRESS, чтобы
дочерние zathura попали на общую шину.<C-CR> (а не <C-enter>) — так клавишу Ctrl+Enter надёжнее распознаёт
MacVim в GUI.~/.local/bin/mvim-synctex (не забудьте chmod +x):
1 |
|
На какие грабли можно наступить без скрипта:
mvim --remote-silent без --servername заменяет чужую вкладку. Файл
уходит в дефолтный сервер (какая-то из открытых инстанций), и :drop
открывает его вместо активного буфера. Поэтому сначала опрашиваем все серверы
из --serverlist и шлём файл только туда, где он уже открыт, — там :drop
просто перейдёт на его вкладку.--remote-expr в MacVim «падает», но работает. Клиент печатает результат
выражения в stderr с припиской Send expression failed., а stdout оставляет
пустым. Если читать stdout (как обычно), проверка не сработает никогда —
отсюда 2>&1 и сравнение по префиксу 1*.realpath со
стороны шелла и resolve(fnamemodify(...,":p")) со стороны vim приводят оба
пути к одному виду.mvim без --remote. Каждый такой запуск
создаёт отдельный vim-процесс со своим server name (VIM, VIM1, …),
существующие окна не затрагиваются..tex в MacVim (mvim file.tex).F11 — скомпилировать с -synctex=1 (для надёжных ссылок прогнать дважды).Alt+8 — открыть превью в zathura (под общей D-Bus-шиной).Ctrl+Enter на нужной строке — zathura подсвечивает соответствующее место
(forward). Если pdf не был открыт, то он откроется и по Ctrl+Enter.Ctrl+левый клик в zathura — переход на нужную строку в той инстанции
MacVim, где открыт этот .tex; если не открыт нигде — новая инстанция
(backward).Если zathura была запущена до старта launchd-агента (или до внесения правок), перезапустите её: окна, открытые вне общей шины, на forward-поиск не отзовутся.