*** /tmp/edifffETTJu 2021-02-17 16:37:56.993381450 +0100 --- /home/albinus/src/tramp/lisp/tramp-integration.el 2021-02-17 14:12:36.736224836 +0100 *************** *** 41,46 **** --- 41,47 ---- (declare-function recentf-cleanup "recentf") (declare-function tramp-dissect-file-name "tramp") (declare-function tramp-file-name-equal-p "tramp") + (declare-function tramp-message "tramp") (declare-function tramp-tramp-file-p "tramp") (defvar eshell-path-env) (defvar ido-read-file-name-non-ido) *************** *** 261,266 **** --- 262,303 ---- (delete (info-lookup->mode-cache 'symbol ',mode) (info-lookup->topic-cache 'symbol)))))))) + ;;; Integration of compile.el: + + ;; Compilation processes use `accept-process-output' such a way that + ;; Tramp's parallel `accept-process-output' blocks. See last part of + ;; Bug#45518. So we forbid them to run in parallel. There must be a + ;; better solution, though. + (defun tramp-compile-disable-goto-error (proc) + "Don't allow remote file operations while compiling." + (with-current-buffer (process-buffer proc) + (when (file-remote-p default-directory) + (advice-add 'ignore :override 'compile-goto-error) + (tramp-message + (tramp-dissect-file-name default-directory) 4 + "Disable `compile-goto-error'")))) + + (defun tramp-compile-enable-goto-error (buffer _message) + "Reenable remote file operations." + (with-current-buffer buffer + (when (file-remote-p default-directory) + (advice-remove 'ignore 'compile-goto-error) + (tramp-message + (tramp-dissect-file-name default-directory) 4 + "Enable `compile-goto-error'")))) + + (with-eval-after-load 'compile + (add-hook 'compilation-start-hook + #'tramp-compile-disable-goto-error) + (add-hook 'compilation-finish-functions + #'tramp-compile-enable-goto-error) + (add-hook 'tramp-integration-unload-hook + (lambda () + (remove-hook 'compilation-start-hook + #'tramp-compile-disable-goto-error) + (remove-hook 'compilation-finish-functions + #'tramp-compile-enable-goto-error)))) + ;;; Default connection-local variables for Tramp: ;; `connection-local-set-profile-variables' and ;; `connection-local-set-profiles' exists since Emacs 26.1.