From 17f52b72796a1040889422914a1235e101c5b95d Mon Sep 17 00:00:00 2001 From: zdm Date: Wed, 3 Feb 2021 09:23:13 -0700 Subject: [PATCH] first commit --- .gitignore | 6 + README.md | 23 +++ init.el | 542 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 571 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 init.el diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d20a6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +* +!.gitignore +!README.md +!init.el +!/my-utils +!/my-utils* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..998cc58 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +## Install + +Clone the repository + +``` +git clone https://git.lain.church/zdm/emacs-config ~/.emacs.d/ +``` + +After launching Emacs the directory structure will be the following + +``` + auto-package-configuration/ + auto-package-data/ + elpa/ + my-utils/ + others-utils/ + src-packages/ + system-dependencies/ + .git + .gitignore + README.md + init.el + ``` diff --git a/init.el b/init.el new file mode 100644 index 0000000..dba66ea --- /dev/null +++ b/init.el @@ -0,0 +1,542 @@ +;;; 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 + :defer 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-" . 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-" . 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))