Emacs:保存时加载文件.emacs

时间:2014-11-23 20:52:01

标签: emacs buffer hook

我是emacs和lisp的新手。

我想在保存点文件时自动加载。这意味着,当我保存我的.emacs文件时,它会自动调用它上面的load-file(因此如果我搞砸了就立刻告诉我)。

但我无法在emacs中找到关于钩子的全面教程。

这就是我提出的:

(defun load-init-after-save ()
  "After saving this file, load it"
  (if (eq bname this) ('load-file this) (nil))
)
(add-hook 'after-save-hook 'load-init-after-save)

当然,这是不正确的:bnamethis只是占位符。并且我不希望此功能在所有保存时运行,就在保存.emacs文件时。

有谁知道怎么做?有更好,更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

以下代码在保存后加载.emacs~/.emacs.d/init.el文件:

(defun my-load-user-init-file-after-save ()
  (when (string= (file-truename user-init-file)
                 (file-truename (buffer-file-name)))
    (let ((debug-on-error t))
      (load (buffer-file-name)))))

(add-hook 'after-save-hook #'my-load-user-init-file-after-save)

由于您的预期用途是错误检查,因此代码还会在加载init文件时启用调试器,以便在出现错误时获得良好的回溯。

对于init文件的错误检查,您可能还会发现Flycheck有用。它使用字节编译器动态检查您的init文件,突出显示缓冲区中的所有错误和警告,并且 - 可选 - 为您提供所有错误和警告的列表。

免责声明:我是这个图书馆的维护者。

答案 1 :(得分:2)

方式1

一种方法是从MELPA安装auto-compile-mode并启用它:

(defun my-emacs-lisp-hook ()
  (auto-compile-mode 1))

(add-hook 'emacs-lisp-mode-hook 'my-emacs-lisp-hook)

现在每次保存一个字节编译的Elisp文件时,它都会 重新编译。编译通常会捕获一些错误。

要编译任何Elisp文件,请在dired中选择它( C-x d ) 然后按 B dired-do-byte-compile)。

方式2

使用我写的这个自定义代码。

(defun test-emacs ()
  (interactive)
  (require 'async)
  (async-start
   (lambda () (shell-command-to-string "emacs --batch --eval \"(condition-case e (progn (load \\\"~/.emacs\\\") (message \\\"-OK-\\\")) (error (message \\\"ERROR!\\\") (signal (car e) (cdr e))))\""))
   `(lambda (output)
      (if (string-match "-OK-" output)
          (when ,(called-interactively-p 'any)
            (message "All is well"))
        (switch-to-buffer-other-window "*startup error*")
        (delete-region (point-min) (point-max))
        (insert output)
        (search-backward "ERROR!")))))

(defun auto-test-emacs ()
  (when (eq major-mode 'emacs-lisp-mode))
  (test-emacs))

(add-hook 'after-save-hook 'auto-test-emacs)

每次你都会在后台启动一个新的Emacs实例 保存文件。如果出现问题,它会抱怨。 第二种方法使用async

如果您真的想为.emacs用户执行 ,请执行以下操作:

(defun auto-test-emacs ()
  (when (and (eq major-mode 'emacs-lisp-mode)
             (equal (file-truename user-init-file)
                    (expand-file-name
                     buffer-file-truename)))
    (test-emacs)))