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


159

TAB使用主模式按in缓冲区时,我无法使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个空格?


对于模式行C ++或csharp-mode,我在(defun csharp-mode()...)的末尾添加了(setq tab-width 4)(setq c-basic-offset 4),它起到了使( 1)标签显示为4个字符,而不是8个字符;(2)当我按Tab时,我在新行上得到4个空格。
Jared Updike

很晚了,但我刚刚意识到使用(setq tab-width 4)不起作用,但是如果使用(setq-default tab-width 4),则不需要执行其他任何操作。
Sambatyon

如果要使用空格,但请转到制表位,请参阅我的答案。
forkandwait 2014年

注意发现此问题的其他人:(setq-default tab-width 4)(setq tab-width 4)确保您没有错过“ -default” 是不一样的!
zachaysan 2015年

10
我不敢相信这很难做到。
gwg

Answers:


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

9
制表符宽度和制表符停止列表都是必需的。当显示标签时,使用标签宽度,而在添加标签时需要使用标签停止列表来确定标签停止。
Michael Ratanapintha


5
真的比这短'(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
HelloGoodbye 2014年

5
根据文档,您不需要所有这些职位。只需执行4 8 12,它将扩展到所有其他(继续添加4)。显然,如果仅使用1个或2个元素而不是3个元素,则最后一步将使用制表符宽度。因此,从理论上讲,如果我想按四个空格制表,并且制表符宽度设置为4,则可以编写'(tab-stop-list (quote (4)))
尼古拉斯·彼得森

1
@NicholasPeterson谢谢您的注意!但是,实际上似乎quote需要两个数字才能继续无穷大。请参阅:stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

简短答案:

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

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

说明:

主要模式控制的缩进@ emacs manual

每种主要模式的一项重要功能是自定义键,以针对所编辑的语言正确缩进。

[...]

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

[...]

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

从缩进相对@ emacs手册:

相对于上一个非空白行中下一个缩进点的缩进相对空间。

[...]

如果前一个非空白行没有缩进点,超出了列点的起点,则执行“ tab-to-tab-stop”。

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


10
我和OP有同样的问题,您的解决方案对我不起作用。
Gauthier

请进一步详细说明。您是否意味着将上述行用作.emacs的唯一内容并调用“ Mx缩进模式”,将不会插入4个空格?
alcortes 2010年

3
您的配置为我插入了8个空格。
Vladimir Mihailenco 2011年

4
我正在使用emacs版本23.3.1,简短的回答不会将其更改为空格。这个答案是误导的。
VNarasimhaM

2
@BruceBarnett我处于文本模式,这些说明仍然不起作用。
2015年

66

更新:从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))

这是我可以在系统上工作的唯一答案。
卡波夫2015年

emacs缩进自定义页面显示选项卡列表“通过重复最后一步隐式扩展到无穷大”-这意味着列表(4 8)应该足够好,没有明确的数字顺序
James Waldby-jwpat7

@ JamesWaldby-jwpat7确实,这发生在24.4(2014)。NEWS说:“ tab-stop-list现在隐式扩展为无穷大。其默认值更改为nil,这意味着每个tab-width列都将制表位停止。” -因此实际上您可以使用默认值nil
phils

21

您可能会发现按以下步骤设置标签更加容易:

M-x customize-group

Customize group:提示符下输入indent

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

如果以这种方式进行操作,则需要设置自定义文件


我需要记住Mx custom-group-非常方便的快捷方式!
尼克·博尔顿

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)

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)

这对我有用,而此页面上的其他人却没有。
Michael Terry

在emacs中工作26.3
Saurabh,

9
(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 ...
MegaWidget '18

我想亲自问这个问题,以便我可以接受此答案。如果可以的话,我会赏金的。我非常非常沮丧,因为更改使emacs不愿意在4上切换,正在经历此页面上的所有解决方案,您为我节省了很多工作!
拓扑排序

7

此问题不是由缺少制表位引起的;这是emacs具有一个名为indent-relative的(新?)制表符方法,该方法似乎旨在排列表格数据。TAB键映射到方法indent-for-tab-command,该方法调用将变量indent-line-function设置为的任何方法,该方法是文本模式的indent-relative方法。我还没有想出一种重写indent-line-function变量的好方法(文本模式钩子不起作用,所以它可能在模式钩子运行后被重置了吗?),但是一种简单的方法可以摆脱这种情况行为是通过将TAB设置为更简单的Tab-to-Tab-Stop方法来仅使用Intent-For-Tab-Command方法:

(定义键文本模式映射(kbd“ TAB”)“制表符到制表符停止”)


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个字符(但仅在文本模式下)。如果这不是您要的,请描述您希望看到的行为。


4
我认为OP希望使用空格而不是制表符(因此按Tab会插入4个空格)。
mipadi

与Aquamacs 2.4结合使用时,此特定答案为我提供了另一种语言的字符,而不是制表符:렔。如果多次按下Tab键,则结果为:렔렔(无分隔)。每次连续按Tab键也是如此。
法律列表

6

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

希望对您有所帮助。



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)

请享用!


不满足至少四个空格的问题。
kmarsh

2

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

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

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

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

M--i


2

定制可能会阴影,(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)

1

直到我在.emacs文件中编写以下代码,最佳答案才有用:

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

0

你有没有尝试过

(setq  tab-width  4)

2
他们的问题中有这个问题,因此可以肯定地假设他们尝试过。
ryanpcmcquen

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


0

与我的init文件不同,因为我想要空格而不是制表符:

(add-hook'sql-mode-hook
          (lambda()
             (前进
               (setq-默认制表符宽度4)
               (setq indent-tabs-mode nil)
               (setq缩进行功能'tab-to-tab-stop') 
               (modify-syntax-entry?_“ w”);现在'_'不被认为是单词定界符
               (modify-syntax-entry?-“ w”);现在'-'不被认为是单词定界符
               )))

0

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

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.