;;; my-prog.el --- Configures emacs for various programming languages -*- lexical-binding: t -*- ;;; Commentary: ;;; Code: (customize-set-variable 'Man-notify-method 'aggressive) (customize-set-variable 'Man-fontify-manpage-flag t) ;; turn on `electric-pair-mode' on `prog-mode' and `conf-mode-hook' (dolist (hook '(prog-mode-hook conf-mode-hook)) (add-hook hook 'electric-pair-mode)) ;; Skip over warnings and info messages in compilation (customize-set-variable 'compilation-skip-threshold 2) ;; Don't freeze when process reads from stdin (customize-set-variable 'compilation-disable-input t) ;; Show three lines of context around the current message (customize-set-variable 'compilation-context-lines 3) ;; Jump to first error (customize-set-variable 'compilation-scroll-output 'first-error) (customize-set-variable 'flymake-start-on-flymake-mode t) (customize-set-variable 'flymake-start-on-save-buffer t) (customize-set-variable 'flymake-no-changes-timeout nil) (customize-set-variable 'flymake-proc-compilation-prevents-syntax-check t) (customize-set-variable 'flymake-wrap-around nil) (customize-set-variable 'elisp-flymake-byte-compile-load-path load-path) (with-eval-after-load 'flymake (define-key flymake-mode-map (kbd "C-c ! n") 'flymake-goto-next-error) (define-key flymake-mode-map (kbd "C-c ! p") 'flymake-goto-prev-error) (define-key flymake-mode-map (kbd "C-c ! d") 'flymake-show-diagnostics-buffer)) (dolist (hook '(prog-mode-hook conf-mode-hook)) (add-hook hook 'flymake-mode)) ;; yasnippet is required to support place holders with eglot (dolist (hook '(prog-mode-hook conf-mode-hook org-mode-hook)) (add-hook hook 'yas-minor-mode)) ;; I want comments to be wrapped at column 80 (customize-set-variable 'comment-fill-column 80) (customize-set-variable 'comment-auto-fill-only-comments t) (dolist (hook '(prog-mode-hook conf-mode-hook)) (add-hook hook 'auto-fill-mode)) (defun my/sh-mode-hook () "Hooks for `sh-mode'." ;; shell scripts are made executable (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) (customize-set-variable 'sh-indentation 2) (customize-set-variable 'sh-basic-offset 2)) (add-hook 'sh-mode-hook 'my/sh-mode-hook) ;; set the indent level for python (customize-set-variable 'python-indent-offset 2) (defun my/makefile-mode-hook () "Hooks for `makefile-mode'." ;; I want small tabs when working in a Makefile (setq tab-width 2)) (add-hook 'makefile-mode-hook 'my/makefile-mode-hook) (defun my/go-mode-hook () "Hooks for `go-mode'." (setq tab-width 4) ;; format the buffer using gofmt, for reasons unclear, doing this ;; with LSP is not working great. (add-hook 'before-save-hook 'gofmt-before-save) (set (make-local-variable 'compile-command) "go build -v && go test -v -cover") (define-key go-mode-map (kbd "C-c C-r") 'compile) (define-key go-mode-map (kbd "C-c C-R") 'recompile) (customize-set-variable 'go-test-verbose t) (define-key go-mode-map (kbd "C-c C-n") 'go-run) (define-key go-mode-map (kbd "C-c C-c") 'go-coverage) (define-key go-mode-map (kbd "C-c .") 'go-test-current-test) (define-key go-mode-map (kbd "C-c C-f") 'go-test-current-file) (define-key go-mode-map (kbd "C-c C-p") 'go-test-current-project)) (add-hook 'go-mode-hook 'my/go-mode-hook) (defun my/elisp-mode-hook () "Hooks for `elisp-mode'." (define-key emacs-lisp-mode-map (kbd "C-c C-e") 'eval-buffer) (define-key emacs-lisp-mode-map (kbd "C-c C-r") 'eval-region)) (add-hook 'emacs-lisp-mode-hook 'my/elisp-mode-hook) (define-key prog-mode-map (kbd "C-c C-h") 'eldoc) (dolist (hook '(prog-mode-hook conf-mode-hook)) (add-hook hook 'turn-on-eldoc-mode)) ;; format nix buffers on save (customize-set-variable 'nix-nixfmt-bin "nixpkgs-fmt") (add-hook 'before-save-hook 'nix-format-before-save) ;; List of settings for gopls: ;; https://github.com/golang/tools/blob/master/gopls/doc/settings.md ;; https://github.com/golang/tools/blob/master/gopls/doc/settings.md#experimentalworkspacemodule-bool (customize-set-variable 'eglot-workspace-configuration '((:gopls . ((staticcheck . t) (experimentalWorkspaceModule . t) (matcher . "CaseSensitive") (usePlaceholders . t))))) ;; ensure we load eglot for some specific modes (dolist (hook '(go-mode-hook nix-mode-hook)) (add-hook hook 'eglot-ensure)) (provide 'my-prog) ;;; my-prog.el ends here