169

TAB在使用 main mode 按下缓冲区时,我无法让 Emacs 从 8 个空格制表符切换到 4 个空格制表符text-mode。我已将以下内容添加到我的.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 个空格?

4

21 回答 21

143

简短的回答:

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

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

解释:

主要模式控制的缩进@emacs手册

每个主要模式的一个重要功能是为正在编辑的语言自定义键以正确缩进。

[...]

indent-line-function 变量是用于缩进当前行的函数(以及各种命令,例如调用 indent-region 时)。命令 indent-according-to-mode 只是调用这个函数。

[...]

对于许多模式,默认值是相对缩进的。

来自 indent-relative @emacs 手册:

Indent-relative Space out 到下一个非空行中的下一个缩进点。

[...]

如果前一个非空行没有超出列点开始的缩进点,则改为执行“tab-to-tab-stop”。

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

于 2009-11-30T12:03:59.897 回答
67

更新:从 Emacs 24.4 开始:

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

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

原始答案如下...


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

(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))
于 2012-05-03T20:59:05.290 回答
30

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

-- GNU Emacs 手册

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

或将制表符列表条目添加到.emacs文件中的自定义设置变量:

(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))))

编辑选项卡行为的另一种方法是使用 with M-x edit-tab-stops

有关. _ _edit-tab-stops

于 2008-09-16T07:19:32.227 回答
21

您可能会发现按以下方式设置选项卡更容易:

M-x customize-group

Customize group:提示符处输入indent.

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

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

于 2008-09-16T08:23:05.553 回答
11
(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)
于 2009-01-23T04:55:33.280 回答
10
(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)
于 2013-04-21T04:28:48.550 回答
10
(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++ 代码和里面的注释

于 2013-04-25T09:15:35.043 回答
7

此问题不是由缺少制表位引起的;是 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)

于 2009-04-12T00:05:45.140 回答
7

您可以将这些代码行添加到您的 .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)))

我希望它有所帮助。

于 2012-10-29T00:37:09.743 回答
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 个字符带有制表位(但仅在文本模式下)。如果这不是您所要求的,请描述您希望看到的行为。

于 2008-09-16T07:53:41.553 回答
4

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

于 2009-08-21T01:21:20.137 回答
4

将此添加到您的 .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)

享受!

于 2012-05-03T20:07:25.237 回答
4

自定义可以影响(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)
于 2017-03-16T17:39:24.757 回答
3

这是唯一可以防止标签被插入的解决方案,无需将标签序列或转换为空格。这两个似乎都足够了,但很浪费:

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

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

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

M-i

于 2017-02-09T23:13:43.287 回答
2

直到我在 .emacs 文件中写了这个,最好的答案才起作用:

(global-set-key (kbd "TAB") 'self-insert-command)
于 2015-06-29T19:45:44.150 回答
0

你有没有尝试过

(setq  tab-width  4)
于 2008-09-16T07:10:20.843 回答
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
于 2009-08-19T18:15:17.317 回答
0

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

于 2013-09-19T06:11:05.003 回答
0

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

(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”);现在 '-' 不被视为单词分隔符
               )))
于 2014-10-09T22:29:53.317 回答
0

修改了这个答案,没有任何钩子:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
于 2020-04-14T20:48:52.880 回答
0

要在文本模式下按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)
     )))
于 2021-10-21T07:34:34.843 回答