Kirim hasil proses ke * Pesan * penyangga, tetapi melewati area gema

9

Apakah mungkin untuk mengirim output dari filter proses ke *Messages*buffer dan menekan output pesan agar tidak muncul di area echo, sehingga saya dapat secara bersamaan menggunakan perintah interaktif tanpa minibuffer-promptterhapus oleh output filter subpress yang sedang berlangsung?

(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 (3 Januari 2015): Berikut ini adalah tautan ke pertanyaan serupa, namun, saya belum dapat membuatnya bekerja dengan string proses di mana string yang tepat tidak diketahui - judul utasnya adalah: Emacs - Nonaktifkan Beberapa Pesan Minibuffer :

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

daftar hukum
sumber
Saya tidak berpikir Anda bisa. Mengapa tidak masuk saja ke buffer yang berbeda? Itulah yang dilakukan kebanyakan mode yang berhubungan dengan proses ...
lunaryorn
@ lunaryorn - Terima kasih atas sarannya - buffer khusus adalah opsi yang valid untuk menyelesaikan masalah. Ada beberapa keluaran proses yang saya punya preferensi pribadi untuk dikirim ke *Messages*buffer - sinkronisasi proyek terkait adalah salah satunya. Masih ada beberapa hal yang belum saya coba ( karena saya pikir mungkin ada solusi bawaan ), seperti membuat *Messages*buffer dapat ditulis inhibit-read-onlydan digunakan sementara insertdi point-max- Saya tidak tahu apakah itu akan muncul di area gema juga. Saya akan mengerjakannya lagi malam ini. . .
Gugatan
Satu catatan yang menarik adalah bahwa fungsi C untuk perpesanan sangat banyak dipisahkan oleh kekhawatiran "echo" dan "logging", tetapi perbedaan itu tidak terpapar oleh elisp. Mungkin Anda bisa M-x report-emacs-bugdan meminta ini sebagai fitur?
phils
@phils | @Lunaryorn: Saya dapat mencapai efek yang diinginkan dengan menggunakan (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))dan saya memposting konsep jawaban, yang akan memenuhi syarat untuk diterima setelah periode tunggu wajib pada pertanyaan pengguna sendiri telah berakhir. Saya mengajukan permintaan fitur dengan report-emacs-bug: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
lawlist
lawlist: Saya tidak akan menyarankan pendekatan itu karena Anda mungkin bertabrakan dengan logika untuk menangani pesan duplikat, dll. (Tapi mungkin juga baik-baik saja; Saya tidak benar-benar tahu.) Anda mungkin harus menggunakan (messages-buffer)untuk mendapatkan buffer , jika Anda tetap menggunakan metode ini, dan perhatikan bahwa (point-max)tidak akan selalu menjadi awal dari baris baru (mis. gunakan C-g).
phils

Jawaban:

3

Anda dapat menekan tampilan di minibuffer dengan mengatur minibuffer-message-timeoutke 0.

Misalnya, saya menggunakan sesuatu seperti ini di beberapa tempat di mana saya ingin beralih ke mode minor saat dalam bis minibuffer (seperti ido find-file) tanpa terganggu oleh pesan 'mode diaktifkan':

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))
glukas
sumber
Terima kasih atas sarannya; Namun, ini tidak mencapai pengaruh yang diinginkan. Proses pencetakan hasil yang sedang berjalan dengan (let ((minibuffer-message-timeout 0)) (message "%s" string))masih menampilkan di echo-area / minibuffer ketika mengetik fungsi interaktif seperti execute-extended-commandatau switch-to-buffer-other-window- yaitu, prompt dan penyelesaian yang disarankan terhapus oleh pesan output proses.
Gugatan
3

First Rough Draft (3 Januari 2015): Draf awal direvisi berdasarkan komentar bermanfaat dari @phils mengenai penggunaan fungsi messages-bufferuntuk menemukan atau membuat buffer yang sesuai (dan memasukkannya ke dalam messages-buffer-mode); dan, menambahkan tanda centang apakah point-maxdi awal baris (jika tidak, masukkan baris baru sebelum memasukkan string pesan).

EDIT (4 Januari 2015): Ada situasi di mana string dimasukkan belum tentu berakhir di baris baru, dan fungsi messagetidak memiliki cek untuk memastikan itu adalah pada awal baris baru, jadi kita berhati-hati itu dalam fungsi ini. Jadi, pada titik mana pun ketika messagemenyisipkan baris baru, kata garis akan mulai pada flush-kiri buffer.

(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"))))))
daftar hukum
sumber
2

Memahami dokumentasi messagetampaknya memungkinkan untuk mencapai apa yang Anda inginkan dengan menelepon pesan dengan nilargumen segera setelah menelepon messagedengan konten yang Anda inginkan. Dari docstring darimessage

Jika argumen pertama adalah nil atau string kosong, fungsi ini menghapus semua pesan yang ada; ini memungkinkan konten minibuffer ditampilkan.

Jadi memodifikasi fungsi Anda menjadi sesuatu seperti yang berikut ini harusnya berfungsi

(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)))

Saya mengujinya dengan melakukan hal berikut

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

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

Dan sepertinya berhasil

Iqbal Ansari
sumber
Terima kasih atas sarannya. Gagasan ini, ketika diuji dengan proses yang sedang berjalan output ke *Messages*buffer dan kemudian memanggil perintah interaktif execute-extended-command, menunjukkan yang berikut: prompt interaktif (yaitu, M-xdan setiap penyelesaian parsial) dan output dari proses - yaitu, dua saklar kembali dan maju dengan kecepatan ringan, tetapi berkedip antara keduanya terlihat. Ini tampaknya menjadi masalah karena proses tertentu yang dipermasalahkan adalah terus-menerus mengeluarkan pesan baru, dan bahwa pesan baru ditampilkan untuk sepersekian detik di area gema.
Gugatan