【问题标题】:Set 4 Space Indent in Emacs in Text Mode在 Emacs 中以文本模式设置 4 空格缩进
【发布时间】:2010-09-09 08:31:11
【问题描述】:

当在主模式text-mode 的缓冲区中按 TAB 时,我无法让 Emacs 从 8 个空格制表符切换到 4 个空格制表符。我已将以下内容添加到我的.emacs

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

无论我如何更改我的.emacs 文件(或我的缓冲区的局部变量),TAB 按钮总是做同样的事情。

  1. 如果上面没有文字,缩进8个空格
  2. 如果上一行有文字,则缩进到第二个单词的开头

尽管我很喜欢 Emacs,但它越来越烦人。当上一行没有文本时,有没有办法让 Emacs 至少缩进 4 个空格?

【问题讨论】:

  • 对于模式行 C++ 或 csharp-mode 我添加 (setq tab-width 4) (setq c-basic-offset 4) 到 (defun csharp-mode () ... )它使 (1) 选项卡显示为 4 个而不是 8 个字符,并且 (2) 当我按下制表符时,我在新行上得到 4 个空格。
  • 很晚了,但我才意识到使用 (setq tab-width 4) 不起作用,但如果你使用 (setq-default tab-width 4) 你不需要做任何其他事情.
  • 如果您想使用空格但转到制表位,请查看我的答案。
  • 发现此问题的其他人请注意:(setq-default tab-width 4)(setq tab-width 4) 不同,请确保您没有错过“-default”!
  • 我不敢相信这很难做到。

标签: emacs indentation


【解决方案1】:

你试过了吗

(setq  tab-width  4)

【讨论】:

  • 他们的问题中有这个,所以是的,可以肯定地假设他们尝试过。
【解决方案2】:

不要将变量tab-width 与变量tab-stop-list 混淆。 前者用于显示文字TAB 字符。 后者控制在某些模式下按下TAB 字符时插入的字符。

-- GNU Emacs Manual

(customize-variable (quote tab-stop-list))

或将 tab-stop-list 条目添加到 .emacs 文件中的 custom-set-variables 中:

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))

编辑标签行为的另一种方法是使用M-x edit-tab-stops

有关edit-tab-stops 的更多信息,请参阅GNU Emacs Manual on Tab Stops

【讨论】:

  • tab-width 和 tab-stop-list 都是必需的。 tab-width 用于显示选项卡,而 tab-stop-list 用于确定添加选项卡时的制表位。
  • 真的没有比'(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120)))更短的东西了吗?好吧,只要它有效,我猜......:P
  • 根据文档,您不需要所有这些职位。只需执行 4 8 12,它将扩展到所有其他人(继续添加 4)。显然,如果您只使用 1 个或 2 个元素而不是 3 个,它只会使用制表符宽度作为最后一步。所以理论上,如果我想用四个空格来制表符,并且我的制表符宽度设置为 4。我可以写'(tab-stop-list (quote (4)))
  • @NicholasPeterson 感谢您注意到这一点!尽管如此,实际上quote 似乎需要两个数字来无限地继续序列。见:stackoverflow.com/a/42148697/2662028
【解决方案3】:

试试这个:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

这将使 TAB 始终插入一个文字 TAB 字符,每 4 个字符带有制表位(但仅限于文本模式)。如果这不是您所要求的,请描述您希望看到的行为。

【讨论】:

  • 我认为 OP 想要空格而不是制表符(因此点击制表符会插入 4 个空格)。
  • 结合 Aquamacs 2.4,这个特定的答案给了我另一种语言的字符,而不是标签:렔。如果 tab 键被按下超过一次,结果是:렔렔(没有任何分隔)。每次连续的制表符按下也是如此。
【解决方案4】:

您可能会发现如下设置标签更容易:

M-x customize-group

Customize group: 提示符处输入indent

您将看到一个屏幕,您可以在其中设置所有缩进选项并为当前会话设置它们或为所有未来会话保存它们。

如果你这样做,你会想要set up a customisations file

【讨论】:

  • 我需要记住 M-x customize-group - 非常方便的快捷方式!
  • 缩进似乎是 4,但它仍然适用于 \begin{tikzpicture}\end{tikzpicture} 之间的 2
【解决方案5】:
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)

