แสดงรายการคำศัพท์ที่ด้านล่างของเฟรมหรือไม่


20

ฉันต้องการแสดงคำศัพท์ 3 รายการในบรรทัดแยกกันตามแนวนอนที่ด้านล่าง (แม้ว่าส่วนบนก็ใช้ได้เช่นกัน) ของ emacs ทุกเฟรมที่ฉันเปิด ฉันคิดว่า 6 วิธีในการทำเช่นนี้และพวกเขาทั้งหมดมีปัญหา:

  1. ความคิดแรกของฉันคือการเพิ่มบรรทัดลงในบรรทัดโหมดของฉัน แต่ AFAICT คุณไม่สามารถใช้อักขระบรรทัดใหม่ในบรรทัดโหมดได้เพียงแค่ได้รับการแปลงเป็น "^ J"

  2. ความคิดที่สองของฉันคือการมีบรรทัดที่ด้านบนของหน้าจอและใช้บรรทัดส่วนหัว แต่ไม่รองรับอักขระขึ้นบรรทัดใหม่

  3. ฉันสามารถแสดงโอเวอร์เลย์ในช่วง 3 บรรทัดสุดท้ายของหน้าต่างได้ แต่การทำให้สิ่งนี้ดูแข็งแกร่ง - การเลื่อนจะต้องถูกกระตุ้นเมื่อจุดถึงการวางซ้อนมากกว่าจุดสิ้นสุดของหน้าต่างจริงและฉันต้องเปลี่ยนตำแหน่งใหม่ตลอดเวลา การซ้อนทับเนื่องจากการวางซ้อนอยู่ในพื้นที่ข้อความไม่ใช่พื้นที่หน้าต่าง

  4. ฉันสามารถลองทำ windows เฉพาะที่ด้านล่างของเฟรม ฉันได้ลองโค้ดนี้แล้ว แต่มันก็ไม่แข็งแรงเหมือนกันดูเหมือนว่ามันจะทำงานไม่ถูกต้องเมื่อเฟรมมีหน้าต่างที่แยกออกไปแล้วและฉันต้องรีบูต Cx, 1 ถึงเวอร์ชันลบที่กำหนดเองซึ่งไม่สนใจ หน้าต่างพิเศษของฉันและฉันแน่ใจว่ามีมุมอื่น ๆ นอกจากนี้เมื่อหน้าต่างความช่วยเหลือปรากฏขึ้นในขณะนี้หน้าต่างจะเปิดขึ้นในแนวตั้งเพราะคิดว่ามีการแบ่งตามแนวนอนอยู่แล้ว (ซึ่งในทางเทคนิคแล้วมี แต่จะแสดงหน้าต่างบรรทัดเดียวเท่านั้น)

  5. ฉันสามารถมีเฟรมเฉพาะสำหรับสิ่งนี้ได้ แต่จากนั้น config ของฉันจะไม่ทำงานในโหมดเทอร์มินัลและฉันต้องสคริปต์ตัวจัดการหน้าต่างของฉันเพื่อจัดการกับมันที่ด้านล่างของหน้าจอทำให้ไม่สามารถเลือกได้ ฯลฯ

  6. ฉันสามารถแทรกข้อความ 3 บรรทัดลงใน minibuffer โดยตรง ตอนนี้ฉันทำงานได้บางส่วนฉันสามารถเพิ่มรถมินิบัสเพื่อรองรับ 3 สายและฉันสามารถแสดงมันได้ อย่างไรก็ตามทุกครั้งที่มีข้อความใด ๆ ที่จะสะท้อนให้เห็นเส้นที่หายไปจนกว่าฉันจะออกคำสั่งอื่นที่จุดที่พวกเขาปรากฏขึ้นอีกครั้ง นึกคิด 3 บรรทัดและพื้นที่ echo จะไม่ทับซ้อนกันดังนั้นฉันสามารถดูทั้งสอง นี่จะน่ารำคาญน้อยกว่าถ้าฉันสามารถกรองข้อความที่ไปยังพื้นที่เสียงก้องได้อย่างน่าเชื่อถือ - ฉันพบวิธีแก้ปัญหาใน EmacsWiki แต่ดูเหมือนว่าจะไม่ทำงานสำหรับข้อความที่มาจากแหล่ง emacs C (โดยเฉพาะฉันต้องการได้รับ กำจัดข้อความการบันทึกไฟล์เพราะฉันบันทึกอัตโนมัติบ่อยครั้งในการจับเวลา)

