1

所以我用这种内容hooks.el在我的文件中调用了这个文件:emacs.d

(add-hook 'term-mode-hook ...)
(add-hook 'term-exec-mode-hook ...)
(add-hook 'python-mode-hook ...)
(add-hook 'ido-setup-hook ...)
(add-hook 'makefile-mode-hook ...)
(add-hook 'c-mode-common-hook ...)
(add-hook 'c-mode-hook ...)
(add-hook 'c++-mode-hook ...)
(add-hook 'dired-mode-hook
      (lambda()
        (define-key dired-mode-map "h" 'dired-previous-line)
        (define-key dired-mode-map "j" 'ido-find-file)
            ;; ...
            ))

我只是想知道我是否在这里做一些奇怪的事情,或者这确实是基于模式分配快捷方式的惯用方式?

我的意思是在这里添加钩子而不是简单地写:

(define-key dired-mode-map "h" 'dired-previous-line)

当然,除非dired已加载并dired-mode-map已定义,否则这将不起作用,因此是钩子。加载所有模式可能不是最好的事情,即使我并不总是使用它们,只是为了定义自定义快捷方式。但另一方面,每个新缓冲区打开时都会运行挂钩 - 所有这些快捷方式都被一遍又一遍地重新定义,而不仅仅是一次。

你怎么看?我确信我可以切换到更优化的东西。

同时,我可以炫耀我的书签hooks.el

(defun goto-hook-file ()
  "Opens hooks.el at point specific to current `major-mode'"
  (interactive)
  (let ((str-mode-hook (format "%s-hook" major-mode)))
    (find-file (concat emacs.d "hooks.el"))
    (goto-char (point-min))
    (search-forward str-mode-hook nil t)))
4

1 回答 1

5

您可以使用eval-after-load

(eval-after-load 'dired
  '(progn
     (define-key dired-mode-map "h" 'dired-previous-line)
     (define-key dired-mode-map "j" 'ido-find-file)))

这样,键只定义一次。

于 2013-07-10T19:08:28.293 回答