Trước hết, từ chối trách nhiệm. Tôi đã nghiên cứu điều này nhiều lần và tôi khá chắc chắn rằng tôi đã tìm thấy câu trả lời bằng cách này hay cách khác, nhưng tôi không hiểu nó.
Vấn đề của tôi là như sau:
- Tôi có một quá trình chạy qua comint
- Tôi muốn gửi một dòng đầu vào, bắt đầu ra và xem khi nào nó kết thúc (khi dòng cuối cùng của đầu ra khớp với biểu thức chính quy cho một dấu nhắc)
- chỉ khi quá trình gửi xong đầu ra, tôi mới muốn gửi một dòng đầu vào khác (ví dụ).
Đối với một chút nền tảng, hãy nghĩ đến một chế độ chính thực hiện tương tác với một chương trình, có thể trả về một lượng đầu ra tùy ý, trong thời gian dài tùy ý. Đây không phải là một tình huống bất thường, phải không? Được rồi, có thể phần tôi cần đợi giữa các đầu vào là không bình thường, nhưng nó có một vài lợi thế so với việc gửi toàn bộ đầu vào:
- bộ đệm đầu ra được định dạng độc đáo: đầu vào đầu vào đầu ra ...
- quan trọng hơn, khi gửi nhiều văn bản đến một quy trình, văn bản được cắt thành từng mảnh và các phần được dán lại theo quy trình; các điểm cắt là tùy ý và điều này đôi khi làm cho đầu vào không hợp lệ (ví dụ quy trình của tôi sẽ không dán lại chính xác một lần cắt đầu vào ở giữa một định danh, chẳng hạn)
Dù sao, bất thường hay không, nó chỉ ra rằng nó là phức tạp. Ngay bây giờ, tôi đang sử dụng một cái gì đó dọc theo dòng
(defun mymode--wait-for-output ()
(let ((buffer (mymode-get-buffer)))
(with-current-buffer buffer
(goto-char (point-max))
(forward-line 0)
(while (not (mymode-looking-at-prompt))
(accept-process-output nil 0.001)
(redisplay)
(goto-char (point-max))
(forward-line 0))
(end-of-line))))
và tôi gọi nó mỗi lần sau khi gửi một dòng đầu vào, và trước khi gửi dòng tiếp theo. Chà ... nó hoạt động, đó đã là một cái gì đó.
Nhưng nó cũng làm cho emacs bị treo trong khi chờ đầu ra. Lý do rất rõ ràng và tôi đoán rằng nếu tôi đưa một số loại không đồng bộ sleep-for
(ví dụ 1s) vào vòng lặp thì nó sẽ trì hoãn đầu ra thêm 1 giây, nhưng triệt tiêu việc treo. Ngoại trừ việc có vẻ như loại không đồng bộ
sleep-for
này không tồn tại .
Hay không? Tổng quát hơn, có một cách thành ngữ để đạt được điều này với emacs? Nói cách khác:
Làm thế nào để gửi đầu vào cho một quá trình, chờ đầu ra, sau đó gửi thêm đầu vào, không đồng bộ?
Khi tìm kiếm xung quanh (xem các câu hỏi liên quan), tôi chủ yếu thấy đề cập đến các câu thần chú (nhưng tôi không nghĩ rằng nó áp dụng trong trường hợp của tôi, vì quá trình không kết thúc) và một số móc nối (nhưng sau đó thì sao? làm cho hook hook-local, biến "đánh giá các dòng còn lại" của tôi thành một hàm, thêm chức năng này vào hook và làm sạch hook sau đó? nghe có vẻ rất bẩn phải không?).
Tôi xin lỗi nếu tôi không làm cho mình rõ ràng, hoặc nếu thực sự có một câu trả lời rõ ràng có sẵn ở đâu đó, tôi thực sự bối rối bởi tất cả những rắc rối của quá trình tương tác.
Nếu cần, tôi có thể biến tất cả thành một ví dụ hoạt động, nhưng tôi sợ rằng nó sẽ chỉ tạo thêm một "câu hỏi quy trình cụ thể với câu trả lời quy trình cụ thể" như tất cả những gì tôi tìm thấy trước đó và không giúp tôi.
Một số câu hỏi liên quan về SO: