Set 4 Space Indent in Emacs in Text Mode

I've been unsuccessful in getting Emacs to switch from 8 space tabs to 4 space tabs when pressing the TAB in buffers with the major mode text-mode . I've added the following to my .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)

No matter how I change my .emacs file (or my buffer's local variables) the TAB button always does the same thing.

  • If there is no text above, indent 8 spaces
  • If there is text on the previous line, indent to the beginning of the second word
  • As much as I love Emacs this is getting annoying. Is there a way to make Emacs to at least indent 4 space when there's not text in the previous line?


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

    Short answer:

    The key point is to tell emacs to insert whatever you want when indenting, this is done by changing the indent-line-function. It is easier to change it to insert a tab and then change tabs into 4 spaces than change it to insert 4 spaces. The following configuration will solve your problem:

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

    Explanation:

    From Indentation Controlled by Major Mode @ emacs manual:

    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.

    From indent-relative @ emacs manual:

    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.

    Just change the value of indent-line-function to the insert-tab function and configure tab insertion as 4 spaces.


    It always pains me slightly seeing things like (setq tab-stop-list 4 8 12 ................) when the number-sequence function is sitting there waiting to be used.

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

    or

    (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))
    
    链接地址: http://www.djcxy.com/p/28632.html

    上一篇: 如何将Eclipse更改为使用空格而不是制表符?

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