From 8c9847e321bf277e5f8de8d7b7eca6a17dd86b8e Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:05:16 -0500 Subject: [PATCH 1/9] build: split nix dev shell into `default` and `presets` (#48) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: the single dev shell mixed dev tooling (linters, test runner) with preset compiler tools, causing heavy rebuilds (e.g. Chromium for `mermaid-cli`) for contributors who only need the dev tools. Solution: extract dev tooling into a shared `devTools` list and expose two shells — `default` for development and `presets` for running all built-in preset compilers (`typst`, `texliveMedium`, `tectonic`, `pandoc`, `asciidoctor`, `quarto`, `plantuml`, `mermaid-cli`). --- flake.nix | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/flake.nix b/flake.nix index d5bdae4..636f4d0 100644 --- a/flake.nix +++ b/flake.nix @@ -19,9 +19,9 @@ { formatter = forEachSystem (pkgs: pkgs.nixfmt-tree); - devShells = forEachSystem (pkgs: { - default = pkgs.mkShell { - packages = [ + devShells = forEachSystem (pkgs: + let + devTools = [ (pkgs.luajit.withPackages ( ps: with ps; [ busted @@ -32,10 +32,24 @@ pkgs.stylua pkgs.selene pkgs.lua-language-server - pkgs.plantuml - pkgs.mermaid-cli ]; - }; - }); + in + { + default = pkgs.mkShell { + packages = devTools; + }; + presets = pkgs.mkShell { + packages = devTools ++ [ + pkgs.typst + pkgs.texliveMedium + pkgs.tectonic + pkgs.pandoc + pkgs.asciidoctor + pkgs.quarto + pkgs.plantuml + pkgs.mermaid-cli + ]; + }; + }); }; } From 00caad18bfb2196fd6ed79a95315d0a4a5b5af82 Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Thu, 5 Mar 2026 12:05:34 -0500 Subject: [PATCH 2/9] refactor(presets): simplify `mermaid` error parser (#49) * feat: add `mermaid` preset Problem: no built-in support for compiling mermaid diagrams via `mmdc`. Solution: add a `mermaid` preset that compiles `.mmd` files to SVG and parses `Parse error on line N` diagnostics from stderr. Add `mermaid-cli` to the nix dev shell. * refactor(presets): simplify `mermaid` error parser Problem: the inline `mermaid` error_parser looped over every line and used the `Parse error on line N:` header as the message, losing the useful `Expecting ..., got ...` token detail. Solution: extract `parse_mermaid` alongside the other parse functions, use a single `output:match` (mermaid's JISON parser stops at the first error), and surface the `Expecting ..., got ...` line as the message. * ci: format * ci: format --- flake.nix | 6 ++++-- lua/preview/presets.lua | 32 +++++++++++++++++++------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/flake.nix b/flake.nix index 636f4d0..f6c279b 100644 --- a/flake.nix +++ b/flake.nix @@ -19,7 +19,8 @@ { formatter = forEachSystem (pkgs: pkgs.nixfmt-tree); - devShells = forEachSystem (pkgs: + devShells = forEachSystem ( + pkgs: let devTools = [ (pkgs.luajit.withPackages ( @@ -50,6 +51,7 @@ pkgs.mermaid-cli ]; }; - }); + } + ); }; } diff --git a/lua/preview/presets.lua b/lua/preview/presets.lua index 1b5333e..d4b03cc 100644 --- a/lua/preview/presets.lua +++ b/lua/preview/presets.lua @@ -115,6 +115,24 @@ local function parse_asciidoctor(output) return diagnostics end +---@param output string +---@return preview.Diagnostic[] +local function parse_mermaid(output) + local lnum = output:match('Parse error on line (%d+)') + if not lnum then + return {} + end + local msg = output:match('(Expecting .+)') or 'parse error' + return { + { + lnum = tonumber(lnum) - 1, + col = 0, + message = msg, + severity = vim.diagnostic.severity.ERROR, + }, + } +end + ---@type preview.ProviderConfig M.typst = { ft = 'typst', @@ -313,19 +331,7 @@ M.mermaid = { return (ctx.file:gsub('%.mmd$', '.svg')) end, error_parser = function(output) - local diagnostics = {} - for line in output:gmatch('[^\r\n]+') do - local lnum = line:match('^%s*Parse error on line (%d+)') - if lnum then - table.insert(diagnostics, { - lnum = tonumber(lnum) - 1, - col = 0, - message = line, - severity = vim.diagnostic.severity.ERROR, - }) - end - end - return diagnostics + return parse_mermaid(output) end, clean = function(ctx) return { 'rm', '-f', (ctx.file:gsub('%.mmd$', '.svg')) } From 1fbc307badcad1454d65694b673cc986c94cf697 Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:24:52 -0500 Subject: [PATCH 3/9] Update README to refine project description --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 80a2650..1c59fd6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # preview.nvim -**Universal document previewer for Neovim** +**Universal previewer for Neovim** An extensible framework for compiling and previewing _any_ documents (LaTeX, Typst, Markdown, etc.)—diagnostics included. From 8dd8b533cccaa2669dc0b5f18a07297034d46631 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 21:59:42 -0500 Subject: [PATCH 4/9] docs: add SyncTeX section with viewer recipes Problem: SyncTeX setup for forward/inverse search was undocumented, forcing users to figure out viewer-specific CLI flags on their own. Solution: Add `preview-synctex` vimdoc section with shared setup and per-viewer recipes for Zathura, Sioyek, and Okular. Add FAQ entry in README pointing to the new section. --- README.md | 5 +++ doc/preview.txt | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/README.md b/README.md index 1c59fd6..6d896ac 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,8 @@ vim.g.preview = { typst = { open = { 'sioyek', '--new-instance' } }, } ``` + +**Q: How do I set up SyncTeX (forward/inverse search)?** + +See `:help preview-synctex` for full recipes covering Zathura, Sioyek, and +Okular. diff --git a/doc/preview.txt b/doc/preview.txt index 383a8f5..fd55793 100644 --- a/doc/preview.txt +++ b/doc/preview.txt @@ -26,6 +26,7 @@ CONTENTS *preview-contents* 7. Lua API ................................................... |preview-api| 8. Events ............................................... |preview-events| 9. Health ............................................... |preview-health| + 10. SyncTeX ............................................. |preview-synctex| ============================================================================== REQUIREMENTS *preview-requirements* @@ -272,5 +273,116 @@ Checks: ~ - Each configured provider's binary is executable - Each configured provider's opener binary (if any) is executable +============================================================================== +SYNCTEX *preview-synctex* + +SyncTeX enables bidirectional navigation between LaTeX source and the +compiled PDF. The `latex` preset compiles with `-synctex=1` by default. + +Forward search (editor -> viewer) requires caching the output path. +Inverse search (viewer -> editor) requires a fixed Neovim server socket. + +The following configs leverage the below basic setup: ~ + +>lua + vim.fn.serverstart('/tmp/nvim-preview.sock') + + local synctex_pdf = {} + vim.api.nvim_create_autocmd('User', { + pattern = 'PreviewCompileSuccess', + callback = function(args) + synctex_pdf[args.data.bufnr] = args.data.output + end, + }) +< + +The recipes below bind `s` for forward search. To scroll the PDF +automatically on cursor movement, call the forward search function from a +|CursorMoved| or |CursorHold| autocmd instead. + +Viewer-specific recipes: ~ + + *preview-synctex-zathura* +Zathura ~ + +Inverse search: Ctrl+click. + +>lua + vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'zathura', '--synctex-forward', + vim.fn.line('.') .. ':0:' .. vim.fn.expand('%:p'), pdf, + }) + end + end) + + vim.g.preview = { + latex = { + open = { + 'zathura', + '--synctex-editor-command', + 'nvim --server /tmp/nvim-preview.sock' + .. [[ --remote-expr "execute('b +%{line} %{input}')"]], + }, + }, + } +< + + *preview-synctex-sioyek* +Sioyek ~ + +Inverse search: right-click with synctex mode active. + +Add to `~/.config/sioyek/prefs_user.config`: > + inverse_search_command nvim --server /tmp/nvim-preview.sock --remote-expr "execute('b +%2 %1')" +< + +>lua + vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'sioyek', + '--instance-name', 'preview', + '--forward-search-file', vim.fn.expand('%:p'), + '--forward-search-line', tostring(vim.fn.line('.')), + pdf, + }) + end + end) + + vim.g.preview = { + latex = { + open = { 'sioyek', '--instance-name', 'preview' }, + }, + } +< + + *preview-synctex-okular* +Okular ~ + +Inverse search: one-time GUI setup via +Settings -> Editor -> Custom Text Editor: > + nvim --server /tmp/nvim-preview.sock --remote-expr "execute('b +%l %f')" +< + +>lua + vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'okular', '--unique', + ('%s#src:%d:%s'):format(pdf, vim.fn.line('.'), vim.fn.expand('%:p')), + }) + end + end) + + vim.g.preview = { + latex = { open = { 'okular', '--unique' } }, + } +< + ============================================================================== vim:tw=78:ts=8:ft=help:norl: From f6199af3901fac169f4cab1bb61041286f04c5f7 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 21:59:45 -0500 Subject: [PATCH 5/9] build: add `zathura` and `sioyek` to nix dev shell --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index f6c279b..539840f 100644 --- a/flake.nix +++ b/flake.nix @@ -49,6 +49,8 @@ pkgs.quarto pkgs.plantuml pkgs.mermaid-cli + pkgs.zathura + pkgs.sioyek ]; }; } From 1e3d0fa57744c6a3cd5c1a773b877d13cadc7fb2 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 22:29:30 -0500 Subject: [PATCH 6/9] fix(nvim): simplify preview.nvim config --- spec/synctex_zathura.lua | 37 +++++++++++++++++++ test.tex | 80 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 spec/synctex_zathura.lua create mode 100644 test.tex diff --git a/spec/synctex_zathura.lua b/spec/synctex_zathura.lua new file mode 100644 index 0000000..16c7e76 --- /dev/null +++ b/spec/synctex_zathura.lua @@ -0,0 +1,37 @@ +vim.cmd([[set runtimepath=$VIMRUNTIME]]) +vim.opt.runtimepath:append('.') +vim.opt.packpath = {} +vim.opt.loadplugins = false + +require('preview.commands').setup() + +vim.fn.serverstart('/tmp/nvim-preview.sock') + +local synctex_pdf = {} +vim.api.nvim_create_autocmd('User', { + pattern = 'PreviewCompileSuccess', + callback = function(args) + synctex_pdf[args.data.bufnr] = args.data.output + end, +}) + +vim.g.preview = { + latex = { + open = { + 'zathura', + '--synctex-editor-command', + 'nvim --server /tmp/nvim-preview.sock' + .. [[ --remote-expr "execute('b +%{line} %{input}')"]], + }, + }, +} + +vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'zathura', '--synctex-forward', + vim.fn.line('.') .. ':0:' .. vim.fn.expand('%:p'), pdf, + }) + end +end) diff --git a/test.tex b/test.tex new file mode 100644 index 0000000..835d1de --- /dev/null +++ b/test.tex @@ -0,0 +1,80 @@ +\documentclass{article} +\title{SyncTeX change} +\author{preview.nvim} +\date{} + +\begin{document} +\maketitle + +\section{Introduction} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor +incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis +nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore +eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident. + +\section{Background} +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac +turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor +sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies +mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien +ullamcorper pharetra. + +\section{Methods} +Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, +turpis molestie dictum semper, diam lectus aliquam diam. Morbi facilisis +porttitor enim at ullamcorper. Phasellus at erat eget augue pulvinar sodales. +Etiam sodales felis eget urna aliquet interdum. Fusce bibendum lorem at justo +commodo, at tempus est lobortis. Integer at odio nec felis facilisis blandit. + +\subsection{Data Collection} +Nullam at lectus in augue fringilla lobortis. Proin in justo at diam blandit +sollicitudin. Nulla vestibulum elementum magna. Donec consectetur erat et +turpis malesuada, at interdum tortor iaculis. Cras imperdiet sagittis augue +quis lobortis. Vestibulum ante ipsum primis in faucibus orci luctus. + +\subsection{Analysis} +Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu +quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent dapibus, +neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros +eu erat. Aliquam erat volutpat. Duis accumsan risus quis sapien bibendum. + +\section{Results} +Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi +auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ornare +quis libero. Maecenas commodo nisi non quam. Donec tellus eros, lobortis non +tristique id, aliquam ut ipsum. Sed lorem urna, eleifend eget pretium id. + +\subsection{Primary Findings} +Pellentesque condimentum, magna ut suscipit hendrerit, ipsum augue ornare nulla, +non luctus diam neque sit amet urna. Curabitur vulputate vestibulum lorem. +Fusce sagittis, libero non molestie mollis, magna orci ultrices dolor, at +vulputate neque nulla lacinia eros. Sed id ligula quis est convallis tempor. + +\subsection{Secondary Findings} +Integer vulputate sem a nibh rutrum consequat. Nunc aliquet, augue pretium +mattis consectetur, mauris urna posuere arcu, eget commodo enim lectus quis +lorem. Phasellus tristique purus a augue condimentum adipiscing. Aenean sagittis. +Etiam leo pede, rhoncus venenatis, tristique in, dictum non, justo. + +\section{Discussion} +Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis +luctus, metus. Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec +consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, +commodo a, sodales sit amet, nisi. + +Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec +venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. +Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. +Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia. + +\section{Conclusion} +This is the final section. Forward search from the introduction should jump to +the top of the PDF. Forward search from here should jump to the bottom. Inverse +search from anywhere in the PDF should jump back to this source file at the +corresponding line. + +Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis +luctus, metus. Phasellus ultrices nulla quis nibh. Quisque a lectus. + +\end{document} From 5c4fb1059683d40c84a7ba54dbfd20e76dd6626d Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 22:36:35 -0500 Subject: [PATCH 7/9] fix(nvim): simplify preview.nvim config --- flake.nix | 11 +++++++++++ spec/synctex_okular.lua | 38 ++++++++++++++++++++++++++++++++++++ spec/synctex_sioyek.lua | 42 ++++++++++++++++++++++++++++++++++++++++ spec/synctex_zathura.lua | 6 ++++++ 4 files changed, 97 insertions(+) create mode 100644 spec/synctex_okular.lua create mode 100644 spec/synctex_sioyek.lua diff --git a/flake.nix b/flake.nix index 539840f..bb71950 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,16 @@ pkgs.selene pkgs.lua-language-server ]; + okular-wrapped = pkgs.symlinkJoin { + name = "okular"; + paths = [ pkgs.kdePackages.okular ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/okular \ + --prefix XDG_DATA_DIRS : "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" \ + --prefix XDG_DATA_DIRS : "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}" + ''; + }; in { default = pkgs.mkShell { @@ -51,6 +61,7 @@ pkgs.mermaid-cli pkgs.zathura pkgs.sioyek + okular-wrapped ]; }; } diff --git a/spec/synctex_okular.lua b/spec/synctex_okular.lua new file mode 100644 index 0000000..982a45c --- /dev/null +++ b/spec/synctex_okular.lua @@ -0,0 +1,38 @@ +vim.cmd([[set runtimepath=$VIMRUNTIME]]) +vim.opt.runtimepath:append('.') +vim.opt.packpath = {} +vim.opt.loadplugins = false + +require('preview.commands').setup() + +vim.fn.serverstart('/tmp/nvim-preview.sock') + +local synctex_pdf = {} +vim.api.nvim_create_autocmd('User', { + pattern = 'PreviewCompileSuccess', + callback = function(args) + synctex_pdf[args.data.bufnr] = args.data.output + end, +}) + +vim.g.preview = { + latex = { + open = { 'okular', '--unique' }, + output = function(ctx) + return vim.fn.fnamemodify(ctx.file, ':h') + .. '/build/' + .. vim.fn.fnamemodify(ctx.file, ':t:r') + .. '.pdf' + end, + }, +} + +vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'okular', '--unique', + ('%s#src:%d:%s'):format(pdf, vim.fn.line('.'), vim.fn.expand('%:p')), + }) + end +end) diff --git a/spec/synctex_sioyek.lua b/spec/synctex_sioyek.lua new file mode 100644 index 0000000..a666409 --- /dev/null +++ b/spec/synctex_sioyek.lua @@ -0,0 +1,42 @@ +vim.cmd([[set runtimepath=$VIMRUNTIME]]) +vim.opt.runtimepath:append('.') +vim.opt.packpath = {} +vim.opt.loadplugins = false + +require('preview.commands').setup() + +vim.fn.serverstart('/tmp/nvim-preview.sock') + +local synctex_pdf = {} +vim.api.nvim_create_autocmd('User', { + pattern = 'PreviewCompileSuccess', + callback = function(args) + synctex_pdf[args.data.bufnr] = args.data.output + end, +}) + +vim.g.preview = { + latex = { + open = { 'sioyek', '--instance-name', 'preview' }, + output = function(ctx) + return vim.fn.fnamemodify(ctx.file, ':h') + .. '/build/' + .. vim.fn.fnamemodify(ctx.file, ':t:r') + .. '.pdf' + end, + }, +} + +vim.keymap.set('n', 's', function() + local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] + if pdf then + vim.fn.jobstart({ + 'sioyek', + '--instance-name', 'preview', + '--reuse-window', + '--forward-search-file', vim.fn.expand('%:p'), + '--forward-search-line', tostring(vim.fn.line('.')), + pdf, + }) + end +end) diff --git a/spec/synctex_zathura.lua b/spec/synctex_zathura.lua index 16c7e76..75ae1fb 100644 --- a/spec/synctex_zathura.lua +++ b/spec/synctex_zathura.lua @@ -23,6 +23,12 @@ vim.g.preview = { 'nvim --server /tmp/nvim-preview.sock' .. [[ --remote-expr "execute('b +%{line} %{input}')"]], }, + output = function(ctx) + return vim.fn.fnamemodify(ctx.file, ':h') + .. '/build/' + .. vim.fn.fnamemodify(ctx.file, ':t:r') + .. '.pdf' + end, }, } From 23bce48d275c5a038e69b4078c6eba5801f41a87 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 22:37:48 -0500 Subject: [PATCH 8/9] docs: fix Okular inverse search instructions Problem: Okular settings path was incomplete and didn't mention the trigger keybinding. Solution: Update to full path (Settings -> Configure Okular -> Editor) and note that Shift+click triggers inverse search. --- doc/preview.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/preview.txt b/doc/preview.txt index fd55793..ca4610a 100644 --- a/doc/preview.txt +++ b/doc/preview.txt @@ -363,8 +363,8 @@ Add to `~/.config/sioyek/prefs_user.config`: > *preview-synctex-okular* Okular ~ -Inverse search: one-time GUI setup via -Settings -> Editor -> Custom Text Editor: > +Inverse search (Shift+click): one-time GUI setup via +Settings -> Configure Okular -> Editor -> Custom Text Editor: > nvim --server /tmp/nvim-preview.sock --remote-expr "execute('b +%l %f')" < From 87f2ed4aa24146fffe8c310c10af186689f0d18d Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Thu, 5 Mar 2026 22:37:52 -0500 Subject: [PATCH 9/9] build: remove synctex test files --- spec/synctex_okular.lua | 38 ------------------- spec/synctex_sioyek.lua | 42 --------------------- spec/synctex_zathura.lua | 43 --------------------- test.tex | 80 ---------------------------------------- 4 files changed, 203 deletions(-) delete mode 100644 spec/synctex_okular.lua delete mode 100644 spec/synctex_sioyek.lua delete mode 100644 spec/synctex_zathura.lua delete mode 100644 test.tex diff --git a/spec/synctex_okular.lua b/spec/synctex_okular.lua deleted file mode 100644 index 982a45c..0000000 --- a/spec/synctex_okular.lua +++ /dev/null @@ -1,38 +0,0 @@ -vim.cmd([[set runtimepath=$VIMRUNTIME]]) -vim.opt.runtimepath:append('.') -vim.opt.packpath = {} -vim.opt.loadplugins = false - -require('preview.commands').setup() - -vim.fn.serverstart('/tmp/nvim-preview.sock') - -local synctex_pdf = {} -vim.api.nvim_create_autocmd('User', { - pattern = 'PreviewCompileSuccess', - callback = function(args) - synctex_pdf[args.data.bufnr] = args.data.output - end, -}) - -vim.g.preview = { - latex = { - open = { 'okular', '--unique' }, - output = function(ctx) - return vim.fn.fnamemodify(ctx.file, ':h') - .. '/build/' - .. vim.fn.fnamemodify(ctx.file, ':t:r') - .. '.pdf' - end, - }, -} - -vim.keymap.set('n', 's', function() - local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] - if pdf then - vim.fn.jobstart({ - 'okular', '--unique', - ('%s#src:%d:%s'):format(pdf, vim.fn.line('.'), vim.fn.expand('%:p')), - }) - end -end) diff --git a/spec/synctex_sioyek.lua b/spec/synctex_sioyek.lua deleted file mode 100644 index a666409..0000000 --- a/spec/synctex_sioyek.lua +++ /dev/null @@ -1,42 +0,0 @@ -vim.cmd([[set runtimepath=$VIMRUNTIME]]) -vim.opt.runtimepath:append('.') -vim.opt.packpath = {} -vim.opt.loadplugins = false - -require('preview.commands').setup() - -vim.fn.serverstart('/tmp/nvim-preview.sock') - -local synctex_pdf = {} -vim.api.nvim_create_autocmd('User', { - pattern = 'PreviewCompileSuccess', - callback = function(args) - synctex_pdf[args.data.bufnr] = args.data.output - end, -}) - -vim.g.preview = { - latex = { - open = { 'sioyek', '--instance-name', 'preview' }, - output = function(ctx) - return vim.fn.fnamemodify(ctx.file, ':h') - .. '/build/' - .. vim.fn.fnamemodify(ctx.file, ':t:r') - .. '.pdf' - end, - }, -} - -vim.keymap.set('n', 's', function() - local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] - if pdf then - vim.fn.jobstart({ - 'sioyek', - '--instance-name', 'preview', - '--reuse-window', - '--forward-search-file', vim.fn.expand('%:p'), - '--forward-search-line', tostring(vim.fn.line('.')), - pdf, - }) - end -end) diff --git a/spec/synctex_zathura.lua b/spec/synctex_zathura.lua deleted file mode 100644 index 75ae1fb..0000000 --- a/spec/synctex_zathura.lua +++ /dev/null @@ -1,43 +0,0 @@ -vim.cmd([[set runtimepath=$VIMRUNTIME]]) -vim.opt.runtimepath:append('.') -vim.opt.packpath = {} -vim.opt.loadplugins = false - -require('preview.commands').setup() - -vim.fn.serverstart('/tmp/nvim-preview.sock') - -local synctex_pdf = {} -vim.api.nvim_create_autocmd('User', { - pattern = 'PreviewCompileSuccess', - callback = function(args) - synctex_pdf[args.data.bufnr] = args.data.output - end, -}) - -vim.g.preview = { - latex = { - open = { - 'zathura', - '--synctex-editor-command', - 'nvim --server /tmp/nvim-preview.sock' - .. [[ --remote-expr "execute('b +%{line} %{input}')"]], - }, - output = function(ctx) - return vim.fn.fnamemodify(ctx.file, ':h') - .. '/build/' - .. vim.fn.fnamemodify(ctx.file, ':t:r') - .. '.pdf' - end, - }, -} - -vim.keymap.set('n', 's', function() - local pdf = synctex_pdf[vim.api.nvim_get_current_buf()] - if pdf then - vim.fn.jobstart({ - 'zathura', '--synctex-forward', - vim.fn.line('.') .. ':0:' .. vim.fn.expand('%:p'), pdf, - }) - end -end) diff --git a/test.tex b/test.tex deleted file mode 100644 index 835d1de..0000000 --- a/test.tex +++ /dev/null @@ -1,80 +0,0 @@ -\documentclass{article} -\title{SyncTeX change} -\author{preview.nvim} -\date{} - -\begin{document} -\maketitle - -\section{Introduction} -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor -incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis -nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore -eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident. - -\section{Background} -Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac -turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor -sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies -mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien -ullamcorper pharetra. - -\section{Methods} -Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, -turpis molestie dictum semper, diam lectus aliquam diam. Morbi facilisis -porttitor enim at ullamcorper. Phasellus at erat eget augue pulvinar sodales. -Etiam sodales felis eget urna aliquet interdum. Fusce bibendum lorem at justo -commodo, at tempus est lobortis. Integer at odio nec felis facilisis blandit. - -\subsection{Data Collection} -Nullam at lectus in augue fringilla lobortis. Proin in justo at diam blandit -sollicitudin. Nulla vestibulum elementum magna. Donec consectetur erat et -turpis malesuada, at interdum tortor iaculis. Cras imperdiet sagittis augue -quis lobortis. Vestibulum ante ipsum primis in faucibus orci luctus. - -\subsection{Analysis} -Fusce vel dui. Sed in libero ut nibh placerat accumsan. Proin faucibus arcu -quis ante. In consectetuer turpis ut velit. Nulla sit amet est. Praesent dapibus, -neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros -eu erat. Aliquam erat volutpat. Duis accumsan risus quis sapien bibendum. - -\section{Results} -Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi -auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ornare -quis libero. Maecenas commodo nisi non quam. Donec tellus eros, lobortis non -tristique id, aliquam ut ipsum. Sed lorem urna, eleifend eget pretium id. - -\subsection{Primary Findings} -Pellentesque condimentum, magna ut suscipit hendrerit, ipsum augue ornare nulla, -non luctus diam neque sit amet urna. Curabitur vulputate vestibulum lorem. -Fusce sagittis, libero non molestie mollis, magna orci ultrices dolor, at -vulputate neque nulla lacinia eros. Sed id ligula quis est convallis tempor. - -\subsection{Secondary Findings} -Integer vulputate sem a nibh rutrum consequat. Nunc aliquet, augue pretium -mattis consectetur, mauris urna posuere arcu, eget commodo enim lectus quis -lorem. Phasellus tristique purus a augue condimentum adipiscing. Aenean sagittis. -Etiam leo pede, rhoncus venenatis, tristique in, dictum non, justo. - -\section{Discussion} -Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis -luctus, metus. Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec -consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, -commodo a, sodales sit amet, nisi. - -Nunc nulla. Fusce risus nisl, viverra et, tempor et, pretium in, sapien. Donec -venenatis vulputate lorem. Morbi nec metus. Phasellus blandit leo ut odio. -Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. -Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia. - -\section{Conclusion} -This is the final section. Forward search from the introduction should jump to -the top of the PDF. Forward search from here should jump to the bottom. Inverse -search from anywhere in the PDF should jump back to this source file at the -corresponding line. - -Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis -luctus, metus. Phasellus ultrices nulla quis nibh. Quisque a lectus. - -\end{document}