在文本模式下,在 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文件(或我的缓冲区的本地变量)的 TAB按钮总是做同样的事情。

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

虽然我很喜欢 Emacs 但这越来越烦人了。当前一行没有文本时,有没有办法使 Emacs 至少缩进4个空格?

164096 次浏览

你有没有试过

(setq  tab-width  4)

不要混淆变量 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))))

另一种编辑制表符行为的方法是使用 M-x edit-tab-stops

有关 edit-tab-stops的更多信息,请参见 选项卡停止手册

试试这个:

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

这将使 TAB 始终插入一个字面 TAB 字符,每4个字符有一个制表符停止(但仅在文本模式下)。如果这不是你想要的,请描述一下你想看到的行为。

您可能会发现设置标签更容易,如下所示:

M-x customize-group

Customize group:提示符下输入 indent

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

如果你这样做,你会想要 建立定制文件

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

这个问题不是由于缺少制表位造成的,而是 emacs 有一个(新的?)称为缩进-相对的 tab 方法,似乎是为了排列表格数据而设计的。TAB 键映射到方法 indent-for-TAB-command,该方法调用变量 indent-line-function 所设置的任何方法,该方法是文本模式的缩进-相对方法。我还没有找到一个好的方法来覆盖缩进行函数变量(文本模式挂钩不工作,所以可能是在模式挂钩运行后重置它?)但是,摆脱这种行为的一个简单方法是通过将 TAB 设置为更简单的 TAB-to-TAB-stop 方法,从而放弃 Int-for-TAB-command 方法:

(Definition-key text-mode-map (kbd“ TAB”)‘ TAB-to-TAB-stop)

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

只是改变风格与 C 集风格对我来说就足够了。

简短的回答:

关键点是告诉 emacs 在缩进时插入任何你想要的东西,这是通过改变缩进-行-函数来实现的。将其更改为插入制表符,然后将制表符更改为4个空格,比将其更改为插入4个空格更容易。下面的配置将解决您的问题:

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

说明:

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

每个专业的重要功能 模式是将密钥定制为 语言正确缩进 剪辑过。

[...]

缩进行函数变量是 (和)要使用的函数 各种命令,例如在调用 缩进区域)来缩进当前 命令 根据模式缩进不再有效 而不是调用这个函数。

[...]

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

来自缩进相关@emacs 手册:

缩进-相对空间出到下一个 前面非空行的缩进点。

[...]

如果前一个非空行没有 列点后面的缩进点 从“ tab-to-tab-stop”开始 取而代之。

只需将缩进行函数的值更改为 insert-tab 函数,并将 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)

好好享受吧!

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

您可以将这些代码行添加到.emacs 文件中。 它为文本模式添加了一个钩子,以使用 insert-tab 代替缩进相对。

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

希望能有所帮助。

(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)
(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 + + 代码和其中的注释

顺便说一下,对于 C 模式,我将 (setq-default c-basic-offset 4)添加到.emacs。详情请参阅 http://www.emacswiki.org/emacs/IndentingC

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



(add-hook '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")       ; now '_' is not considered a word-delimiter
(modify-syntax-entry ?- "w")       ; now '-' is not considered a word-delimiter
)))

直到我在.emacs 文件中写下以下内容,最佳答案才得以实现:

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

这是唯一的解决方案,可以防止我插入选项卡,而不需要序列或将选项卡转换为空格。这两种方法似乎都足够了,但有些浪费:

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

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

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

M-i

自定义可以隐藏 (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)

改进的 这个答案无钩:

(setq-default
indent-tabs-mode t
tab-stop-list (number-sequence 4 200 4)
tab-width 4
indent-line-function 'insert-tab)

要使在文本模式按 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)
)))