กำหนดขอบเขตของบัฟเฟอร์ด้วยโหมดหลักอื่น


12

ฉันมีบัฟเฟอร์ที่แสดงเอกสารสำหรับโมดูล Ansible บัฟเฟอร์นี้มีโหมดหลักของตัวเองซึ่งมีเนื้อหามาตรฐานทั้งหมด โดยเฉพาะอย่างยิ่งมัน fontifies บัฟเฟอร์เพื่อไฮไลท์มาร์กอัปแบบอินไลน์ตัวเลือกส่วนอื่น ๆ M-x manทั้งหมดในทุกมันสวยคล้ายกับ

ที่ด้านล่างของเอกสารมักจะมีตัวอย่างรหัสใน YAML ฉันต้องการที่จะทำให้แบบอักษรเหล่านี้เช่นกัน ฉันสามารถเพิ่มคำสำคัญแบบอักษรของตัวเองล็อคสำหรับ YAML แน่นอน แต่ฉันอยากจะใช้แบบอักษรของโหมด YAML อีกครั้ง

ฉันจะทำสิ่งนั้นได้อย่างไร โดยเฉพาะฉันจะใช้โหมดหลักที่แตกต่างกันเพื่อกำหนดขอบเขตของบัฟเฟอร์ได้อย่างไร

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

ฉันคิดว่าฉันสามารถคัดลอกขอบเขตของบัฟเฟอร์ไปยังบัฟเฟอร์ชั่วคราวเปิดใช้งานโหมด YAML กำหนดบัฟเฟอร์ของแบบอักษรและคัดลอกคุณสมบัติข้อความทั้งหมดไป มันจะใช้ได้ไหม ถ้าเป็นเช่นนั้นฉันจะคัดลอกคุณสมบัติข้อความและคุณสมบัติที่เกี่ยวข้องที่จะคัดลอกได้อย่างไร หรือมีวิธีการที่ดีกว่า


มีการใช้แบบอักษรที่ไม่ใช่ yaml อย่างไร? คุณใช้คุณสมบัติข้อความด้วยตนเองหรือคุณใช้โหมดล็อคแบบอักษรหรือไม่?
Malabarba

ลิงก์ในโพสต์นี้สรุปอย่างน้อยกลุ่มตัวเลือกที่ดีมีดังนี้: wiseandwonder.com/link/8610/ …
grettke

คำตอบ:


10

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

(defun my-fontify-yaml (text)
  (with-temp-buffer
    (erase-buffer)
    (insert text)
    (delay-mode-hooks (yaml-mode))
    (font-lock-default-function 'yaml-mode)
    (font-lock-default-fontify-region (point-min)
                                      (point-max)
                                      nil)
    (buffer-string)))

เนื่องจาก @Malabarba ชี้ให้เห็นในความคิดเห็นวิธีการง่าย ๆ ข้างต้นไม่สามารถใช้งานได้หากบัฟเฟอร์ปลายทางใช้ฟอนต์ล็อคโหมด อย่างไรก็ตามเราสามารถหลอกตัวอักษรล็อคโหมดเชื่อว่าสตริงที่มีอยู่แล้วล็อคตัวอักษรโดยการตั้งค่าคุณสมบัติข้อความfont-lock-faceไปface(เราได้รับfaceชุดคุณสมบัติเมื่อเราใช้ฟังก์ชั่นข้างต้น) และการตั้งค่าสถานที่ให้บริการข้อความไปfontified tฟังก์ชั่นต่อไปนี้รับฟังก์ชั่นสตริงที่ส่งคืนโดยฟังก์ชั่นด้านบนและทำการประมวลผลที่จำเป็นเพื่อให้สตริงถูกแทรกแบบอักษร (ซึ่งนำมาจากorg-src-font-lock-fontify-blockฟังก์ชั่นของโหมดองค์กร

(defun my-fontify-using-faces (text)
  (let ((pos 0))
    (while (setq next (next-single-property-change pos 'face text))
      (put-text-property pos next 'font-lock-face (get-text-property pos 'face text) text)
      (setq pos next))
    (add-text-properties 0  (length text) '(fontified t) text)
    text))

ตอนนี้คุณสามารถใช้มันได้ดังต่อไปนี้

(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))

นี่เป็นวิธีการแก้ปัญหาเดียวกับที่ฉันพบsx.elแต่สิ่งสำคัญที่จะต้องทราบก็คือมันจะใช้ได้ก็ต่อเมื่อบัฟเฟอร์ปลายทางไม่ใช้โหมดล็อคแบบอักษร
Malabarba

ขวา! ฉันเพิ่งรู้ว่าสิ่งนี้ได้ผลสำหรับฉันเพราะฉันใช้ในบัฟเฟอร์ที่ไม่ได้ใช้ฟอนต์ล็อค (บัฟเฟอร์ความช่วยเหลือ)
Iqbal Ansari

@Malabarba พบวิธีที่จะทำให้การทำงานกับบัฟเฟอร์ปลายทางที่เปิดใช้งานโหมดล็อคแบบอักษร
Iqbal Ansari


ดี! ดีใจที่ฉันช่วยได้ :)
อิกบัลอันซารี

3

Library Narrow Indirect ( narrow-indirect) สามารถช่วยได้ที่นี่ - ดูความเห็นส่วนหัว มันอาศัย:

  1. การ จำกัด ให้แคบลงซึ่ง จำกัด การแก้ไขส่วนหนึ่งบนบัฟเฟอร์และ
  2. บัฟเฟอร์ทางอ้อมซึ่งคัดลอกบัฟเฟอร์ในอีกอันหนึ่งซึ่งคุณสามารถเปลี่ยนโหมดหลักได้

โปรดทราบว่าการ จำกัด การปิดใช้งานจะถูกปิดใช้งานตามค่าเริ่มต้นเนื่องจากถือว่าเป็นการเริ่มต้น - ไม่เป็นมิตร (การผูกเริ่มต้นคือC-x n n) คุณสามารถเปิดใช้งานได้โดยใส่สิ่งต่อไปนี้ในไฟล์ init ของคุณ:

(put 'narrow-to-region 'disabled nil)

นอกจากนี้คุณยังสามารถดูทำด้วยมือของฉันmyfn-narrow-indirectในของฉันconf


การ จำกัด ขนาดแคบลงส่งผลกระทบต่อการล็อคแบบอักษรจริง ๆ หรือไม่เช่นกันให้ห่างจากนอกพื้นที่แคบ การล็อคแบบอักษรจริงๆแล้วไม่เคยลบข้อ จำกัด ของบัฟเฟอร์?
Lunaryorn

และอย่างไรก็ตามแพ็คเกจ wiki ไม่ใช่ตัวเลือก
Lunaryorn

นอกจากนี้คุณไม่จำเป็นต้องลบdisabledคุณสมบัติออกจากคำสั่งเพื่อเรียกใช้จาก Emacs Lisp มันมีผลต่อการใช้แบบโต้ตอบเท่านั้น
Lunaryorn

0

ฉันขอแนะนำให้ดูที่ org-src-font-lock-fontify-block ซึ่งมีฟังก์ชั่นนี้สำหรับบล็อกแหล่งที่มาของโหมด org ดูเหมือนว่าจะคัดลอกส่วนที่เกี่ยวข้องไปยังบัฟเฟอร์อื่นเปิดใช้งานโหมดหลักที่นั่นแล้วคัดลอกข้อความแบบอักษรกลับ แฮ็ค แต่ดูเหมือนว่าจะทำงาน


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