makefile


Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法

问题描述 我的Emacs使用了Purcell的配置,在其配置中使用了whitespace-cleanup,且通过在.emacs.d/lisp/init-edit-utils.el中设定: (require ‘whitespace-cleanup-mode) (global-whitespace-cleanup-mode t) 这样设定后,默认会全局使用whitespace-cleanup-mode,导致的结果是在保存文件前将TAB转换成对应的空格。这样的结果在多数情况下是我们想要的,但是对于有些类型的文件(比如makefile)而言便是灾难了。通过实测发现,只有当新建maekfile文件保存时,才会将TAB符替换成空格,导致makefile格式错误,而打开编辑一个已存在的makefile后保存则不存在这个问题。 解决方法   网上的方案 网上查了很多资料,基本都是以下解决方案: ;; 默认不加载indent-tabs-mode (setq-default indent-tabs-mode nil) ;; 保存文件前执行一次whitespace-cleanup (add-hook ‘before-save-hook ‘whitespace-cleanup) ;; 如果是打开makefile文件,则开启indent-tabs-mode,因为whitespace-cleanup中会用到这个 (add-hook ‘makefile-mode-hook ‘indent-tabs-mode) 但是我看了Purcell配置,发现两点跟以上解决方案不符: Purcell的配置并不是使用after-save-hook的,而是启用global-whitespace-cleanup-mode来实现空格处理的功能 当前版本的whitespace-cleanup-mode的实现代码中,并没用使用indent-tabs-mode,因此修改这个没用 我的解决方案 经过一系列的失败尝试后,我总算找到一种解决方案: ;; 后面设置tab-width部分只是个人喜好,与本问题无关 ;; 当打开makefile文件时,禁用whitespace-cleanup-mode。其他类似需要保留TAB的文件类型也可以采用这种方法 (add-hook ‘makefile-mode-hook (lambda () (whitespace-cleanup-mode 0) (setq tab-width 8))) 现在,我们在Emacs中新建makefile文件并保存后,再也不会出现问题了!^_^ Author: Rex Shen Created: 2014-03-05 […]