program story

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

inputbox 2020. 8. 15. 09:12
반응형

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


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

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


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

(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 $bufEmacs에게 본문 내의 모든 코드 $buf가 실제로 화면에 표시되는 버퍼 대신 버퍼 내부에서 실행되는 것처럼 실행되어야한다고 알리는 데 사용 합니다 .
  4. when <some mode variable>모드가 활성화되어 있는지 확인하는 올바른 방법입니다. if및 기타 이러한 방법을 사용할 수도 있습니다 . 어느 쪽이든 목표는 부 또는 주 모드의 주 모드 변수가 버퍼에 설정되어 있는지 확인하는 것입니다. 거의 모든 모드는 모드를 "정의"하여 변수를 정의합니다. 그러면 자동으로 모드 이름을 따서 명명 된 버퍼 로컬 변수가 생성됩니다. 표준 변수가없는 경우 자체 소스 코드를보고 "토글"코드가 어떻게 켜고 끄는지를 결정합니다. 99 %는 자신의 모드 이름 변수의 존재를 사용합니다 (그렇지 않으면 모드 작성자에게 버그로보고하는 것이 좋습니다). 예를 들어, 버퍼에 공백 모드가 활성화되어 있는지 확인하려면 when whitespace-mode.
  5. After that, it just outputs a message to the Messages buffer, with an "x" and the name of the buffer that had the mode active. That's where you'd put your own code, to do whatever you wanted to do with the discovered buffer.

Enjoy! Onwards to greater and cleaner lisp code!

참고URL : https://stackoverflow.com/questions/1511737/how-do-you-list-the-active-minor-modes-in-emacs

반응형