summary refs log tree commit diff
path: root/config/init-programming.el
diff options
context:
space:
mode:
Diffstat (limited to 'config/init-programming.el')
-rw-r--r--config/init-programming.el224
1 files changed, 173 insertions, 51 deletions
diff --git a/config/init-programming.el b/config/init-programming.el
index ca1ec41..f90aaf1 100644
--- a/config/init-programming.el
+++ b/config/init-programming.el
@@ -7,6 +7,14 @@
 
 ;;; Code:
 
+;; `elec-pair' is a built-in minor-mode that enables auto-pairing of parens (or
+;; similar delimiters).
+(use-package elec-pair
+  :hook (prog-mode . electric-pair-mode))
+
+;; `delete-trailing-whitespace' removes the tailing whitespace.
+(add-hook 'before-save-hook 'delete-trailing-whitespace)
+
 (use-package compile
   :ensure nil
   :hook (compilation-filter . ansi-color-compilation-filter)
@@ -22,18 +30,13 @@
 
 (use-package eldoc
   :diminish
-  :hook ((c-mode-common emacs-lisp-mode) . eldoc-mode)
+  :hook ((emacs-lisp-mode) . eldoc-mode)
   :custom
   (eldoc-idle-delay 1)
   (eldoc-documentation-strategy #'eldoc-documentation-default)
-  (eldoc-echo-area-use-multiline-p 3)
-  (eldoc-echo-area-prefer-doc-buffer 'maybe)
-  (eldoc-echo-area-display-truncation-message nil))
-
-(use-package indent
-  :commands indent-according-to-mode
-  :custom
-  (tab-always-indent 'complete))
+  ;; Don't resize the echo area if the documentation is longer. This is very
+  ;; distracting when combined with Eglot's highlight functionality.
+  (eldoc-echo-area-use-multiline-p nil))
 
 (use-package tree-sitter
   :ensure t
@@ -51,48 +54,167 @@
   :config
   (direnv-mode))
 
-(setq prettify-symbols-unprettify-at-point 'right-edge)
-
-(defun my/github-code-search ()
-  "Search code on github for a given language."
-  (interactive)
-  (let ((language (completing-read
-                   "Language: "
-                   '("Emacs Lisp" "Python"  "Go" "Nix")))
-        (code (read-string "Code: ")))
-    (browse-url
-     (concat "https://github.com/search?lang=" language
-             "&type=code&q=" code))))
-
-(defun my/work-code-search ()
-  "Search code on sourcegraph for a given language."
-  (interactive)
-  (let ((language (completing-read
-                   "Language: "
-                   '("Ruby" "Python"  "Go")))
-        (code (read-string "Code: ")))
-    (browse-url
-     (concat "https://sourcegraph.rbx.com/search?q=context:global+lang:" language
-             "+" code))))
-
-
-(require 'init-elisp)
-(require 'init-go)
-(require 'init-lsp)
-(require 'init-nix)
-(require 'init-python)
-(require 'init-ruby)
-(require 'init-rust)
-
-(require 'init-flymake)
-
-(require 'init-shell)
-(require 'init-json)
-(require 'init-terraform)
-(require 'init-toml)
-(require 'init-yaml)
-
-(require 'init-docker)
+(use-package emacs-lisp-mode
+  :bind (:map emacs-lisp-mode-map
+              ("C-c C-r" . eval-region)
+              ("C-c C-d" . eval-defun)
+              ("C-c C-b" . eval-buffer))
+  :hook ((emacs-lisp-mode . flymake-mode)))
+
+(use-package eglot
+  :after yasnippet
+  :bind (:map eglot-mode-map
+              ("C-c l a" . eglot-code-actions)
+              ("C-c l r" . eglot-rename)
+	      ("C-c l f" . eglot-format-buffer))
+  :hook ((go-mode     . eglot-ensure)
+	 (python-mode . eglot-ensure)
+	 (nix-mode    . eglot-ensure))
+  :custom
+  (eglot-send-changes-idle-time 0.1)
+  :config
+  (setq eglot-autoshutdown t
+	;; Disable logging of events.
+	eglot-events-buffer-size 0)
+  (setq-default eglot-workspace-configuration
+                '(:pylsp (:plugins (:ruff (:enabled t)))
+                  :gopls (:usePlaceholders t
+					   :staticcheck t
+					   :completeUnimported t
+					   :matcher "CaseSensitive")))
+
+  ;; uses https://github.com/nix-community/nixd for the LSP server instead of rnix
+  (add-to-list 'eglot-server-programs '(nix-mode . ("nixd"))))
+
+;;; go related configuration
+(use-package go-mode
+  :ensure t
+  :defer t
+  :hook ((go-mode . tree-sitter-hl-mode)
+         (go-mode . (lambda () (setq tab-width 4)))
+         (go-mode . (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t))))
+  :bind (:map go-mode-map
+              ("C-c C-c" . compile)))
+
+(use-package gotest
+  :ensure t
+  :after go-mode
+  :custom
+  (go-test-verbose t))
+
+;;; nix related configuration
+(use-package nix-mode
+  :ensure t
+  :hook ((nix-mode . (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t))))
+  :custom
+  (nix-indent-function 'nix-indent-line))
+
+;;; python related configuration
+(use-package python-mode
+  :hook ((python-mode . tree-sitter-hl-mode))
+  :custom
+  ;; if set to an absolute path, pyvenv won't work
+  (python-shell-interpreter "python3"))
+
+(use-package blacken
+  :ensure t
+  :hook (python-mode . blacken-mode))
+
+(use-package pyvenv
+  :ensure t
+  :config
+  (pyvenv-mode 1))
+
+(use-package ruby-mode)
+
+;;; flymake related configuration
+(use-package flymake
+  :ensure nil
+  :defer t
+  :bind (:prefix "C-c !"
+		 :prefix-map flymake-prefix-map
+		 ("l" . consult-flymake)
+                 ("b" . flymake-show-project-diagnostics)
+                 ("n" . flymake-goto-next-error)
+                 ("p" . flymake-goto-prev-error))
+  :hook
+  (prog-mode . flymake-mode)
+  :custom
+  (flymake-start-on-save-buffer t)
+  (flymake-fringe-indicator-position 'left-fringe)
+  (flymake-suppress-zero-counters t)
+  (flymake-proc-compilation-prevents-syntax-check t)
+  (flymake-no-changes-timeout 9999)
+  (elisp-flymake-byte-compile-load-path load-path))
+
+;;; JSON related modules
+(use-package json-mode
+  :defer t
+  :mode "\\.json\\'")
+
+(use-package json-reformat
+  :defer t
+  :ensure t
+  :after json-mode)
+
+(use-package jq-mode
+  :defer t
+  :ensure t
+  :mode "\\.jq\\'")
+
+;;; hashicorp related modules
+(use-package terraform-mode
+  :defer t
+  :ensure t
+  :mode "\.tf\\'")
+
+(use-package hcl-mode
+  :defer t
+  :ensure t
+  :mode "\.nomad\\'")
+
+;;; TOML related modules
+(use-package toml-mode
+  :defer t
+  :ensure t)
+
+;;; YAML related modules
+(use-package yaml-mode
+  :defer t
+  :ensure t)
+
+;;; docker related modules
+(use-package docker
+  :defer t
+  :bind ("C-c d" . docker)
+  :ensure t
+  :diminish
+  :init
+  (use-package docker-image   :commands docker-images)
+  (use-package docker-volume  :commands docker-volumes)
+  (use-package docker-network :commands docker-containers)
+  (use-package docker-compose :commands docker-compose)
+
+  (use-package docker-container
+    :commands docker-containers
+    :custom
+    (docker-containers-shell-file-name "/bin/bash")
+    (docker-containers-show-all nil)))
+
+(use-package docker-compose-mode
+  :defer t
+  :ensure t
+  :mode "docker-compose.*\.yml\\'")
+
+(use-package dockerfile-mode
+  :defer t
+  :ensure t
+  :mode "Dockerfile[a-zA-Z.-]*\\'")
+
+(use-package protobuf-mode
+  :defer t
+  :ensure t
+  :mode "\\.proto\\'")
 
 (provide 'init-programming)