我同意泰勒的观点;虽然它有点复杂,但从长远来看,如果您尝试了解和自定义默认缩进功能,您会更好。 Emacs Wiki 有 good resources,在 Stack Overflow 上还有其他 relevant Q&As。
将 Tab 键绑定到 insert-tab 意味着您完全失去了 indent-region 之类的好处,以及主要模式可能提供的任何其他智能行为。
无论如何,为了解决您的具体问题:
1) 如果您定义 (java-insert-tab) 和 (css-insert-tab) 和 (javascript-insert-tab) 等,它们都做完全相同的事情......好吧,希望你能看到你实际上不需要超过一个那些功能。只需给它一个更通用的名称,然后重新使用它。
2) (local-set-key ...) 与(define-key (current-local-map) ...) 做同样的事情,这意味着您也可以拥有一个通用函数来覆盖选项卡键绑定,而不管主要模式如何。
(defun my-coding-config ()
(setq tab-width 4)
(setq indent-tabs-mode t)
(local-set-key (kbd "<tab>") 'my-insert-tab))
(defun my-insert-tab (&optional arg)
(interactive "P")
(insert-tab arg))
然后您只需将my-coding-config 添加到每个适用的模式挂钩变量即可。如果它们很多,您可以将其包装在这样的列表中:
;; Use my coding hook for all programming modes
(mapcar
(lambda (language-mode-hook)
(add-hook language-mode-hook 'my-coding-config))
'(java-mode-hook
javascript-mode-hook
css-mode-hook
...))
3) 如果您查看 Ch v tab-width RET 和 indent-tabs-mode,您会注意到它们都说“自动变为缓冲区本地以任何方式设置时。”
作为已经提到的自定义界面的替代方案,您可以使用(set-default 'indent-tabs-mode t) 为此类变量建立默认值。在没有设置缓冲区本地值的代码的情况下,所有缓冲区都将使用默认值,这可能有助于避免编写不必要的模式挂钩。