使用 CLI vim 和 Skim 的 synctex

使用 CLI vim 和 Skim 的 synctex

我的设置是运行命令行界面 vim(使用 iTerm)和 Skim 作为我的 pdf 查看器。我想使用 Skim 设置 synctex,但我尝试过的所有方法都没有奏效。以下是我正在做的事情:

  • 我正在使用 pdflatex 和 -synctex=1 进行编译
  • Skim 需要 synctex 的命令和参数。我的命令是 /usr/bin/vim,我的参数是 --remote-silent +"%line" "%file"

这没用。我也尝试了提供的建议这里,它说要制作一个 bash 脚本,运行一个可以操纵我的编辑器的自动脚本。但我也无法让它工作(这似乎也相当笨重)。

我也愿意更换 pdf 查看器,所以如果您对如何让 synctex 与 iTerm vim 和其他 pdf 查看器一起工作有任何建议那就太好了。

答案1

经过一番头痛之后,我让 synctex 在 CLI vim(在 osX 终端上)和 Skim 之间工作,因此我可以向您概述我的设置:

我使用 latexmk 进行编译并执行以下操作他们的建议我的 .latexmkrc 文件看起来像

$pdf_previewer = 'open -a Skim';                                                                                      
$pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode';
@generated_exts = (@generated_exts, 'synctex.gz');

这对于 synctex 使用来说可能不是完全必要的,但它允许我使用 .vimrc 中的简单命令从 .tex 文档进行编译和查看,例如:

nnoremap <leader>c :w<CR> :silent !latexmk -pdf -pv -halt-on-error % <CR> <C-L><CR>

我使用的是 Skim 1.6.3 版本,直接从他们的网站

正向搜索(.tex/vim 到 .pdf/Skim)非常简单,只需使用稍微修改过的命令(再次在我的 .vimrc 中)即可你提到的来源

nnoremap <leader>f :w<CR>:silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> %<.pdf<CR> <C-L><CR>

编辑(2023-01-28):如果您有多文件文档,则向前搜索会更加复杂,但我刚刚解决了这个问题,因此我将其添加到后文中。上述命令搜索与当前 .tex 文档名称匹配的 pdf 文件。如果您使用的是使用 include{} 和章节/节的主 .tex 文件,则必须指定输出 pdf 的名称和当前 .tex 章节/节文档才能向前搜索。这个答案给了我足够的信息继续使用 .synctex.gz 文件自动命名输出 pdf,并且我的 .vimrc 中的前向搜索如下所示:

nnoremap <leader>f :silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> <C-r>=substitute(glob("*synctex.gz"),"synctex.gz","pdf","")<CR> % <CR><C-L>

如果您正在编译没有 .synctex.gz 文件的文档,则可以在 if 语句中组合这些方法:

nnoremap <leader>f 
\ :if filereadable(glob("*.synctex.gz")) 
\ <bar> silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> <C-r>=substitute(glob("*synctex.gz"),"synctex.gz","pdf","")<CR> % <CR>  
\ <bar> else 
\ <bar> silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> %<.pdf<CR> 
\ <bar> endif <CR><C-L>

编辑结束 (2023-01-28)

反向搜索(.pdf/Skim 到 .tex/vim)有点棘手。我发现我的 Mac 上的原生 vim(版本 8.0,High Sierra 10.13.6)没有 --remote 功能,所以我使用 macports 安装了 vim 版本 8.2,并使用 +huge +gtk2 +X11 +clientserver 进行构建:

sudo port install vim +huge +gtk2 +X11 +clientserver

如果您不想要/没有 macports(或 homebrew 等)或不想安装其他 vim,您可以通过从源代码构建并包含必要的部分来升级 mac 的原生 vim,但我选择这条路线是因为我喜欢保留原生内容。请注意,您还需要安装 X11。

之后,我将 Skim 中的命令(Skim > 首选项 > 同步 > PDF-Tex 同步支持)设置为/opt/local/bin/vim(我安装的新 vim),并将选项设置为--servername VIM --remote-silent +%line "%file"。我发现,如果我使用相同的命令()在 vim 中打开我的 .tex 文件/opt/local/bin/vim --servername VIM --remote-silent <file>,则可以使用 Command+Shift+Click 从 Skim 进行反向搜索。

我真的不知道为什么我必须在这里指定服务器名称,但这似乎是必要的。例如,如果我打开 vim 而不指定服务器名称(或使用未内置远程支持的 vim),此功能将不起作用。Skim 也无法打开新的 vim 实例,所以我必须已经打开了文档(使用指定的命令)。这个设置对我来说是可行的,但我认为可以编写一个 Skim 调用的 shell 脚本,该脚本会查找打开的 vim 实例,如果未找到,则正确打开一个(类似于你引用的来源,但实际上适用于 CLI vim)。为了方便一些,我在 .bashrc 中编写了一个命令,专门用于打开 .tex 文件以供 Skim 使用:

lvim ()
{/opt/local/bin/vim --servername VIM --remote-silent "$1"}

所以现在我只需从终端打开我想要的 .tex 文件,然后手动 ( ) 或通过编译 ( ) 或正向搜索 ( )从 vim$lvim <file>.tex打开 Skim ,正向和反向搜索功能就可以使用了。open -a Skim <file>.pdf<leader>c<leader>f

我想在这里把所有事情都说清楚,因为我还没有找到通过 synctex 将标准 CLI vim 与 Skim 配对的(有效)描述。但是,我应该指出,如果您只是在 osX 上寻找某种 vim/synctex/Skim 组合,并且不依赖 CLI vim,那么使用 macvim 肯定更容易。我使用 macports 安装了 macvim,并使用了 Skim 的 macvim 预设,它立即起作用了,包括在调用反向搜索且 .tex 文件未打开时打开一个新的 macvim 实例。

答案2

至于逆向搜索,另一个选择是通过tmux(以下是基本内容新手指南,如果您不熟悉该程序)。例如,您可以像这样配置 Skim:

  • 命令:/usr/local/bin/tmux
  • 参数:send-keys -t vim "%line"gg

此设置要求您已经通过在 tmux 中启动 vim 打开源 .tex 文件,然后与 vim 进行简单的一次性交互(例如移动光标),以便 tmux 目标窗口重命名为 vim(即-t vim上述参数中提到的内容)。您可以通过编写 shell 脚本并让 Skim 调用该脚本来自动执行所有这些操作。

相关内容