;; Eshell settings (eval-when-compile '(load "init.el")) (eval-after-load "em-term" '(add-to-list 'eshell-visual-commands "unison")) (defun oni:eshell-mode-func () "Function for `eshell-mode-hook'." (setq truncate-lines nil)) (defun oni:eshell-prompt-function () (let ((status (if (zerop eshell-last-command-status) ?+ ?-)) (hostname (shell-command-to-string "hostname")) (dir (abbreviate-file-name (eshell/pwd))) (branch (shell-command-to-string "git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'")) (userstatus (if (zerop (user-uid)) ?# ?$))) (concat (propertize (char-to-string status) 'face `(:foreground ,(if (= status ?+) (oni:color chameleon-1) (oni:color scarlet-red-2)))) " " (propertize (substring hostname 0 -1) 'face 'mode-line-buffer-id) " " (propertize (oni:shorten-dir dir) 'face 'font-lock-string-face) " " (when (not (string= branch "")) (propertize ;; Cut off "* " and "\n" (substring branch 2 -1) 'face 'font-lock-function-name-face)) " \n" (propertize (char-to-string userstatus) 'face `(:foreground ,(oni:color sky-blue-1))) "> "))) ;;;###autoload (defun oni:raise-eshell () "Start or switch back to `eshell'. Also change directories to current working directory." (interactive) (let ((dir (file-name-directory (or (buffer-file-name) "~/"))) (hasfile (not (eq (buffer-file-name) nil)))) (eshell) (if (and hasfile (eq eshell-process-list nil)) (progn (eshell/cd dir) (eshell-reset))))) (defun oni:shorten-dir (dir) "Shorten a directory, (almost) like fish does it." (while (string-match "\\(/\\.?[^./]\\)[^/]+/" dir) (setq dir (replace-match "\\1/" nil nil dir))) dir) (setq eshell-prompt-regexp "^[#$]> ") (setq eshell-highlight-prompt nil) (setq eshell-prompt-function 'oni:eshell-prompt-function) (add-hook 'eshell-mode-hook 'oni:eshell-mode-func)