สำหรับบริบทเป้าหมายของฉันคือการแสดงคำที่ใช้บ่อยที่สุดในบัฟเฟอร์ปัจจุบันอย่างต่อเนื่องคำที่ใกล้เคียงที่สุดในบัฟเฟอร์ปัจจุบันและคำที่ใช้ล่าสุดในบัฟเฟอร์ปัจจุบัน ฉันตั้งใจจะใส่ลงในบัฟเฟอร์ผ่านคำสั่งเสียง ดังนั้นฉันจึงสามารถพูดว่า "ใกล้ที่สุด 2" และให้มันเลือกรายการที่สองจากรายการคำที่ใกล้ที่สุดแล้วใส่เข้าไป ฉันสนใจเฉพาะรายการคำที่สามารถมองเห็นได้สำหรับบัฟเฟอร์ใดก็ตามที่ฉันกำลังแก้ไขอยู่ ฉันไม่ต้องการใช้หน้าต่างป๊อปอัปที่ใช้โดยโหมดการเติมโค้ดที่หลากหลายเพราะฉันต้องการรายการที่มองเห็นได้เสมอ


เป็นคำถามที่ดีและถูกวางไว้อย่างดี หวังว่าคุณจะได้รับคำแนะนำที่มีประโยชน์
ดึง

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

@ ดึง: ฉันหมายความว่าฉันขับ WM ของฉันโดยใช้แป้นพิมพ์และมันไม่น่าเป็นไปได้ที่ฉันจะต้องการให้ความสำคัญกับเป้าหมายนั้น ในทำนองเดียวกันฉันต้องการให้เลย์เอาต์หน้าต่างทำหน้าที่เหมือนกับว่าเฟรมนั้นเป็นเพียงส่วนหนึ่งของพาเนล / ทาสก์บาร์ แก้ไข: ทุกที่ในความคิดเห็นนี้ฉันพูดว่า 'หน้าต่าง' ฉันหมายถึงหน้าต่าง X ไม่ใช่หน้าต่าง emacs; p
โจเซฟการ์วิน

ความเป็นไปได้อีกข้อหนึ่งที่แนะนำให้ฉันคือการใช้รถมินิบัส ฉันไม่มีความคิดถ้าเป็นไปได้ที่จะแสดงข้อความที่อยู่เฉยๆโดยไม่รบกวนทุกสิ่งที่พยายามจะใช้แม้ว่า ...
Joseph Garvin

เพิ่มหมายเหตุเกี่ยวกับการพยายามใช้ minibuffer
โจเซฟการ์วิน

คำตอบ:


8

ด้วยการทดลองแฮ็คจำนวนมากฉันสามารถรับ # 6 (โดยใช้ข้อความ minibuffer) เป็นสถานะการทำงาน 'ดีพอ' นี่คือภาพหน้าจอ:

สกรีนช็อตของสายพานที่ใช้งานจริง

