+(setq sh-shell-file "/bin/sh")
+
+;; Awful hacking to override the shell detection for particular scripts.
+(defmacro define-custom-shell-mode (name shell)
+ `(defun ,name ()
+ (interactive)
+ (set (make-local-variable 'sh-shell-file) ,shell)
+ (sh-mode)))
+(define-custom-shell-mode bash-mode "/bin/bash")
+(define-custom-shell-mode rc-mode "/usr/bin/rc")
+(put 'sh-shell-file 'permanent-local t)
+
+;; Hack the rc syntax table. Backquotes aren't paired in rc.
+(eval-after-load "sh-script"
+ '(or (assq 'rc sh-mode-syntax-table-input)
+ (let ((frag '(nil
+ ?# "<"
+ ?\n ">#"
+ ?\" "\"\""
+ ?\' "\"\'"
+ ?$ "'"
+ ?\` "."
+ ?! "_"
+ ?% "_"
+ ?. "_"
+ ?^ "_"
+ ?~ "_"
+ ?, "_"
+ ?= "."
+ ?< "."
+ ?> "."))
+ (assoc (assq 'rc sh-mode-syntax-table-input)))
+ (if assoc
+ (rplacd assoc frag)
+ (setq sh-mode-syntax-table-input
+ (cons (cons 'rc frag)
+ sh-mode-syntax-table-input))))))
+
+;;;--------------------------------------------------------------------------
+;;; Emacs shell mode.
+
+(defun mdw-eshell-prompt ()
+ (let ((left "[") (right "]"))
+ (when (= (user-uid) 0)
+ (setq left "«" right "»"))
+ (concat left
+ (save-match-data
+ (replace-regexp-in-string "\\..*$" "" (system-name)))
+ " "
+ (let* ((pwd (eshell/pwd)) (npwd (length pwd))
+ (home (expand-file-name "~")) (nhome (length home)))
+ (if (and (>= npwd nhome)
+ (or (= nhome npwd)
+ (= (elt pwd nhome) ?/))
+ (string= (substring pwd 0 nhome) home))
+ (concat "~" (substring pwd (length home)))
+ pwd))
+ right)))
+(setq eshell-prompt-function 'mdw-eshell-prompt)
+(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
+
+(defun eshell/e (file) (find-file file) nil)
+(defun eshell/ee (file) (find-file-other-window file) nil)
+(defun eshell/w3m (url) (w3m-goto-url url) nil)
+
+(mdw-define-face eshell-prompt (t :weight bold))
+(mdw-define-face eshell-ls-archive (t :weight bold :foreground "red"))
+(mdw-define-face eshell-ls-backup (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-product (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-clutter (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-executable (t :weight bold))
+(mdw-define-face eshell-ls-directory (t :foreground "cyan" :weight bold))
+(mdw-define-face eshell-ls-readonly (t nil))
+(mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
+