如何在find-file-hook中显示文件

时间:2016-10-28 23:11:00

标签: emacs

目前,我使用find-file-hook来调用该文件的冗长编译/检查。因此,我需要等待一段时间才能真正看到该文件。我想要做的是能够在检查器运行时查看(而不是编辑)文件,从而产生瞬时编译的错觉。我怎么能这样做?

2 个答案:

答案 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。为了解决这个问题,你可以 必须使用asyncdeferredconcurrent等库。

答案 1 :(得分:1)

您应该考虑使用Flycheck为大多数编程语言提供异步语法检查,并为实现新的/自定义检查程序提供了一个很好的API。