如何按文件类型设置Emacs选项卡设置?

时间:2010-10-23 20:51:41

标签: 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很陌生,所以我的配置知识非常低。

5 个答案:

答案 0 :(得分:28)

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

对于Ruby(我的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或类似的东西。

干杯。

答案 1 :(得分:7)

有关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-basic-offset但尝试一些组合,看看效果最好。

答案 2 :(得分:6)

js-mode使用js-indent-level所以把(setq js-indent-level 4)放到〜/ .emacs中(不应该在钩子里,甚至,但如果你想知道,那就是js-mode-钩子,而不是javascript-mode-hook)。

如果设置tab-width不会更改某个模式的缩进级别,那么打开该模式的源通常最简单。我通过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)

这样我就可以处理更少的变量(并且不必获得有关文件局部变量不安全的警告,或者如果模式写入者忘记将其声明为安全的话,则不需要警告)

答案 3 :(得分:0)

如果您正在使用带有emacs 23.1.1的ELPA&#css-mode.el,则可以通过执行以下操作来参数化选项卡宽度的CSS文件的选项卡宽度的全局设置: 1)输入M-x customize-variable, 2)然后键入css-indent-level, 3)然后在根据自己的喜好更改变量后,执行"保存以备将来的会话"。

答案 4 :(得分: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表示ERB中的嵌入式Ruby等。