您的位置:首页 > 其它

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

2014-03-05 15:48 399 查看

问题描述

我的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配置,发现两点跟以上解决方案不符:

  1. Purcell的配置并不是使用after-save-hook的,而是启用global-whitespace-cleanup-mode来实现空格处理的功能
  2. 当前版本的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 Wed 15:41

Emacs 24.3.1 (Org mode 8.2.5h)

Validate

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