Files
doomemacs/modules/lang/coq/config.el
2025-06-01 00:44:13 +02:00

121 lines
4.6 KiB
EmacsLisp

;;; lang/coq/config.el -*- lexical-binding: t; -*-
;;;###package proof-general
(setq proof-splash-enable nil)
;; REVIEW: Remove when ProofGeneral/PG#771 is fixed. Also see #8169.
(require 'proof-site
(expand-file-name "generic/proof-site"
(file-name-directory (locate-library "proof-general"))))
;;;###package coq
(setq-hook! 'coq-mode-hook
;; Doom syncs other indent variables with `tab-width'; we trust major modes to
;; set it -- which most of them do -- but coq-mode doesn't, so...
tab-width proof-indent
;; HACK Fix #2081: Doom continues comments on RET, but coq-mode doesn't have a
;; sane `comment-line-break-function', so...
comment-line-break-function nil)
;; HACK: See #5823: indent detection is slow and inconclusive in coq-mode files,
;; and rarely helpful anyway, so I inhibit it.
(add-to-list 'doom-detect-indentation-excluded-modes 'coq-mode)
;; We've replaced coq-mode abbrevs with yasnippet snippets (in the snippets
;; library included with Doom).
(setq coq-mode-abbrev-table '())
(map! :after coq-mode
:map coq-mode-map
:localleader
"]" #'proof-assert-next-command-interactive
"[" #'proof-undo-last-successful-command
"." #'proof-goto-point
(:prefix ("l" . "layout")
"c" #'pg-response-clear-displays
"l" #'proof-layout-windows
"p" #'proof-prf)
(:prefix ("p" . "proof")
"i" #'proof-interrupt-process
"p" #'proof-process-buffer
"q" #'proof-shell-exit
"r" #'proof-retract-buffer)
(:prefix ("a" . "about/print/check")
"a" #'coq-Print
"A" #'coq-Print-with-all
"b" #'coq-About
"B" #'coq-About-with-all
"c" #'coq-Check
"C" #'coq-Check-show-all
"f" #'proof-find-theorems
(:prefix ("i" . "implicits")
"b" #'coq-About-with-implicits
"c" #'coq-Check-show-implicits
"i" #'coq-Print-with-implicits))
(:prefix ("g" . "goto")
"e" #'proof-goto-command-end
"l" #'proof-goto-end-of-locked
"s" #'proof-goto-command-start)
(:prefix ("i" . "insert")
"c" #'coq-insert-command
"e" #'coq-end-Section
"i" #'coq-insert-intros
"r" #'coq-insert-requires
"s" #'coq-insert-section-or-module
"t" #'coq-insert-tactic
"T" #'coq-insert-tactical))
;; This package provides more than just code completion, so we load it whether
;; or not :completion company is enabled.
(use-package! company-coq
:hook (coq-mode . company-coq-mode)
:config
(set-popup-rule! "^\\*\\(?:response\\|goals\\)\\*" :ignore t)
(set-lookup-handlers! 'company-coq-mode
:definition #'company-coq-jump-to-definition
:references #'company-coq-grep-symbol
:documentation #'company-coq-doc)
(setq company-coq-disabled-features '(hello company-defaults spinner))
(cond ((modulep! :completion corfu)
;; HACK: company-coq activates `company-mode', though it's not really
;; needed when we're relying on Corfu, hence these hacks:
(add-hook! 'coq-mode-local-vars-hook
(defun +coq-init-capf-completion-h ()
(when (bound-and-true-p company-mode)
(company-mode -1))
(add-hook 'completion-at-point-functions
(cape-company-to-capf 'company-coq-master-backend)
nil t)))
(defadvice! +coq--proof-goto-point-advice (&rest _)
:override #'company-coq--proof-goto-point-advice
(when (bound-and-true-p company-candidates)
(company-abort))))
;; DEPRECATED: The company module is deprecated.
((modulep! :completion company)
(define-key coq-mode-map [remap company-complete-common]
#'company-indent-or-complete-common)))
;; HACK: Doom treats the use of package.el and its API as user error unless
;; they've called `package-initialize' themselves (in which case, it is
;; assumed you know what you're doing).
(defadvice! +coq--noop-upgrade-elpa-packages-a (fn &rest args)
:override #'proof-upgrade-elpa-packages
(if (and (featurep 'package) package--initialized)
(apply fn args)
(user-error "Doom doesn't support this command (update packages through `package!' statements!)")))
(map! :map coq-mode-map
:localleader
"ao" #'company-coq-occur
(:prefix "i"
"l" #'company-coq-lemma-from-goal
"m" #'company-coq-insert-match-construct)
(:prefix ("h" . "help")
"e" #'company-coq-document-error
"E" #'company-coq-browse-error-messages
"h" #'company-coq-doc)))