关于缩进:在文本模式下在Emacs中设置4个空格缩进

Set 4 Space Indent in Emacs in Text Mode

在主模式text-mode的缓冲区中按TAB时,我没有成功让Emacs从8个空格标签切换到4个空格标签。 我已将以下内容添加到.emacs中:

1
2
3
4
5
6
(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按钮总是做同样的事情。

  • 如果上面没有文字,则缩进8个空格
  • 如果前一行有文本,则缩进到第二个单词的开头
  • 尽管我喜欢Emacs但这很烦人。 当上一行中没有文本时,有没有办法让Emacs至少缩进4个空格?


    简短回答:

    关键点是告诉emacs在缩进时插入你想要的东西,这是通过改变缩进线功能来完成的。更改它以插入选项卡然后将选项卡更改为4个空格比将其更改为插入4个空格更容易。以下配置将解决您的问题:

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

    说明:

    来自主流模式控制的缩进@ emacs手册:

    An important function of each major
    mode is to customize the key to
    indent properly for the language being
    edited.

    [...]

    The indent-line-function variable is
    the function to be used by (and
    various commands, like when calling
    indent-region) to indent the current
    line. The command
    indent-according-to-mode does no more
    than call this function.

    [...]

    The default value is indent-relative
    for many modes.

    来自缩进相关的@ emacs手册:

    Indent-relative Space out to under next
    indent point in previous nonblank line.

    [...]

    If the previous nonblank line has no
    indent points beyond the column point
    starts at, `tab-to-tab-stop' is done
    instead.

    只需将indent-line-function的值更改为insert-tab函数,并将Tab键插入配置为4个空格。


    更新:自Emacs 24.4以来:

    tab-stop-list is now implicitly extended to infinity. Its default value is changed to nil which means a tab stop every tab-width columns.

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

    原始答案如下......


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

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

    要么

    1
    2
    3
    4
    5
    6
    7
    8
    9
    (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))


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

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

    1
    2
    3
    4
    5
    6
    (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))))


    您可能会发现更容易设置选项卡,如下所示:

    1
    M-x customize-group

    Customize group:提示符下输入indent

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

    如果您这样做,您将需要设置自定义文件。


    1
    2
    3
    (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)

    1
    2
    3
    4
    5
    6
    (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 ++代码和内部注释


    1
    2
    3
    4
    5
    6
    7
    (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有一个名为indent-relative的(新的?)tab方法,它似乎是为了排列表格数据而设计的。 TAB键映射到方法indent-for-tab-command,它调用变量indent-line-function设置的任何方法,这是文本模式的缩进相对方法。我没有想出一个覆盖缩进行函数变量的好方法(文本模式挂钩不工作,所以也许它在模式挂钩运行后重置?)但是一个简单的方法来摆脱这个行为是通过将TAB设置为更简单的tab-to-tab-stop方法来查看intent-for-tab-command方法:

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


    试试这个:

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

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


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

    1
    2
    3
    4
    5
    6
    (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)))

    我希望它有所帮助。


    只是用c-set风格改变风格对我来说已经足够了。


    将其添加到.emacs文件中:

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

    1
    (setq default-tab-width 2)

    要确保emacs实际上使用制表符而不是空格:

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

    另外,在选项卡上退格时,emacs的默认设置是将其转换为空格然后删除空格。这可能很烦人。如果您希望它只删除选项卡,您可以这样做:

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

    请享用!


    自定义可以隐藏(setq tab width 4),因此使用setq-default或让Customize知道您正在做什么。 我也遇到类似于OP的问题并单独修复它,不需要调整tab-stop-list或任何insert函数:

    1
    2
    3
    (custom-set-variables
     '(tab-width 4 't)
     )

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

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

    这是唯一一个不会为我插入标签的解决方案,没有顺序或将标签转换为空格。这两个似乎都足够,但浪费:

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

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

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

    M-i


    在我在.emacs文件中写这个之前,最好的答案不起作用:

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

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


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


    从我的init文件,不同,因为我想要空格而不是标签:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    (add-hook 'sql-mode-hook
              (lambda ()
                 (progn
                   (setq-default tab-width 4)
                   (setq indent-tabs-mode nil)
                   (setq indent-line-function 'tab-to-tab-stop)
                   (modify-syntax-entry ?_"w")       ; now '_' is not considered a word-delimiter
                   (modify-syntax-entry ?-"w")       ; now '-' is not considered a word-delimiter
                   )))

    你有没有尝试过

    1
    (setq  tab-width  4)