diff options
author | Thanos Apollo <[email protected]> | 2024-05-10 09:09:25 +0300 |
---|---|---|
committer | Thanos Apollo <[email protected]> | 2024-05-10 09:09:25 +0300 |
commit | 91e4e06f9080836c7095e7198e923ee4be768882 (patch) | |
tree | 3d43d84c75172fc4bfa3d76fa35e5a12fbf7705f /.emacs.d/init.el | |
parent | bec6503f1224c6b03d954887a3ee50c49fa3115f (diff) |
emacs: Rewrite emacs configuration as one file
Diffstat (limited to '.emacs.d/init.el')
-rw-r--r-- | .emacs.d/init.el | 883 |
1 files changed, 0 insertions, 883 deletions
diff --git a/.emacs.d/init.el b/.emacs.d/init.el deleted file mode 100644 index 392a5ec..0000000 --- a/.emacs.d/init.el +++ /dev/null @@ -1,883 +0,0 @@ -;;; init.el --- Welcome to my Emacs configuration! -*- lexical-binding: t; -*- - -;; Copyright (C) 2023 Thanos Apollo - -;; Author: Thanos Apollo <[email protected]> -;; Keywords: extensions - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <https://www.gnu.org/licenses/>. - -;;; Commentary: -;; ╭━━━━┳╮╱╱╱╱╱╱╱╱╱╱╱╱╱╱╭━━━╮╱╱╱╱╱╭╮╭╮╱╱╱╱╱╱╱╱╭━━━╮ -;; ┃╭╮╭╮┃┃╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃╭━╮┃╱╱╱╱╱┃┃┃┃╱╱╱╱╱╱╱╱┃╭━━╯ -;; ╰╯┃┃╰┫╰━┳━━┳━╮╭━━┳━━╮┃┃╱┃┣━━┳━━┫┃┃┃╭━━╮╱╱╱╱┃╰━━┳╮╭┳━━┳━━┳━━╮ -;; ╱╱┃┃╱┃╭╮┃╭╮┃╭╮┫╭╮┃━━┫┃╰━╯┃╭╮┃╭╮┃┃┃┃┃╭╮┃╭━━╮┃╭━━┫╰╯┃╭╮┃╭━┫━━┫ -;; ╱╱┃┃╱┃┃┃┃╭╮┃┃┃┃╰╯┣━━┃┃╭━╮┃╰╯┃╰╯┃╰┫╰┫╰╯┃╰━━╯┃╰━━┫┃┃┃╭╮┃╰━╋━━┃ -;; ╱╱╰╯╱╰╯╰┻╯╰┻╯╰┻━━┻━━╯╰╯╱╰┫╭━┻━━┻━┻━┻━━╯╱╱╱╱╰━━━┻┻┻┻╯╰┻━━┻━━╯ -;; ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃┃ -;; ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╰╯ -;;; Code: - -(setf user-full-name "Thanos Apollo" - user-mail-address "[email protected]") - -(defvar is-zeus (equal (system-name) "zeus")) -(defvar is-hermes (equal (system-name) "hermes")) -(defvar is-phone (equal (system-name) "localhost")) - -(setf browse-url-browser-function 'browse-url-generic - browse-url-generic-program "firefox" - backup-directory-alist '((".*" . "~/.Trash")) - sentence-end-double-space t - default-input-method "bulgarian-phonetic" - ;; fix emacs hangs - gc-cons-threshold 5000000 - ispell-program-name (executable-find "hunspell")) - -(define-key global-map (kbd "M-<backspace>") 'backward-kill-sexp) -(define-key global-map (kbd "C-c L") 'display-line-numbers-mode) -(define-key global-map (kbd "C-z") 'nil) -(define-key global-map (kbd "C-c r") 'rename-visited-file) - -(add-to-list 'load-path "~/.emacs.d/modules") - -(setf disabled-command-function nil ;; Enable all commands - url-privacy-level 'high) ;; Privacy level - -;; Calendar dates -(setf calendar-date-style 'european) - -(require 'dired) -(define-key dired-mode-map (kbd "b") 'dired-up-directory) -(define-key dired-mode-map (kbd "v") 'dired-watch-video) -(define-key dired-mode-map (kbd "z") 'wdired-change-to-wdired-mode) -(define-key dired-mode-map (kbd "C-c w") 'dired-set-wallpaper) -(define-key dired-mode-map (kbd "C-c d") 'dired-delete-files-except) -(define-key dired-mode-map (kbd "C-c r") 'dired-do-query-replace-regexp) - -;; font -(custom-set-faces - (if is-hermes '(default ((t (:inherit nil :height 120 :family "Jetbrains Mono")))) - '(default ((t (:inherit nil :height 130 :family "Jetbrains Mono")))))) - -(if is-zeus - (display-battery-mode 0) - (display-battery-mode 1)) - -(savehist-mode) -(save-place-mode 1) -(recentf-mode 1) -(electric-pair-mode 1) - -;; Autoinsert -(auto-insert-mode 1) - -(setq auto-insert-alist '((python-mode . "python.template")) - auto-insert-directory (locate-user-emacs-file "insert")) - -(add-to-list 'completion-styles 'initials t) - -(setf tab-always-indent 'complete) - -;; tramp -(setf tramp-default-method "ssh") - -;; xref -(setf xref-show-xrefs-function #'consult-xref - xref-show-definitions-function #'consult-xref) - -(add-hook 'emacs-lisp-mode-hook #'prettify-symbols-mode) -(add-hook 'lisp-mode-hook #'prettify-symbols-mode) - -;; Set and load custom.el -(setf custom-file (locate-user-emacs-file "custom.el")) -(load custom-file 'noerror) - -;; Enable use-package support for imenu -(setf use-package-enable-imenu-support t) - -;; Install straight.el -(defvar bootstrap-version) - -(let ((bootstrap-file - (expand-file-name - "straight/repos/straight.el/bootstrap.el" - (or (bound-and-true-p straight-base-dir) - user-emacs-directory))) - (bootstrap-version 7)) - (unless (file-exists-p bootstrap-file) - (with-current-buffer - (url-retrieve-synchronously - "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" - 'silent 'inhibit-cookies) - (goto-char (point-max)) - (eval-print-last-sexp))) - (load bootstrap-file nil 'nomessage)) - -(setq package-enable-at-startup nil) - -(require 'straight) - -(setf straight-use-package-by-default t) - -(setf straight-recipe-overrides - '((transmission :type git :host nil :repo "[email protected]:/var/git/transmission.git") - (yeetube :type git :host nil :repo "[email protected]:/var/git/yeetube.git") - (gnosis :type git :host nil :repo "[email protected]:/var/git/gnosis.git") - (pcmpl-emerge :type git :host nil :repo "[email protected]:/var/git/pcmpl-emerge.git") - (pcmpl-rc :type git :host nil :repo "[email protected]:/var/git/pcmpl-rc.git"))) - -(defun theme-invisible-dividers (_theme) - "Make window dividers for THEME invisible." - (let ((bg (face-background 'default))) - (custom-set-faces - `(fringe ((t :background ,bg :foreground ,bg))) - `(window-divider ((t :background ,bg :foreground ,bg))) - `(window-divider-first-pixel ((t :background ,bg :foreground ,bg))) - `(window-divider-last-pixel ((t :background ,bg :foreground ,bg)))))) - -(add-hook 'enable-theme-functions #'theme-invisible-dividers) - -;;;; Theming ;;;; -(setf inhibit-startup-message t - initial-scratch-message nil) - -(blink-cursor-mode -1) -(global-visual-line-mode 0) - -(setf visible-bell nil - display-line-numbers-type 'relative) - -(column-number-mode) -(global-display-line-numbers-mode 1) - -;; Transparency -(add-to-list 'default-frame-alist '(alpha-background . 85)) - -;; theming -(global-hl-line-mode) - -(defun thanos/terminal-theming () - "Customize theming when laucning Emacs as TUI." - (unless (display-graphic-p (selected-frame)) - (set-face-background 'default "unspecified-bg" (selected-frame)) - (global-hl-line-mode 0))) - -(add-hook 'window-setup-hook 'thanos/terminal-theming) - -(when (equal is-phone nil) - (scroll-bar-mode -1) - (set-fringe-mode 10)) - -(tool-bar-mode -1) -(tooltip-mode -1) -(menu-bar-mode -1) - - -(use-package org - :ensure t - :config - (setf org-directory "~/org/" - org-agenda-files '("~/org/seminars.org" "~/org/lectures.org") - org-default-notes-file (expand-file-name "notes.org" org-directory) - org-ellipsis " ▼ " - org-log-done 'time - org-hide-emphasis-markers nil ;;change to t to hide emphasis markers - org-table-convert-region-max-lines 20000 - org-log-done 'time - org-todo-keywords '((sequence "TODO(t)" "SEMINAR(s)" "LECTURE(l)" "DONE(d)"))) - - (setf org-structure-template-alist - '(("e" . "src emacs-lisp") - ("p" . "src python") - ("l" . "src lisp") - ("b" . "src bash") - ("q" . "QUOTE"))) - :hook ((org-mode . org-auto-tangle-mode) - (org-mode . (lambda () (display-line-numbers-mode -1) (flyspell-mode)))) - :bind (:map org-mode-map - (("C-c l" . org-store-link) - ("C-c M-t" . org-todo)))) - -(defun org-insert-book () - "Insert org-link from ~/Library for book." - (interactive) - (let* ((book-path (read-file-name "Book: " "~/Library/"))) - (org-insert-link nil book-path (file-name-base book-path)))) - -(use-package org-modern - :ensure t - :config - (global-org-modern-mode) - (setf org-modern-table nil - org-modern-todo nil - org-modern-tag nil)) - -;; Create notes directory for org-roam -(unless (file-exists-p "~/Notes") - (make-directory "~/Notes")) - -(use-package org-roam - :defer t - :init - (define-prefix-command 'thanos/notes-map) - :config - (setf org-roam-directory "~/Notes" - org-roam-dailies-directory "daily/") - - (org-roam-db-autosync-enable) - - (setf org-roam-node-display-template - (concat "${title:50} "(propertize "${tags:30}" 'face 'org-tag))) - - (setf org-roam-db-node-include-function - (lambda () - (not (or (member "journal" (org-get-tags)) - (member "dailies" (org-get-tags)))))) - ;; Templates - (setf org-roam-capture-templates - '(("d" "default" plain - "%?" - :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+startup: overview\n") - :unnarrowed t) - ("p" "MUS" plain "* Goals\n\n%?\n\n* Tasks\n\n** TODO Add initial tasks\n\n* Dates\n\n" - :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+filetags: MUS") - :unnarrowed t)) - org-roam-dailies-capture-templates - '(("d" "default" entry - "* %?" - :target (file+head "%<%Y-%m-%d>.org" - "#+title: %<%Y-%m-%d>\n#+filetags: :journal:\n")) - ("j" "journal" plain - "\n* Daily Notes\n\n* Goals\n+ []\n\n* Extras %?" - :target (file+head "%<%Y-%m-%d>.org" - "#+title: %<%Y-%m-%d>\n#+filetags: :journal:\n")))) - (defun org-roam-ref-add-book () - "Insert org-link from Library." - (interactive) - (let ((book (format "file:%s" (read-file-name "Book: " (if is-zeus "/hdd/Library/" "~/Library/"))))) - book)) - - (defun org-roam-sync-notes () - "Sync org-oram notes" - (interactive) - (let ((git (executable-find "git")) - (default-directory org-roam-directory)) - (message "Synching org-roam notes %s" org-roam-directory) - (unless git - (error "Git not found, please install `git'")) - (unless (file-exists-p (expand-file-name ".git" gnosis-dir)) - (message "Creating git repository") - (vc-create-repo 'Git)) - (shell-command "git pull") - (shell-command (format "%s %s" git "add .")) - (shell-command (format "%s %s %s" git "commit -m" (shell-quote-argument "Update org-roam notes"))) - (vc-git-push nil)) - (funcall 'org-roam-db-sync)) - :bind (("C-c n" . thanos/notes-map) - :map thanos/notes-map - ("t" . org-roam-buffer-toggle) - ("f" . org-roam-node-find) - ("i" . org-roam-node-insert) - ("d" . org-roam-dailies-goto-today) - ("D" . org-roam-dailies-goto-date) - :map org-mode-map - ("C-c C-." . org-roam-tag-add) - ("C-c i" . org-id-get-create))) - -(use-package org-roam-ui - :defer t) - -(use-package modus-themes - :straight t - :config - (setf modus-themes-italic-constructs nil - modus-themes-bold-constructs nil - modus-themes-mixed-fonts nil - modus-themes-variable-pitch-ui nil - modus-themes-custom-auto-reload t - modus-themes-disable-other-themes t - modus-themes-prompts '(italic) - modus-themes-completions '((matches . (extrabold)) - (selection . (semibold italic text-also underline))) - modus-themes-org-blocks 'tinted-background) - ;; Palette overrides - (setf modus-themes-common-palette-overrides - '(;; (fg-line-number-inactive "gray40") - (fg-line-number-active cyan-intense) - ;; (bg-main "#1d2021") ;;grubox-hard - ;; (bg-main "#191919") ;; 1337 - ;; (bg-main "#1d1f21") ;; tomorrow night - (bg-main "#151515") ;; jazz - ;; (bg-main "#0C0C0C") ;; random black - ;; (bg-main "#171717") ;; badger - ;; (overline-heading-1 gold) - (fg-heading-1 red-warmer) - ;; (bg-heading-1 bg-blue-nuanced) - (bg-line-number-inactive unspecified) - (bg-line-number-active unspecified) - (bg-paren-match bg-magenta-intense) - (underline-paren-match fg-main) - (underline-err red-intense) - (underline-warning yellow-faint) - (underline-note cyan-faint) - (string "#86B187") - (border-mode-line-active unspecified) - (border-mode-line-inactive unspecified) - (bg-mode-line-active "#433F4f") ;; subtle lavender - (bg-mode-line-inactive "#1D1D1D") - ;; set fg from badger theme - (fg-mode-line-active "#F6F3E8") - (bg-hl-line bg-dim) - (cursor slate) - (prose-todo green-intense) - (prose-done bg-term-white) - (fg-prompt yellow-faint) - ,@modus-themes-preset-overrides-intense)) - ;; Headings - (setf modus-themes-headings - '((1 . (ultrabold 1.35)) - (2 . (semibold 1.2)) - (agenda-date . (1.3)) - (agenda-structure . (variable-pitch light 1.8)) - (t . (1.15)))) - ;; Load modus - (load-theme 'modus-vivendi t)) - -(use-package vertico - :ensure t - :config - (vertico-mode)) - -(use-package marginalia - :ensure t - :config - (marginalia-mode)) - -(use-package consult - :ensure t - :init (define-prefix-command 'thanos/search) - :bind (("C-x r d" . 'bookmark-delete) - ("C-x r C-r" . 'bookmark-rename) - ("C-x r C-j" . 'consult-register) - ("C-x r SPC" . 'consult-register-store) - ("C-x r b" . 'consult-bookmark) - ("C-c m" . 'consult-imenu) - ("C-x b" . 'consult-buffer) - ("M-y" . 'consult-yank-from-kill-ring) - ("C-s" . 'thanos/search) - :map thanos/search - ("f" . 'isearch-forward) - ("r" . 'isearch-backward) - ("s" . 'consult-line) - ("i" . 'change-inner) - ("C-f" . 'consult-find) - ("C-g" . 'consult-grep) - ("C-i" . 'consult-info) - ("C-l" . 'consult-locate) - :map project-prefix-map - ("b" . 'consult-project-buffer))) - -(use-package which-key - :ensure t - :config - (which-key-mode 1)) - -(defun elfeed-mpv (&optional use-generic-p) - "Play video link with mpv." - (interactive "P") - (let ((entries (elfeed-search-selected))) - (cl-loop for entry in entries - do (elfeed-untag entry 'unread) - when (elfeed-entry-link entry) - do (start-process-shell-command "elfeed-video" nil (format "mpv \"%s\"" it))) - (mapc #'elfeed-search-update-entry entries) - (unless (use-region-p) (forward-line)))) - -(use-package elfeed - :defer t - :config - (setf elfeed-search-filter "@1-week-ago +unread -hackernoon" - browse-url-browser-function #'browse-url-default-browser) - ;; Feeds - (setf elfeed-feeds - '(("https://hackaday.com/blog/feed/" - hackaday linux) - ("https://thanosapollo.com/posts/index.xml" - thanos) - ("http://wikileaks.org/feed" - wikileaks) - ("https://hackernoon.com/feed" - hackernoon) - ("https://torrentfreak.com/feed" - torrentfreak piracy) - ("https://www.science.org/action/showFeed?type=etoc&feed=rss&jc=sciimmunol" - science) - ("https://rss-bridge.thanosapollo.org/?action=display&bridge=CssSelectorBridge&home_page=https%3A%2F%2Fwww.medscape.com%2Findex%2Flist_13470_0&url_selector=a.title&url_pattern=viewarticle%2F.*&content_selector=div.article__main-content&content_cleanup=&title_cleanup=+-+Index&limit=&format=Atom" medscape med) - ("http://rss-bridge.thanosapollo.org/?action=display&bridge=CssSelectorBridge&home_page=https%3A%2F%2Fmedfac.mu-sofia.com%2Fen%2Fnews%2F&url_selector=div.news-card&url_pattern=%2F*&content_selector=article.richtext-area&content_cleanup=&title_cleanup=&limit=&format=Atom" musofia med) - ("http://rss-bridge.thanosapollo.org/?action=display&bridge=CssSelectorBridge&home_page=https%3A%2F%2Fedition.cnn.com%2Fworld%2Feurope&url_selector=a.container__link--type-article&url_pattern=&content_selector=div.article__content&content_cleanup=&&title_cleanup=-+breaking+news%2C+video%2C+headlines+and+opinion&limit=&format=Atom" news cnn europe) - ("http://rss-bridge.thanosapollo.org/?action=display&bridge=CssSelectorBridge&home_page=https%3A%2F%2Fedition.cnn.com%2Fworld%2Famericas&url_selector=a.container__link--type-article&url_pattern=&content_selector=div.article__content&content_cleanup=div.data-uri&title_cleanup=-+breaking+news%2C+video%2C+headlines+and+opinion&limit=&format=Atom" news cnn americas) - ("https://annas-blog.org/rss.xml" - anna piracy) - ("https://rss-bridge.thanosapollo.org/?action=display&bridge=CssSelectorBridge&home_page=https%3A%2F%2Fwww.theguardian.com%2Feurope&url_selector=a.dcr-lv2v9o&url_pattern=&content_selector=div.article-body-commercial-selector&content_cleanup=figure.dcr-173mewl%2C+div.dcr-ut4tvs&title_cleanup=News%2C+sport+and+opinion+from+the+Guardian%27s+Europe+edition+%7C&limit=&format=Atom" news guardian europe) - ("https://planet.emacslife.com/atom.xml" emacs emacslife) - ("https://localmonero.co/static/rss/the-monero-standard/feed.xml" monero) - ("https://devonzuegel.com/feed" devon) - ("https://www.addtoany.com/add_to/feed?linkurl=http%3A%2F%2Fwww.thelancet.com%2Frssfeed%2Flancet_online.xml&type=feed&linkname=The%20Lancet%20Online%20First&linknote=" lancet med) - ("http://tools.cdc.gov/podcasts/feed.asp?feedid=183" cdc med) - ("http://planet.lisp.org/rss20.xml" lisp planetlisp))) - :bind (("C-x f" . elfeed) - :map elfeed-search-mode-map - ("v" . 'elfeed-mpv) - ("U" . 'elfeed-update)) - :hook ((elfeed-search-mode . (lambda () (display-line-numbers-mode 0))))) - -;; Python -(use-package python-mode - :defer t - :config - (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))) - -(use-package pyenv - :defer t) - -(use-package elpy - :ensure t - :init - (elpy-enable)) - -;; Clojure -(use-package cider - :defer t) - -(use-package clojure-mode - :defer t) - -(use-package rainbow-delimiters - :defer t - :hook ((emacs-lisp-mode . rainbow-delimiters-mode) - (lisp-mode . rainbow-delimiters-mode) - (clojure-mode . rainbow-delimiters-mode) - (scheme-mode . rainbow-delimiters-mode))) - -;; (use-package paredit -;; :ensure t -;; :hook ((emacs-lisp-mode . paredit-mode) -;; (lisp-mode . paredit-mode) -;; (clojure-mode . paredit-mode) -;; (scheme-mode . paredit-mode))) - -(use-package sly - :init (setf inferior-lisp-program "sbcl") - :defer t) - -(use-package helpful - :defer t - :bind (("C-h f" . 'helpful-callable) - ("C-h v" . 'helpful-variable) - ("C-h k" . 'helpful-key) - ("C-h x" . 'helpful-command) - ("C-h ." . 'helpful-at-point) - ("C-h F" . 'helpful-function) - ("C-h C-k" . 'helpful-kill-buffers) - ("C-h a" . 'apropos) - ("C-h C-m" . 'info-apropos))) - -(use-package password-store - :defer t) - -(use-package ox-hugo - :ensure t - :config - (setf org-hugo-section "post")) - -(use-package json-mode - :defer t - :config - (add-to-list 'auto-mode-alist '("\\.json'" . json-mode))) - -(defun project-magit () - "Run magit-status in the current project's root." - (interactive) - (magit-status-setup-buffer (project-root (project-current t)))) - -(use-package magit - :defer t - :config - (setf magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1) - :bind (:map project-prefix-map ("g" . 'project-magit))) - -(use-package corfu - :ensure t - :config - (global-corfu-mode) - (corfu-popupinfo-mode) - (setf corfu-auto t - corfu-auto-delay 0.1 - corfu-auto-prefix 2 - corfu-cycle t - corfu-popupinfo-delay 0.3 - corfu-quit-at-boundary 'separator - corfu-quit-no-match t - corfu-preselect 'first - corfu-preview-current t - corfu-echo-mode t) - (setf indent-tabs-mode nil)) - -(defun insert-brackets (&optional arg) - "Insert ARG brackets." - (interactive "P") - (insert-pair arg ?\[ ?\])) - -(global-set-key (kbd "C-x M-[") 'insert-brackets) - - -(use-package orderless - :init (add-to-list 'completion-styles 'initials t) - :ensure t - :config - (setf completion-category-overrides '((file (style basic partial-completion))) - completion-styles '(orderless) - completion-cycle-threshold 2)) - -(use-package pdf-tools - :ensure t - :config - (pdf-tools-install) - (add-to-list 'auto-mode-alist '("\\.pdf\\'" . 'pdf-view-mode)) - :hook - ((pdf-view-mode . (lambda () (display-line-numbers-mode 0))))) - -(use-package markdown-mode - :defer t - :config - (setq markdown-header-scaling t - markdown-command "multimarkdown") - (add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode)) - :hook ((markdown-mode . flyspell-mode))) - -(use-package org-auto-tangle - :defer t) - -(use-package org-present - :defer t) - -(use-package expand-region - :defer t) - -(use-package change-inner - :after expand-region - :bind ((:map thanos/search ("i" . 'change-inner)))) - -(use-package nov - :defer t - :config - (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))) - -(use-package eshell-syntax-highlighting - :defer t) - -(use-package emojify - :ensure t - :hook (erc-mode . emojify-mode) - :commands emojify-mode) - -(use-package flycheck-package - :ensure t - :after flycheck) - -(use-package flycheck - :ensure t - :config - (setf flycheck-emacs-lisp-load-path 'inherit) - (global-flycheck-mode) - :hook ((emacs-lisp-mode . (lambda () (flycheck-mode) (flycheck-package-setup))))) - -;; Shells -;; (use-package vterm -;; :defer t -;; :bind (("C-c v" . vterm) -;; :map vterm-mode-map -;; ("M-&" . 'async-shell-command) -;; ("C-c C-y" . 'vterm-copy-mode)) -;; :hook ((vterm-mode . (lambda () (display-line-numbers-mode -1))))) - -(use-package shell - :defer t - :bind (("C-c v" . shell)) - :hook ((shell-mode . (lambda () (display-line-numbers-mode -1))))) - -(defvar thanos/aliases - '((g . magit) - (gl . magit-log) - (gc . magit-clone) - (d . dired) - (o . find-file) - (oo . find-file-other-window) - (ll . (lambda () (eshell/ls '-lha))) - (eshell/clear . eshell/clear-scrollback))) - -(defun thanos/set-eshell-aliases (aliases) - "Set ALIASES as eshell aliases." - (mapc (lambda (alias) - (defalias (car alias) (cdr alias))) - aliases)) - -(use-package eshell - :config - (setf eshell-highlight-prompt t) - (eshell-syntax-highlighting-global-mode 1) - :bind (("C-c e" . eshell)) - :hook ((eshell-mode . (lambda () - (thanos/set-eshell-aliases thanos/aliases) - (display-line-numbers-mode -1))))) - -(use-package eat - :after 'eshell - :config - (add-hook 'eshell-load-hook #'eat-eshell-mode) - (setf eat-term-name "xterm-256color")) - -(use-package eshell-git-prompt - :straight '(eshell-git-prompt :type git - :host nil - :repo "https://git.thanosapollo.org/eshell-git-prompt") - :config - (eshell-git-prompt-use-theme 'multiline)) - -;; Chat -(use-package telega - :defer t - :hook ((telega-root-mode . (lambda () - (emojify-mode) - (display-line-numbers-mode -1))) - (telega-chat-mode . (lambda () - (emojify-mode) - (display-line-numbers-mode -1)))) - :config - (setf telega-completing-read-function #'completing-read) - :bind (("C-x T" . 'telega))) - -(use-package erc - :defer t - :config - (unless (expand-file-name "erc" user-emacs-directory) - (make-directory (expand-file-name "erc" user-emacs-directory))) - (setf erc-modules - '(sasl netsplit fill button match track completion readonly - networks ring autojoin noncommands irccontrols move-to-prompt stamp - menu list log notifications) - erc-log-channels-directory (expand-file-name "erc" user-emacs-directory)) - :bind (("C-c E" . 'erc-libera) - :map erc-mode-map - ("C-c RET" . 'erc-cmd-QUERY))) - -(use-package erc-image - :ensure t - :after erc - :config - (setq erc-image-inline-rescale 300) - (add-to-list 'erc-modules 'image)) - -(use-package transmission - :defer t) - -(use-package sudo-edit - :defer t - :config - (setf sudo-edit-local-method "doas")) - -(use-package dabbrev - :defer t - :config - (setf dabbrev-ignored-buffer-regexps '("\\.\\(?:pdf\\|jpe?g\\|png\\)\\'"))) - -(use-package xref - :defer t - :config - (setf xref-show-xrefs-function #'consult-xref - xref-show-definitions-function #'consult-xref)) - -(use-package moc-player - :defer t - :straight '(moc-player :local-repo "~/Dev/emacs-lisp/moc-player") - :init (define-prefix-command 'thanos/mocp) - :bind (("C-z" . thanos/mocp) - :map thanos/mocp - ("SPC" . 'mocp-toggle-pause) - ("n" . 'mocp-next) - ("p" . 'mocp-previous))) - -;; My packages -(when (or is-zeus is-hermes) - (use-package yeetube - :init (define-prefix-command 'thanos/yeetube-map) - :straight (yeetube :local-repo "~/Dev/emacs-lisp/yeetube") - :ensure t - :config - (setf yeetube-results-limit 20 - yeetube-mpv-disable-video t - yeetube-display-thumbnails t - yeetube-play-function #'yeetube-mpv-play) - :bind (("C-c y" . 'thanos/yeetube-map) - :map thanos/yeetube-map - ("s" . 'yeetube-search) - ("b" . 'yeetube-play-saved-video) - ("d" . 'yeetube-download-videos) - ("C-d" . 'yeetube-download-vimeo-videos) - ("p" . 'yeetube-mpv-toggle-pause) - ("v" . 'yeetube-mpv-toggle-video) - ("V" . 'yeetube-mpv-toggle-no-video-flag) - ("C-p" . 'yeetube-mpv-toggle-video) - ("k" . 'yeetube-remove-saved-video))) - - (use-package gnosis - :straight (gnosis :local-repo "~/Dev/emacs-lisp/gnosis") - :ensure t - :init (define-prefix-command 'thanos/gnosis-map) - :config - (setf gnosis-vc-auto-push (when (or is-hermes - is-zeus) - t) - gnosis-mcq-display-choices nil - gnosis-image-width (if is-zeus 300 150) - gnosis-image-height (if is-zeus 300 150)) - (gnosis-modeline-mode) - :bind (("C-r" . thanos/gnosis-map) - :map thanos/gnosis-map - ("r" . 'gnosis-review) - ("a" . 'gnosis-add-note) - ("C-d" . 'gnosis-dashboard) - ("d" . 'gnosis-add-deck) - ("t" . 'gnosis-test-start))) - - ;; Run vc-pull on startup - (gnosis-vc-pull) - - (use-package pcmpl-emerge - :defer t - :straight (pcmpl-emerge :local-repo "~/Dev/emacs-lisp/pcmpl-emerge")) - - (use-package pcmpl-rc - :straight (pcmpl-rc :local-repo "~/Dev/emacs-lisp/pcmpl-rc") - :defer t) - - (use-package pcmpl-tailscale - :straight (pcmpl-tailscale :local-repo "~/Dev/emacs-lisp/pcmpl-taiscale") - :defer t)) - -;; Emacs dev - -(use-package package-lint - :defer t) - -;; AI tools -(use-package gptel - :defer t - :config - (setf gptel-api-key (password-store-get-field "openai/[email protected]" "api") - gptel-default-mode 'org-mode) - (setq-default gptel-model "zephyr:latest" - gptel-backend (gptel-make-ollama "Ollama" - :host "zeus:11434" - :stream t - :models '("llama2:latest" "zephyr:latest" "codellama:latest" - "mistral:latest" "mixtral:latest" "neural-chat:latest" - "dolphin-mixtral:latest")) - gptel-directives '((default . "You are a large language model living in Emacs and a helpful assistant. Respond concisely.") - (programming . "You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note.") - (epictetus . "You are Epictetus, the stoic philosopher from Nicopolis. Respond concisely as Epictetus.") - (med . "You are a medical professor within the Emacs. Respond concisely.") - (code-review . "You are an expert programmer within Emacs reviewing code. Respond concisely") - (writer . "You are an expert writer and FOSS enthusiast. Improve only the article sections provided as a hacker, do not add extra paragraphs."))) - :bind (("C-c g" . 'gptel-send) - :map gptel-mode-map - ("C-c h" . 'gptel-menu))) - -(use-package copilot - :straight (copilot :host github :repo "zerolfx/copilot.el" :files ("dist" "*.el")) - :bind (:map copilot-mode-map - ("M-TAB" . 'copilot-accept-completion-by-line) - ("C-M-<tab>" . 'copilot-accept-completion-by-word) - ("C-M-n" . 'copilot-next-completion) - ("C-M-p" . 'copilot-previous-completion))) - - -;; Password-store -(require 'password-store) -(defun thanos/pass-launcher () - "Launch Emacs as a front-end for pass." - (interactive) - (unwind-protect - (with-selected-frame - (make-frame '((name . "thanos/pass-launcher") - (fullscreen . 0) - (undecorated . t) - (minibuffer . only) - (width . 70) - (height . 15))) - (let* ((choice (completing-read "Choose an action: " - '("AUTO" "COPY PASS" "COPY USERNAME" "EDIT" "GENERATE"))) - (action (pcase choice - ("AUTO" #'(lambda (entry) (let ((user (password-store-get-field entry "user")) - (pass (password-store-get entry))) - (start-process-shell-command - "xdotool" nil - (format "sleep 0.3 && xdotool getactivewindow type %s && xdotool key Tab && xdotool getactivewindow type %s" - (shell-quote-argument (if user user "thanosapollo")) - (shell-quote-argument pass)))))) - ("COPY PASS" #'password-store-copy) - ("COPY USERNAME" #'(lambda (entry) (password-store-copy-field entry "user"))) - ("EDIT" #'password-store-edit) - ("GENERATE" #'password-store-generate)))) - (funcall action (completing-read "Search: " (password-store-list))) - (delete-frame))))) - -(defun smtp-get-pass () - "Get password for smtp." - (interactive) - (password-store-copy-field "fastmail.com/[email protected]" "smtp")) - - -(use-package password-store - :init (define-prefix-command 'thanos/pass) - :defer t - :config - (setf password-store-password-length (+ 20 (random 20))) - :bind (("C-c p" . 'thanos/pass) - :map thanos/pass - ("i" . 'password-store-insert) - ("e" . 'password-store-edit) - ("g" . 'password-store-generate) - ("c" . 'password-store-copy) - ("s" . 'smtp-get-pass))) - -(use-package package-lint - :defer t) - -(use-package consult-mu - :straight (consult-mu :type git :host github :repo "armindarvish/consult-mu" :files (:defaults "extras/*.el")) - :after (mu4e consult) - :bind (:map mu4e-main-mode-map - ("M-s" . 'consult-mu) - :map mu4e-view-mode-map - ("M-s" . 'consult-mu) - :map mu4e-headers-mode-map - ("M-s" . 'consult-mu))) - -(require 'thanos-commands) ;; Misc commands -(when (or is-zeus is-hermes) - (require 'thanos-mu4e)) - -;;; init.el ends here |