ส่งเอาต์พุตกระบวนการไปยังบัฟเฟอร์ * Messages * แต่ข้ามพื้นที่ echo


9

เป็นไปได้ไหมที่จะส่งเอาต์พุตจากตัวกรองโปรเซสไปยัง*Messages*บัฟเฟอร์และระงับข้อความเอาต์พุตไม่ให้ปรากฏในพื้นที่เสียงก้องเช่นนั้นฉันสามารถใช้คำสั่งแบบโต้ตอบพร้อมกันได้โดยไม่ต้องminibuffer-promptถูกลบออกโดยตัวกรอง subpress

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

แก้ไข (3 มกราคม 2015): ต่อไปนี้เป็นลิงก์ไปยังคำถามที่คล้ายกันอย่างไรก็ตามฉันยังไม่สามารถทำให้มันทำงานกับกระบวนการสตริงที่สตริงที่แน่นอนไม่ได้ถูกผูกไว้ - ชื่อของเธรดคือ: Emacs - ปิดการใช้งานข้อความขนาดเล็ก :

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


ฉันไม่คิดว่าคุณจะทำได้ ทำไมไม่เพียงเข้าสู่ระบบบัฟเฟอร์ที่แตกต่างกัน? นั่นคือสิ่งที่โหมดส่วนใหญ่ที่จัดการกับกระบวนการทำ ...
lunaryorn

@lunaryorn - ขอบคุณสำหรับคำแนะนำ - บัฟเฟอร์เฉพาะเป็นตัวเลือกที่ถูกต้องในการแก้ไขปัญหา มีเอาต์พุตกระบวนการไม่กี่อย่างที่ฉันมีการตั้งค่าส่วนตัวสำหรับการส่งไปยัง*Messages*บัฟเฟอร์ - โครงการที่เกี่ยวข้องกับการประสานเป็นหนึ่งในพวกเขา ยังมีบางสิ่งที่ฉันไม่ได้ลอง ( เพราะฉันคิดว่าอาจมีวิธีแก้ปัญหาในตัว ) เช่นการทำให้*Messages*บัฟเฟอร์สามารถเขียนได้ชั่วคราวinhibit-read-onlyและใช้insertที่point-max- ฉันไม่รู้ว่าจะปรากฏขึ้นใน พื้นที่เสียงสะท้อนเช่นกัน ฉันจะทำงานอีกครั้งในเย็นนี้ . .
ฏหมาย

สิ่งที่น่าสนใจอย่างหนึ่งก็คือฟังก์ชั่น C สำหรับการส่งข้อความนั้นแยกจากกันเป็นอย่างมากโดยเกี่ยวข้องกับ "echo" และ "การบันทึก" แต่ความแตกต่างนั้นไม่ได้เกิดจาก elisp บางทีคุณสามารถทำได้M-x report-emacs-bugและขอสิ่งนี้เป็นคุณสมบัติหรือไม่?
phils

@phils | @ lunaryorn: ฉันสามารถบรรลุผลตามที่ต้องการโดยใช้(let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))และฉันโพสต์คำตอบแบบร่างซึ่งจะมีสิทธิ์ได้รับการยอมรับหลังจากระยะเวลารอคอยบังคับของคำถามของผู้ใช้หมดไป ฉันได้ส่งคำขอคุณสมบัติด้วยreport-emacs-bug: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
กฎหมาย

ลิสต์กฎหมาย: ฉันจะไม่แนะนำวิธีการนี้เพราะคุณอาจใช้ตรรกะเพื่อจัดการกับข้อความที่ซ้ำกันเป็นต้น (แต่มันก็อาจจะดีฉันไม่รู้จริง ๆ ) คุณอาจใช้(messages-buffer)เพื่อรับบัฟเฟอร์ ถ้าคุณใช้วิธีนี้และสังเกตว่า(point-max)จะไม่เป็นจุดเริ่มต้นของบรรทัดใหม่ (เช่นใช้C-g)
phils

คำตอบ:


3

คุณสามารถระงับการแสดงผลใน minibuffer โดยการตั้งค่าminibuffer-message-timeoutเป็น 0

