evince에 PDF 파일이 열려 있고(예: /path/to/my/file.pdf
LaTeX에서 생성됨) 해당 LaTeX 소스 파일을 Emacs 편집기( )에서 열고 싶다고 가정합니다 /path/to/my/file.tex
. evince의 속성을 클릭하고 파일 경로를 클립보드에 복사한 다음 emacs find-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"