ฉันจะเรียกใช้กระบวนการ async ในพื้นหลังโดยไม่ต้องเพิ่มบัฟเฟอร์ในบัฟเฟอร์ได้อย่างไร


23

ฉันได้กำหนดฟังก์ชั่นบางอย่างเพื่อเรียกใช้กระบวนการพื้นหลัง async โดยใช้async-shell-commandใน. emacs ของฉัน แต่ทุกครั้งที่ฉันเรียกใช้คำสั่งจะมีการสร้างหน้าต่างใหม่ (ไม่ใช่เฟรม) และบัฟเฟอร์ของกระบวนการจะปรากฏขึ้นที่นั่น ฉันจะรันคำสั่งโดยไม่มีบัฟเฟอร์ "ป๊อปอัป" ได้อย่างไร

คำตอบ:


21

คุณสามารถเริ่มกระบวนการพื้นหลังด้วยstart-processซึ่งไม่ควรปรากฏบัฟเฟอร์:

(start-process "process-name" "buffer-name" "program")

ชื่อกระบวนการได้รับการแก้ไขเพื่อหลีกเลี่ยงการทำซ้ำตามความจำเป็นดังนั้นไม่ต้องกังวลเกี่ยวกับสิ่งนั้น เพียงตั้งชื่อที่มีประโยชน์สำหรับการดีบักในอนาคต!

ถ้าคุณให้ a "buffer-name", บัฟเฟอร์จะถูกสร้างขึ้น แต่ไม่แสดงทันที สิ่งนี้สามารถอำนวยความสะดวกในการจัดการกระบวนการและดูผลลัพธ์ หากคุณไม่ต้องการให้สร้างบัฟเฟอร์เลยให้ส่งnilเป็นชื่อบัฟเฟอร์:

(start-process "process-name" nil "program")

เป็นไปได้ที่จะใช้start-processสำหรับคำสั่ง sudo หรือไม่? ฉันพยายามห่อโทรของฉันไปstart-processใน(let ((default-directory "/sudo::")) ... )แต่มันไม่ได้ทำงานสำหรับฉัน
sid-kap

@ sid-kap: ฉันไม่รู้ คุณควรถามว่าเป็นคำถามแบบสแตนด์อโลน
Tikhon Jelvis

1
"program"ในกรณีนี้คือชื่อโปรแกรมเท่านั้น (เช่นหอยโข่ง, Caja, Firefox) และควรจะอยู่ในตำแหน่งอาร์กิวเมนต์ที่สี่ของ"arg1 arg2 ..." start-processฉันคิดออกว่าโดยการอ่านเอกสาร :)
biocyberman

8

เช่นเดียวกับ Tikhon ที่กล่าวถึง(start-process)คือหนทางที่จะไป ในกรณีที่คุณไม่ต้องการที่จะสร้างบัฟเฟอร์ (set-process-sentinel)แต่ยังคงต้องการที่จะตอบสนองต่อสถานะกระบวนการพื้นหลังคุณยังสามารถจ้าง นี่คือตัวอย่างที่ฉันแก้ไขจากprojectorแพ็คเกจของฉัน:

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

จากคำอธิบายฟังก์ชั่น Emacs:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

GNU หน้าคู่มือในกระบวนการเป็นรักที่ดีสำหรับข้อมูลเพิ่มเติม


คุณช่วยอธิบายสิ่งที่set-process-sentinelแม่นยำกว่านี้หน่อยได้ไหม? ฉันได้รับแนวคิดทั่วไปของการมีฟังก์ชั่นที่จัดการกระบวนการ แต่ฉันไม่เข้าใจรายละเอียดทั้งหมดอย่างสมบูรณ์ ขอบคุณ!
Tikhon Jelvis

หากคุณM-x describe-functionป้อนแล้วset-process-sentinelคุณจะได้รับคำตอบสั้น ๆ จากเอกสารของ Emacs: (set-process-sentinel PROCESS SENTINEL) ให้กระบวนการของ Sentinel SENTINEL ไม่มีค่าเริ่มต้น Sentinel ถูกเรียกว่าเป็นฟังก์ชั่นเมื่อกระบวนการเปลี่ยนสถานะ มันได้รับสองข้อโต้แย้ง: กระบวนการและสตริงที่อธิบายการเปลี่ยนแปลง
waymondo

1
หน้าคู่มือ GNU Emacs ในยามรักษาการณ์และกระบวนการจะสวยจริงที่ดีสำหรับข้อมูลรายละเอียดเพิ่มเติม
waymondo

เย็น. บางทีคุณสามารถแก้ไขลิงก์ในคำตอบของคุณ? ผมคิดว่าหนึ่งยังสามารถเรียนรู้เพิ่มเติมเพียงแค่ใช้C-h f...
ทิคฮอน Jelvis

2

ไม่จำเป็นต้องเปลี่ยนวิธีการรันคำสั่งแบบอะซิงโครนัส Emacs มีความสามารถทั่วไปเพื่อช่วยให้คุณสามารถควบคุมตำแหน่งหรือไม่ว่าบัฟเฟอร์ใด ๆ display-buffer-alistจะปรากฏขึ้นโดยการปรับเปลี่ยนโครงสร้างข้อมูลเดียว

ในโซลูชันด้านล่างคุณจะเห็นว่าฟังก์ชั่นการกระทำdisplay-buffer-no-window(เช่นไม่มีป๊อปอัป) ถูกตั้งค่าให้เชื่อมโยงกับบัฟเฟอร์ใด ๆ ที่มีชื่อขึ้นต้น*Asynchronous Shell Command*(emacs เพิ่มส่วนต่อท้ายที่เพิ่มขึ้นเมื่อถูกขอให้สร้างมากกว่าหนึ่ง)

หากต้องการดูรายการตัวเลือกการแสดงอื่น ๆ ที่มีให้พิมพ์C-h f display-bufferและค้นหารายการของ "ฟังก์ชั่นการทำงาน"

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.