마이너 모드를 활성화하는 올바른 방법


24

나는이 foo는 모드를 하고 사용 할 바 - 마이너 모드를 그것을 위해. 그렇다면 어느 쪽이 더 일반적이고 선호됩니까?

에이

(add-hook 'foo-mode-hook 'bar-minor-mode)

(add-hook 'foo-mode-hook (lambda ()
                           "Turn on `bar-minor-mode' mode."
                           (bar-minor-mode 1)))

기음

(defun bar-minor-mode-on ()
  "Turn on `bar-minor-mode' mode."
  (interactive)
  (bar-minor-mode 1))

(add-hook 'foo-mode-hook 'bar-minor-mode-on)

• 변형 C이지만 기능이 업스트림으로 푸시 됨

이자형

• 변형 C이지만 플러그인 레시피에 저장된 기능


4
안녕하세요 @Netsu, 람다에서 제거한 인용을 다시 추가 한 것으로 나타났습니다. 일반적으로 람다를 인용하는 것은 해 롭기 때문에 Stefan과 나는 좋은 사례를 동기 부여하려고합니다. :-)
Malabarba 2014

답변:


26

사용중인 (또는 타겟팅) Emacs 버전에 따라 다릅니다. Emacs 24+를 독점적으로 사용하는 경우 변형 A를 안전하게 사용할 수 있습니다.

* Incompatible Lisp Changes in Emacs 24.1

** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally.  This is so that you can write e.g.

 (add-hook 'text-mode-hook 'foo-mode)

to enable foo-mode in Text mode buffers, removing the need for
`turn-on-foo-mode' style functions.  This affects all mode commands
defined by `define-minor-mode'.  If called interactively, the mode
command still toggles the minor mode.

NEWS 파일에서 가져온 것이지만 주석에 따라 함수 기호에 함수 인용을 사용하는 것이 좋습니다.

 (add-hook 'text-mode-hook #'foo-mode)

코드가 Emacs 23 (또는 그 이전 버전)에서 실행되어야 할 경우, 개인적으로 후크 변수에서 익명 함수를 보는 것을 싫어하므로 변형 C를 사용합니다. (변형 D & E, 마음의 의미를 이해하지 못했습니다).


3
모드가 정의되지 않은 경우 바이트 컴파일러가 경고 할 수 있도록 부 모드에 대해 함수 따옴표를 사용하는 것이 좋습니다.
lunaryorn

감사. 그러나 기능 인용은 여전히 ​​필요합니까? 어떤 장점이 있습니까? 람다에도 필요합니까?
Netsu


7

배포하는 패키지가 아닌 자체 구성을 편집한다고 가정 할 때 몇 가지 장점이있는 또 다른 방법이 있습니다.

(add-hook 'foo-mode-hook
          #'custom-foo-hook)

(defun custom-foo-hook ()
  (bar-minor-mode 1)
  (baz-minor-mode 1)
  ;; ...
  (define-key foo-mode-map "C-c C-b" #'foobar))

장점은 모든 것이 하나의 후크에 저장되어 있으므로 일부 항목을 비활성화하려면 할 필요 remove-hook가 없지만 대신 custom-foo-hook및에 일부 내용을 주석 처리하십시오 C-M-x.

모든 모드에서 사용자 정의 후크로 이동하는 명령을 작성할 수도 있습니다.


1
이것은 (본질적으로) 다른 이름을 가진 변형 C이지만 강조 할 가치가 있다고 생각합니다. 이것은 내 구성에서 주요 모드 동작을 사용자 정의 할 때 취하는 접근법입니다.
phils

1
변형 C add-hook는 활성화 할 각 부 모드에 대해 여러 명령문을 의미 합니다. 하나의 add-hook진술 만 갖는 것이 유리하다는 점 을 강조하고 싶었습니다 .
abo-abo

동의했다. 내 머릿속에서 나는 변형 C를 "모드 만을 가능하게 하는 커스텀 함수를 정의하는 것"보다는 "모드를 가능하게하는 커스텀 함수를 정의하는"것으로 거의 변환 했지만, 후자는 의도 인 것으로 보인다. 당신이 말했듯이, 그것은 코드가 개인적인 용도인지 아닌지에 달려 있습니다.
phils

7

정확히 무엇을하는 새로운 명령을 정의 bar-minor-mode하시겠습니까?

24.1부터는 모두 완전히 동일하므로 덜 중복되는 옵션을 사용하십시오. 옵션 A

(add-hook 'foo-mode-hook #'bar-minor-mode)

1
안전한 솔루션입니까? foo-mode-hook 부모 모드 중 하나 가 bar-minor-mode 가 두 번 호출하는 것과 동일한 후크를 갖는 경우 비활성화됩니다. 예기치 않은 동작.
Netsu

2
@Netsu yes, 인수없이 마이너 모드 함수를 호출하면 마이너 모드가 무조건 활성화됩니다.
Malabarba

4
@Malabarba Emacs 24 기준. 이전 버전에서는 실제로 모드를 토글합니다.
lunaryorn

1
@lunaryorn 네, 그래서 필자의 대답이 더 낫습니다. :-) 나는 나의 것을 고치기에는 너무 게으르다.
Malabarba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.