Увімкніть область буфера за допомогою іншого основного режиму


12

У мене буфер, який показує документацію для модулів Ansible. Цей буфер має власний основний режим, який забезпечує всі стандартні речі. Зокрема, він вказує на буфер, щоб виділити вбудовану розмітку, параметри, розділи тощо. Загалом, це дуже схоже на M-x man.

Внизу документації зазвичай є кілька прикладів коду в YAML. Я також хотів би їх обґрунтувати. Я, звичайно, можу додати власні ключові слова для блокування шрифту для YAML, але я вважаю за краще скористатись fontification YAML Mode.

Як я можу це зробити? Зокрема, як я можу використовувати інший основний режим для фунтування конкретної області буфера?

Зауважте, що режим YAML не потребує активності в цьому регіоні. Весь буфер є лише буфером пасивного дисплея, і не призначений для редагування. Мені дійсно потрібна лише дана обробка, як ніби в цьому регіоні був активний режим YAML.

Я припускаю, що я міг скопіювати область буфера у тимчасовий буфер, увімкнути режим YAML, увімкнути буфер та скопіювати всі властивості тексту. Це би спрацювало? Якщо так, то як скопіювати властивості тексту та які відповідні властивості копіювати? Або є кращий підхід?


Як реалізується не ямлівська фонтифікація? Чи застосовуєте ви властивості тексту вручну чи використовуєте режим блокування шрифту?
Малабарба

Посилання в цій публікації підсумовують принаймні хороший фрагмент варіантів там: wisdomandwonder.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. Наступна функція приймає рядок , повернуту функцією вище і робить необхідною обробку таким чином , що рядок вставляється fontified (це береться з орга-режим в 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, але важливо зазначити, що воно буде працювати лише в тому випадку, якщо буфер призначення не використовує режим шрифтового блокування.
Малабарба

Правильно! Я щойно зрозумів, що це працює для мене, тому що я використовував у буфері, де не використовувався блокування шрифтів (Довідковий буфер)
Iqbal Ansari

@Malabarba знайшов спосіб зробити цю роботу за допомогою буферів призначення з увімкненим режимом блокування шрифту
Iqbal Ansari

Велике спасибі, працює чудово !
місячник

О, гарно! Радий, що можу допомогти :)
Ікбал Ансарі

3

Тут може допомогти Бібліотека Narrow Indirect ( narrow-indirect) - подивіться коментар заголовка. Він спирається на:

  1. звуження, яке обмежує редагування частини на буфері, і
  2. непрямі буфери, які копіюють буфер в інший, для якого ви можете змінити основний режим.

Зауважте, що звуження відключено за замовчуванням, оскільки воно вважається неприйнятним для початківців (прив'язка за замовчуванням C-x n n). Ви можете ввімкнути це, помістивши у свій файл init:

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

Ви також можете подивитися на мою ручну роботу myfn-narrow-indirectв моїй конф .


Чи впливає звуження насправді блокування шрифту, тобто тримати його подалі від зовнішньої частини звуженого регіону? Чи блокування шрифту насправді ніколи не знімає обмежень на буфер?
місячник

І все одно, вікі-пакет - це не варіант.
місячник

Крім того, вам не потрібно видаляти disabledвластивість з команди, щоб викликати його з Emacs Lisp. Це впливає лише на інтерактивне використання.
місячник

0

Я б запропонував переглянути org-src-font-lock-lock-fontify-block, який забезпечує цю функціональність для вихідних блоків в режимі org. Здається, просто скопіюйте відповідні частини в інший буфер, увімкніть там основний режим, а потім скопіюйте назад фанований текст. Хакіш, але, здається, працює.


2
Ця відповідь більше нагадує коментар, наскільки він пропонує запропонований напрямок для вирішення проблеми, але не є повною відповіддю. Будь ласка, подумайте про зміну цього коментаря.
Дан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.