untabify ao salvar no Emacs 24 sem make-local-hook

2

Eu gostaria de desabilitar sempre que eu salvar um buffer. Isso funcionou bem até que eu atualizei para o Emacs 24, que quebrou, já que não há mais make-local-hook . Dê uma olhada:

;;; 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) ))

EDITAR

Consegui-lo para trabalhar com a ajuda abaixo e este site .

O mais irônico é que, com a minha solução antiga (usando make-local-hook ), de alguma forma eu tenho isso globalmente (é por isso que eu tive que adicionar essa verificação para makefiles do GNU).

Agora, isso parece ser uma coisa local: isso é bom, já que o teste não precisa ser feito a cada salvamento; apenas, você tem que declarar quais modos o untabify deve ser feito. (Eu acho que você poderia simplesmente adicioná-los um por um à medida que avançasse, cada vez que você descobrisse uma aba, até que você terminasse. Embora pareça que você está usando 5-6 modos, quando você pensa sobre isso, você usa toneladas!)

Mas, para confundir ainda mais as coisas, o modo HTML parece fazer isso, sem intervenção! Se você ler o código acima, verá que mesmo para a solução antiga, o HTML era o gato entre as minas ...

De qualquer forma, isso parece funcionar:

(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)
    
por Emanuel Berg 19.01.2013 / 21:30

1 resposta

2

O Emacs 24 usa o parâmetro LOCAL de add-hook em vez de make-local-hook . (Acredito que foi adicionado no Emacs 21.1, mas make-local-hook não foi removido até o Emacs 24).

Tente isto:

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

Seu outro problema é que untab-all deve retornar nil para indicar que não gravou o buffer em disco (conforme explicado nos documentos para write-contents-hooks , ou como agora é chamado, 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
    
por 19.01.2013 / 22:07

Tags