100 lines
2.9 KiB
EmacsLisp
100 lines
2.9 KiB
EmacsLisp
;;; 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
|