【讨论】:

    【解决方案6】:

    这个问题不是由缺少制表位引起的;是 emacs 有一个(新的?)选项卡方法,称为 indent-relative,它似乎旨在排列表格数据。 TAB 键映射到 indent-for-tab-command 方法,该方法调用变量 indent-line-function 设置的任何方法,这是文本模式的相对缩进方法。我还没有想出一个好方法来覆盖 indent-line-function 变量(文本模式挂钩不起作用,所以它可能在模式挂钩运行后被重置?)但是一个简单的方法来摆脱这个行为是通过将 TAB 设置为更简单的 tab-to-tab-stop 方法来放弃 intent-for-tab-command 方法:

    (define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)

    【讨论】:

      【解决方案7】:
      (setq-default tab-width 4)
      (setq-default indent-tabs-mode nil)
      

      【讨论】:

        【解决方案8】:

        只用 c-set-style 改变样式对我来说就足够了。

        【讨论】:

          【解决方案9】:

          简答:

          关键是告诉emacs在缩进时插入你想要的任何东西,这是通过改变indent-line-function来完成的。将其更改为插入一个制表符,然后将制表符更改为 4 个空格比将其更改为插入 4 个空格更容易。以下配置将解决您的问题:

          (setq-default indent-tabs-mode nil)
          (setq-default tab-width 4)
          (setq indent-line-function 'insert-tab)
          

          解释:

          来自Indentation Controlled by Major Mode @ emacs manual

          每个专业的重要功能 模式是自定义的关键 为当前语言正确缩进 已编辑。

          [...]

          缩进行函数变量是 要使用的功能(和 各种命令,例如调用时 indent-region) 缩进当前 线。命令 indent-according-to-mode 不再做 而不是调用这个函数。

          [...]

          默认值是相对缩进 适用于多种模式。

          来自 indent-relative @emacs 手册:

          缩进相对空格 out to under next 前一个非空行的缩进点。

          [...]

          如果前一个非空行没有 超出列点的缩进点 开始于,`tab-to-tab-stop' 完成 而是。

          只需将 indent-line-function 的值改为 insert-tab 函数,并配置制表符插入为 4 个空格即可。

          【讨论】:

          • 我遇到了和OP一样的问题,你的解决方案对我不起作用。
          • 请进一步详细说明。您的意思是使用上述行作为 .emacs 的唯一内容并调用“M-x indent-according-to-mode”不会插入 4 个空格?
          • 你的配置为我插入了 8 个空格。
          • 我使用的是 emacs 版本 23.3.1,简短的回答不会将其更改为空格。这个答案具有误导性。
          • @BruceBarnett 我处于文本模式,但这些说明仍然不起作用。
          【解决方案10】:

          将此添加到您的 .emacs 文件中:

          这会将标签显示的宽度设置为 2 个字符(将数字 2 更改为您想要的任何值)

          (setq default-tab-width 2)
          

          为了确保 emacs 实际使用的是制表符而不是空格:

          (global-set-key (kbd "TAB") 'self-insert-command)
          

          顺便说一句,当在制表符上退格时,emacs 的默认设置是将其转换为空格,然后删除空格。这可能很烦人。如果你想让它只删除标签,你可以这样做:

          (setq c-backspace-function 'backward-delete-char)
          

          享受吧!

          【讨论】:

          • 不符合问题中提出的至少 4 个空格。
          【解决方案11】:

          更新:自 Emacs 24.4 起:

          tab-stop-list 现在隐式扩展到无穷大。它的默认值更改为nil,这意味着每个tab-width 列都有一个制表位。

          这意味着不再需要按如下所示的方式设置tab-stop-list,因为您可以将其设置为nil

          原答案如下...


          number-sequence 函数坐在那里等待使用时,看到像(setq tab-stop-list 4 8 12 ................) 这样的东西总是让我有点痛苦。

          (setq tab-stop-list (number-sequence 4 200 4))
          

          (defun my-generate-tab-stops (&optional width max)
            "Return a sequence suitable for `tab-stop-list'."
            (let* ((max-column (or max 200))
                   (tab-width (or width tab-width))
                   (count (/ max-column tab-width)))
              (number-sequence tab-width (* tab-width count) tab-width)))
          
          (setq tab-width 4)
          (setq tab-stop-list (my-generate-tab-stops))
          

          【讨论】:

          • 这是我可以在我的系统上工作的唯一答案。
          • emacs 缩进自定义页面显示选项卡列表“通过重复最后一步隐式扩展到无穷大” - 这意味着列表 (4 8) 应该足够好,没有明确的数字序列
          • @JamesWaldby-jwpat7 事实上,这发生在 24.4(2014 年)。 NEWS 说:“tab-stop-list 现在隐式扩展到无穷大。它的默认值更改为 nil,这意味着每个 tab-width 列都有一个制表位。” -- 所以实际上你可以使用默认值nil
          • 缩进似乎是 4 in 但 emacs 仍然在 \begin{tikzpicture} 和 \end{tikzpicture} 之间应用 2 个空格
          • @alper:缩进功能因模式而异——不同的语言可能有非常不同的规则和要求。您必须阅读有关 Emacs 如何专门进行 LaTeX(我认为)缩进的阅读。
          【解决方案12】:

          您可以将这些代码行添加到您的 .emacs 文件中。 它为文本模式添加了一个钩子,以使用 insert-tab 而不是 indent-relative。

          (custom-set-variables
           '(indent-line-function 'insert-tab)
           '(indent-tabs-mode t)
           '(tab-width 4))
          (add-hook 'text-mode-hook
                (lambda() (setq indent-line-function 'insert-tab)))
          

          希望对你有帮助。

          【讨论】:

            【解决方案13】:
            (defun my-custom-settings-fn ()
              (setq indent-tabs-mode t)
              (setq tab-stop-list (number-sequence 2 200 2))
              (setq tab-width 2)
              (setq indent-line-function 'insert-tab))
            
            (add-hook 'text-mode-hook 'my-custom-settings-fn)
            

            【讨论】:

            • 这对我有用,而此页面上的其他人没有。
            • 在 emacs 中工作 26.3
            【解决方案14】:
            (setq-default indent-tabs-mode nil)
            (setq-default tab-width 4)
            (setq indent-line-function 'insert-tab)
            (setq c-default-style "linux") 
            (setq c-basic-offset 4) 
            (c-set-offset 'comment-intro 0)
            

            这也适用于 C++ 代码和里面的注释

            【讨论】:

            • 聚会迟到了,但谢谢。我无法理解为什么 emacs 需要特定的指令才能将其缩进规则也应用于 C/C++ 代码。我以后会关注vim...
            • 我想亲自问这个问题,这样我才能接受这个答案。如果可以的话,我会给它一个赏金。我非常非常沮丧,因为一个改变让 emacs 不愿意在 4 点按 tab,正在浏览这个页面上的所有解决方案,你为我节省了大量的工作!
            【解决方案15】:

            顺便说一下,对于 C 模式,我将 (setq-default c-basic-offset 4) 添加到 .emacs。详情请见http://www.emacswiki.org/emacs/IndentingC

            【讨论】:

              【解决方案16】:

              在我的初始化文件中,不同的是因为我想要空格而不是制表符:

              (add-hook 'sql-mode-hook (拉姆达() (预测 (setq-default tab-width 4) (setq indent-tabs-mode nil) (setq indent-line-function 'tab-to-tab-stop) (修改语法条目?_“w”);现在 '_' 不被视为单词分隔符 (修改语法条目?-“w”);现在 '-' 不被视为单词分隔符 )))

              【讨论】:

                【解决方案17】:

                在我将这个写在 .emacs 文件中之前,最好的答案是无效的:

                (global-set-key (kbd "TAB") 'self-insert-command)
                

                【讨论】:

                  【解决方案18】:

                  这是唯一让我永远不会插入制表符的解决方案,无需将制表符序列或转换为空格。这两个似乎都足够了,但很浪费:

                  (setq-default
                      indent-tabs-mode nil
                      tab-width 4
                      tab-stop-list (quote (4 8))
                  )
                  

                  请注意,quote 需要两个数字才能工作(但不能更多!)。

                  此外,在大多数主要模式下(例如Python),缩进在 Emacs 中是自动的。如果您需要在自动缩进之外缩进,请使用:

                  M-i

                  【讨论】:

                    【解决方案19】:

                    自定义可以影响(setq tab width 4),所以要么使用setq-default,要么让自定义知道你在做什么。我也遇到了与 OP 类似的问题,仅用这个就修复了,不需要调整 tab-stop-list 或任何 insert 函数:

                    (custom-set-variables
                     '(tab-width 4 't)
                     )
                    

                    发现在之后立即添加它很有用(来自 emacsWiki 的提示):

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

                    【讨论】:

                      【解决方案20】:

                      修改this answer不带任何钩子:

                      (setq-default
                        indent-tabs-mode t
                        tab-stop-list (number-sequence 4 200 4)
                        tab-width 4
                        indent-line-function 'insert-tab)
                      

                      【讨论】:

                        【解决方案21】:

                        要在文本模式下按Tab 会缩进,然后按固定值制表符/间距(不是前一行字)

                        另见:缩进-相对-第一个缩进点,制表符宽度缩进制表符模式

                        (add-hook 'text-mode-hook
                         (lambda()
                           (progn
                             (setq tab-always-indent nil) 
                             ;(setq electric-indent-mode nil)
                             (setq indent-line-function 
                                   (lambda()
                                     (indent-relative 't)   
                                     )
                                   ) 
                             (setq tab-always-indent nil)
                             )))
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-05-14
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-01-07
                          • 2010-12-12
                          相关资源
                          最近更新 更多