dotfiles/.config/emacs/lisp/init-prog.el
2023-05-21 21:57:03 +09:00

188 lines
5.9 KiB
EmacsLisp

;; init-prog.el -*- lexical-binding: t -*-
(require 'init-custom)
(require 'init-const)
(require 'init-funcs)
;; Tree-sitter support
(use-package treesit-auto
:hook (after-init . global-treesit-auto-mode)
:init (setq treesit-auto-install 'prompt))
;; Search tool
(use-package grep
:ensure nil
:autoload grep-apply-setting
:config
(cond
((executable-find "ugrep")
(grep-apply-setting
'grep-command "ugrep --color=auto -0In -e ")
(grep-apply-setting
'grep-template "ugrep --color=auto -0In -e <R> <D>")
(grep-apply-setting
'grep-find-command '("ugrep --color=auto -0Inr -e ''" . 30))
(grep-apply-setting
'grep-find-template "ugrep <C> -0Inr -e <R> <D>"))
((executable-find "rg")
(grep-apply-setting
'grep-command "rg --color=auto --null -nH --no-heading -e ")
(grep-apply-setting
'grep-template "rg --color=auto --null --no-heading -g '!*/' -e <R> <D>")
(grep-apply-setting
'grep-find-command '("rg --color=auto --null -nH --no-heading -e ''" . 38))
(grep-apply-setting
'grep-find-template "rg --color=auto --null -nH --no-heading -e <R> <D>"))))
;;;; Cross-referencing commands
(use-package xref
:ensure nil
:config
(with-no-warnings
;; Use faster search tool
(add-to-list 'xref-search-program-alist
'(ugrep . "xargs -0 ugrep <C> --null -ns -e <R>"))
(cond
((executable-find "ugrep")
(setq xref-search-program 'ugrep))
((executable-find "rg")
(setq xref-search-program 'ripgrep)))
;; Select from xref candidates with Ivy
(setq xref-show-definitions-function #'xref-show-definitions-completing-read
xref-show-xrefs-function #'xref-show-definitions-completing-read)))
;;;; Jump to definition
(use-package dumb-jump
:pretty-hydra
((:title (pretty-hydra-title "Dump Jump" 'faicon "nf-fa-anchor")
:color blue :quit-key ("q" "C-g"))
("Jump"
(("j" dumb-jump-go "Go")
("o" dumb-jump-go-other-window "Go other window")
("e" dumb-jump-go-prefer-external "Go external")
("x" dumb-jump-go-prefer-external-other-window "Go external other window"))
"Other"
(("i" dumb-jump-go-prompt "Prompt")
("l" dumb-jump-quick-look "Quick look")
("b" dumb-jump-back "Back"))))
:bind (("M-g o" . dumb-jump-go-other-window)
("M-g j" . dumb-jump-go)
("M-g i" . dumb-jump-go-prompt)
("M-g x" . dumb-jump-go-prefer-external)
("M-g z" . dumb-jump-go-prefer-external-other-window))
;;("C-M-j" . dumb-jump-hydra/body))
:init
(add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
(setq dumb-jump-prefer-searcher 'rg
dumb-jump-selector 'ivy))
;; Code styles
(use-package editorconfig
:diminish
:hook (after-init . editorconfig-mode))
;; Run commands quickly
(use-package quickrun
:bind (("C-<f5>" . quickrun)
("C-c X" . quickrun)))
;; Browse devdocs.io documents using EWW
(use-package devdocs
:autoload (devdocs--installed-docs devdocs--available-docs)
:bind (:map prog-mode-map
("M-<f1>" . devdocs-dwim)
("C-h D" . devdocs-dwim))
:init
(defconst devdocs-major-mode-docs-alist
'((c-mode . ("c"))
(c++-mode . ("cpp"))
(python-mode . ("python~3.10" "python~2.7"))
(ruby-mode . ("ruby~3.1"))
(go-mode . ("go"))
(rustic-mode . ("rust"))
(css-mode . ("css"))
(html-mode . ("html"))
(julia-mode . ("julia~1.8"))
(js-mode . ("javascript" "jquery"))
(js2-mode . ("javascript" "jquery"))
(emacs-lisp-mode . ("elisp")))
"Alist of major-mode and docs.")
(mapc
(lambda (mode)
(add-hook (intern (format "%s-hook" (car mode)))
(lambda ()
(setq-local devdocs-current-docs (cdr mode)))))
devdocs-major-mode-docs-alist)
(setq devdocs-data-dir (expand-file-name "devdocs" user-emacs-directory))
(defun devdocs-dwim()
"Look up a DevDocs documentation entry.
Install the doc if it's not installed."
(interactive)
;; Install the doc if it's not installed
(mapc
(lambda (slug)
(unless (member slug (let ((default-directory devdocs-data-dir))
(seq-filter #'file-directory-p
(when (file-directory-p devdocs-data-dir)
(directory-files "." nil "^[^.]")))))
(mapc
(lambda (doc)
(when (string= (alist-get 'slug doc) slug)
(devdocs-install doc)))
(devdocs--available-docs))))
(alist-get major-mode devdocs-major-mode-docs-alist))
;; Lookup the symbol at point
(devdocs-lookup nil (thing-at-point 'symbol t))))
;;;; Misc. programming modes
(use-package csv-mode)
(use-package csharp-mode)
;;(use-package cask-mode)
(use-package cmake-mode)
;;(use-package dart-mode)
;;(use-package groovy-mode)
;;(use-package julia-mode)
;;(use-package lua-mode)
;;(use-package mermaid-mode)
;;(use-package plantuml-mode)
(use-package rmsbolt) ; A compiler output viewer
;;(use-package scala-mode)
;;(use-package swift-mode)
;;(use-package v-mode)
;;(use-package vimrc-mode)
;;(use-package protobuf-mode
;; :hook (protobuf-mode . (lambda ()
;; (setq imenu-generic-expression
;; '((nil "^[[:space:]]*\\(message\\|service\\|enum\\)[[:space:]]+\\([[:alnum:]]+\\)" 2))))))
;;(use-package nxml-mode
;; :ensure nil
;; :mode (("\\.xaml$" . xml-mode)))
;; Batch Mode eXtras
(use-package bmx-mode
:after company
:diminish
:hook (after-init . bmx-mode-setup-defaults))
;; Fish shell
(use-package fish-mode
:hook (fish-mode . (lambda ()
(add-hook 'before-save-hook
#'fish_indent-before-save))))
(use-package pkgbuild-mode)
(use-package systemd)
(provide 'init-prog)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; init-prog.el ends here