ในฐานะที่เป็นคำตอบอยู่แล้วในความคิดเห็นที่ Emacs กลายเป็นช้ามากในสต์สำหรับสายยาวเป็นปัญหาที่รู้จักกันดี การแก้ไขมันจะดีมาก แต่ต้องการความคิดจำนวนมากเพื่อดึงออกอย่างถูกต้อง ฉันมีความคิดว่ามันสามารถทำได้อย่างไรตามส่วนที่ 6.3 ของเอกสารนี้
(โดยทั่วไปจัดเก็บข้อมูลบรรทัดภาพในบัฟเฟอร์ปัจจุบันและอัปเดตเมื่อแทรกช่องว่างคุณสมบัติการแสดงผลการเปลี่ยนแปลงหน้าต่าง ฯลฯ จากนั้นใช้ข้อมูลใน รหัส redisplay เพื่อหลีกเลี่ยงการสแกนตลอดเวลา) แต่ฉันไม่คุ้นเคยกับ C internals เพื่อดึงออกมา
มีวิธีแก้ไขเฉพาะหน้า สิ่งที่ชัดเจนที่สุดคือการปรับพารามิเตอร์ที่เกี่ยวข้องกับการแสดงผล (เช่นการเปิดใช้งานการตัดบรรทัดภาพในอินสแตนซ์ Emacs แบบกราฟิกโดยใช้ Emac ที่ไม่ใช่กราฟิกเพื่อทำสิ่งนั้นโดยอัตโนมัติปิดการใช้งานคุณสมบัติ Bidi ฯลฯ ) และประมวลผลเนื้อหาไฟล์ของคุณ การอ่านสิ่งที่ชัดเจนน้อยลงคือการโพสต์ไฟล์โดยอัตโนมัติไม่ว่าจะเป็นการตัดทอนบรรทัดของพวกเขาหรือเพิ่มคุณสมบัติข้อความที่ทำให้บรรทัดปรากฏสั้นกว่าที่เป็นจริง ในการเปลี่ยนให้เป็นคำตอบที่น่าสนใจยิ่งขึ้นฉันจะนำเสนอการแฮ็กที่น่าเกลียดของตัวเลือกเดิมที่จะใช้ได้เฉพาะกับcomint
โหมดที่ได้รับการถ่ายทอด:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?$")
(shortened-text (replace-regexp-in-string regexp "\\1" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
my-comint-shorten-long-lines
ฟังก์ชันนี้กำหนดฟังก์ชันที่ใช้สตริงที่อาจประกอบด้วยหลายบรรทัดและใช้พลังของนิพจน์ทั่วไปเพื่อแทนที่บรรทัดใด ๆ ในนั้นด้วยความยาว 80 อักขระขึ้นไปด้วยเวอร์ชันย่อที่แสดงข้อความต้นฉบับเมื่อวางเมาส์เหนือมัน เมื่อใช้เป็นตะขอใน
comint-preoutput-filter-functions
มันจะกรองcomint
เอาท์พุททั้งหมดก่อนที่จะแสดง
อย่างไรก็ตามแฮ็คนี้มีจุดอ่อนที่ร้ายแรง ในโหมดที่มีการทำให้แบบอักษรพื้นฐานเกิดขึ้น (เช่น, M-x ielm
) มันจะตัดเส้นที่เป็นส่วนหนึ่งของสตริงอย่างมีความสุขและจะทำให้ทุกอย่างเป็นแบบอักษรจนกระทั่งมีการอ้างอิงเป็นสตริงต่อไป! นั่นไม่ใช่สิ่งที่เราต้องการและสามารถแก้ไขได้ด้วยความเชี่ยวชาญของ regex อีกเล็กน้อย (แต่สันนิษฐานได้ว่าอาจแตกภายใน REPL สำหรับภาษาเช่น Python) ในขณะที่เราอยู่ที่นี่เราขอเน้นผลลัพธ์ที่สั้นลงเช่นกัน:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?\\(\"?\\)$")
(shortened-text (replace-regexp-in-string regexp "\\1\\2" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'font-lock-face 'shadow 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
มันค่อนข้างดีกว่า แต่ก็ยังน่าเกลียดอยู่ดี โฉบในการส่งออกของสิ่งที่ต้องการfind /
ในM-x shell
ไม่น่าสนใจ (เราต้องการนึกคิดเพียงต้องการที่จะแสดงเส้น unshortened ไม่ส่งออกทั้งหมด), การตรวจสอบสตริงเป็นพื้นฐานที่ดีที่สุดและการตัดอาจจะชี้ให้เห็นได้ดีขึ้นด้วยวงรีแทน fontifying ทุกอย่าง ยิ่งไปกว่านั้นไม่รับประกันว่าข้อความที่เข้ามาจะไม่ถูกเปลี่ยนเป็นแบตช์ ทั้งหมดนี้ส่งเสียงกรีดร้องสำหรับการทำขั้นตอนการประมวลผลในบัฟเฟอร์ชั่วคราว แต่จะเหลือไว้สำหรับผู้อ่านว่าเป็นการออกกำลังกาย (หรือผู้เขียนเป็นบล็อกโพสต์ที่มีศักยภาพ)