;;; bandali-eshell.el --- bandali's Eshell setup -*- lexical-binding: t; -*- ;; Copyright (C) 2018-2025 Amin Bandali ;; Author: Amin Bandali ;; Keywords: processes ;; 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: ;; My humble Eshell setup. ;;; Code: (use-package eshell :defer t :bind ("C-c s e" . eshell) :custom (eshell-hist-ignoredups t) (eshell-input-filter #'eshell-input-filter-initial-space) (eshell-prompt-regexp "^[^#$\n]* [#$] ; ") (eshell-prompt-function (lambda () (let ((uid (if (functionp #'file-user-uid) #'file-user-uid ; (version<= "30" emacs-version) #'user-uid))) ; (version< emacs-version "30") (concat ": " (system-name) ":" (abbreviate-file-name (eshell/pwd)) (unless (eshell-exit-success-p) (format " [%d]" eshell-last-command-status)) (if (= (funcall uid) 0) " # " " $ ") "; "))))) (use-package esh-mode :after eshell :init (eval-when-compile (defvar eshell-prompt-regexp) (declare-function eshell-life-is-too-much "esh-mode") (declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))) (defun b/eshell-quit-or-delete-char (arg) (interactive "p") (if (and (eolp) (looking-back eshell-prompt-regexp nil)) (eshell-life-is-too-much) (delete-char arg))) (defun b/eshell-clear () (interactive) (let ((inhibit-read-only t)) (erase-buffer)) (eshell-send-input)) :bind (:map eshell-mode-map ("C-d" . b/eshell-quit-or-delete-char) ("C-S-l" . b/eshell-clear))) (use-package esh-hist :after eshell :init (defun b/eshell-history () (interactive) (completing-read "Eshell history: " (ring-elements eshell-history-ring))) :bind (:map eshell-hist-mode-map ("M-r" . b/eshell-history))) (provide 'bandali-eshell) ;;; bandali-eshell.el ends here