Gửi đầu ra quá trình đến bộ đệm * Message *, nhưng bỏ qua vùng echo


9

Có thể gửi đầu ra từ bộ lọc quy trình đến *Messages*bộ đệm và ngăn chặn đầu ra thông báo đó xuất hiện trong vùng dội lại, để tôi có thể sử dụng đồng thời các lệnh tương tác mà không minibuffer-promptbị xóa bởi đầu ra bộ lọc phụ đang diễn ra?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

EDIT (ngày 3 tháng 1 năm 2015): Sau đây là một liên kết đến một câu hỏi tương tự, tuy nhiên, tôi chưa thể làm cho nó hoạt động với một chuỗi quy trình trong đó chuỗi chính xác không rõ ràng - tiêu đề của chuỗi là: Emacs - Vô hiệu hóa một số tin nhắn Minibuffer :

/superuser/669701/emacs-disable-some-minibuffer-messages


Tôi không nghĩ rằng bạn có thể. Tại sao không chỉ đăng nhập vào một bộ đệm khác? Đó là những gì hầu hết các chế độ xử lý các quá trình thực hiện, bắt giữ
lunaryorn

@lunaryorn - Cảm ơn bạn đã gợi ý - bộ đệm chuyên dụng là một tùy chọn hợp lệ để giải quyết vấn đề. Có một vài kết quả đầu ra mà tôi có sở thích cá nhân để được gửi đến *Messages*bộ đệm - các dự án liên quan đến đồng bộ hóa là một trong số đó. Vẫn còn một vài điều tôi chưa thử ( vì tôi nghĩ có thể đã có giải pháp tích hợp sẵn ), chẳng hạn như làm cho *Messages*bộ đệm tạm thời có thể ghi inhibit-read-onlyvà sử dụng inserttại point-max- Tôi không biết liệu nó có xuất hiện trong khu vực tiếng vang là tốt. Tôi sẽ làm việc với nó một lần nữa vào tối nay. . .
luật

Một lưu ý quan tâm là các chức năng C để nhắn tin được phân tách rất nhiều bởi mối quan tâm "tiếng vang" và "ghi nhật ký", nhưng sự khác biệt đó không được thể hiện rõ ràng. Có lẽ bạn có thể M-x report-emacs-bugvà yêu cầu điều này như là một tính năng?
phils

@phils | @lunaryorn: Tôi đã có thể đạt được hiệu quả mong muốn bằng cách sử dụng (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))và tôi đã đăng một câu trả lời dự thảo, sẽ có thể được chấp nhận sau khi thời gian chờ đợi bắt buộc đối với câu hỏi của chính người dùng đã hết. Tôi đã gửi một yêu cầu tính năng với report-emacs-bug: debbugs.gnu.org/cgi/ormsreport.cgi?orms=19495
luật

danh sách luật: Tôi sẽ không đề xuất cách tiếp cận đó vì bạn có thể chạy logic để xử lý các tin nhắn trùng lặp, v.v. (Nhưng nó cũng có thể ổn; tôi thực sự không biết.) Có lẽ bạn nên sử dụng (messages-buffer)để có được bộ đệm , nếu bạn tuân theo phương pháp này và lưu ý rằng (point-max)sẽ không luôn là sự khởi đầu của một dòng mới (ví dụ: sử dụng C-g).
phils

Câu trả lời:


3

Bạn có thể chặn hiển thị trong bộ thu nhỏ bằng cách đặt minibuffer-message-timeoutthành 0.

Ví dụ: tôi sử dụng một cái gì đó như thế này ở một vài nơi mà tôi muốn chuyển đổi chế độ nhỏ trong khi ở dấu nhắc của bộ thu nhỏ (như tệp tìm ido) mà không bị gián đoạn bởi thông báo 'chế độ được bật':

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))

Cảm ơn vì những đề suất của bạn; tuy nhiên, điều này đã không đạt được ảnh hưởng mong muốn. Quá trình in đầu ra đang diễn ra với (let ((minibuffer-message-timeout 0)) (message "%s" string))màn hình tĩnh vẫn hiển thị trong vùng tiếng vang / bộ thu nhỏ khi gõ các chức năng tương tác như execute-extended-commandhoặc switch-to-buffer-other-window- tức là, hoàn thành lời nhắc và đề xuất bị xóa bởi các thông báo đầu ra của quy trình.
luật

3

Bản nháp đầu tiên (ngày 3 tháng 1 năm 2015): Bản nháp ban đầu được sửa đổi dựa trên nhận xét hữu ích của @phils về việc sử dụng chức năng messages-bufferđể xác định vị trí hoặc tạo bộ đệm thích hợp (và đưa nó vào messages-buffer-mode); và, thêm một kiểm tra xem point-maxcó ở đầu dòng không (nếu không, sau đó chèn một dòng mới trước khi chèn chuỗi thông báo).

EDIT (ngày 4 tháng 1 năm 2015): Có những tình huống chuỗi được chèn có thể không nhất thiết phải kết thúc ở một dòng mới và hàm messagekhông có kiểm tra để đảm bảo nó nằm ở đầu một dòng mới, vì vậy chúng tôi xử lý vấn đề đó trong chức năng này. Do đó, tại bất kỳ thời điểm nào khi messagechèn một dòng mới, dòng đã nói sẽ bắt đầu ở phía bên trái của bộ đệm.

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))

2

Đi qua chuỗi tài liệu của messagenó dường như có thể đạt được những gì bạn muốn bằng cách gọi tin nhắn với một nilđối số ngay sau khi gọi messagevới nội dung mong muốn của bạn. Từ chuỗi củamessage

Nếu đối số đầu tiên là nil hoặc chuỗi rỗng, hàm sẽ xóa mọi thông báo hiện có; Điều này cho phép các nội dung xe buýt nhỏ hiển thị.

Vì vậy, sửa đổi chức năng của bạn thành một cái gì đó như sau đây sẽ hoạt động

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

Tôi đã thử nó bằng cách làm như sau

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

Và nó dường như làm việc


Cảm ơn vì đã góp ý. Ý tưởng này, khi được thử nghiệm với đầu ra quy trình đang chạy đến *Messages*bộ đệm và sau đó gọi lệnh tương tác execute-extended-command, hiển thị như sau: dấu nhắc tương tác (nghĩa là, M-xvà bất kỳ hoàn thành một phần nào) đầu ra từ quy trình - tức là, hai chuyển đổi trở lại và ở tốc độ ánh sáng, nhưng nhấp nháy giữa hai là rõ ràng. Điều này dường như là trường hợp bởi vì quá trình cụ thể có vấn đề liên tục phun ra các tin nhắn mới và tin nhắn mới đó đang được hiển thị trong một phần của giây trong khu vực tiếng vang.
luật
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.