Emacs가 호출 한 프로그램에서 emacsclient를 호출


9

AucTex에서 pdf 문서 파일을 보는 데 문제가 있습니다. pdf-toolsEmacs에서 PDF 파일을 보는 데 사용 하고 emacsclient -n기본 pdf 뷰어 (Debian Linux의 xdg-mime를 통해)로 설정했습니다. 이것은 대부분의 상황에서 잘 작동하지만 (Tex-documentation-texdoc ...)Auctex ( C-c ?) 의 기능을 손상시킵니다 .

문제를 한 줄의 코드로 좁혔습니다. listings패키지 의 설명서를 보려고 할 때 이것을 TeX-documentation-texdoc다음 sexp로 바꿉니다.

(shell-command-to-string "texdoc --view  listings")

texdoc차례로 emacsclientxdg를 통해 데스크탑을 구성한 방법에 따라 실제로 파일을 열 도록 호출 합니다. 그러나이 시점에서 Emacs가 중단되고 C-g제어를 다시 받으려면 ( )를 종료해야합니다 . 그 후에는 새로운 pdf가 열리지 않습니다. emacsclient를 직접 호출하려고 할 때도 마찬가지입니다.

(shell-command-to-string "emacsclient -n tmp.pdf")

두 명령 모두 명령 행에서 작동합니다 (예 : emacsclient -n tmp.pdf및) texdoc --view listings.

내 질문은 이런 경우 Emacs 내에서 어떻게 emacsclient를 호출합니까? (그리고 나는 단지 pdf 파일을 열 수 있다는 것을 알고있다 find-file; 그것은 파일을 찾기 위해 외부 프로세스 (texdoc)를 호출해야하기 때문에 여기서는 옵션이 아니며, 그 프로세스는 emacsclient를 호출한다).


texdoc -M --list listings파일을 찾은 다음 사용하지 find-file않습니까?
Quarky

@suvayu 편리함. 다른 대안은 전화를 걸기 위해 터미널로 texdoc --view전환 한 다음 파일을 열 때 Emacs로 다시 전환하는 것입니다. 그러나 Emacs의 한 단계 에서이 작업을 수행 할 수있는 방법이 있어야한다고 생각합니까?
Tyler

1
(async-shell-command "emacsclient -n tmp.pdf")문제를 해결할 수 있습니까 ?
이름

1
@Name 재미있는- (async-shell-command "emacsclient -n tmp.pdf")작동하지만 작동 (async-shell-command "texdoc --view listings")하지 않습니다. 유용한 단서입니다.
Tyler

1
합니까의 C-u C-c ?작업? 먼저 패키지와 관련된 문서 목록을 표시 한 다음로 뷰어를 엽니 다 (call-process "texdoc" nil 0 nil "--just-view" doc).
giordano

답변:


5

해결책은 texdoc비동기 프로세스 내 에서 실행 하는 것입니다.

가장 좋은 방법은 아마도 start-file-process대신에 사용하는 것입니다 shell-command-to-string(해당 Elisp 코드보다 작은 쉘 스크립트를 작성하는 것이 더 편리하지만 내 경험으로는 피하는 것이 더 빠르면 더 빠르고 더러운 코드에 편리한 기능입니다).

그러나 start-file-process프로세스의 출력을 직접 반환하지 않으므로 주변 코드를 크게 변경해야합니다 . 대신 출력을 배치 할 버퍼를 지정한 다음 set-process-sentinel해당 버퍼에서 출력을 가져 오는 콜백 함수 에 사용해야 합니다. 명령이 완료되면 "무엇으로해야합니까?"


texdocAUCTeX에서 실행하는 특정 경우 에는 센티넬을 약간 과잉 사용 하는 것으로 나타났습니다. 이것은 근본적인 기능이 아니기 때문에 (출력 문서의 뷰어를 여는 것과 같이) 보초).
giordano

"to-string"함수가 왜 사용되었는지 모르겠으므로 명령 출력으로 수행되는 작업을 모르겠습니다. 이 출력이 필요한 경우 (를 사용하여 제안한 ...-to-string경우) 비동기 솔루션에는 프로세스 필터 또는 프로세스 센티넬이 필요합니다. 그렇지 않은 경우 코드는 다음과 같은 것을 사용할 수 있습니다 (shell-command "texdoc --view listings &").
Stefan

주석에 설명되어 있습니다 TeX-documentation-texdoc. ...-to-string변형은 사용자에게 가능한 오류 메시지를 표시하는 데 사용됩니다 (예 : 문서가없는 경우). 또한 texdoc nonexistingpackage0을 반환하지만 센티넬을 사용하여 출력을 구문 분석 할 수 있습니다.
giordano

그렇다면 센티넬이 최선의 선택 인 것 같습니다.
Stefan

start-file-process실제로 여기에서 작동 하는 호출을 찾을 수 없습니다 . "Process texdoc finished"가 삽입 된 (start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")buffer를 생성하고 *texdoc*pdf는 절대로 열리지 않습니다. xdg-mime pdf 뷰어를 설정하도록 설정했을 때도 마찬가지입니다.
Tyler

1

답변을 기다리지 않고 Emacs에 요청을 피드백해야하는 경우 emacsclient백그라운드에서 실행할 수 있습니다 . 유닉스 스타일 OS (Linux, macOS, Cygwin 등)에서 :

emacsclient … &

기본 Windows에서 :

start emacsclient …

물론이 특별한 경우에는 (emacsclient)를 호출하는 프로그램 (texdoc)을 호출해야합니다. 리디렉션의 추가 수준으로 인해 문제가 발생합니다.
Tyler

@Tyler texdoc는 비동기 적입니다 (즉, 완료되기를 기다리지 않습니다), 그렇지 않습니까? 따라서 동일한 원칙을 적용 할 수 있습니다 : texdoc … &shell 명령으로 실행하십시오.
Gilles 'SO- 악마 그만해'

우리는 내 질문 아래의 의견에서 그것을 시도했습니다. emacsclient직접 호출 할 때는 작동 하지만 호출 할 때는 작동 하지 않습니다 texdoc.
Tyler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.