İşlem çıktısını * Mesajlar * arabelleğine gönder, ancak yankı alanını atla


9

Çıkışı bir işlem filtresinden *Messages*arabelleğe göndermek ve yankı alanında görünmesini engellemek için iletinin yankı alanında görünmesini engellemek mümkün minibuffer-promptmü?

(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 Ocak 2015): Aşağıdaki benzer bir soruya bir bağlantı, ancak, henüz tam dize bilinmeyen bir işlem dizesi ile çalışmasını mümkün değil - iş parçacığının başlığı: Emacs - Bazı Minibuffer Mesajlarını devre dışı bırakın :

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


Yapabileceğini sanmıyorum. Neden sadece farklı bir tamponda oturum açmıyorsunuz? Süreçlerle ilgilenen çoğu mod budur…
lunaryorn

@lunaryorn - Öneri için teşekkür ederim - özel bir arabellek sorunu çözmek için geçerli bir seçenektir. *Messages*Arabelleğe gönderilmek için kişisel tercihime sahip olduğum birkaç işlem çıktısı var - senkronizasyon ile ilgili projeler bunlardan biri. Tamponu geçici olarak yazılabilir yapmak ve kullanmak gibi - denemediğim birkaç şey var ( çünkü yerleşik bir çözüm olabileceğini düşündüm ) - Bunun görünüp görünmeyeceğini bilmiyorum yankı alanı da. Bu akşam tekrar üzerinde çalışacağım. . . *Messages*inhibit-read-onlyinsertpoint-max
hukukçu

İlgilenilen bir nokta, mesajlaşma için C işlevlerinin "yankı" ve "günlüğe kaydetme" kaygılarıyla çok fazla ayrılmasıdır, ancak bu ayrım elisp'e maruz kalmaz. Belki bunu M-x report-emacs-bugbir özellik olarak isteyebilir ve isteyebilirsiniz?
phils

@phils | @lunaryorn: Kullanarak istenen etkiyi elde (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))ettim ve bir kullanıcının kendi sorusu üzerindeki zorunlu bekleme süresi dolduktan sonra kabul için uygun olacak bir taslak cevap yayınladım. Şununla bir özellik isteği gönderdimreport-emacs-bug : debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
kanun listesi

lawlist: I (Ama aynı zamanda ince olabilir; aslında bilmiyorum.) vb yinelenen iletileri, işlemek için mantık uyulmadığını çünkü bu yaklaşımı önermek edecek değildi Muhtemelen kullanmalıdır (messages-buffer)tampon elde etmek , bu yönteme bağlı kalırsanız ve (point-max)bunun her zaman yeni bir satırın başlangıcı olmayacağını unutmayın (örneğin, kullanın C-g).
phils

Yanıtlar:


3

minibuffer-message-timeout0'a ayarlayarak minibuffer'daki görüntüyü bastırabilirsiniz .

Örneğin, bir minibuffer isteminde (ido find-file gibi) küçük bir modu 'mod etkin' mesajı ile kesilmeden değiştirmek istediğim birkaç yerde böyle bir şey kullanıyorum:

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

Öneri için teşekkür ederim; ancak, bu istenen etkiyi elde edememiştir. Veya - (let ((minibuffer-message-timeout 0)) (message "%s" string))gibi etkileşimli işlevler yazılırken yankı alanında / minibuffer'da devam eden işlem çıktısı yazdırma işlemi, işlem istemi iletileri tarafından istem ve önerilen tamamlamalar silinir. execute-extended-commandswitch-to-buffer-other-window
hukukçu

3

İlk Kaba Taslak (3 Ocak 2015): @phils'in messages-bufferuygun arabelleği bulma veya oluşturma işlevini kullanma (ve içine koyma messages-buffer-mode) işlevine ilişkin yararlı yorumuna dayanarak revize edilmiş ilk taslak ; ve point-maxsatırın başında olup olmadığına dair bir kontrol ekledi (eğer değilse, mesaj dizesini eklemeden önce yeni bir satır ekleyin ).

EDIT (4 Ocak 2015): Eklenen dizenin mutlaka yeni bir satırla bitmeyebileceği durumlar vardır ve işlevin messageyeni bir satırın başında olduğundan emin olmak için bir denetimi yoktur, bu nedenle bununla ilgileniriz bu işlevde. Böylece, herhangi bir noktada messageyeni bir çizgi eklendiğinde , bahsedilen çizgi tamponun sol-solundan başlayacaktır.

(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

Doktora programından geçerek, istediğiniz içeriğe çağrı yaptıktan hemen sonra messagebir nilargümanla mesaj çağırarak istediğiniz şeyi elde etmek mümkün görünmektedir message. Doktrinindenmessage

İlk bağımsız değişken nil veya boş dize ise, işlev varolan tüm iletileri temizler; bu minibuffer içeriğinin gösterilmesini sağlar.

Bu nedenle, işlevinizi aşağıdaki gibi bir şeye değiştirmek çalışmalıdır

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

Aşağıdakileri yaparak test ettim

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

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

Ve işe yarıyor gibi görünüyor


Öneri için teşekkürler. Bu fikir, *Messages*arabelleğe çalışan bir işlem çıktısıyla sınandıktan sonra etkileşimli komutu çağırdığında execute-extended-commandaşağıdakileri gösterir: etkileşimli istem (yani M-xve kısmi tamamlamalar) ve işlemden çıktı - yani, iki anahtar geri ve ışık hızında ilerler, ancak ikisi arasında titreme görülebilir. Bu durum söz konusu gibi görünüyor çünkü söz konusu işlem sürekli olarak yeni mesajlar veriyor ve yeni mesaj yankı alanında bir saniyenin bir kısmı için görüntüleniyor.
hukukçu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.