在最近发现之前zathura
我一直在使用evince
。
我有一个脚本来创建并打开我的简历,并想用 打开它zathura
。我怎样才能强制zathura
只打开一次?
我在脚本中使用的命令是,zathura file.pdf &
但是每次运行脚本时这都会打开一个新实例?
答案1
在这种情况下,你的脚本可以通过在再次打开它之前杀死所有 zathura 实例来工作:
killall zathura #Kill all previous zathura instances zathura file.pdf & #Open zathura
希望能帮助到你。
答案2
当将 SyncTeX 与 zathura 一起使用时,它会自动执行此操作:
zathura --synctex-forward 10:1:main.tex main.pdf
搜索正在查看的 zathura 实例main.pdf
并向它们发送命令以查看 main.tex 中第 10 行第 1 列的输出。如果没有打开实例,它会打开一个新实例。所有后续调用都只关注已打开的实例。
当 pdf 没有 synctex 文件时,它可以正常工作。但是,如果有相应的 synctex 文件并且您输入了无效地址,zathura 会在标准输出中抱怨,因此我用于查看(不使用 synctex)的命令是
zathura --synctex-forward :: main.pdf > /dev/null &
其中,是::
为了让 zathura 能够解析 synctex 命令并使> /dev/null
输出静音
也许除了劫持 SyncTeX 功能之外还有其他选择。
答案3
如果文件已在 zathura 中打开,您可以编写脚本来启动相同的窗口。
将下面的脚本保存到您的本地驱动器。例如。现在,您使用而不是~/unique_zathura_launcher.sh
打开文件。您可以创建一个别名来保存击键。~/unique_zathura_launcher.sh filename.pdf
zathura filename.pdf
您可以将此脚本用作 pdf 文件的默认应用程序。只需右键单击 pdf 文件并选择“使用命令打开”并添加~/unique_zathura_launcher.sh
为命令。这样,您将不再在多个 zathura 实例中打开同一个文件。
下面的脚本只是检查是否有任何 zathrua 进程包含输入文件路径。如果是,则查找窗口 ID 并激活它。否则,启动一个新的 zathura 实例。
#!/bin/bash
# This script assumes all files are passed with an absolute path. Otherwise, it may not work properly.
inputAbsPath=$(realpath -s $1)
inputBasename=$(basename "$1")
zathuraProcess=$(ps aux | grep zathura | grep -v grep)
if [[ -z $zathuraProcess ]]
then
# open the file directly if no zathura process is detected
zathura "$1" &
exit
fi
pdfProcessWindowId="undefined"
while read -r pdfProcess; do
pdfProcessPid=$(echo $pdfProcess | awk '{print $2}')
if [[ -n $(wmctrl -l -p | grep $pdfProcessPid | grep -v grep) ]] && [[ -n $(wmctrl -l -p | grep $pdfProcessPid | grep -v grep | awk '{print $1}') ]]
then
pdfProcessWindowId=$(wmctrl -l -p | grep $pdfProcessPid | grep -v grep | awk '{print $1}' | head -n 1)
fi
done <<< "$(ps aux | grep zathura | grep "$inputAbsPath" | grep -v grep)"
if [[ $pdfProcessWindowId == "undefined" ]]
then
zathura "$1" &
else
wmctrl -ia $pdfProcessWindowId
fi