542 lines
12 KiB
EmacsLisp
542 lines
12 KiB
EmacsLisp
|
;;; Package
|
||
|
|
||
|
(require 'package)
|
||
|
|
||
|
;; Prevent loading packages twice
|
||
|
(setq package-enable-at-startup nil)
|
||
|
|
||
|
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
|
||
|
|
||
|
(package-initialize)
|
||
|
|
||
|
(defalias '_prc 'package-refresh-contents)
|
||
|
(defalias '_pi 'package-install)
|
||
|
|
||
|
;;; Use-Package
|
||
|
|
||
|
(unless (package-installed-p 'use-package)
|
||
|
(package-refresh-contents)
|
||
|
(package-install 'use-package))
|
||
|
|
||
|
(require 'use-package)
|
||
|
|
||
|
;;; No-Littering
|
||
|
|
||
|
(use-package no-littering
|
||
|
:ensure t
|
||
|
:init
|
||
|
(setq no-littering-etc-directory
|
||
|
(expand-file-name "auto-package-configuration/" user-emacs-directory))
|
||
|
|
||
|
(setq no-littering-var-directory
|
||
|
(expand-file-name "auto-package-data/" user-emacs-directory))
|
||
|
|
||
|
(setq auto-save-file-name-transforms
|
||
|
`((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
|
||
|
|
||
|
(setq custom-file (no-littering-expand-etc-file-name "custom.el"))
|
||
|
;; Create `custom-file' if it doesn't exist
|
||
|
(or (file-exists-p custom-file)
|
||
|
(make-empty-file custom-file)))
|
||
|
|
||
|
;;; Configuration Directory Structure
|
||
|
|
||
|
(defconst user-system-dependencies (concat user-emacs-directory "system-dependencies/"))
|
||
|
(defconst user-src-packages (concat user-emacs-directory "src-packages/"))
|
||
|
;; Create while cloning repo
|
||
|
(defconst user-others-utils (concat user-emacs-directory "others-utils/"))
|
||
|
(defconst user-utils (concat user-emacs-directory "my-utils/"))
|
||
|
|
||
|
(load custom-file)
|
||
|
|
||
|
(unless (boundp 'user-installed-emacs-config?)
|
||
|
(mapc #'make-directory `(,user-system-dependencies ,user-src-packages))
|
||
|
|
||
|
;; Append variable binding of `user-installed-emacs-config?' to file `custom-file'
|
||
|
(write-region (format "%s" '(defconst user-installed-emacs-config? t))
|
||
|
nil custom-file t))
|
||
|
|
||
|
;;; Built-in Primitives
|
||
|
|
||
|
(defalias 'yes-or-no-p 'y-or-n-p)
|
||
|
|
||
|
(setq inhibit-startup-screen t)
|
||
|
|
||
|
(setq default-directory "~/")
|
||
|
|
||
|
(setq visible-bell nil)
|
||
|
(setq ring-bell-function 'ignore)
|
||
|
|
||
|
;;; Exec Path From Shell
|
||
|
|
||
|
(use-package exec-path-from-shell
|
||
|
:ensure t
|
||
|
:config
|
||
|
(exec-path-from-shell-initialize))
|
||
|
|
||
|
;;; Magit
|
||
|
|
||
|
(use-package magit
|
||
|
:ensure t
|
||
|
:bind
|
||
|
(("C-c m s" . magit-status)
|
||
|
("C-c m c" . magit-commit)
|
||
|
("C-c m p" . magit-push)
|
||
|
("C-c m S" . magit-stage)))
|
||
|
|
||
|
;;; Utilities
|
||
|
|
||
|
(defvar user-others-utils-list
|
||
|
(mapcar (lambda (util) (concat user-others-utils util))
|
||
|
'("emacsredux.el" "fuco1.el")))
|
||
|
|
||
|
(unless (file-exists-p (car user-others-utils-list))
|
||
|
(magit-call-git "clone" "https://git.lain.church/zdm/others-utils" (expand-file-name user-others-utils)))
|
||
|
|
||
|
(mapc 'load user-others-utils-list)
|
||
|
|
||
|
(defalias '_su 'emacsredux-sudo-edit)
|
||
|
|
||
|
;;; Winner
|
||
|
|
||
|
(use-package winner
|
||
|
:config
|
||
|
(winner-mode))
|
||
|
|
||
|
;;; Shell
|
||
|
|
||
|
(use-package shell
|
||
|
:config
|
||
|
(defalias '_sh 'shell))
|
||
|
|
||
|
;;; Paren
|
||
|
|
||
|
(use-package paren
|
||
|
:config
|
||
|
(show-paren-mode))
|
||
|
|
||
|
;;; Simple
|
||
|
|
||
|
(use-package simple
|
||
|
:config
|
||
|
(column-number-mode))
|
||
|
|
||
|
;;; Delete Selection
|
||
|
|
||
|
(use-package delsel
|
||
|
:config
|
||
|
(delete-selection-mode))
|
||
|
|
||
|
;; Tabs/Spaces
|
||
|
|
||
|
(setq-default indent-tabs-mode nil)
|
||
|
(setq-default tab-width 4)
|
||
|
|
||
|
;;; Minibuffer Depth
|
||
|
|
||
|
(use-package mb-depth
|
||
|
:config
|
||
|
(setq enable-recursive-minibuffers t)
|
||
|
(setq minibuffer-depth-indicate-mode t))
|
||
|
|
||
|
;;; Aesthetics
|
||
|
|
||
|
(mapc (lambda (mode)
|
||
|
(funcall mode -1))
|
||
|
'(menu-bar-mode scroll-bar-mode tool-bar-mode))
|
||
|
|
||
|
(use-package doom-themes
|
||
|
:ensure t
|
||
|
:config
|
||
|
(load-theme 'doom-wilmersdorf t))
|
||
|
|
||
|
(add-to-list 'default-frame-alist '(font . "Iosevka Custom 13"))
|
||
|
|
||
|
(setq-default cursor-type 'bar)
|
||
|
|
||
|
;;; Electric Pair
|
||
|
|
||
|
(use-package electric-pair
|
||
|
:defer t
|
||
|
:hook
|
||
|
((prog-mode) . electric-pair-mode))
|
||
|
|
||
|
;;; Aggressive Indent
|
||
|
(use-package aggressive-indent
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:hook
|
||
|
(prog-mode . aggressive-indent-mode))
|
||
|
|
||
|
;;; Man
|
||
|
|
||
|
(use-package man
|
||
|
:bind
|
||
|
("C-c c m" . man))
|
||
|
|
||
|
;;; Ibuffer
|
||
|
|
||
|
(use-package ibuffer
|
||
|
:init
|
||
|
(setq ibuffer-expert t)
|
||
|
(setq ibuffer-show-empty-filter-groups nil)
|
||
|
|
||
|
(defun user-ibuffer-quit ()
|
||
|
(interactive)
|
||
|
(quit-window t))
|
||
|
:bind
|
||
|
(("C-x C-b" . ibuffer)
|
||
|
:map ibuffer-mode-map
|
||
|
("q" . user-ibuffer-quit))
|
||
|
:hook
|
||
|
((ibuffer-mode) . ibuffer-auto-mode)
|
||
|
((ibuffer-auto-mode) . ibuffer-set-filter-groups-by-mode)
|
||
|
:config
|
||
|
(fuco1-special-beginning-of-buffer ibuffer (ibuffer-forward-line 1))
|
||
|
(fuco1-special-end-of-buffer ibuffer (ibuffer-backward-line 1)))
|
||
|
|
||
|
;;; Dired
|
||
|
|
||
|
(use-package dired+
|
||
|
:load-path user-src-packages
|
||
|
:defer t)
|
||
|
|
||
|
(unless (require 'dired+ nil 'noerror)
|
||
|
(url-copy-file "https://www.emacswiki.org/emacs/download/dired%2b.el" (concat user-src-packages "dired+.el")))
|
||
|
|
||
|
(use-package dired
|
||
|
:defer t
|
||
|
:hook
|
||
|
((dired-mode) . dired-hide-details-mode)
|
||
|
:init
|
||
|
(setq dired-listing-switches "-la --group-directories-first")
|
||
|
(setq dired-recursive-copies 'always)
|
||
|
(setq dired-recursive-deletes 'top)
|
||
|
(setq global-auto-revert-non-file-buffers t)
|
||
|
(setq auto-revert-verbose nil)
|
||
|
:config
|
||
|
(fuco1-special-beginning-of-buffer dired
|
||
|
(while (not (ignore-errors (dired-get-filename)))
|
||
|
(dired-next-line 1)))
|
||
|
(fuco1-special-end-of-buffer dired (dired-previous-line 1)))
|
||
|
|
||
|
;;; Doom Modeline
|
||
|
|
||
|
(use-package doom-modeline
|
||
|
:ensure t
|
||
|
:init (doom-modeline-mode 1))
|
||
|
|
||
|
;;; Ace Link
|
||
|
|
||
|
(use-package ace-link
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:config
|
||
|
(ace-link-setup-default))
|
||
|
|
||
|
;;; Avy
|
||
|
|
||
|
(use-package avy
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:init
|
||
|
(setq avy-style 'pre)
|
||
|
:bind
|
||
|
(("C-c w" . avy-goto-word-1)
|
||
|
("C-c l" . avy-goto-line)))
|
||
|
|
||
|
;;; Counsel
|
||
|
|
||
|
(use-package counsel
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:init
|
||
|
(setq counsel-find-file-at-point t)
|
||
|
|
||
|
(defun user-ivy-switch-file-search ()
|
||
|
(interactive)
|
||
|
(ivy-quit-and-run (counsel-fzf nil ivy--directory)))
|
||
|
:bind
|
||
|
(("C-s" . counsel-grep-or-swiper)
|
||
|
("M-x" . counsel-M-x)
|
||
|
("M-y" . counsel-yank-pop)
|
||
|
("C-x C-f" . counsel-find-file)
|
||
|
("C-h f" . counsel-describe-function)
|
||
|
("C-h v" . counsel-describe-variable)
|
||
|
("C-c c u" . counsel-unicode-char)
|
||
|
("C-c c o" . counsel-outline))
|
||
|
(:map ivy-minibuffer-map
|
||
|
("M-s r" . user-ivy-switch-file-search)))
|
||
|
|
||
|
;;; Ivy
|
||
|
|
||
|
(use-package ivy
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:init
|
||
|
(setq ivy-use-virtual-buffers nil)
|
||
|
:config
|
||
|
(ivy-mode))
|
||
|
|
||
|
;;; Swiper
|
||
|
|
||
|
(use-package swiper
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;;; Ivy-Avy
|
||
|
|
||
|
(use-package ivy-avy
|
||
|
:ensure t)
|
||
|
|
||
|
;;; Hydra
|
||
|
|
||
|
(use-package hydra
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;; Expand Region
|
||
|
|
||
|
(use-package expand-region
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:bind
|
||
|
("C-=" . er/expand-region))
|
||
|
|
||
|
;;; Multiple Cursors
|
||
|
|
||
|
(use-package multiple-cursors
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:bind
|
||
|
("C-S-<mouse-1>" . mc/add-cursor-on-click))
|
||
|
|
||
|
;;; Lispy
|
||
|
|
||
|
(use-package lispy
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:hook
|
||
|
((emacs-lisp-mode scheme-mode) . lispy-mode))
|
||
|
|
||
|
;;; Ace Window
|
||
|
|
||
|
(use-package ace-window
|
||
|
:ensure
|
||
|
:defer t
|
||
|
:init
|
||
|
(setq aw-scope 'frame)
|
||
|
:bind
|
||
|
("C-x o" . ace-window))
|
||
|
|
||
|
;;; Form Feed
|
||
|
|
||
|
(use-package form-feed
|
||
|
:ensure t
|
||
|
:defer t
|
||
|
:hook
|
||
|
((Info-mode org-mode text-mode) . form-feed-mode))
|
||
|
|
||
|
;;; Unfill
|
||
|
|
||
|
(use-package unfill
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;;; Flyspell
|
||
|
|
||
|
(use-package flyspell
|
||
|
:defer t
|
||
|
:hook
|
||
|
((prog-mode) . flyspell-prog-mode)
|
||
|
((text-mode org-mode) . flyspell-mode))
|
||
|
|
||
|
;;; PDF Tools
|
||
|
|
||
|
(use-package pdf-tools
|
||
|
:ensure t
|
||
|
:magic ("%PDF" . pdf-view-mode)
|
||
|
:config
|
||
|
(pdf-tools-install :no-query))
|
||
|
|
||
|
;;; Geiser
|
||
|
|
||
|
(use-package geiser
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;;; Lsp
|
||
|
|
||
|
(let ((elixir-directory (expand-file-name (concat user-system-dependencies "elixir-ls/")))
|
||
|
(elixir-zipfile (expand-file-name (concat user-system-dependencies "elixir-ls-1.11.zip"))))
|
||
|
(unless (file-directory-p elixir-directory)
|
||
|
(url-copy-file "https://github.com/elixir-lsp/elixir-ls/releases/download/v0.6.4/elixir-ls-1.11.zip"
|
||
|
elixir-zipfile)
|
||
|
(shell-command (concat "unzip " elixir-zipfile " -d " elixir-directory))
|
||
|
(delete-file elixir-zipfile)))
|
||
|
|
||
|
(use-package lsp-mode
|
||
|
:commands lsp
|
||
|
:ensure t
|
||
|
:hook
|
||
|
(elixir-mode . lsp)
|
||
|
:init
|
||
|
(add-to-list 'exec-path user-system-dependencies))
|
||
|
|
||
|
;;; DAP
|
||
|
|
||
|
(use-package dap-mode
|
||
|
:ensure t
|
||
|
:hook ((elixir-mode . dap-mode)
|
||
|
(elixir-mode . dap-ui-mode)))
|
||
|
|
||
|
;;; inf-elixir
|
||
|
|
||
|
(use-package inf-elixir
|
||
|
:after elixir-mode
|
||
|
:load-path (lambda () (list (concat user-src-packages "inf-elixir/")))
|
||
|
:bind (:map elixir-mode-map
|
||
|
("C-c i i" . 'inf-elixir)
|
||
|
("C-c i p" . 'inf-elixir-project)
|
||
|
("C-c i l" . 'inf-elixir-send-line)
|
||
|
("C-c i r" . 'inf-elixir-send-region)
|
||
|
("C-c i b" . 'inf-elixir-send-buffer)))
|
||
|
|
||
|
(unless (require 'inf-elixir nil 'noerror)
|
||
|
(magit-call-git "clone" "https://github.com/J3RN/inf-elixir/" (expand-file-name (concat user-src-packages "inf-elixir/"))))
|
||
|
|
||
|
;;; Elixir
|
||
|
|
||
|
(use-package elixir-mode
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;;; Exunit
|
||
|
|
||
|
(use-package exunit
|
||
|
:ensure t
|
||
|
:defer t)
|
||
|
|
||
|
;;; Emacs Upload
|
||
|
|
||
|
(use-package emacs-upload
|
||
|
:load-path (lambda () (list (concat user-src-packages "emacs-upload/")))
|
||
|
:defer t
|
||
|
:bind
|
||
|
("C-c e" . emacs-upload))
|
||
|
|
||
|
(unless (require 'emacs-upload nil 'noerror)
|
||
|
(magit-call-git "clone" "https://git.lain.church/zdm/emacs-upload.git" (expand-file-name (concat user-src-packages "emacs-upload/"))))
|
||
|
|
||
|
;;; ERC
|
||
|
|
||
|
(use-package erc
|
||
|
:defer t
|
||
|
:bind
|
||
|
(:map erc-mode-map
|
||
|
("C-<return>" . ace-link))
|
||
|
:init
|
||
|
(defun user-erc-mpv-url (url &optional new-window)
|
||
|
(start-process "mpv" "*mpv*" "mpv" url))
|
||
|
|
||
|
(defun user-erc-feh-url (url &optional new-window)
|
||
|
(start-process "feh" "*feh*" "feh" url))
|
||
|
|
||
|
(setq browse-url-browser-function '(("\\(?:flac\\|m\\(?:kv\\|p[34]\\)\\|webm\\|youtube\\)" . user-erc-mpv-url)
|
||
|
("\\(?:JPG\\|PNG\\|\\(?:jp\\|pn\\)g\\)" . user-erc-feh-url)
|
||
|
("." . browse-url-firefox)))
|
||
|
|
||
|
(defun user-erc-part-reason (&optional s)
|
||
|
(or s (format "(part-or-quit)")))
|
||
|
|
||
|
(setq erc-quit-reason 'user-erc-part-reason)
|
||
|
(setq erc-part-reason 'user-erc-part-reason)
|
||
|
|
||
|
(setq erc-modules
|
||
|
'(pcomplete netsplit fill button match track completion readonly networks ring
|
||
|
autojoin noncommands irccontrols move-to-prompt stamp menu list
|
||
|
notifications))
|
||
|
|
||
|
(setq erc-timestamp-only-if-changed-flag nil
|
||
|
erc-timestamp-format "%I:%M:%S "
|
||
|
erc-insert-timestamp-function 'erc-insert-timestamp-left)
|
||
|
|
||
|
(setq erc-format-query-as-channel-p t
|
||
|
erc-track-priority-faces-only 'all
|
||
|
erc-track-faces-priority-list
|
||
|
'(erc-error-face
|
||
|
erc-current-nick-face
|
||
|
erc-keyword-face
|
||
|
erc-nick-msg-face
|
||
|
erc-direct-msg-face
|
||
|
erc-dangerous-host-face
|
||
|
erc-notice-face
|
||
|
erc-prompt-face)
|
||
|
erc-track-exclude-types
|
||
|
'("JOIN" "NICK" "PART" "QUIT" "MODE"
|
||
|
"324" "329" "332" "333" "353" "477"))
|
||
|
|
||
|
(defadvice erc-track-find-face (around erc-track-find-face-promote-query activate)
|
||
|
(if (erc-query-buffer-p)
|
||
|
(setq ad-return-value (intern "erc-current-nick-face"))
|
||
|
ad-do-it))
|
||
|
|
||
|
(defadvice erc-track-modified-channels (around erc-track-modified-channels-promote-query activate)
|
||
|
(if (erc-query-buffer-p) (setq erc-track-priority-faces-only 'nil))
|
||
|
ad-do-it
|
||
|
(if (erc-query-buffer-p) (setq erc-track-priority-faces-only 'all)))
|
||
|
|
||
|
(setq erc-nick "zdm"
|
||
|
erc-user-full-name "zdm"
|
||
|
erc-system-name "c"
|
||
|
erc-email-userid "zdm")
|
||
|
|
||
|
(setq erc-disable-ctcp-replies t)
|
||
|
|
||
|
(setq erc-fill-prefix nil
|
||
|
erc-fill-column 120)
|
||
|
|
||
|
(setq erc-flood-protect nil)
|
||
|
|
||
|
(setq erc-auto-query 'buffer)
|
||
|
|
||
|
(setq erc-prompt ">")
|
||
|
|
||
|
(setq erc-format-nick-function 'erc-format-@nick)
|
||
|
|
||
|
(setq erc-after-connect nil)
|
||
|
|
||
|
(setq erc-interpret-mirc-color t
|
||
|
erc-interpret-controls-p t)
|
||
|
|
||
|
(setq erc-server-coding-system '(utf-8 . utf-8))
|
||
|
|
||
|
(setq erc-prompt-for-password nil)
|
||
|
|
||
|
(defun user-erc-servers-connect ()
|
||
|
(interactive)
|
||
|
(erc-tls :server "lainchan.org" :port 6697))
|
||
|
|
||
|
(defalias 'irc 'user-erc-servers-connect)
|
||
|
|
||
|
;; https://emacs.stackexchange.com/a/39212
|
||
|
(defun basil-default-completion ()
|
||
|
"Locally revert completion variables to their default values."
|
||
|
(setq-local completing-read-function #'completing-read-default)
|
||
|
(setq-local completion-in-region-function #'completion--in-region))
|
||
|
|
||
|
:hook
|
||
|
((erc-insert-post erc-send-post) . erc-save-buffer-in-logs)
|
||
|
((erc-mode) . basil-default-completion)
|
||
|
:config
|
||
|
(load (concat user-utils "erc-faces"))
|
||
|
|
||
|
(erc-spelling-mode)
|
||
|
(erc-autojoin-mode)
|
||
|
|
||
|
(erc-update-modules)
|
||
|
|
||
|
(erc-notifications-disable)
|
||
|
(add-hook 'focus-in-hook 'erc-notifications-disable)
|
||
|
(add-hook 'focus-out-hook 'erc-notifications-enable))
|