โทร emacsclient จากโปรแกรมที่เรียกโดย Emacs


9

ฉันพบปัญหาในการดูไฟล์เอกสาร PDF ด้วย AucTex ฉันใช้pdf-toolsเพื่อดูไฟล์ PDF จากภายใน Emacs และฉันตั้งemacsclient -nเป็นค่าเริ่มต้น pdf-viewer ของฉัน (ผ่าน xdg-mime บน Debian Linux) สิ่งนี้ใช้ได้ดีในสถานการณ์ส่วนใหญ่ แต่มันก็แบ่งการ(Tex-documentation-texdoc ...)ทำงานของ Auctex ( C-c ?)

ฉันได้ทำให้ปัญหาแคบลงเป็นรหัสบรรทัดเดียว เมื่อฉันพยายามที่จะดูเอกสารประกอบของlistingsแพคเกจTeX-documentation-texdocเปลี่ยนสิ่งนี้เป็น sexp ต่อไปนี้:

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

texdocในทางกลับกันเรียกร้องemacsclientให้เปิดไฟล์ (ขึ้นอยู่กับวิธีที่ฉันกำหนดค่าเดสก์ท็อปของฉันผ่าน xdg) อย่างไรก็ตาม ณ จุดนี้ Emacs แฮงค์และฉันต้องออก ( C-g) เพื่อรับการควบคุมกลับ หลังจากนั้นจะไม่มีการเปิดไฟล์ PDF ใหม่ สิ่งเดียวกันเกิดขึ้นถ้าฉันพยายามโทรหา emacsclient โดยตรง:

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

คำสั่งการทำงานทั้งที่บรรทัดคำสั่ง (เช่นและemacsclient -n tmp.pdftexdoc --view listings

คำถามของฉันคือในกรณีเช่นนี้ฉันจะเรียก emacsclient จากภายใน Emacs ได้อย่างไร (และฉันรู้ว่าฉันสามารถเปิดไฟล์ 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
@ ชื่อที่น่าสนใจ - ใช้(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ฟังก์ชันการเรียกกลับที่ดึงเอาท์พุทจากบัฟเฟอร์นั้น ทำ "สิ่งที่ต้องทำด้วย" เมื่อคำสั่งเสร็จสิ้น


ในกรณีที่เฉพาะเจาะจงของการทำงานtexdocใน AUCTeX ฉันพบว่าการใช้ Sentinel บิตของ overkill เนื่องจากนี่ไม่ใช่คุณสมบัติพื้นฐาน (เช่นเป็นการเปิดดูสำหรับเอกสารขาออกซึ่งในกรณีนี้เราใช้ แมวมอง)
giordano

ฉันไม่รู้ว่าทำไมใช้ "-to-string" ฟังก์ชั่นดังนั้นฉันไม่รู้ว่าจะทำอย่างไรกับผลลัพธ์ของคำสั่ง หากจำเป็นต้องใช้เอาต์พุตนี้ (ตามที่แนะนำโดยการใช้...-to-string) โซลูชั่น async อาจต้องการตัวกรองกระบวนการหรือตัวประมวลผล - ยาม (shell-command "texdoc --view listings &")ถ้าไม่เช่นนั้นรหัสอาจจะสามารถใช้สิ่งที่ต้องการ
สเตฟาน

มันอธิบายไว้ในความคิดเห็นที่TeX-documentation-texdoc: ...-to-stringตัวแปรถูกนำมาใช้เพื่อแสดงให้ผู้ใช้ข้อความผิดพลาดที่เป็นไปได้ (ตัวอย่างเช่นเมื่อไม่พบเอกสาร) นอกจากนี้texdoc nonexistingpackageส่งคืนค่า 0 แต่อาจใช้ Sentinel เพื่อแยกวิเคราะห์เอาต์พุต
giordano

ดูเหมือนว่าตัวเลือกที่ดีที่สุด
สเตฟาน

ฉันไม่พบคำอุทธรณ์start-file-processที่ใช้งานได้จริงที่นี่ (start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")สร้างบัฟเฟอร์*texdoc*ซึ่งจะถูกแทรก "Process texdoc เสร็จแล้ว" และไฟล์ pdf จะไม่เปิดขึ้น สิ่งเดียวกันนี้เกิดขึ้นเมื่อฉันตั้งค่าตัวแสดง xdg-mime pdf ให้ปรากฏเช่นกัน
Tyler

1

หากคุณต้องการเพียงดึงกลับการร้องขอไปยัง Emacs โดยไม่ต้องรอคำตอบคุณสามารถทำงานemacsclientในพื้นหลังได้ ภายใต้ระบบปฏิบัติการ Unix สไตล์ (Linux, macOS, Cygwin, …):

emacsclient … &

ภายใต้ Windows ดั้งเดิม:

start emacsclient …

แน่นอน แต่ในกรณีนี้ฉันต้องเรียกโปรแกรม (texdoc) ที่เรียกแล้ว (emacsclient) ระดับการเปลี่ยนเส้นทางเพิ่มเติมทำให้เกิดปัญหา
Tyler

@Tyler texdocเป็นแบบอะซิงโครนัส (เช่นคุณไม่ได้รอให้เสร็จสมบูรณ์) ใช่ไหม? ดังนั้นคุณสามารถใช้หลักการเดียวกัน: รันtexdoc … &เป็นคำสั่งเชลล์
Gilles 'หยุดชั่วร้าย'

เราลองดูในความคิดเห็นภายใต้คำถามของฉัน มันทำงานได้เมื่อโทรemacsclientโดยตรง texdocแต่ไม่ได้เมื่อโทร
Tyler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.