it-swarm.cn

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

在按下时,我没有成功让Emacs从8个空格标签切换到4个空格标签 TAB 在主模式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)

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

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

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

152
Cristian
(customize-variable (quote tab-stop-list))

或添加 tab-stop-list entry to custom-set-variables in .emacs file:

(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))))
28
Bert F

简短回答:

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

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

说明:

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

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

[...]

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

[...]

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

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

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

[...]

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

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

132
alcortes

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

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

M-x customize-group

Customize group:提示符下输入indent

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

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

21
Dave Webb
(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)
11
Yan Li
(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)
9
lawlist
(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++代码和内部注释

8
user2318996

此问题不是由缺少制表位引起的;这就是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)

7
Glenn

试试这个:

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

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

6
cjm

您可以将这些代码行添加到.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)))

我希望它有所帮助。

6
gigilibala

将其添加到.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)

请享用!

4
qwerty9967

只是用c-set风格改变风格对我来说已经足够了。

4
dividebyzero

自定义可以影响(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)
2
Yary

在我在.emacs文件中写这个之前,最好的答案不起作用:

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

这是唯一一个不会为我插入标签的解决方案,没有顺序或将标签转换为空格。这两个似乎都足够,但浪费:

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

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

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

M - i

1
ryanpcmcquen

从我的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 “);现在'_'不被视为单词分隔符
(修改语法条目? - ”w“);现在' - '不被视为单词分隔符
)) )
0
forkandwait

你有没有尝试过

(setq  tab-width  4)
0
GrokCode

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

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