summary refs log tree commit diff
path: root/emacs/custom/my-prog.el
blob: 578207c6ccd1cc1fdc5d2702dc73f1019bf2c026 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
;;; 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)

(require 'flymake)
(setq flymake-start-on-save-buffer t)
(setq elisp-flymake-byte-compile-load-path load-path)

(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
(require 'newcomment)
(setq comment-fill-column 80)
(setq 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 4)

(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)

(require 'go-mode)
(require 'gotest)

(defun my/go-mode-hook ()
  "Hooks for `go-mode'."
  (setq tab-width 4)
  (setq go-test-verbose t)

  (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)
  (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))

(require 'eglot)
;; List of settings for gopls:
;; https://github.com/golang/tools/blob/master/gopls/doc/settings.md
(setq eglot-workspace-configuration
      '((:gopls .
                ((staticcheck                 . t)
                 (experimentalWorkspaceModule . t)
                 (matcher                     . "CaseSensitive")
                 (usePlaceholders             . t)))))

(defun my/eglot-install-save-hook ()
  "Install the local hooks that are executed before saving a buffer."
  ;; the last thing we do is to format the buffer
  (add-hook 'before-save-hook #'eglot-format-buffer 100 t))

;; ensure we load eglot for some specific modes
(dolist (hook '(go-mode-hook nix-mode-hook rust-mode-hook))
  (add-hook hook 'eglot-ensure)
  (add-hook hook #'my/eglot-install-save-hook))

(require 'rustic)
(setq rustic-lsp-server 'rust-analyzer
      rustic-lsp-client 'eglot
      rustic-format-on-save t)

(provide 'my-prog)

;;; my-prog.el ends here