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が実行する必要があるモードを指定します。 (終了するまでタップを探すたびに1つずつ追加すればいいようです。

しかし、さらに混乱するように、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) ))

もう1つの問題は、バッファをディスクに書き込んでいないことを示すために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

おすすめ記事