開いているpdfファイルに対応するtexファイルを開きます。

開いているpdfファイルに対応するtexファイルを開きます。

evinceでPDFファイルが開いていて(たとえば/path/to/my/file.pdfLaTeXで作成されている)、その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"

おすすめ記事