目前,我使用find-file-hook
来调用该文件的冗长编译/检查。因此,我需要等待一段时间才能真正看到该文件。我想要做的是能够在检查器运行时查看(而不是编辑)文件,从而产生瞬时编译的错觉。我怎么能这样做?
答案 0 :(得分:3)
使用find-file-hook
表示您的代码将在您打开的每个文件上运行;你是
你确定要这个吗?创建新的主要或次要模式可能更有意义
对于要运行验证的文件类型,然后使用
相应的模式钩子。例如,如果要检查所有.chk文件
(使用继承自prog-mode
的新主要模式):
(define-derived-mode check-mode prog-mode "Checker")
(add-to-list 'auto-mode-alist '("\\.chk\\'" . check-mode))
(add-hook 'check-mode-hook 'check-mode-computation-hook)
至于实际的钩子,这段代码(关于phils'评论)对我有用:
;;; -*- lexical-binding: t -*-
(defun slow-computation ()
(dotimes (i 10000000)
(+ i 1)))
(defun check-mode-computation-hook ()
(let ((cb (current-buffer))
(ro buffer-read-only))
(setq-local buffer-read-only t)
(run-at-time .1 nil
(lambda ()
(with-current-buffer cb
(message "Loading...")
(slow-computation)
(setq-local buffer-read-only ro)
(message "Loaded!"))))))
但请注意,虽然这会显示该文件,但仍会冻结emacs 直到它完成处理,如 emacs doesn't actually support multithreading。为了解决这个问题,你可以 必须使用async,deferred或concurrent等库。
答案 1 :(得分:1)
您应该考虑使用Flycheck为大多数编程语言提供异步语法检查,并为实现新的/自定义检查程序提供了一个很好的API。