我是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)
当然,这是不正确的:bname
和this
只是占位符。并且我不希望此功能在所有保存时运行,就在保存.emacs
文件时。
有谁知道怎么做?有更好,更简单的方法吗?
答案 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)
一种方法是从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
)。
使用我写的这个自定义代码。
(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)))