emacs에서 활성 부 모드를 어떻게 나열합니까?


답변:


125

C-h m또는 M-x describe-mode모든 활성 부 모드 (및 주 모드)와 각각에 대한 간략한 설명을 표시합니다.


21

모든 부 모드 명령 목록은 변수에 저장됩니다 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)))

참고 : 이것은 현재 버퍼에서만 작동합니다 (부 모드는 특정 버퍼에서만 활성화 될 수 있기 때문).


지도 내부 목록에 추가 하시겠습니까? 뒤얽힌.
jrockway

4
@jrockway 가장 자랑스러운 순간이 아닙니다.
Trey Jackson

boundp대신 사용 symbolp하면 condition-case.
Lassi

4

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를 다시 시작하거나 메모리로 활성화해야합니다.


3

특정 모드가 활성화 된 모든 버퍼를 사용 하여 프로그래밍 방식으로 작업을 수행 하려는 경우 가장 좋고 가장 미니멀하며 가장 깨끗한 내장 솔루션은 다음과 같습니다.

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

다음을 수행합니다.

  1. 를 통해 모든 버퍼의 목록을 검색합니다 buffer-list. 현재 활성 버퍼는 목록의 맨 앞에 있습니다 (따라서 일반적으로 원하는 것을 먼저 처리하지만current-buffer 상관하지 않으면 매개 변수는 제외).
  2. 버퍼 목록을 반복하고 각 버퍼 이름을 변수에 할당합니다. $buf .
  3. with-current-buffer $bufEmacs에게 본문 내의 모든 코드가 마치 버퍼 내부에서 실행되는 것처럼 실행되어야한다고 알리는 데 사용 합니다.$buf 가 실제로 화면에 표시되는 대신 .
  4. when <some mode variable>모드가 활성화되어 있는지 확인하는 올바른 방법입니다. if및 기타 이러한 방법을 사용할 수도 있습니다 . 어느 쪽이든 목표는 부 또는 주 모드의 주 모드 변수가 버퍼에 설정되어 있는지 확인하는 것입니다. 거의 모든 모드는 모드를 "정의"하여 변수를 정의합니다. 그러면 자동으로 모드 이름을 따서 명명 된 버퍼 로컬 변수가 생성됩니다. 표준 변수가없는 경우 자체 소스 코드를보고 "토글"코드가 어떻게 켜고 끄는지를 결정합니다. 99 %는 자신의 모드 이름 변수의 존재를 사용합니다 (그렇지 않으면 모드 작성자에게 버그로보고하는 것이 좋습니다). 예를 들어, 버퍼에 공백 모드가 활성화되어 있는지 확인하려면 when whitespace-mode.
  5. 그 후, "x"와 모드가 활성화 된 버퍼의 이름과 함께 메시지를 메시지 버퍼에 출력합니다. 여기에서 발견 된 버퍼로 원하는 작업을 수행하기 위해 고유 한 코드를 넣을 수 있습니다.

즐겨! 더 크고 깨끗한 lisp 코드로 나아가세요!


2

다음은 다른 답변에서 이미 해결 된 일부 방법과 유사한 간단한 대체 스 니펫입니다.

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.