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

我已经在使用主模式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文件(或我的缓冲区的本地variables) TABbutton始终做同样的事情。

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

就像我爱Emacs一样,这让人讨厌。 有没有办法让Emacs在上一行没有文本的时候至less缩进4个空格?

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

或在.emacs文件中将制表符停止列表项添加到自定义设置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)))) 

简短的回答:

关键是告诉emacs插入任何你想要的,这是通过改变indent-line-function来完成的。 将其更改为插入一个选项卡,然后将选项卡更改为4个空格而不是将其更改为插入4个空格更容易。 以下configuration将解决您的问题:

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

说明:

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

每个主要模式的一个重要function是定制要正确缩进正在编辑的语言的键。

[…]

indent-line-functionvariables是由(和​​各种命令,如调用缩进区域时)使用的缩进当前行的函数。 indent-by-to-mode命令只不过是调用这个函数。

[…]

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

来自indent-relative @ emacs手册:

在前一个非空行中的下一个缩进点之前的缩进相关空间。

[…]

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

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

number-sequencefunction正坐在那里等待使用时,它总是会让我轻微看到像(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)) 

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

 Mx customize-group 

在“ Customize group:提示inputindent

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

如果你这样做,你会想要build立一个自定义文件 。

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

这个问题不是由于缺less制表位造成的; 这是emacs有一个(新?)选项卡方法称为缩进相对似乎devise为排列表格数据。 TAB键被映射到indent-for-tab-command方法,该方法调用variablesindent-line-function设置的任何方法,这是用于文本模式的缩进相关方法。 我没有想出一个很好的方式来重写indent-line-functionvariables(文本模式钩子不工作,所以也许它是在模式挂钩运行后重置?),但一个简单的方法来摆脱这一点行为就是通过将TAB设置为更简单的tab-to-tab-stop方法来查找tab-command-intent-command方法:

(define-key text-mode-map(kbd“TAB”)'制表符到制表符停止)

尝试这个:

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

这将使TAB总是插入每4个字符(但仅限于文本模式)的制表符Tab停止的文字制表符。 如果这不是你所要求的,请描述你想看到的行为。

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

我希望它有帮助。

只要改变风格对于我来说就足够了。

 (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文件中:

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

 (setq default-tab-width 2) 

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

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

顺便说一句,退格时,emacs的默认值是将其转换为空格,然后删除空格。 这可能是烦人的。 如果你想只是删除标签,你可以这样做:

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

请享用!

最好的答案不工作,直到我写在.emacs文件中:

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

这是唯一的解决scheme,保持从我的插入标签,没有一个序列或标签转换为空格。 这两个看起来都不错,但浪费了:

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

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

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

M

定制可以影响(setq tab width 4)所以要么使用setq-default要么让Customize知道你在做什么。 我也有类似于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) 

你有没有尝试过

 (setq tab-width 4) 
 (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文件,不同,因为我想空间而不是制表符:


 (加钩'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”); 现在“_”不被视为单词分隔符
                (modify-syntax-entry? - “w”); 现在“ - ”不被视为单词分隔符 
                )))