Created
June 24, 2017 04:39
-
-
Save ekaschalk/f0ac91c406ad99e53bb97752683811a5 to your computer and use it in GitHub Desktop.
Customizing your emacs shell.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@mtellezj I forked this Gist and updated it with some instructions. I solved your issue by using the
all-the-icons
package. See my comments at the top of the file. I wanted to source this customization in my profile so I am including the packages forcl
,magit
, andall-the-icons