다른 주요 모드로 버퍼 영역을 글꼴 화


12

Ansible 모듈에 대한 설명서를 보여주는 버퍼가 있습니다. 이 버퍼에는 모든 표준 기능을 제공하는 자체 주요 모드가 있습니다. 특히 버퍼를 글꼴 화하여 인라인 마크 업, 옵션, 섹션 등을 강조 표시합니다. 대체로와 비슷합니다 M-x man.

문서 맨 아래에는 일반적으로 YAML의 일부 코드 예제가 있습니다. 이것들도 글꼴 화하고 싶습니다. 물론 YAML에 대한 자체 글꼴 잠금 키워드를 추가 할 수도 있지만 YAML 모드의 글꼴을 다시 사용하는 것이 좋습니다.

어떻게해야합니까? 특히, 다른 주 모드를 사용하여 버퍼의 특정 영역을 글꼴 화하려면 어떻게해야합니까?

이 지역에서 YAML 모드를 활성화 할 필요는 없습니다 . 전체 버퍼는 수동 디스플레이 버퍼 일 뿐이며 편집 할 수 없습니다. YAML 모드가 해당 지역에서 활성화 된 것처럼 생성 된 글꼴 만 있으면됩니다.

버퍼 영역을 임시 버퍼에 복사하고 YAML 모드를 활성화하고 버퍼를 글꼴 화하고 모든 텍스트 속성을 복사 할 수 있다고 가정합니다. 작동합니까? 그렇다면 텍스트 속성을 어떻게 복사하고 복사 할 관련 속성은 무엇입니까? 아니면 더 나은 접근 방법이 있습니까?


Yaml이 아닌 글꼴이 어떻게 구현됩니까? 텍스트 속성을 수동으로 적용하거나 글꼴 잠금 모드를 사용합니까?
Malabarba

이 포스트의 링크는 최소한 거기에있는 옵션들 중 일부를 요약합니다
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가 주석에서 지적했듯이 대상 버퍼가 글꼴 잠금 모드를 사용하는 경우 위의 간단한 접근 방식이 작동하지 않습니다. 그러나 text 속성 font-lock-face을 로 설정하고 face( face위의 함수를 사용할 때 속성 집합 을 얻음 ) text-property fontified를로 설정 하여 문자열이 이미 글꼴로 잠겨 있다고 믿도록 글꼴 잠금 모드를 속일 수 있습니다 t. 다음 함수는 위 함수에서 반환 한 문자열을 가져 와서 문자열을 글꼴로 삽입하도록 필요한 처리를 수행합니다 (org-mode의 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

권리! 내가 버퍼에 사용했기 때문에 글꼴 잠금 (도움말 버퍼)를 사용하지 않은 곳 난 그냥 나를 위해 일한이 실현
이크발 안사리를

@Malabarba 폰트 잠금 모드와 대상 버퍼와이 일을하는 방법을 사용 발견
이크발 안사리를


오 좋은! 기꺼이 도울 수 :)
Iqbal Ansari

3

Library Narrow Indirect ( narrow-indirect)가 여기에 도움이 될 수 있습니다. 헤더 해설을 살펴보십시오. 다음에 의존합니다.

  1. 좁힘 (Narrowing) : 버퍼의 일부로 편집을 제한하고
  2. 간접 버퍼-다른 모드에서 버퍼를 복사하여 주 모드를 변경할 수 있습니다.

축소는 초보자에게 친숙하지 않은 것으로 간주되므로 기본적으로 비활성화되어 있습니다 (기본 바인딩은 C-x n n). init 파일에 다음을 넣어서 활성화 할 수 있습니다.

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

당신은 또한 myfn-narrow-indirectconf 에서 나의 handmade 를 볼 수 있습니다 .


좁히는 것이 실제로 글꼴 잠금에 영향을 줍니까? 글꼴 잠금은 실제로 버퍼 제한을 제거하지 않습니까?
lunaryorn

어쨌든 위키 패키지는 옵션이 아닙니다.
lunaryorn

또한 disabled명령 에서 속성 을 제거하지 않아도 Emacs Lisp에서 호출 할 수 있습니다. 대화식 사용에만 영향을 미칩니다.
lunaryorn

0

조직 모드 소스 블록에이 기능을 제공하는 org-src-font-lock-fontify-block을 살펴볼 것을 제안합니다. 관련 부분을 다른 버퍼에 복사하고 주요 모드를 활성화 한 다음 글꼴로 된 텍스트를 다시 복사하는 것 같습니다. 해 키시지만 작동하는 것 같습니다.


2
이 답변은 문제를 처리하기위한 제안 된 방향을 제공하지만 완전한 답변이 아닌 한 주석처럼 보입니다. 주석으로 변경하십시오.
Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.