답변:
동일한 버퍼의 여러 위치를보고 편집합니다. 따라서 긴 버퍼를 스크롤 할 필요없이 창을 보이는 영역으로 전환하면됩니다. 복제 된 각 버퍼에는 다른 마크 링, 좁힘 및 기타 버퍼 속성이 있습니다. 간접 버퍼를 사용하지 않고 동일한 버퍼의 다른 창을 만들면 모든 것이 공유되므로 다른 위치를보고 편집하는 것 외에 다른 고급 기능을 수행 할 수 없습니다. 예를 들어, 간접 버퍼를 사용하면 모든 코드 블록을 접고 원래 버퍼에 영향을주지 않고 효과적으로 "태그 트리"를 만들 수 있습니다. 창을 사용하면 두 버퍼가 동일하므로 두 창의 두 버퍼가 모두 접 힙니다.
요약하면, 간접 버퍼는 원래 버퍼에서 동일한 텍스트와 파일을 공유하는 완전히 다른 버퍼이므로 복제 된 버퍼를 저장하면 원래 파일도 저장됩니다.
한 사용 사례는 파일의 한 부분에서 다른 주요 모드를 사용하는 것입니다.
예를 들어 특정 요소 내부에 코드가있는 XML 문서로 한 번 작업했습니다. 전체 문서를 XML처럼 편집 할 수 있기를 원했지만 특정 요소에 포함 된 프로그래밍 언어에 대한 모든 주요 모드 기능을 계속 가지고 있기 때문에 실행중인 간접 버퍼에서 해당 요소의 본문으로 좁혔습니다. 적절한 주 모드.
내 구성의 기능은 다음과 같습니다.
(defun indirect-region (start end)
"Edit the current region in another indirect buffer.
Prompt for a major mode to activate."
(interactive "r")
(let ((buffer-name (generate-new-buffer-name "*indirect*"))
(mode (intern
(completing-read
"Mode: "
(mapcar (lambda (e)
(list (symbol-name e)))
(apropos-internal "-mode$" 'commandp))
nil t))))
(pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))
(funcall mode)
(narrow-to-region start end)
(goto-char (point-min))
(shrink-window-if-larger-than-buffer)))
참고 : 이것은 완벽하지는 않습니다. font-lock과 같은 것은이 시나리오에서 사용하기 위해 특별한 추가 작업이 필요합니다.
간접 버퍼는 동일한 버퍼에 대한 여러 뷰를 제공합니다. 특히 여러 협소화는 각각 여러 가지 측면에서 별도의 버퍼처럼 작동합니다.
도서관 논평 narrow-indirect.el
은 다음과 같이 말합니다 :
생각보다 간접 버퍼를 사용할 수 있습니다. 예를 들어 Dired 버퍼의 일부에서 가져온 복제본을 사용하여 디렉토리 목록에 유용한 (활성)보기를 제공 할 수 있습니다.
g
전체 Dired 버퍼의보기에 의존하기 때문에 작동하지 않는 키 / 명령 (예 : 목록 업데이트)이 몇 개 밖에 없습니다. 실험, 그리고 당신은 의심 할 여지없이 간접 버퍼에 대한 흥미로운 새로운 용도를 찾을 것입니다.