在主模式 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 按钮总是做同样的事情。
如果上面没有文字,则缩进8个空格如果上一行有文字,则缩进到第二个单词的开头
尽管我很喜欢 Emacs,但它变得越来越烦人。当上一行没有文本时,有没有办法让 Emacs 至少缩进 4 个空格?
(setq-default tab-width 4)
与 (setq tab-width 4)
不同,请确保您没有错过“-default”!
简短的回答:
关键是告诉emacs在缩进时插入你想要的任何东西,这是通过改变indent-line-function来完成的。将其更改为插入一个制表符,然后将制表符更改为 4 个空格比将其更改为插入 4 个空格更容易。以下配置将解决您的问题:
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
解释:
从 Indentation Controlled by Major Mode @ emacs manual:
每个主要模式的一个重要功能是为正在编辑的语言自定义键以正确缩进。 [...] indent-line-function 变量是用于缩进当前行的函数(以及各种命令,例如调用 indent-region 时)。命令 indent-according-to-mode 只是调用这个函数。 [...] 对于许多模式,默认值是相对缩进的。
来自 indent-relative @emacs 手册:
Indent-relative Space out 到下一个非空行中的下一个缩进点。 [...]如果前一个非空白行在列点开始处没有缩进点,则改为执行“tab-to-tab-stop”。
只需将 indent-line-function 的值更改为 insert-tab 函数,并将制表符插入配置为 4 个空格。
更新:从 Emacs 24.4 开始:
tab-stop-list 现在隐式扩展到无穷大。它的默认值更改为 nil,这意味着每个制表符宽度列都有一个制表位。
这意味着不再需要按如下所示的方式设置 tab-stop-list
,因为您可以将其设置为 nil
。
原始答案如下...
当 number-sequence
函数坐在那里等待使用时,看到像 (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))
tab-stop-list
现在隐式扩展到无穷大。它的默认值更改为 nil,这意味着每 tab-width
列有一个制表位。” -- 所以实际上你可以使用默认值 nil
。
不要将变量 tab-width 与变量 tab-stop-list 混淆。前者用于显示文字 TAB 字符。后者控制在某些模式下按 TAB 字符时插入的字符。
(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
的详细信息,请参阅 GNU Emacs Manual on Tab Stops。
'(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
'(tab-stop-list (quote (4)))
。
quote
似乎需要两个数字来无限地继续序列。请参阅:stackoverflow.com/a/42148697/2662028
您可能会发现按以下方式设置选项卡更容易:
M-x customize-group
在 Customize group:
提示符处输入 indent
。
您将看到一个屏幕,您可以在其中设置所有缩进选项并为当前会话设置它们或为所有未来会话保存它们。
如果您这样做,您会想要 set up a customisations file。
\begin{tikzpicture}
和 \end{tikzpicture}
之间应用 2
(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)
(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++ 代码和里面的注释
(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)
26.3
此问题不是由缺少制表位引起的;是 emacs 有一个(新的?)选项卡方法,称为 indent-relative,它似乎旨在排列表格数据。 TAB 键映射到方法 indent-for-tab-command,它调用变量 indent-line-function 设置的任何方法,这是文本模式的缩进相关方法。我还没有想出一个好方法来覆盖 indent-line-function 变量(文本模式钩子不起作用,所以它可能在模式钩子运行后被重置?)但是一个简单的方法来摆脱这个行为是通过将 TAB 设置为更简单的 tab-to-tab-stop 方法来放弃 intent-for-tab-command 方法:
(define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)
您可以将这些代码行添加到您的 .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)))
我希望它有所帮助。
尝试这个:
(add-hook 'text-mode-hook
(function
(lambda ()
(setq tab-width 4)
(define-key text-mode-map "\C-i" 'self-insert-command)
)))
这将使 TAB 始终插入一个文字 TAB 字符,每 4 个字符带有制表位(但仅在文本模式下)。如果这不是您所要求的,请描述您希望看到的行为。
只需用 c-set-style 更改样式对我来说就足够了。
将此添加到您的 .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)
享受!
自定义可能会影响 (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)
M+i
和在 this answer 中使用 4 个空格时,这里有 8 个空格。
这是唯一可以防止标签被插入的解决方案,无需将标签序列或转换为空格。这两个似乎都足够了,但很浪费:
(setq-default
indent-tabs-mode nil
tab-width 4
tab-stop-list (quote (4 8))
)
请注意,quote
需要两个数字才能工作(但不能更多!)。
此外,在大多数主要模式(例如 Python
)中,缩进在 Emacs 中是自动的。如果您需要在自动缩进之外缩进,请使用:
米
M+i
技巧适用于 4 个空格。该选项卡只是让我将已经缩进的东西切换回左对齐。第二次制表符将其带回开始缩进。任何左对齐的东西都不会改变。我在一个 Python 文件中,这可能是这里所说的自动对齐。但是这个答案使用 tab-stop-list
这不是一个好方法,它应该是 number-sequence
而不是,参见 this highly upvoted answer。
bash (setq-default indent-tabs-mode nil tab-width 4 tab-stop-list (number-sequence 4 200 4) )
直到我在 .emacs 文件中写了这个,最好的答案才起作用:
(global-set-key (kbd "TAB") 'self-insert-command)
M+i
上留出 4 个空格。
你有没有尝试过
(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。
从我的初始化文件中,不同,因为我想要空格而不是制表符:
(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 )))
修改后的 this answer 没有任何钩子:
(setq-default
indent-tabs-mode t
tab-stop-list (number-sequence 4 200 4)
tab-width 4
indent-line-function 'insert-tab)
M+i
时,要进一步缩进 4 个空格。可能我的选项卡测试主要由我的 Python 文件的 emacs 自动对齐控制,在那个答案中也有解释。
要在文本模式下按 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)
)))
M+i
和在 this answer 中使用 4 个空格时,这里有 8 个空格。
~/.emacs
。如果您没有该文件,您可以创建它。