5

我想知道是否有人可以为我提供一些帮助来缩小我的 .emacs 文件。

目前我已经将它设置为我使用的每种语言都有一个自定义选项卡,例如,如果我有一个 Java 钩子,它看起来像这样。

;; Java 钩子
(defun e-java-mode-hook ()
    (setq tab-width 4)
    (setq indent-tabs-mode t)
    (define-key java-mode-map (kbd "") 'java-insert-tab))
(defun java-insert-tab (&可选参数)
    (交互式“P”)
    (插入选项卡 arg))
(add-hook 'java-mode-hook 'e-java-mode-hook)

如果我要添加另一种语言,如 CSS 或 JavaScript,我会为 CSS 添加另一个钩子,为 JavaScript 添加另一个钩子。所以我想知道是否有一种全球性的方式来设置它,以便它适用于任何和所有语言?

我目前在 Windows 7 上运行 GNU Emacs 23.2.1。

4

3 回答 3

5

我同意泰勒的观点;虽然它有点复杂,但从长远来看,如果您尝试了解和自定义默认缩进功能,您会更好。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)为此类变量建立默认值。在没有设置缓冲区本地值的代码的情况下,所有缓冲区都将使用默认值,这可能有助于您避免编写不必要的模式挂钩。

于 2011-01-29T00:00:17.580 回答
2

我不确定你想做什么。如果要将制表符宽度全局设置为 4 个空格,则可以使用自定义命令执行此操作:

M-x customize-variable tab-width <ret>

您在自定义中对制表符宽度所做的任何更改都将全局应用。因此,您无需使用钩子为每种模式单独设置它。

如果您想将不同的设置应用于不同的模式,则必须在 .emacs 中为每种模式提供特定的代码。

更一般地说,您似乎正在尝试构建自己的自定义制表符插入命令 - 内置缩进不是您需要的吗?我认为在 Emacs 中自定义缩进设置比在您想要的位置手动插入制表符更容易。

如果您还没有,请查看有关缩进的手册部分,看看您是否可以在没有很多额外钩子的情况下做您需要的事情:

Chrm 缩进

(即:h -elp, r -ead the manual, m -enu item Indentation

或者:

(info "(emacs)Indentation")
于 2011-01-28T14:10:48.240 回答
1

espect.el正在做你想做的事。

从文档:


此模式使用简洁且可扩展的迷你语言轻松配置各个缓冲区的设置。它将常见的配置选择任务(例如检查模式或文件名)抽象为简单的声明性语法。声明条件;当新缓冲区匹配它们时运行一个函数。这使得为​​您喜欢的编程语言打开 flyspell-prog-mode 或使所有以 .mkn 结尾的文本模式缓冲区具有特殊属性等操作变得容易。

于 2011-01-28T13:46:31.053 回答