;;; thanos-shell.el --- shells configuration -*- lexical-binding: t; -*- ;; Copyright (C) 2023 Thanos Apollo ;; Author: Thanos Apollo ;; Keywords: ;; 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 . ;;; Commentary: ;; ╭━━━━┳╮╱╱╱╱╱╱╱╱╱╱╱╱╱╱╭━━━╮╱╱╱╱╱╭╮╭╮╱╱╱╱╱╱╱╱╭━━━╮ ;; ┃╭╮╭╮┃┃╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃╭━╮┃╱╱╱╱╱┃┃┃┃╱╱╱╱╱╱╱╱┃╭━━╯ ;; ╰╯┃┃╰┫╰━┳━━┳━╮╭━━┳━━╮┃┃╱┃┣━━┳━━┫┃┃┃╭━━╮╱╱╱╱┃╰━━┳╮╭┳━━┳━━┳━━╮ ;; ╱╱┃┃╱┃╭╮┃╭╮┃╭╮┫╭╮┃━━┫┃╰━╯┃╭╮┃╭╮┃┃┃┃┃╭╮┃╭━━╮┃╭━━┫╰╯┃╭╮┃╭━┫━━┫ ;; ╱╱┃┃╱┃┃┃┃╭╮┃┃┃┃╰╯┣━━┃┃╭━╮┃╰╯┃╰╯┃╰┫╰┫╰╯┃╰━━╯┃╰━━┫┃┃┃╭╮┃╰━╋━━┃ ;; ╱╱╰╯╱╰╯╰┻╯╰┻╯╰┻━━┻━━╯╰╯╱╰┫╭━┻━━┻━┻━┻━━╯╱╱╱╱╰━━━┻┻┻┻╯╰┻━━┻━━╯ ;; ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃┃ ;; ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╰╯ ;;; Code: (setenv "EDITOR" "emacsclient -n") (setenv "SBCL_HOME" "~/Developer/common-lisp/sbcl") (setenv "XDG_SESSION_TYPE" "x11") ;; yay completions (require 'pcomplete-yay) ;; configuration with eat (require 'eshell) (setf eshell-visual-commands '()) (use-package eat :straight t :hook (eshell-mode . eat-eshell-mode) (eshell-mode . eat-eshell-visual-command-mode)) ;;;; sudo completion (defun pcomplete/sudo () "Completion rules for the `sudo' command." (let ((pcomplete-ignore-case t)) (pcomplete-here (funcall pcomplete-command-completion-function)) (while (pcomplete-here (pcomplete-entries))))) ;;;; systemctl completion (defcustom pcomplete-systemctl-commands '("disable" "enable" "status" "start" "restart" "stop" "reenable" "list-units" "list-unit-files") "p-completion candidates for `systemctl' main commands" :type '(repeat (string :tag "systemctl command")) :group 'pcomplete) (defvar pcomplete-systemd-units (split-string (shell-command-to-string "(systemctl list-units --all --full --no-legend;systemctl list-unit-files --full --no-legend)|while read -r a b; do echo \" $a\";done;")) "p-completion candidates for all `systemd' units") (defvar pcomplete-systemd-user-units (split-string (shell-command-to-string "(systemctl list-units --user --all --full --no-legend;systemctl list-unit-files --user --full --no-legend)|while read -r a b;do echo \" $a\";done;")) "p-completion candidates for all `systemd' user units") (defun pcomplete/systemctl () "Completion rules for the `systemctl' command." (pcomplete-here (append pcomplete-systemctl-commands '("--user"))) (cond ((pcomplete-test "--user") (pcomplete-here pcomplete-systemctl-commands) (pcomplete-here pcomplete-systemd-user-units)) (t (pcomplete-here pcomplete-systemd-units)))) ;;;; man completion (defvar pcomplete-man-user-commands (split-string (shell-command-to-string "apropos -s 1 .|while read -r a b; do echo \" $a\";done;")) "p-completion candidates for `man' command") (defun pcomplete/man () "Completion rules for the `man' command." (pcomplete-here pcomplete-man-user-commands)) ;; hut completion (defcustom pcomplete-hut-commands '("builds" "export" "git" "graphql" "lists" "help" "hg" "init" "meta" "pages" "paste" "todo") "p-completion candidates for `hut' main commands" :type '(repeat (string :tag "hut command")) :group 'pcomplete) (defun pcomplete/hut () "Completion rules for `hut' command" (pcomplete-here (append pcomplete-hut-commands))) ;; Setting eshell aliases (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)) (add-hook 'eshell-mode-hook #'(lambda () (thanos/set-eshell-aliases thanos/aliases))) ;; PATH (defvar eshell-path-env (getenv "~/.local/bin")) (require 'eshell-git-prompt) ;; customize multiline theme (defun eshell-git-prompt-multiline () "Eshell Git prompt inspired by spaceship-prompt." (let (separator hr dir git git-dirty time sign command) (setq separator (with-face " | " 'eshell-git-prompt-multiline-secondary-face)) (setq hr (with-face (concat "\n" (make-string (/ (window-total-width) 2) ?─) "\n") 'eshell-git-prompt-multiline-secondary-face)) (setq dir (concat (concat (abbreviate-file-name (eshell/pwd))))) (setq git (concat (with-face "⎇" 'eshell-git-prompt-exit-success-face) (concat (eshell-git-prompt--branch-name)))) (setq git-dirty (when (eshell-git-prompt--branch-name) (if (eshell-git-prompt--collect-status) (with-face " ✎" 'eshell-git-prompt-modified-face) (with-face " ✔" 'eshell-git-prompt-exit-success-face)))) (setq time (with-face (format-time-string "%I:%M:%S %p") 'eshell-git-prompt-multiline-secondary-face)) (setq sign (if (= (user-uid) 0) (with-face "\n#" 'eshell-git-prompt-multiline-sign-face) (with-face "\nλ" 'eshell-git-prompt-multiline-sign-face))) (setq command (with-face " " 'eshell-git-prompt-multiline-command-face)) (eshell-git-prompt---str-read-only (concat hr dir separator git git-dirty separator time sign command)))) (eshell-git-prompt-use-theme 'multiline) (eshell-syntax-highlighting-global-mode 1) (setq eshell-highlight-prompt t) ;; Keybindings (define-key global-map (kbd "C-c e") 'eshell) (define-key global-map (kbd "C-c v") 'vterm) (provide 'thanos-shells) ;;; thanos-eshell.el ends here