Fontify region bufora innym trybem głównym

12

Mam bufor, który pokazuje dokumentację modułów Ansible. Bufor ma swój własny tryb główny, który zapewnia wszystkie standardowe rzeczy. Warto zauważyć, że buforuje on bufor, aby podświetlić wbudowane znaczniki, opcje, sekcje itp. Podsumowując, jest bardzo podobny do M-x man.

Na dole dokumentacji jest zwykle kilka przykładów kodu w YAML. Też chciałbym je fontować. Mógłbym oczywiście dodać własne słowa kluczowe do blokowania czcionek w YAML, ale wolałbym ponownie używać czcionek w trybie YAML.

Jak mogę to zrobić? W szczególności, w jaki sposób mogę użyć innego trybu głównego do fontowania określonego regionu bufora?

Pamiętaj, że tryb YAML nie musi być aktywny w tym regionie. Cały bufor jest tylko pasywnym buforem wyświetlania i nie jest przeznaczony do edycji. Naprawdę potrzebuję tylko utworzonej czcionki, tak jakby tryb YAML był aktywny w tym regionie.

Zakładam, że mógłbym skopiować region bufora do bufora tymczasowego, włączyć tryb YAML, skasować bufor i skopiować wszystkie właściwości tekstu. Czy to zadziała? Jeśli tak, to jak skopiować właściwości tekstu i jakie odpowiednie właściwości skopiować? Czy jest lepsze podejście?

księżycowy
źródło
W jaki sposób wdrażane są czcionki inne niż yaml? Czy stosujesz właściwości tekstu ręcznie, czy używasz trybu blokowania czcionek?
Malabarba
Linki w tym poście podsumowują przynajmniej sporą
grettke

Odpowiedzi:

10

Ostatnio natknąłem się na podobny problem, w zasadzie chciałem fontować fragmenty kodu w dokumentacji, którą otrzymałem z innego źródła. Podążyłem za podejściem wymienionym pod koniec twojej odpowiedzi i zadziałało dla mnie dobrze. Funkcja zakończyła się czymś takim, jak poniżej

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

Jak zauważył @Malabarba w komentarzach, powyższe proste podejście nie działa, jeśli bufor docelowy używa trybu blokowania czcionek. Możemy jednak oszukać tryb blokowania czcionek, aby przekonać się, że ciąg znaków jest już zablokowany czcionką, ustawiając właściwość text font-lock-facena face, (otrzymujemy facezestaw właściwości, gdy korzystamy z powyższej funkcji) i ustawiając właściwość text fontifiedna t. Poniższa funkcja wykonuje ciąg zwracanej przez funkcję powyżej wykonuje przetwarzanie wymagane tak, że łańcuch jest włożony fontified (to jest pobierane z ORG-trybach org-src-font-lock-fontify-blockfunkcji

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

Teraz możesz go używać w następujący sposób

(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))
Iqbal Ansari
źródło
Jest to to samo rozwiązanie, które znalazłem sx.el, ale ważne jest, aby pamiętać, że będzie działać tylko wtedy, gdy bufor docelowy nie będzie korzystał z trybu blokowania czcionek.
Malabarba
Dobrze! Właśnie zdałem sobie sprawę, że to działa dla mnie, ponieważ użyłem w buforze, w którym nie zastosowano blokady czcionek (bufor pomocy)
Iqbal Ansari,
@Malabarba znalazł sposób na to, aby ta funkcja działała z buforami docelowymi z włączonym trybem blokowania czcionek
Iqbal Ansari
Wielkie dzięki, działa idealnie !
lunaryorn
Och, miło! Cieszę się, że mogłem pomóc :)
Iqbal Ansari
3

Biblioteka Narrow Indirect ( narrow-indirect) może tutaj pomóc - spójrz na komentarz do nagłówka. Opiera się na:

  1. zawężenie, które ogranicza edycję do części bufora, oraz
  2. bufory pośrednie, które kopiują bufor w innym, dla którego możesz zmienić tryb główny.

Zauważ, że zwężanie jest domyślnie wyłączone, ponieważ jest uważane za nieprzyjazne dla początkujących (domyślne wiązanie to C-x n n). Możesz go włączyć, umieszczając następujące elementy w pliku init:

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

Możesz też poszukać mojego ręcznie robionego myfn-narrow-indirectw mojej konf .

freakhill
źródło
Czy zwężenie faktycznie wpływa na blokadę czcionek, tzn. Czy trzyma się z dala od zwężonego regionu? Czy blokada czcionki naprawdę nigdy nie usuwa ograniczeń bufora?
lunaryorn,
Poza tym pakiet wiki nie jest opcją.
lunaryorn,
Poza tym nie trzeba usuwać disabledwłaściwości z polecenia, aby wywołać ją z Emacsa Lispa. Wpływa tylko na użycie interaktywne.
lunaryorn,
0

Proponuję zajrzeć do org-src-font-lock-fontify-block, który zapewnia tę funkcjonalność dla bloków źródłowych w trybie org. Wydaje się, że po prostu skopiuj odpowiednie części do innego bufora, włącz tam tryb główny, a następnie skopiuj tekst z powrotem z powrotem. Hackish, ale wydaje się, że działa.

Joakim Hårsman
źródło
2
Ta odpowiedź bardziej przypomina komentarz, ponieważ zawiera sugerowany kierunek rozwiązania problemu, ale nie jest kompletną odpowiedzią. Proszę rozważyć zmianę go na komentarz.
Dan