我同意泰勒的观点;虽然它有点复杂,但从长远来看,如果您尝试了解和自定义默认缩进功能,您会更好。Emacs Wiki 有很好的资源, Stack Overflow 上还有其他相关的问答。
将 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)如果您查看C-h v tab-width
RET并同样查看indent-tabs-mode
,您会注意到它们都说“以任何方式设置时自动变为缓冲区本地”。
作为已经提到的自定义接口的替代方案,您可以使用(set-default 'indent-tabs-mode t)
为此类变量建立默认值。在没有设置缓冲区本地值的代码的情况下,所有缓冲区都将使用默认值,这可能有助于您避免编写不必要的模式挂钩。