Как отобразить файл, находясь еще в find-file-hook

В настоящее время я использую find-file-hook, чтобы вызвать длительную компиляцию /проверку этого файла. Поэтому мне придется подождать некоторое время, чтобы увидеть файл. Вместо этого я хотел бы иметь возможность просматривать (не редактировать) файл уже во время работы программы проверки, создавая иллюзию мгновенной компиляции. Как я могу это сделать?

7 голосов | спросил false 29 +03002016-10-29T02:10:59+03:00312016bEurope/MoscowSat, 29 Oct 2016 02:10:59 +0300 2016, 02:10:59

2 ответа


0

Использование 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)

Что касается фактического хука, этот код (за исключением комментария филса) работает для меня:

;;; -*- 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 фактически не поддерживает многопоточность . Чтобы обойти это, вы можете использовать библиотеку, например async , отложено или одновременный .

ответил charliegreen 2 Jam1000000amMon, 02 Jan 2017 00:53:56 +030017 2017, 00:53:56
0

Вы должны рассмотреть возможность использования Flycheck , который обеспечивает асинхронную проверку синтаксиса для большинства языков программирования и предоставляет хороший API реализация новых /пользовательских контролеров .

ответил Jürgen Hötzel 29 +03002016-10-29T12:32:15+03:00312016bEurope/MoscowSat, 29 Oct 2016 12:32:15 +0300 2016, 12:32:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132