【问题标题】:How can I set Emacs tab settings by file type?如何按文件类型设置 Emacs 选项卡设置?
【发布时间】:2010-10-23 20:51:40
【问题描述】:

我需要能够为以下文件类型设置选项卡设置:

  • .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 很陌生,所以我对配置的了解很少。

【问题讨论】:

  • 您要求的是 .rb 文件,这些文件是 ruby​​ 文件。但是你的钩子是用于 javascript 的。还有什么是.erb?
  • 我应该提到我当前的设置默认使用 2 个软间隔选项卡,这适用于 ruby​​ 文件。至于 .erb 文件,它们本质上是嵌入了 ruby​​ 代码的 html 文件。结帐en.wikipedia.org/wiki/ERuby#erb 了解更多信息。

标签: emacs


【解决方案1】:

在 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 函数:)。学习一些 lisp。

我使用的是js2模式,默认缩进完美。对于 js,你必须搜索 js-indent-level 或类似的东西。

干杯。

【讨论】:

  • 这样我得到了正确的标签宽度,但我仍然得到了软标签。我试过(setq indent-tabs-mode t),但这似乎没有任何作用。
  • indent-tabs-mode 是一个缓冲区局部变量。如果要全局启用它,请使用 (set-default 'indent-tabs-mode t)。这至少对我来说适用于文本模式。其他一些模式可能没有考虑到它。例如,ruby 有ruby-indent-tabs-mode,它将解决您的 ruby​​ 问题。在 css 中,到目前为止我没有看到任何效果,并且找不到对此负责的变量。对不起。显然,每种模式的设计者都会针对标签功能做出自己的决定。
  • 我能想到的所有 xxx-indent-tabs-mode 都玩过,但还是都很软。
  • 在本周不得不与 textmate 合作后回到 emacs 后,现在很多选项卡都可以使用了,除了 css,它给了我 3 个间隔的软选项卡。
  • 我感觉 javascript 没有设置为当前模式,因为它现在可以正常工作,所以这不起作用。
【解决方案2】:

Emacs 缩进的方式有很多方面。设置制表符宽度仅指定插入文字制表符时制表符的大小。如果您不想使用文字制表符进行缩进,那么您应该首先禁用它们的插入 (from the manual ):

Emacs 通常同时使用选项卡和 空格缩进行。若你宁可, 所有缩进都可以从 仅限空格。要请求这个,设置 缩进制表符模式为零。这是一个 每个缓冲区变量,所以改变 变量只影响当前 缓冲区,但有一个默认值 你也可以改变。你也可以改变。

但是,要指定缩进级别,您还需要设置 c-basic-offset value 变量:

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

在您的情况下,您可能只需要 c-basic-offset,但可以尝试几种组合,看看哪种效果最好。

【讨论】:

  • 我使用了 c-basic-offset 我尝试使用和不使用 indent-tabs-mode 以及使用/不使用制表符宽度,但它们都不起作用。我正在使用 emacs 入门工具包,所以是否有其他 .el 文件覆盖了我在 chris.el 中的设置?
  • 在删除除我的自定义文件之外的所有其他配置文件后,仅使用上述设置,我仍然会在制表符上缩进 2 个空格。
  • 我相信 VitoshKa 的答案在这种情况下更相关——我所描述的应该适用于任何 cc-mode 派生模式(例如 java-mode、csharp-mode 等)。抱歉,如果这具有误导性 - 我很抱歉。
【解决方案3】:

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

如果设置制表符宽度不会改变您在特定模式下的缩进级别,通常最简单的方法是打开该模式的源代码。我通过C-h f js-mode 找到了这个变量,点击链接“js.el”,然后搜索“indent”,从上数第二次点击。


但是,如果您经常与其他人合作,最好将 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)

这样我可以处理更少的变量(并且不必收到有关文件局部变量不安全或模式编写者忘记将其声明为安全的警告)

【讨论】:

    【解决方案4】:

    如果您将 ELPA 的 css-mode.el 与 emacs 23.1.1 一起使用,您可以通过执行以下操作将 CSS 文件的标签宽度的全局设置参数化为标签宽度: 1) 键入 M-x customize-variable , 2) 然后输入 css-indent-level, 3)然后根据自己的喜好更改变量后,执行“保存以备将来会话”。

    【讨论】:

      【解决方案5】:

      对于 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 等。

      【讨论】:

        猜你喜欢
        • 2016-03-18
        • 1970-01-01
        • 2011-08-28
        • 2010-12-06
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多