cc 모드를위한 사전 저장 후크


13

cc-mode저장하기 전에 기능을 실행 하도록 사용자 정의하고 싶습니다 . 한 가지 해결책은 cc-mode키맵 을 수정 하여 C-x C-s필요한 작업을 수행 한 다음 저장하는 기능 에 바인딩 하는 것입니다.

내 질문은 이것에 대해 사용자 정의 할 수있는 후크가 있는지 여부입니다. CC 후크의 문서는 언급하지 않는 before-save-hook특별히을 cc-mode. 후크를 통해 어떻게해야합니까?

또는 어떻게 이것을 통해 defadvice합니까? 매뉴얼을 읽음으로써 내가 볼 수있는 유일한 방법은 저장하기 전에 조언을 활성화 한 다음 작업이 완료된 후 비활성화하는 것입니다. 번거로워 요. advices 를 사용하는 관용적 방법은 무엇입니까 ?


3
당신이 추가 기능은 before-save-hook현재 주요 모드 (예를 확인하실 수 있습니다 (eq major-mode ...))와 아무것도하지 않는 당신이 정의하는 모드와 일치하지 않는 경우.
Constantine

@ 콘스탄틴 합의. 이런 종류의 것들에 대해 "내장 된"것이 있는지 확인하고 싶었습니다. IIRC haskell-mode에는 최소한 하나의 after/before-save후크가 있으며 이것이 프로그 모드의 표준 관행이라고 가정했습니다.
Pradhan

@Constantine : 댓글을 답변으로 변환 할 수 있습니까 (물론 약간 확장)?
Dan

1
; 사용 예제는 이 스레드 를 참조하십시오 after-save-hook. 동일한 종류의 절차를 사용할 수 있지만 대체 할 수 있습니다 before-save-hook.
Dan

답변:


12

후크의 동작을 특정 주요 모드로 제한하는 상당히 일반적인 방법 중 하나는의 값을 확인하는 것입니다 major-mode.

예를 들어이 후크는 다음을 사용하여 버퍼를 저장하기 전에 메시지를 인쇄합니다 c++-mode.

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

참고로 때로는 메이저 모드가 CC 모드에서 파생되는지 확인하는 것이 유용 할 수 있습니다. 경우 우리는 확인하여이 작업을 수행 할 수 c-buffer-is-cc-mode없는 nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

또는 로컬 후크를 사용하십시오.

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

이는 추가 MY-HOOK-FUNC받는 버퍼 로컬 before-save-hook 각각 C ++ 모드 버퍼 또는 C ++ 모드 도출 모드에있는 버퍼.

명시 적으로 확인하는 것이 더 우아하다는 것을 알았 major-mode으며 다른 버퍼에 영향을 미치지 않고 각 버퍼에 대해 before-save-hook 로컬로 비활성화 할 수 있다는 이점이 있습니다 M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local).


-1

저장시 elisp 파일을 자동 컴파일하기 위해 이와 같은 것이 필요했습니다.이 접근 방식을 cc 모드로 변환했습니다.

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
먼저, 당신은 의미 c-mode-common-hook했습니까? 둘째, 관련 언어를 before-save-hook처음 입력 할 때 함수를 추가하는 것처럼 보이지만 C해당 함수는 모든 버퍼에 저장하기 직전에 호출됩니다. OP 가해 야 할 일은 특정 모드에있는 버퍼에서 조건부 기능을 실행하는 것입니다 (방법은 @Constantine의 의견 참조).
Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.