มีส่วนสำคัญหลายประการที่จะทำให้งานนี้:

  • การแทรกข้อความลงใน minibuffer น่าแปลกใจที่เกือบจะทำสิ่งที่ถูกต้องออกมาจากกล่อง ข้อความที่แทรกไว้ที่นั่นจะปรากฏขึ้นจริง
  • ด้วยการทำให้ข้อความเป็น 'after-string ของการซ้อนทับแทนที่จะเป็นข้อความธรรมดาทำให้คุณไม่สามารถเลือกได้และไม่ต้องกังวลเกี่ยวกับเคอร์เซอร์โดยไม่ตั้งใจ
  • ในการทำให้คำสั่ง minibuffer ให้ทำงานอย่างถูกต้องคุณต้องยับยั้งการแทรกข้อความ / การซ้อนทับเมื่อหน้าต่าง minibuffer ทำงาน
  • หากคุณพยายามปรับขนาด minibuffer ด้วยฟังก์ชั่นปรับขนาดหน้าต่างปกติคุณจะได้รับข้อผิดพลาดเกี่ยวกับ windows ที่เล็กเกินไปถ้าคุณใช้ฟังก์ชั่น md-resize-minibuf ที่ไม่มีเอกสารคุณสามารถปรับขนาดตามจำนวนบรรทัดที่คุณต้องการตราบใดที่คุณ ได้ตั้งค่าการปรับขนาด mini-windows เป็นศูนย์ก่อน
  • เพื่อแก้ไขรายการที่หายไปเมื่อใดก็ตามที่มีข้อความคุณต้องแนะนำฟังก์ชั่นข้อความเพื่อสกัดกั้นข้อความ จากนั้นคุณแทรกมันลงใน minibuffer ด้วยตัวคุณเอง นอกจากนี้คุณยังต้องดูตัวแปรข้อความปัจจุบันซึ่งเก็บสิ่งที่ปรากฏล่าสุดในพื้นที่เสียงสะท้อน (น่าแปลกใจที่พื้นที่เสียงสะท้อนและ minibuffer แตกต่างทางเทคนิคและฟังก์ชันซอร์สโค้ด C บางฟังก์ชันพิมพ์โดยตรงไปยังพื้นที่เสียงสะท้อนโดยไม่ต้องผ่านข้อความ ฟังก์ชั่น) รหัสที่ฉันให้ไว้ด้านล่างนี้ไม่สมบูรณ์ข้อความยังคงมีอยู่นานกว่าปกติซึ่งฉันยังต้องตรวจสอบ (การตรวจสอบรายการสุดท้ายใน * ข้อความ * อาจจะง่ายกว่าและแข็งแกร่งกว่า) แต่ตอนนี้ก็ดีพอสำหรับตอนนี้

นี่คือลิงค์ไปสู่การใช้งานของฉันด้วยเข็มขัดตัวอย่างที่แสดงวงแหวนฆ่า ในที่สุดนี่จะเป็นส่วนหนึ่งของโครงการที่เหมาะสม: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

นี่เป็นครั้งแรกที่ฉันเขียนจำนวน elisp ที่มีนัยสำคัญดังนั้นคุณภาพน่าจะเป็น subpar แต่ก็ใช้ได้ดี


1

น่าเสียดายที่ทั้งโหมดบรรทัดและส่วนหัวอาจมีหลายบรรทัด ฉันเคยถามเกี่ยวกับเรื่องนี้มาก่อนแล้วและไม่มีตัวเลือกใด ๆ ซ่อนเร้นที่จะทำให้งานนี้ ดังนั้น 1 และ 2 ออกไป ฉันยังรู้สึกเหมือน 3 และ 6 เป็นแฮ็กที่จะไม่ทำให้คุณมีความสุขในระยะยาว 3 และ 4 ดูเหมือนจะเป็นแนวทางที่ดี แต่การทำให้พวกเขาทำงานได้อย่างน่าเชื่อถือนั้นเป็นการลงทุน

ดังนั้นฉันขอแนะนำให้คุณนำemacs-develนี้ขึ้นมาก่อน จากประสบการณ์ของฉันสิ่งต่าง ๆ จะถูกนำไปใช้ในที่สุดหากคุณกังวลที่จะอธิบายสิ่งที่คุณต้องการอย่างรอบคอบและทำไมจึงเป็นสิ่งที่ดี อาจใช้เวลาสักพักอย่างน้อยก็จนกว่าจะถึงรุ่นถัดไป แต่ถ้าคุณรอได้ดีหรือใช้รุ่นพัฒนาคุณอาจได้รับสิ่งที่คุณต้องการโดยไม่ต้องพยายามมากนัก


ขอบคุณสำหรับคำแนะนำในการติดต่อ emacs-devel แม้ว่าฉันจะมีวิธีแก้ปัญหา แต่มันก็ค่อนข้างแฮ็คและมันก็ดีที่มี API จริง ๆ สำหรับการวาดบนพิกัดหน้าจอโดยตรงดังนั้นเมื่อฉันมีเวลาฉันอาจยิงอีเมลในแบบของพวกเขา
โจเซฟการ์วิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.