Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Customizing your emacs shell.
(require 'dash)
(require 's)
(defmacro with-face (STR &rest PROPS)
"Return STR propertized with PROPS."
`(propertize ,STR 'face (list ,@PROPS)))
(defmacro esh-section (NAME ICON FORM &rest PROPS)
"Build eshell section NAME with ICON prepended to evaled FORM with PROPS."
`(setq ,NAME
(lambda () (when ,FORM
(-> ,ICON
(concat esh-section-delim ,FORM)
(with-face ,@PROPS))))))
(defun esh-acc (acc x)
"Accumulator for evaluating and concatenating esh-sections."
(--if-let (funcall x)
(if (s-blank? acc)
it
(concat acc esh-sep it))
acc))
(defun esh-prompt-func ()
"Build `eshell-prompt-function'"
(concat esh-header
(-reduce-from 'esh-acc "" eshell-funcs)
"\n"
eshell-prompt-string))
(esh-section esh-dir
"\xf07c" ;  (faicon folder)
(abbreviate-file-name (eshell/pwd))
'(:foreground "gold" :bold ultra-bold :underline t))
(esh-section esh-git
"\xe907" ;  (git icon)
(magit-get-current-branch)
'(:foreground "pink"))
(esh-section esh-python
"\xe928" ;  (python icon)
pyvenv-virtual-env-name)
(esh-section esh-clock
"\xf017" ;  (clock icon)
(format-time-string "%H:%M" (current-time))
'(:foreground "forest green"))
;; Below I implement a "prompt number" section
(setq esh-prompt-num 0)
(add-hook 'eshell-exit-hook (lambda () (setq esh-prompt-num 0)))
(advice-add 'eshell-send-input :before
(lambda (&rest args) (setq esh-prompt-num (incf esh-prompt-num))))
(esh-section esh-num
"\xf0c9" ;  (list icon)
(number-to-string esh-prompt-num)
'(:foreground "brown"))
;; Separator between esh-sections
(setq esh-sep " ") ; or " | "
;; Separator between an esh-section icon and form
(setq esh-section-delim " ")
;; Eshell prompt header
(setq esh-header "\n ") ; or "\n┌─"
;; Eshell prompt regexp and string. Unless you are varying the prompt by eg.
;; your login, these can be the same.
(setq eshell-prompt-regexp " ") ; or "└─> "
(setq eshell-prompt-string " ") ; or "└─> "
;; Choose which eshell-funcs to enable
(setq eshell-funcs (list esh-dir esh-git esh-python esh-clock esh-num))
;; Enable the new eshell prompt
(setq eshell-prompt-function 'esh-prompt-func)
@mtellezj

This comment has been minimized.

Copy link

mtellezj commented Apr 16, 2020

Hi, I tried your prompt but has an odd problem. The icons are wrong (see first image). If I copy your code to an emacs buffer faicon folder, git icon, python icon get the wrong icon (on this page they are a little box but when I paste it a icon appear) see second image. I can insert an python icon with all-the-icons-insert python and it insert the snake icon, but if I quote the icon it change to the capital D (see images). Any help? Thanks in advance.

image

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.