버퍼를 저장할 때마다 탭을 억제하고 싶습니다. 이것은 내가 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-hook
make-local-hook
make-local-hook
이 시도:
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(add-hook 'write-contents-hooks 'untab-all nil t) ))
다른 문제는 버퍼를 디스크에 쓰지 않았음을 나타내기 위해 untab-all
반환해야 한다는 것 입니다(문서에 명시된 대로 또는 지금 호출됨 ).nil
write-contents-hooks
write-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