evinceでPDFファイルが開いていて(たとえば/path/to/my/file.pdf
LaTeXで作成されている)、そのLaTeXソースファイルをEmacsエディタ()で開こうとします/path/to/my/file.tex
。 evinceのプロパティをクリックしてファイルパスをクリップボードにコピーし、emacsfind-file
会話をミニバッファに変換し、pdfからtexで終わるファイルを手動で変更してファイルを開きます。
さて、同じことをすばやく実行する方法(他のPDFビューアを使用することもできます)があるかどうかを尋ねたいと思います。たとえば、キーボードショートカット(PDFビューア自体、または私の場合はwmレベルで)xmonadを設定または設定します。 PDFビューアのカスタムボタン。
編集する私が必要とする状況は、同時に20個のPDF文書を開いたままにしたことを付け加えたいと思います。
編集2@meuhの提案に従って以下を試しました。
cat get_tex_name.sh
#!/bin/sh
pid=xprop _NET_WM_PID
filename=ls -l /proc/'$pid'/fd/ | grep pdf | sed 's/.*\(\/.*home.*\).pdf/\1tex/'
#emacsclient -c $filename
urxvt -hold -e sh -c "echo $filename"
私の.xmonad
ファイルから:
[...]
-- find corresponding tex file
, ((modm, xK_p ), spawn "get_tex_name.sh")
集中したevinceインスタンスがあり、windows-pを介してストリップを実行すると、ファイル名を取得できないようです(xpropは集中ウィンドウのpidを返さないようですが、それをクリックした後にのみ)。
それでは、どのように機能させるのですか?
答え1
これを自動化するために使用できるツールがたくさんあります。もちろん、最初の考慮事項は、PDFファイルをEmacsで見ることです。その後、elispを介してファイル名にアクセスして作業できます。
たとえば、Emacsの外部で使用できます。
pgrep -xa evince
evinceのプロセスIDとコマンドラインを見つけて、起動に使用されたファイル名を抽出します。または、証拠から対話形式でファイルを選択した場合は、次のものを使用できます。
ls -l /proc/"$pid"/fd/
(ここでpidは以前のものですpgrep
)どのファイル記述子が開いているかを確認し、pdf
で終わるファイル記述子を選択してpdfファイルの名前を取得します。
実行中の証拠が複数ある場合は、次のものを使用できます。
xprop _NET_WM_PID
指定されたウィンドウを対話的にクリックし、そのプログラムのプロセスIDを取得します。残念ながら、evinceは完全なファイル名をX11プロパティに入れません。
ファイル名をemacsに渡すには、emacsでemacsclient
実行して使用します。(server-start)
結合スクリプトのキーバインディングを設定するには、次を参照してください。xmonad。
可能なbashスクリプトは次のとおりです。
#!/bin/bash
pid=$(xprop _NET_WM_PID | sed -n '/not found/q; s/.* //; p')
if [ -z "$pid" ]
then echo "no pid"; exit 1
fi
filename=$(ls -l /proc/"$pid"/fd/ |
sed -n '/pdf$/{ s/.* -> //; s/pdf$/tex/; p}')
if [ -z "$filename" ]
then echo "no filename"; exit 2
fi
emacsclient -c -n "$filename"