在主模式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 按钮总是会做同样的事情。
尽管我喜欢Emacs,但这很烦人。当上一行中没有文本时,有没有办法让Emacs至少缩进4个空格?
答案 0 :(得分:132)
关键是告诉emacs在缩进时插入你想要的东西,这是通过改变缩进线功能来完成的。更改它以插入选项卡然后将选项卡更改为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-relative 对于许多模式。
来自缩进相关的@ emacs手册:
缩进相对空间到下一个 前一个非空行中的缩进点。
[...]
如果之前的非空行没有 缩进点超出列点 从“tab-to-tab-stop”开始 代替。
只需将indent-line-function的值更改为insert-tab函数,并将tab选项卡配置为4个空格。
答案 1 :(得分:65)
更新:自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))
答案 2 :(得分:28)
(customize-variable (quote tab-stop-list))
或将 tab-stop-list 条目添加到 .emacs 文件中的 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))))
答案 3 :(得分:21)
您可能会发现按以下方式设置标签更加容易:
M-x customize-group
在Customize group:
提示符下输入indent
。
您将看到一个屏幕,您可以在其中设置所有缩进选项并将其设置为当前会话,或者将其保存以供将来的所有会话使用。
如果您这样做,则需要set up a customisations file。
答案 4 :(得分: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)
答案 5 :(得分: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)
答案 6 :(得分:8)
(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 ++代码和内部的注释
答案 7 :(得分:7)
此问题不是由缺少制表位引起的;这就是emacs有一个名为indent-relative的(新的?)tab方法,它似乎是为了排列表格数据而设计的。 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)
答案 8 :(得分: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)))
我希望它有所帮助。
答案 9 :(得分:6)
试试这个:
(add-hook 'text-mode-hook
(function
(lambda ()
(setq tab-width 4)
(define-key text-mode-map "\C-i" 'self-insert-command)
)))
这将使TAB始终插入一个文字TAB字符,每4个字符使用制表位(但仅限于文本模式)。如果这不是您所要求的,请描述您希望看到的行为。
答案 10 :(得分: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)
享受!
答案 11 :(得分:4)
用c-set风格改变风格对我来说已经足够了。
答案 12 :(得分:2)
自定义设置可以隐藏(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)
答案 13 :(得分:1)
在我在.emacs文件中写这个之前,最好的答案不起作用:
(global-set-key (kbd "TAB") 'self-insert-command)
答案 14 :(得分:1)
这是唯一一个不会为我插入标签的解决方案,没有顺序或将标签转换为空格。这两个似乎都足够,但浪费:
(setq-default
indent-tabs-mode nil
tab-width 4
tab-stop-list (quote (4 8))
)
请注意,quote
需要两个数字才能工作(但不能更多!)。
此外,在大多数主要模式(例如Python
)中,缩进在Emacs中是自动的。如果您需要在自动缩进之外缩进,请使用:
中号 - 我
答案 15 :(得分:0)
你试过吗
(setq tab-width 4)
答案 16 :(得分:0)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
答案 17 :(得分:0)
顺便说一句,对于 C-mode ,我将 (setq-default c-basic-offset 4)
添加到.emacs。有关详细信息,请参阅http://www.emacswiki.org/emacs/IndentingC。
答案 18 :(得分:0)
从我的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 )))
答案 19 :(得分:0)
修改后的this answer,不带任何钩子:
(setq-default
indent-tabs-mode t
tab-stop-list (number-sequence 4 200 4)
tab-width 4
indent-line-function 'insert-tab)