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.