Emacs 24:Unabify保存一切*除了*生成文件

Emacs 24:Unabify保存一切*除了*生成文件,emacs,makefile,Emacs,Makefile,我的.emacs中有以下代码: ;; untabify on save ;; source: http://www.e

我的
.emacs
中有以下代码:

;; untabify on save                                                                                                                                                                                               
;; source: http://www.emacswiki.org/emacs/UntabifyUponSave and                                                                                                                                                    
;; http://stackoverflow.com/questions/318553/getting-emacs-to-untabify-when-saving-certain-file-types-and-only-those-file-ty                                                                                      
;; and a little help from http://ergoemacs.org/emacs/emacs_avoid_lambda_in_hook.html                                                                                                                              
;; and help from http://stackoverflow.com/questions/1931784/emacs-is-before-save-hook-a-local-variable                                                                                                            
(defun untabify-everything ()
  (untabify (point-min) (point-max)))
(defun untabify-everything-on-save ()
  (add-hook 'before-save-hook 'untabify-everything)
  nil)

;; I think the c-mode-common-hook includes the makefile-modes, so it's untabifying those                                                                                                                          
;; maybe not?                                                                                                                                                                                                     
(add-hook 'c-mode-common-hook 'untabify-everything-on-save)
;; (add-hook 'c-mode-hook 'untabify-everything-on-save)                                                                                                                                                           
;; (add-hook 'c++-mode-hook 'untabify-everything-on-save)                                                                                                                                                         
;; (add-hook 'java-mode-hook 'untabify-everything-on-save)                                                                                                                                                        
(add-hook 'python-mode-hook 'untabify-everything-on-save)
(add-hook 'latex-mode-hook 'untabify-everything-on-save)
(add-hook 'org-mode-hook 'untabify-everything-on-save)
(add-hook 'css-mode-hook 'untabify-everything-on-save)
(add-hook 'html-mode-hook 'untabify-everything-on-save)
(add-hook 'emacs-lisp-mode-hook 'untabify-everything-on-save)
但是
unbify save上的所有内容
似乎都在运行
BSDmakefile模式
makefile模式
。我怎么才能让它不那么做呢

(目前我的
makefile
中有一个解决方法:

.RECIPEPREFIX = +
tree:
+ @tree -L 2 -C $(PROJECT_DIR)
但这不是一个令人满意的解决方案。它假设每个收到我的makefile的人都有GNU Make版本>3.81,我不能保证。)

根据,(!!我错误地认为)解决方案是改变

(defun untabify-everything-on-save ()
  (add-hook 'before-save-hook 'untabify-everything)
  nil)

因为我猜前者会感染多个缓冲区,而后者显然是特定缓冲区的局部

编辑:等等,我保存并重新加载了
.emacs
文件,并认为它可以工作,但后来我重新启动了emacs,现在当我试图保存
.emacs
缓冲区时,它挂起了(可能还有所有其他调用
解除保存时所有内容的模式)


edit2:I
nano
'd my
.emacs
文件注释掉
emacs lisp模式下保存文件时取消所有设置的行,这样至少我可以在emacs中编辑该文件,但似乎其他任何模式都是,正如预期的那样,无法保存。

以下定义了一个函数,用于
解除整个缓冲区的绑定,除非其主模式是
makefile模式
或其派生模式之一。我们可以将该函数放在保存挂钩之前的
中,以获得您想要的功能:

(defun untabify-except-makefiles ()
  "Replace tabs with spaces except in makefiles."
  (unless (derived-mode-p 'makefile-mode)
    (untabify (point-min) (point-max))))

(add-hook 'before-save-hook 'untabify-except-makefiles)

请注意,原始的
在保存时解除所有内容的绑定
所做的唯一一件事是在保存挂钩
之前将原始的
解除所有内容的绑定
添加到
,因此它被应用到您试图保存到文件的每个缓冲区,包括make文件。将原始的
unabify everything on save
添加到各种模式钩子基本上是调用一个函数从另一个钩子添加到钩子,这没有实现您想要的功能,在概念上很奇怪。

我遇到了同样的问题。最后我想到了:

(defun tvaughan/untabify ()
  "Preserve initial tab when 'makefile-mode."
  (interactive)
  (save-excursion
    (if (derived-mode-p 'makefile-mode)
      (progn
        (goto-char (point-min))
        (while (not (eobp))
          (skip-chars-forward "\t")
          (untabify (point) (line-end-position))
          (forward-line 1)))
      (untabify (point-min) (point-max)))))

(add-hook 'before-save-hook 'tvaughan/untabify)
我经常跨越多行命令,我喜欢使用行延续标记来对齐。例如:

.PHONY: import-ova
import-ova: $(VMPACKAGE).ova
    @if ! VBoxManage list vms | grep -cq $(VMNAME);                         \
    then                                                                    \
        VBoxManage import $(VMPACKAGE).ova                                  \
          --vsys 0                                                          \
          --vmname $(VMNAME)                                                \
          --ostype Windows10_64                                             \
          --cpus 2                                                          \
          --memory 2048                                                     \
          --eula accept;                                                    \
    fi

来源:

请注意,如果您与版本控制下的人员协作,这种暴力方法可能很容易导致您提交大量与实际操作无关的空白更改,这绝对不是一个好的外观。您最好花些时间确保所做的更改格式正确,而不必对整个文件进行重击。这一点很好,但这里的“国家宗教”是空格而不是制表符。我意识到我的问题是关闭缓冲区范围的取消限制只保存一种特定模式,但现在我想起来了,在某些模式下打开它似乎更好,所以如果我将来编辑新的文件类型,我不会感到惊讶。是否有一种方法可以在保存钩子之前将
缓冲区设置为本地,或者解决方案需要比这更深入的调整?这可能有点过头了。如果一次解除缓冲区的绑定,它总是处于解除绑定状态——无需在每次保存时都执行此操作。如果您坚持使用.emacs文件,emacs将插入空格而不是制表符。从这里开始,默认情况下,所有缓冲区都将是“未加密”的,而您对旧文件所要做的就是手动对它们进行一次加密。
.PHONY: import-ova
import-ova: $(VMPACKAGE).ova
    @if ! VBoxManage list vms | grep -cq $(VMNAME);                         \
    then                                                                    \
        VBoxManage import $(VMPACKAGE).ova                                  \
          --vsys 0                                                          \
          --vmname $(VMNAME)                                                \
          --ostype Windows10_64                                             \
          --cpus 2                                                          \
          --memory 2048                                                     \
          --eula accept;                                                    \
    fi