2010-10-23 90 views
18

我需要能够为下列文件类型设置选项设置:如何根据文件类型设置Emacs标签设置?

  • .RB:2个软空间
  • 的.css,.html.erb:4个空间标签

我已经尝试了以下内容,但似乎没有任何内容会改变每种文件类型的默认选项卡设置。

;; js-mode-hook has also been tried 
(add-hook 'javascript-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'css-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq tab-width 8))) 

我对emacs很新,所以我的配置知识很低。

+0

你要求.rb文件这是红宝石文件。但你的钩子是用于JavaScript的。什么是.erb? – VitoshKa 2010-10-24 08:49:46

+0

我应该提到我的当前设置默认使用2个软间隔标签,用于ruby文件。至于.erb文件,它们基本上是嵌入了ruby代码的html文件。结帐http://en.wikipedia.org/wiki/ERuby#erb了解更多信息。 – chris 2010-10-24 17:58:56

回答

25

在emacs中,每种模式都有自己的缩进样式。缩进的主要命令(绑定到TAB)是indent-for-tab-command。 该命令调用在变量indent-line-function中找到的特定于模式的缩进函数。所以每种模式都有自己的做法。

对于红宝石(我的emacs 2是默认):

(setq ruby-indent-level 2) 

对于CSS(再次,默认值是4对我来说):

(setq css-indent-offset 4) 

不幸的是SGML模式(其中HTML模式基于)有一个非常简单的缩进机制,显然这个级别是不可配置的。 请参阅sgml-calculate-indent函数的源代码。

我个人觉得很奇怪。我不写HTML,但你可以尝试自己修改sgml-calculate-indent函数:)。学一些唇齿轮。

我使用的是js2模式,并且默认情况下它完全缩进。对于js,你必须搜索js-indent-level或类似的东西。

干杯。

+0

由于我得到适当的标签宽度,但我仍然得到软标签。我试过(setq indent-tabs-mode t),但这似乎没有做任何事情。 – chris 2010-10-24 18:01:20

+0

indent-tabs-mode是一个缓冲区局部变量。如果你想让它可以循环使用(set-default'indent-tabs-mode t)。这至少适用于我的文本模式。其他一些模式可能没有考虑到它。例如红宝石有'ruby-indent-tabs-mode'这将解决您的问题的红宝石。在CSS中,我目前没有看到任何效果,并且找不到可响应的变量。抱歉。显然,每个模式的设计师都会根据标签功能做出自己的决定。 – VitoshKa 2010-10-24 20:03:01

+0

我已经玩过所有我能想到的xxx-indent-tabs-mode,但它们仍然很柔和。 – chris 2010-10-26 04:15:41

7

Theres关于Emacs如何缩进的一些方面。设置制表符宽度仅指定插入文字选项卡时制表符的大小。如果你不希望使用的文字标签的缩进,那么你应该先禁用其插入(from the manual )

Emacs中通常使用两个标签和 空格缩进线。如果您愿意, 所有缩进可以从 空间进行。要请求此操作,请将 indent-tabs-mode设置为nil。这是每个缓冲区变量的 ,因此更改 变量只会影响当前的 缓冲区,但有一个默认值 ,您可以更改它,也可以更改。

然而,指定缩进层次,你还需要设置c-basic-offset value变量:

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq c-basic-offset 4) 
     (setq indent-tabs-mode nil)) 

在你的情况,你可能只需要在C-基本偏移,但尝试几个组合,看看什么效果最好。

+0

我使用c-basic-offset我尝试过,没有indent-tabs-mode,也没有/没有制表符宽度,都没有工作。我正在使用emacs入门工具包,所以有可能其他一些.el文件正在重写我在chris.el中的设置? – chris 2010-10-24 00:31:41

+0

在除了我的自定义文件之外的所有其他配置文件(仅使用上述设置)之后,我仍然在缩进中得到2个空格的缩进。 – chris 2010-10-24 03:16:47

+0

我相信VitoshKa的答案在这种情况下更具相关性 - 我所描述的应该适用于任何cc模式派生模式(例如,java-mode,csharp-mode等)。对不起,如果这是误导 - 我的道歉。 – cristobalito 2010-10-24 22:18:18

5

JS-模式使用js-indent-level所以把(setq js-indent-level 4)到你的〜/的.emacs(不应该是在一个钩,甚至,但如果你想知道,这是JS-mode-hook中,没有JavaScript的模式 - 钩)。

如果设置制表符宽度不会更改某个模式的缩进级别,那么只需打开该模式的源代码通常是最简单的方法。我通过做C-h f js-mode找到了这个变量,点击链接“js.el”,然后搜索“缩进”,从顶部第二次点击。


但是,如果您与其他人进行了大量合作,最好将cookie放在文件的顶部。我通常做// -*- tab-width: 8 -*-文件中,然后我有这样的东西在我的〜/的.emacs:

(defvaralias 'c-basic-offset 'tab-width) 
(defvaralias 'cperl-indent-level 'tab-width) 
(defvaralias 'perl-indent-level 'tab-width) 
(defvaralias 'js-indent-level 'tab-width) 

让我有较少的变量来处理(而不必以获取有关文件的警告 - 本地变量是不安全的,或者如果模式作者忘记声明它是安全的)

0

如果您使用ELPA的css-mode.el和emacs 23.1.1,则可以参数化CSS的标签宽度的全局设置通过执行以下操作来为制表符宽度生成文件: 1)键入Mx自定义变量, 2)然后键入css-indent-level, 3)然后,在根据自己的喜好更改变量后,你做“保存将来的会议”。

0

对于HTML和ERB:如果您使用web-mode(由Spacemacs提供的模式),也可以是简单:

(setq-default web-mode-code-indent-offset 2 web-mode-markup-indent-offset 2)

其中markup-indent-offset指的是实际的标签和code-indent-offset是指嵌入的Ruby在ERB等