ตัวอย่างเช่นฉันใช้บางอย่างเช่นนี้ในไม่กี่แห่งที่ฉันต้องการสลับโหมดรองในขณะที่อยู่ในพร้อมท์ minibuffer (เช่น ido find-file) โดยไม่ถูกขัดจังหวะด้วยข้อความ 'เปิดใช้งานโหมด':

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

ขอบคุณสำหรับคำแนะนำ; อย่างไรก็ตามสิ่งนี้ไม่ได้ผลตามที่ต้องการ เอาท์พุทกระบวนการที่ต่อเนื่องกับการพิมพ์(let ((minibuffer-message-timeout 0)) (message "%s" string))ยังคงแสดงในก้อง / พื้นที่ minibuffer เมื่อพิมพ์โต้ตอบเช่นฟังก์ชั่นexecute-extended-commandหรือswitch-to-buffer-other-window- กล่าวคือความสำเร็จที่รวดเร็วและได้รับการแนะนำโดยลบข้อความที่ส่งออกกระบวนการ
ฏหมาย

3

First Rough Draft (3 มกราคม 2015): แก้ไขแบบร่างเริ่มต้นตามความคิดเห็นที่เป็นประโยชน์ของ @phils เกี่ยวกับการใช้ฟังก์ชั่นmessages-bufferเพื่อค้นหาหรือสร้างบัฟเฟอร์ที่เหมาะสม (และใส่ลงในmessages-buffer-mode) และเพิ่มการตรวจสอบว่าpoint-maxอยู่ที่จุดเริ่มต้นของบรรทัด (ถ้าไม่ใช่จากนั้นให้แทรกบรรทัดใหม่ก่อนที่จะแทรกสตริงข้อความ)

แก้ไข (4 มกราคม 2015): มีสถานการณ์ที่สตริงที่แทรกอาจไม่จำเป็นต้องจบในบรรทัดใหม่และฟังก์ชั่นmessageไม่ได้มีการตรวจสอบเพื่อให้แน่ใจว่ามันเป็นจุดเริ่มต้นของบรรทัดใหม่ดังนั้นเราจึงดูแล ในฟังก์ชั่นนี้ ดังนั้น ณ จุดใดก็ตามเมื่อmessageแทรกบรรทัดใหม่บรรทัดดังกล่าวจะเริ่มต้นที่ด้านซ้ายของบัฟเฟอร์

(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

การดู docstring ของmessageมันดูเหมือนว่าเป็นไปได้ที่จะบรรลุสิ่งที่คุณต้องการโดยการโทรข้อความด้วยการnilโต้เถียงทันทีหลังจากการโทรmessageด้วยเนื้อหาที่คุณต้องการ จาก docstring ของmessage

ถ้าอาร์กิวเมนต์แรกคือไม่มีหรือสตริงว่างฟังก์ชั่นล้างข้อความที่มีอยู่ใด ๆ สิ่งนี้จะช่วยให้เนื้อหา minibuffer แสดง

ดังนั้นการปรับเปลี่ยนการทำงานของคุณเป็นสิ่งที่ควรปฏิบัติ

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

ฉันทดสอบโดยทำสิ่งต่อไปนี้

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

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

และดูเหมือนว่าจะทำงาน


ขอบคุณสำหรับคำแนะนำ แนวคิดนี้เมื่อทดสอบด้วยเอาต์พุตกระบวนการที่กำลังรันไปยัง*Messages*บัฟเฟอร์แล้วเรียกคำสั่งแบบโต้ตอบexecute-extended-commandจะแสดงสิ่งต่อไปนี้: พรอมต์แบบโต้ตอบ (เช่นM-xและความสำเร็จบางส่วน) และผลลัพธ์จากกระบวนการ - นั่นคือทั้งสองสลับกลับและ ออกมาด้วยความเร็วแสง แต่การริบหรี่ระหว่างทั้งสองจะมองเห็นได้ ดูเหมือนว่าจะเป็นกรณีนี้เนื่องจากกระบวนการเฉพาะที่เป็นปัญหาจะกระจายข้อความใหม่ออกไปอย่างต่อเนื่องและข้อความใหม่นั้นจะถูกแสดงเป็นเสี้ยววินาทีในพื้นที่เสียงก้อง
ฏหมาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.