diff options
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.el | 237 |
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 |
