summaryrefslogtreecommitdiffstats
path: root/emacs/eshell-init.el
blob: 1dd87737535ba7619837e5b484ca85acc48a15c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;; 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)
     " "
     (propertize (when (not (string= branch ""))
                   ;; 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)