후크를 어떻게 "그룹화"합니까?


14

후행 공백 표시, 버퍼 경계 표시, 무지개 색 구분 기호 등 대부분의 모드에서 또는 대부분의 프로그래밍 및 텍스트 관련 문자 (후행 공백을 표시하기 때문에)를 활성화하고 싶습니다. 예를 들어 ediff-mode예외 규칙과 함께 세계화 된 부 모드를 사용하는 대신 주 모드와 충돌합니다. 대부분의 모드가 하나에서 파생되기 때문에 prog-mode또는 text-mode모두에 해당하는 기능을 추가 prog-mode-hook하고 text-mode-hook작업을 수행하지만 같은이 규격 다음 충분한 모드가있다 css-mode거나 LaTeX-mode.

한 번에 하나의 후크에만 기능을 추가하는 동안이 모든 모드를 포함하는 후크를 정의하고 싶습니다. non-special-mode-hook(와 구별하기 위해) 호출 해 봅시다 special-mode-hook. 모든 주요 모드에서 실행되는 후크를 어떻게 만들 수 있습니까?


답변:


19

해당 설정을 기능으로 그룹화하고 해당 기능을 모든 관련 후크 기능에 추가하십시오.

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

이 작업을 수행하는 다른 방법은 더 간결하지 않습니다. 어떤 일이 발생하더라도 어딘가에 화이트리스트 또는 블랙리스트 모드가 있습니다. 실제로는 목록에 추가해야하는 몇 가지 모드 만 있으므로 간단하게 유지하는 것이 좋습니다.

내 자신의 구성 에서이 트릭 을 사용하여 여러 lisp 지향 모드의 구성을 통합합니다.


감사합니다.이 솔루션을 다른 유용한 그룹 (예 : lispy 그룹)에도 적용 할 것입니다.
wasamasa

1
그것이 바로 제가하는 일입니다 : github.com/purcell/emacs.d/blob/…
sanityinc

1
훌륭합니다. 답에 URL을 추가 할 수 있습니까? 강조 표시된 스 니펫은 실제 사용법을 잘 설명 할뿐만 아니라 Emacs Lisp 관련 "후크"를 더 큰 "후크"의 하위 세트로 사용하는 것과 기존 주요 모드에서 후크 이름을 자동으로 만드는 방법과 같은 추가 사용법을 보여줍니다. 로 derived-mode-hook-name.
wasamasa

나는 (dolist ...)vs (add-hook ...)<repeat>에 대해서만 내 것보다 이것을 좋아합니다 . 모드 별 변경 사항을 별도 (모드 당 파일 use-package, el-get)로 유지할 때만 내 것을 고수했습니다 . 둘 다 일체형 솔루션이지만 서로 다른 관점에서 볼 수 있습니다.
Jonathan Leech-Pepin

여기에 0이 아닌 APPEND인수를 제공하지 않으면 사용자가 제공 한 add-hook목록 순서의 역순으로 후크가 호출됩니다. 아무 문제가 없습니다. 순서가 중요한 경우에만주의하십시오.
Drew

5

after-change-major-mode-hook새로운 모드가 흥미로운 것인지 (가능한 (not (derived-mode-p 'special-mode))경우) 확인하고, 그렇다면 실행 되는 기능을 추가 할 수 있습니다 non-special-mode-hook.


이것은 꽤 근사하게 들립니다 (한 번 사용하면 몇 가지가 있기 때문에 모든 "특별하지 않은"모드를 알아 fundamental-mode냈지만 텍스트를 표시하는 것 이상을 수행합니다).하지만 내 취향에는 너무 마술입니다. 따라서 공감.
wasamasa

4

필자는 종종 @sanityinc의 설정 및 마이너 모드 활성화를 defun으로 래핑하고 호출을 통해 루핑하는 패턴을 수행한다는 것을 알았지 만 더 깨끗한 접근 방식을 원했기 때문에이 매크로를 작성했습니다.

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

참고 : 나는 dash.el청결을 위해 있지만 쉽게 사용하도록 조정할 수 있습니다 (dolist).

그런 다음 그룹화 된 모드를 목록 변수로 정의하고 다음과 같이 사용할 수 있습니다.

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
여기서는 derived-mode-hook-name모드의 후크 변수 이름을 가져 와서 intern트릭 을 피할 수 있습니다.
sanityinc

@sanityinc TIL derived-mode-hook-name. 좋은 팁!
waymondo

1

파생되지 않은 모든 모드 에서 작동하는 새 후크를 정의하는 대신 다음을 수행 할 수 있습니다.

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

여전히 모든 모드에 추가해야하지만 모든 모드를 포함하도록 함수를 정의하면 추가 기능을 추가 / 제거 할 때 하나의 정의 만 변경하면됩니다.


-2

아마도 당신은 이것을 시도 할 수 있습니다 :

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

(add-hook 'lisp-dialects-mode-hook 'func)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.