summaryrefslogtreecommitdiff
path: root/guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el
diff options
context:
space:
mode:
Diffstat (limited to 'guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el')
-rw-r--r--guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el237
1 files changed, 237 insertions, 0 deletions
diff --git a/guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el b/guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el
new file mode 100644
index 0000000..dfc9f15
--- /dev/null
+++ b/guix/kolwynia/home/bdunahu/files/.config/emacs/modules/bd--devel.el
@@ -0,0 +1,237 @@
+;;; -*- lexical-binding: t; -*-
+;;; Commentary:
+;;; Code:
+
+(require 'selector)
+(require 'dash)
+
+(setopt display-line-numbers-type 'relative)
+(defvar bd/enable-line-numbers-in-hooks
+ '(prog-mode-hook)
+ "List of hook symbols to add `display-line-numbers-mode' to.")
+(mapc
+ (lambda (hook)
+ (add-hook hook #'display-line-numbers-mode))
+ bd/enable-line-numbers-in-hooks)
+
+;; skr (skribe) is a scheme extension
+(add-to-list 'auto-mode-alist '("\\.skr\\'" . scheme-mode))
+
+(defun bd/beginning-of-visual-line-dwim (&optional n)
+ (interactive "P")
+ (let ((pt (point)))
+ (back-to-indentation)
+ (when (or n (eq pt (point)))
+ (beginning-of-visual-line n))))
+
+(define-minor-mode dwim-cursor-mode
+ "Toggle dwim-cursor-mode."
+ :init-value nil
+ :group 'quality
+ :light " SC"
+ :keymap (list
+ (cons (kbd "C-a") #'bd/beginning-of-visual-line-dwim)))
+
+(use-package prog-mode
+ :hook
+ ((js-mode . (lambda ()
+ (add-to-list 'prettify-symbols-alist '("function" . ?ƒ))))
+ (prog-mode . (lambda ()
+ (font-lock-add-keywords
+ nil '(("\\<\\(FIX\\(ME\\)?\\|TODO\\)"
+ 1 font-lock-warning-face t)))))
+ (prog-mode . dwim-cursor-mode))
+ :config
+ (global-prettify-symbols-mode 1))
+
+(use-package tramp
+ :config
+ (defun request-sudo ()
+ "Uses TRAMP to edit current opened file as root."
+ (interactive)
+ (when buffer-file-name
+ (find-alternate-file
+ (concat "/sudo:root@localhost:"
+ buffer-file-name))))
+ (setopt tramp-remote-path
+ (append tramp-remote-path
+ '(tramp-own-remote-path
+ "~/.guix-profile/bin" "~/.guix-profile/sbin"))))
+
+(use-package vc
+ :bind (("C-x v B" . #'bd/vc-browse-remote))
+ :config
+ (defun bd/vc-browse-remote (&optional current-line)
+ "Open the repository's remote URL in the browser.
+If CURRENT-LINE is non-nil, point to the current branch, file, and line.
+Otherwise, open the repository's main page."
+ (interactive "P")
+ (let* ((remote-url (string-trim (vc-git--run-command-string nil "config" "--get" "remote.origin.url")))
+ (branch (string-trim (vc-git--run-command-string nil "rev-parse" "--abbrev-ref" "HEAD")))
+ (file (string-trim (file-relative-name (buffer-file-name) (vc-root-dir))))
+ (line (line-number-at-pos)))
+ (message "Opening remote on browser: %s" remote-url)
+ (if (and remote-url (string-match "\\(?:git@\\|https://\\)\\([^:/]+\\)[:/]\\(.+?\\)\\(?:\\.git\\)?$" remote-url))
+ (let ((host (match-string 1 remote-url))
+ (path (match-string 2 remote-url)))
+ ;; Convert SSH URLs to HTTPS (e.g., git@github.com:user/repo.git -> https://github.com/user/repo)
+ (when (string-prefix-p "git@" host)
+ (setq host (replace-regexp-in-string "^git@" "" host)))
+ ;; Construct the appropriate URL based on CURRENT-LINE
+ (browse-url
+ (if current-line
+ (format "https://%s/%s/blob/%s/%s#L%d" host path branch file line)
+ (format "https://%s/%s" host path))))
+ (message "Could not determine repository URL")))))
+
+(use-package hl-line
+ :hook
+ ((prog-mode . hl-line-mode)
+ (text-mode . hl-line-mode)))
+
+(use-package compile
+ :demand t
+ :hook ((compilation-filter . ansi-color-compilation-filter))
+ :config
+ (setopt compilation-always-kill t
+ compilation-scroll-output 'first-error
+ compilation-ask-about-save nil
+ ansi-color-for-compilation-mode t)
+ (defun bd/compile-dwim (f)
+ (let ((default-directory (bd/get-directory-dwim)))
+ (call-interactively f)))
+ (add-to-list 'display-buffer-alist
+ '((major-mode . compilation-mode)
+ (display-buffer-in-side-window)
+ (side . bottom)
+ (slot . -1)
+ (width . 0.15)
+ (post-command-select-window t)))
+
+ (keymap-set prog-mode-map
+ "C-," #'(lambda ()
+ (interactive)
+ (bd/compile-dwim #'recompile)))
+ (keymap-set prog-mode-map
+ "C-<" #'(lambda ()
+ (interactive)
+ (bd/compile-dwim #'compile))))
+
+(use-package man
+ :config
+ (setopt Man-notify-method 'pushy))
+
+(use-package eldoc
+ :init
+ (global-eldoc-mode))
+
+(use-package flymake
+ :bind (("C-c f f" . #'flymake-mode)
+ :map flymake-mode-map
+ ("C-c f s" . #'flymake-start)
+ ("C-c f n" . #'flymake-goto-next-error)
+ ("C-c f p" . #'flymake-goto-prev-error)
+ ("C-c f b" . #'flymake-show-buffer-diagnostics)
+ ("C-c f d" . #'flymake-show-project-diagnostics))
+ :config
+ (setopt flymake-no-changes-timeout nil
+ flymake-start-on-flymake-mode t
+ flymake-start-on-save-buffer t
+ flymake-proc-compilation-prevents-syntax-check t
+ flymake-wrap-around nil
+ flymake-show-diagnostics-at-end-of-line nil))
+
+(require 'geiser)
+(require 'geiser-mode)
+(require 'geiser-guile)
+
+(use-package cider)
+
+(use-package gdb-mi
+ :config
+ (setopt gdb-debuginfod-enable-setting nil))
+
+(use-package eglot
+ :defer t
+ :bind (:map eglot-mode-map
+ ("C-c C-f" . eglot-format)
+ ("C-c C-e" . eglot-rename))
+ :config
+ (setopt eglot-autoshutdown t
+ eglot-prefer-plaintext t
+ jsonrpc-event-hook nil)
+ (add-to-list 'eglot-server-programs
+ '(c-mode . ("ccls" "--init={\"clang\": {\"extraArgs\": [\"-std=c++20\"]}}"))))
+
+(use-package rainbow-mode
+ :hook css-mode)
+
+(use-package lua-mode
+ :config
+ (setopt lua-indent-level 4
+ lua-indent-nested-block-content-align nil)
+ (defun lua-at-most-one-indent (old-function &rest arguments)
+ (let ((old-res (apply old-function arguments)))
+ (if (> old-res lua-indent-level) lua-indent-level old-res)))
+ (advice-add #'lua-calculate-indentation-block-modifier
+ :around #'lua-at-most-one-indent))
+
+(use-package clojure-mode)
+
+(use-package slime
+ :defer t
+ :commands slime
+ :bind (:map slime-mode-map
+ ("C-c C-k" . slime-eval-buffer))
+ :config
+ ;; more memory for ml libraries
+ (setopt inferior-lisp-program "sbcl --dynamic-space-size 4096"))
+
+(use-package yasnippet
+ :hook (vc-git-log-edit-mode . yas-minor-mode)
+ :config
+ (add-to-list 'yas-snippet-dirs (expand-file-name "~/pt/guix/etc/snippets/yas")))
+
+(use-package paren
+ :config
+ (setopt show-paren-delay 0
+ show-paren-style 'mixed
+ show-paren-highlight-openparen t
+ show-paren-context-when-offscreen t
+ show-paren-when-point-in-periphery t
+ show-paren-when-point-inside-paren t))
+
+(use-package rainbow-delimiters
+ :hook prog-mode)
+
+(use-package paredit
+ :hook (ielm-mode
+ emacs-lisp-mode
+ eshell-mode
+ geiser-repl-mode
+ clojure-mode
+ cider-repl-mode
+
+ lisp-mode
+ scheme-mode
+ slime-repl-mode
+ lisp-interaction-mode)
+ :config
+ (defun bd/paredit-preserve-repl (f &rest args)
+ "Wrapper around F (paredit-RET), discarding ARGS."
+ (pcase (cons major-mode (eolp))
+ ('(inferior-emacs-lisp-mode . t) (ielm-return))
+ ('(eshell-mode . t) (eshell-send-input))
+ ('(geiser-repl-mode . t) (geiser-repl-maybe-send))
+ ('(cider-repl-mode . t) (eshell-send-input))
+ ('(slime-repl-mode . t) (slime-repl-return))
+ (_ (funcall f))))
+ (advice-add #'paredit-RET :around #'bd/paredit-preserve-repl)
+ (eldoc-add-command
+ 'paredit-backward-delete
+ 'paredit-close-round))
+
+(use-package copyright)
+
+(provide 'bd--devel)
+;;; bd--devel.el ends here