;;; development.el --- Languages, Eglot and code navigation -*- lexical-binding: t; -*- ;;; Commentary: ;; Loaded from init.el. Requires Evil. ;; ;; Languages: ;; Markdown markdown-mode. ;; PHP php-mode, PSR-2 style, 4 spaces. ;; Odin odin-mode from git (needs Emacs 30+ for :vc), Eglot + OLS. ;; Go go-mode, Eglot + gopls; organize imports and format on save. ;; ;; Normal/motion state: ;; gd definitions gD references K eldoc ;; C-t jump back ESC closes any open eldoc window. ;;; Code: ;;;; Markdown (use-package markdown-mode) ;;;; PHP (use-package php-mode :mode "\\.php\\'" :hook (php-mode . (lambda () (setq-local indent-tabs-mode nil) (setq-local tab-width 4) (setq-local c-basic-offset 4))) :custom (php-mode-coding-style 'psr2)) ;;;; Odin (use-package odin-mode :vc (:url "https://github.com/mattt-b/odin-mode" :rev :newest) :mode "\\.odin\\'" :hook (odin-mode . eglot-ensure)) ;;;; Go ;; Emacs started from the desktop doesn't inherit fish env. (dolist (d '("/usr/local/go/bin" "/home/jason/.go/bin")) (add-to-list 'exec-path d) (setenv "PATH" (concat d ":" (getenv "PATH")))) (setenv "GOPATH" "/home/jason/.go") (setenv "GOCACHE" "/home/jason/.go/cache") (defun my/go-before-save () "Organize imports and format the buffer through Eglot." (when (eglot-managed-p) (eglot-code-actions nil nil "source.organizeImports" t) (eglot-format-buffer))) (use-package go-mode :mode "\\.go\\'" :hook ((go-mode . eglot-ensure) (go-mode . (lambda () (setq-local tab-width 4) (add-hook 'before-save-hook #'my/go-before-save nil t))))) ;;;; Eglot (use-package eglot :ensure nil :config (setq eglot-autoshutdown t) (add-to-list 'eglot-ignored-server-capabilities :signatureHelpProvider) ;; Explicit OLS configuration. (add-to-list 'eglot-server-programs '(odin-mode . ("/home/jason/.local/bin/ols" :initializationOptions (:odin_command "/home/jason/.odin/odin" :enable_document_symbols t :enable_format t :collections [(:name "core" :path "/home/jason/.odin/core") (:name "vendor" :path "/home/jason/.odin/vendor")]))))) ;; OLS built-in definitions. (setenv "OLS_BUILTIN_FOLDER" "/home/jason/ThirdParty/ols/builtin") ;;;; Code navigation ;; Vim-style code navigation. (evil-define-key '(normal motion) 'global "gd" #'xref-find-definitions "gD" #'xref-find-references "K" #'eldoc (kbd "C-t") #'xref-go-back) ;; ESC closes any open eldoc window. (defun my/eldoc-close (&rest _) "Quit every window showing an *eldoc* buffer." (dolist (w (window-list)) (when (string-prefix-p "*eldoc" (buffer-name (window-buffer w))) (quit-window nil w)))) (advice-add 'evil-force-normal-state :after #'my/eldoc-close) ;;; development.el ends here