;;; bandali-eshell.el --- bandali's Eshell setup -*- lexical-binding: t; -*- ;; Copyright (C) 2018-2020 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 awesome Eshell setup. ;;; Code: (with-eval-after-load 'eshell (make-directory (b/etc "eshell/") t) (csetq eshell-aliases-file (b/etc "eshell/aliases") eshell-directory-name (b/var "eshell/") eshell-hist-ignoredups t eshell-input-filter #'eshell-input-filter-initial-space eshell-prompt-regexp "\\(.*\n\\)*[$#] " eshell-prompt-function (lambda () (concat (propertize (format "%s@%s:" (user-login-name) (system-name)) 'face 'default) (propertize (abbreviate-file-name default-directory) 'face 'font-lock-comment-face) (propertize "\n" 'face 'default) (if (= (user-uid) 0) (propertize "#" 'face 'red) (propertize "$" 'face 'default)) (propertize " " 'face 'default)))) (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)) (defun b/eshell-history () (interactive) (completing-read "Eshell history: " (ring-elements eshell-history-ring))) (defun b/eshell-setup () (make-local-variable 'company-idle-delay) (defvar company-idle-delay) (eval-when-compile (defvar eshell-mode-map) (defvar eshell-hist-mode-map)) (setq company-idle-delay nil) ;; local key bindings (define-key eshell-mode-map (kbd "C-d") #'b/eshell-quit-or-delete-char) (define-key eshell-mode-map (kbd "C-S-l") #'b/eshell-clear) (define-key eshell-hist-mode-map (kbd "M-r") #'b/eshell-history))) ;; global key bindings (global-set-key (kbd "C-c a s e") #'eshell) ;; hooks (add-hook 'eshell-mode-hook #'b/eshell-setup) (provide 'bandali-eshell) ;;; bandali-eshell.el ends here