문제

EMACS에 활성 마이너 모드를 어떻게 나열합니까?

도움이 되었습니까?

해결책

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

다른 팁

모든 사소한 모드 명령 목록이 변수에 저장됩니다. 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)))

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

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

마이너 모드 목록을 변수에 저장하는 것을 잊지 마십시오. 그렇지 않으면 EMAC를 다시 시작하거나 메모리로 활성화해야합니다.

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

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))

당신이 원한다면 프로그래밍 방식으로 특정 모드가 활성화 된 모든 버퍼로 무언가를 수행 한 다음 가장, 가장 미니멀하고 가장 깨끗한 내장 솔루션은 다음과 같습니다.

(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 $buf emacs에 본문 내의 모든 코드가 마치 버퍼 내부에서 실행되는 것처럼 실행되어야한다고 말합니다. $buf 화면에 실제로 표시하는 버퍼 대신.
  4. when <some mode variable> 모드가 활성화되어 있는지 확인하는 올바른 방법입니다. 당신은 또한 사용할 수 있습니다 if 그리고 다른 방법들. 어느 쪽이든, 목표는 마이너 또는 메이저 모드의 기본 모드 변수가 버퍼에 설정되어 있는지 확인하는 것입니다. 거의 모든 모드는 "정의"를 통해 변수를 정의합니다. 자동으로 이들은 모드의 이름을 따서 명명 된 버퍼 로컬 변수를 생성하게합니다. 이것이 작동하는 방식입니다. 표준 변수가없는 경우 자체 소스 코드를보고 "토글"코드가 켜고 끄는 방법을 결정하는 방법을 확인하십시오. 그들 중 99%는 Modename 변수의 존재를 사용합니다 (그렇지 않은 경우 모드의 저자에게 버그로보고하는 것이 좋습니다). 예를 들어, 버퍼에 공백 모드가 활성화되어 있는지 확인하려면 when whitespace-mode.
  5. 그런 다음 "x"와 모드가 활성화 된 버퍼의 이름을 사용하여 메시지 버퍼에 메시지를 출력합니다. 그곳에서 발견 된 버퍼로 원하는 모든 일을하기 위해 자신의 코드를 넣을 수있는 곳입니다.

즐기다! 더 크고 깨끗한 LISP 코드로!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top