为什么我的Emacs会使用空格而不是制表符?

为什么我的Emacs会使用空格而不是制表符?,emacs,keyboard-shortcuts,code-formatting,Emacs,Keyboard Shortcuts,Code Formatting,我正在尝试诊断这个问题。制表符创建4个空格,而不是我想要的4列制表符。但我不认为应该这样做,因为所讨论的缓冲区上的C-hv缩进制表符模式表示它被设置为t。当我检查键绑定时,TAB被设置为c-indent-line-or-region。此功能是否忽略“我的选项卡”模式 检查选项卡宽度变量。如果它是8(默认值),那么Emacs当然必须插入四个空格,因为选项卡“太多了”。检查文件中是否有空格。加载文件时,这些特殊格式的行可以覆盖您的设置 下面是一段Ruby代码的底部示例,强制缩进为2个空格,制表符转换

我正在尝试诊断这个问题。制表符创建4个空格,而不是我想要的4列制表符。但我不认为应该这样做,因为所讨论的缓冲区上的
C-hv缩进制表符模式
表示它被设置为
t
。当我检查键绑定时,TAB被设置为
c-indent-line-or-region
。此功能是否忽略“我的选项卡”模式

检查
选项卡宽度
变量。如果它是8(默认值),那么Emacs当然必须插入四个空格,因为选项卡“太多了”。

检查文件中是否有空格。加载文件时,这些特殊格式的行可以覆盖您的设置

下面是一段Ruby代码的底部示例,强制缩进为2个空格,制表符转换为空格:

# Local Variables:
# tab-width: 2
# ruby-indent-level: 2
# indent-tabs-mode: nil
# End:

我解决了这个问题。毕竟,这是在插入制表符。结果我认为这不是因为当我点击backspace键时,该键被绑定到
c-electric-backspace
,它查看变量
c-backspace-function
,该变量被设置为
向后删除字符,哪个IMO违背了在Emacs中设置制表符的目的。

制表符和缩进是一个比大多数人预期的要复杂得多的主题。我强烈建议你花些时间来阅读它——从长远来看,它几乎肯定会帮你省去一些困惑

Emacs Wiki的以下页面将大部分相关讨论分组:

那里有很多,但值得一看

顺便说一句,TabsAreEvil和SmartTabs配置中的一种或另一种很可能会吸引您,这取决于您对该主题的个人看法

确保已阅读tab stop list变量上的页面。它隐藏在链接列表的底部,但是在没有自动缩进规则的情况下,了解选项卡的行为以及“tabify”之类的东西是至关重要的

标尺模式在这里也很有用。我使用文本模式自动启用它:

;; Use ruler in text-mode
(add-hook 'text-mode-hook
          (function (lambda ()
                      (setq ruler-mode-show-tab-stops t)
                      (ruler-mode 1))))

请务必查看文件的第一行。如果你看到类似的东西 //——制表符宽度:4;模式:C++;c-基本偏移量:4;缩进制表符模式:无--
此行将覆盖所有全局或模式设置。

它是8。我刚刚把它改为4,但问题仍然存在。注意,很多人(包括我自己)认为标签是邪恶的:-你已经将标签宽度从默认的8改为4。如果我看一下你的代码,缩进就错了。此外,您通常喜欢对齐代码的一部分,即函数参数-这在单独使用制表符时是不可能的,并且最终会混合使用制表符和空格。您可能会发现x-stretch-cursor变量和空白模式对于直观地识别制表符非常有用。默认情况下,后者可能相当花哨,但它可以合理定制,因此您可能会发现一个令人满意的配置。如果我早一点看到这个答案,我会省下一个小时的生命。