;;; 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: (with-eval-after-load 'eshell (setopt 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) " # " " $ ") "; ")))) ;; `esh-mode' (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)) (with-eval-after-load 'esh-mode (let ((m eshell-mode-map)) (b/keymap-set m "C-d" #'b/eshell-quit-or-delete-char) (b/keymap-set m "C-S-l" #'b/eshell-clear))) ;; `esh-hist' (defun b/eshell-history () (interactive) (completing-read "Eshell history: " (ring-elements eshell-history-ring))) (with-eval-after-load 'esh-hist (let ((m eshell-hist-mode-map)) (b/keymap-set m "M-r" #'b/eshell-history)))) (b/keymap-global-set "C-c s e" #'eshell) (provide 'bandali-eshell) ;;; bandali-eshell.el ends here