summary refs log tree commit diff
path: root/emacs/custom/my-prog.el
blob: c4865a51059e5adf6397b7878ff83fc616e9800c (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
123
124
125
126
127
128
129
130
131
132
;;; my-prog.el --- Configures emacs for various programming languages -*- lexical-binding: t -*-

;;; Commentary:

;;; Code:

(require 'tree-sitter)
(require 'tree-sitter-langs)
;; enable tree-sitter mode for all supported major modes
(global-tree-sitter-mode)
;; the minor mode tree-sitter-hl-mode provides the framework for syntax
;; highlighting. It overrides the regex-based highlighting provided by
;; font-lock-mode, using the syntax tree provided by tree-sitter-mode
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)

(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