Files
dotfiles/profiles/desktop/.emacs.d/modules/programming.el
2026-02-13 04:20:30 +01:00

172 lines
5.5 KiB
EmacsLisp

;;; programming.el --- core programming settings -*- lexical-binding: t -*-
;;; Commentary:
;; default indentation settings
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
;; code diagnostics
(use-package flycheck
:custom
(flycheck-display-error-delay 1.0)
:hook
(prog-mode . (lambda nil
(when (not (derived-mode-p 'emacs-lisp-mode))
(flycheck-mode))))
(yaml-mode . flycheck-mode))
;; lsp support
(use-package lsp-mode
:custom
(lsp-keymap-prefix "C-c l")
(lsp-auto-guess-root t)
:hook
(prog-mode . (lambda nil
(when (not (derived-mode-p 'emacs-lisp-mode))
(lsp-deferred))))
(TeX-mode . lsp-deferred)
(lsp-mode . lsp-enable-which-key-integration))
(use-package lsp-ui
:custom
(lsp-ui-sideline-show-diagnostics t)
(lsp-ui-sideline-show-hover nil)
(lsp-ui-sideline-show-code-actions nil)
(lsp-ui-sideline-update-mode 'line)
(lsp-ui-peek-enable t)
(lsp-ui-peek-show-directory t)
(lsp-ui-doc-enable t)
(lsp-ui-doc-position 'top)
(lsp-ui-doc-side 'right)
(lsp-ui-doc-show-with-cursor nil)
(lsp-ui-doc-show-with-mouse nil)
:bind
(:map lsp-ui-mode-map
([remap xref-find-definitions] . #'lsp-ui-peek-find-definitions)
([remap xref-find-references] . #'lsp-ui-peek-find-references)
("C-c l d" . #'lsp-ui-doc-toggle)))
;; autocompletion
(defun pt/company-complete-func nil
"Insert the common part of all candidates, or insert <TAB>."
(interactive)
(when (company-manual-begin)
(let ((tick (buffer-chars-modified-tick)))
(call-interactively #'company-complete-common)
(when (eq tick (buffer-chars-modified-tick))
(call-interactively #'company-abort)
(call-interactively (key-binding "\t"))))))
(use-package company
:config
(define-key company-active-map (kbd "<tab>") #'pt/company-complete-func)
(define-key company-active-map (kbd "<TAB>") #'pt/company-complete-func)
(define-key company-active-map (kbd "<backtab>") nil)
(define-key company-active-map (kbd "C-p") #'company-cycle-backward)
(define-key company-active-map (kbd "C-n") (lambda (&optional arg)
(interactive "p")
(let ((company-selection-wrap-around t))
(call-interactively #'company-select-next))))
:custom
(company-minimum-prefix-length 1)
(company-idle-delay (lambda () (if (company-in-string-or-comment) nil 0.3)))
:hook
(prog-mode . company-mode)
(yaml-mode . company-mode)
(TeX-mode . company-mode)
(text-mode . company-mode)
(conf-mode . company-mode))
;; project management
(use-package projectile
:commands projectile-mode
:hook (after-init . projectile-mode)
:bind
(:map projectile-mode-map
("C-c p" . #'projectile-command-map)))
;; web development
(use-package web-mode
:custom
(web-mode-enable-auto-closing t)
(web-mode-enable-auto-pairing t)
(web-mode-enable-css-colorization t)
(web-mode-markup-indent-offset 2)
(web-mode-css-indent-offset 2)
(web-mode-code-indent-offset 2)
(web-mode-style-padding 0)
(web-mode-script-padding 0)
:mode
(("\\.html?\\'" . web-mode)
("\\.phtml\\'" . web-mode)
("\\.php\\'" . web-mode)
("\\.tpl\\'" . web-mode)
("\\.[agj]sp\\'" . web-mode)
("\\.as[cp]x\\'" . web-mode)
("\\.erb\\'" . web-mode)
("\\.mustache\\'" . web-mode)
("\\.djhtml\\'" . web-mode)))
;; formatting code
(use-package format-all
:commands format-all-mode
:hook (prog-mode . format-all-mode)
:bind ("C-c f" . format-all-buffer)
:config
(define-format-all-formatter autopep8
(:executable "autopep8")
(:install "pip install autopep8")
(:languages "Python")
(:features)
(:format (format-all--buffer-easy executable "-")))
(define-format-all-formatter dockerfmt
(:executable "dockerfmt")
(:install "go install github.com/reteps/dockerfmt@latest")
(:languages "Dockerfile")
(:features)
(:format (format-all--buffer-easy executable)))
(setq-default format-all-formatters
'(("C" (clang-format))
("C++" (clang-format))
("Shell" (beautysh))
("HTML" (prettier))
("XHTML" (prettier))
("XML" (prettier))
("CSS" (prettier))
("Less" (prettier))
("SCSS" (prettier))
("JavaScript" (prettier))
("JSON" (prettier))
("JSX" (prettier))
("TypeScript" (prettier))
("TSX" (prettier))
("YAML" (prettier))
("TOML" (prettier))
("LaTeX" (latexindent))
("Lua" (stylua))
("PHP" (prettier))
("Python" (autopep8) (isort))
("Perl" (perltidy))
("Markdown" (prettier))
("Dockerfile" (dockerfmt))
("SQL" (pgformatter))
("Nginx" (nginxfmt)))))
;; highlight words like todo
(use-package hl-todo
:custom
(hl-todo-keyword-faces
'(("FIXME" error bold)
("TODO" org-todo)
("DONE" org-done)
("NOTE" bold)))
:hook (prog-mode . hl-todo-mode))
;; various useful modes
(use-package dockerfile-mode :commands dockerfile-mode)
(use-package systemd :commands systemd-mode)
(use-package nginx-mode :commands nginx-mode)
(use-package yaml-mode :commands yaml-mode)
(provide 'programming)
;;; programming.el ends here