답변:
모든 부 모드 명령 목록은 변수에 저장됩니다 minor-mode-list
. 그들이 활성 상태인지 아닌지 알아내는 것은 일반적으로 같은 이름의 변수를 확인하여 수행됩니다. 따라서 다음과 같이 할 수 있습니다.
(defun which-active-modes ()
"Give a message of which minor modes are enabled in the current buffer."
(interactive)
(let ((active-modes))
(mapc (lambda (mode) (condition-case nil
(if (and (symbolp mode) (symbol-value mode))
(add-to-list 'active-modes mode))
(error nil) ))
minor-mode-list)
(message "Active modes are %s" active-modes)))
참고 : 이것은 현재 버퍼에서만 작동합니다 (부 모드는 특정 버퍼에서만 활성화 될 수 있기 때문).
boundp
대신 사용 symbolp
하면 condition-case
.
describe-mode
어떻게 든 활성화 된 부 모드 목록을 만들 수 있는데, 왜 그렇게 할 수 없습니까? 그래서 소스 코드를 읽은 후 minor-mode-list
및 에서 활성 부 모드 목록을 가져 오는 것을 깨달았습니다 minor-mode-alist
. 타사 dash.el
목록 조작 라이브러리를 사용하여 다음 코드와 함께 제공되었습니다.
(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
예를 들어 모든 부 모드를 비활성화하려면 -each
다음을 사용하십시오 .
(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))
변수에 부 모드 목록을 저장하는 것을 잊지 마십시오. 그렇지 않으면 Emacs를 다시 시작하거나 메모리로 활성화해야합니다.
특정 모드가 활성화 된 모든 버퍼를 사용 하여 프로그래밍 방식으로 작업을 수행 하려는 경우 가장 좋고 가장 미니멀하며 가장 깨끗한 내장 솔루션은 다음과 같습니다.
(dolist ($buf (buffer-list (current-buffer)))
(with-current-buffer $buf
(when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
(message "x %s" $buf))))
다음을 수행합니다.
buffer-list
. 현재 활성 버퍼는 목록의 맨 앞에 있습니다 (따라서 일반적으로 원하는 것을 먼저 처리하지만current-buffer
상관하지 않으면 매개 변수는 제외).$buf
.with-current-buffer $buf
Emacs에게 본문 내의 모든 코드가 마치 버퍼 내부에서 실행되는 것처럼 실행되어야한다고 알리는 데 사용 합니다.$buf
가 실제로 화면에 표시되는 대신 .when <some mode variable>
모드가 활성화되어 있는지 확인하는 올바른 방법입니다. if
및 기타 이러한 방법을 사용할 수도 있습니다 . 어느 쪽이든 목표는 부 또는 주 모드의 주 모드 변수가 버퍼에 설정되어 있는지 확인하는 것입니다. 거의 모든 모드는 모드를 "정의"하여 변수를 정의합니다. 그러면 자동으로 모드 이름을 따서 명명 된 버퍼 로컬 변수가 생성됩니다. 표준 변수가없는 경우 자체 소스 코드를보고 "토글"코드가 어떻게 켜고 끄는지를 결정합니다. 99 %는 자신의 모드 이름 변수의 존재를 사용합니다 (그렇지 않으면 모드 작성자에게 버그로보고하는 것이 좋습니다). 예를 들어, 버퍼에 공백 모드가 활성화되어 있는지 확인하려면 when whitespace-mode
.즐겨! 더 크고 깨끗한 lisp 코드로 나아가세요!