Emacs 24에서 make-local-hook을 사용하지 않고 저장 취소

Emacs 24에서 make-local-hook을 사용하지 않고 저장 취소

버퍼를 저장할 때마다 탭을 억제하고 싶습니다. 이것은 내가 Emacs 24로 업그레이드할 때까지 잘 작동했는데 더 이상 make-local-hook. 구경하다:

;;; untabify on C-x C-s (except for GNUmakefiles that needs tabs)
;;;   (note: `stringp` check to avoid bug (?) in HTML-mode)
(defun untab-all ()
  (unless (and (stringp mode-name)
               (string= mode-name "GNUmakefile") )
    (untabify (point-min) (point-max)) ))

;; TODO: doesn't work anymore as no make-local-hook in Emacs 24 - 
;; it won't work with simply dropping that line,
;; or doing that, and passing a 4th `t` argument in the second
;; add-hook call (which is the LOCAL parameter)

;; (add-hook 'emacs-lisp-mode-hook
;;    '(lambda ()
;;       (make-local-hook 'write-contents-hooks)
;;       (add-hook 'write-contents-hooks 'untab-all) ))

편집하다

다음 도움을 받아 작동시키세요.이것장소.

아이러니하게도 이전 솔루션( 사용 make-local-hook)을 사용하면 어떻게든 이런 결과를 얻었습니다.세계적인(그래서 GNU makefile에 대한 검사를 추가해야 했습니다).

이제 이것은 로컬인 것 같습니다. 저장할 때마다 확인할 필요가 없기 때문에 괜찮습니다. untabify가 수행해야 하는 모드를 지정하면 됩니다. (끝날 때까지 탭을 찾을 때마다 하나씩 추가하면 될 것 같습니다. 5~6개 모드를 사용하는 것처럼 느껴지실 수도 있지만, 생각해보면 엄청 많이 사용하게 될 것입니다! )

그러나 더욱 혼란스럽게도 HTML 모드는 아무런 개입 없이 이 작업을 수행하는 것 같습니다. 위의 코드를 읽으면 이전 솔루션에서도 HTML이 흰족제비 사이의 고양이라는 것을 알 수 있습니다.

어쨌든, 이것은 작동하는 것 같습니다:

(defun untab-all ()
  (untabify (point-min) (point-max))
   nil ) ; did not write buffer to disk

(defun add-write-contents-hooks-hook ()
  (add-hook
   'write-contents-hooks
   'untab-all
     nil  ; APPEND  unrelated, explicit default nil as optional :)
     t )) ; LOCAL   non-nil => make hook local

;; more modes: http://www.emacswiki.org/CategoryModes
(add-hook 'emacs-lisp-mode-hook #'add-write-contents-hooks-hook)
(add-hook 'c-mode-common-hook   #'add-write-contents-hooks-hook)
(add-hook 'sh-mode-hook         #'add-write-contents-hooks-hook)
(add-hook 'text-mode-hook       #'add-write-contents-hooks-hook)
(add-hook 'sql-mode-hook        #'add-write-contents-hooks-hook)
(add-hook 'css-mode-hook        #'add-write-contents-hooks-hook)

답변1

Emacs 24는 대신 LOCAL인수를 사용합니다 . (나는 이것이 Emacs 21.1에 추가되었다고 생각하지만 Emacs 24까지는 제거되지 않았습니다.)add-hookmake-local-hookmake-local-hook

이 시도:

(add-hook 'emacs-lisp-mode-hook
    '(lambda ()
       (add-hook 'write-contents-hooks 'untab-all nil t) ))

다른 문제는 버퍼를 디스크에 쓰지 않았음을 나타내기 위해 untab-all반환해야 한다는 것 입니다(문서에 명시된 대로 또는 지금 호출됨 ).nilwrite-contents-hookswrite-contents-functions

(defun untab-all ()
  (unless (and (stringp mode-name)
               (string= mode-name "GNUmakefile") )
    (untabify (point-min) (point-max)) )
  nil) ; did not write buffer to disk

관련 정보