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

Cri*_*ian 156 emacs indentation

TAB在使用主模式按下缓冲区时,我没有成功让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)
Run Code Online (Sandbox Code Playgroud)

无论我如何更改我的.emacs文件(或我的缓冲区的局部变量),TAB按钮总是做同样的事情.

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

尽管我喜欢Emacs但这很烦人.当上一行中没有文本时,有没有办法让Emacs至少缩进4个空格?

alc*_*tes 134

简短回答:

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

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

[...]

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

[...]

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

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

缩进相对空格到前一个非空行中的下一个缩进点下方.

[...]

如果前一个非空行没有超出列点开始的缩进点,则执行"tab-to-tab-stop".

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

  • 我和OP有同样的问题,你的解决方案对我不起作用. (10认同)
  • 我正在使用emacs版本23.3.1,简短的回答不会将其更改为空格.这个答案有误导性. (4认同)
  • 你的confuguration为我插入8个空格. (3认同)
  • @BruceBarnett我处于文本模式,这些说明仍然不起作用. (2认同)
  • 对于那些不知道的人...将上面显示的代码块中的行添加到“~/.emacs”。如果您没有该文件,则可以创建它。 (2认同)

phi*_*ils 64

我总是痛苦地看到一些事情,比如tab-stop-listnil功能坐在那里等待使用时.

(setq tab-stop-list (number-sequence 4 200 4))
Run Code Online (Sandbox Code Playgroud)

要么

(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))
Run Code Online (Sandbox Code Playgroud)


Ber*_*t F 29

(customize-variable (quote tab-stop-list))
Run Code Online (Sandbox Code Playgroud)

或者在.emacs文件中添加tab-stop-list条目到custom-set-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))))
Run Code Online (Sandbox Code Playgroud)

  • tab-width和tab-stop-list都是必需的.在显示选项卡时使用选项卡宽度,而在添加选项卡时需要选项卡停止列表来确定选项卡停止. (9认同)
  • 真的没什么比''更短的(标签停止列表(引用(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 (5认同)
  • 根据文档,您不需要所有这些职位.只做4 8 12,它将扩展到所有其他(继续添加4).显然,如果你只使用1或2个元素而不是3个元素,它将只使用tab-width作为最后一步.所以理论上,如果我想用四个空格标签,并且我的标签宽度设置为4.我可以写`'(tab-stop-list(quote(4)))`. (5认同)
  • 请注意http://stackoverflow.com/questions/69934/set-4-space-indent-in-emacs-in-text-mode#10439239 (3认同)
  • @NicholasPeterson 感谢您注意到这一点!但实际上,“quote”似乎需要两个数字才能无限地延续序列。请参阅:/sf/answers/2950408821/ (2认同)

Dav*_*ebb 21

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

M-x customize-group
Run Code Online (Sandbox Code Playgroud)

Customize group:提示输入indent.

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

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


小智 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)
Run Code Online (Sandbox Code Playgroud)


law*_*ist 9

(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)
Run Code Online (Sandbox Code Playgroud)


小智 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)
Run Code Online (Sandbox Code Playgroud)

这适用于C++代码和内部注释


小智 7

此问题不是由缺少制表位引起的; 是的,emacs有一个名为indent-relative的(new?)制表符方法,似乎是为了排列表格数据.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)


cjm*_*cjm 6

试试这个:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为OP需要空格而不是标签(所以点击Tab插入4个空格). (4认同)

小智 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)))
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.