Function: eshell/cd
eshell/cd is a byte-compiled function defined in em-dirs.el.gz.
Signature
(eshell/cd &rest ARGS)
Documentation
Alias to extend the behavior of cd.
Source Code
;; Defined in /usr/src/emacs/lisp/eshell/em-dirs.el.gz
(defun eshell/cd (&rest args) ; all but first ignored
"Alias to extend the behavior of `cd'."
(setq args (flatten-tree args))
(let ((path (car args))
(subpath (car (cdr args)))
(case-fold-search (eshell-under-windows-p))
handled)
(if (numberp path)
(setq path (number-to-string path)))
(if (numberp subpath)
(setq subpath (number-to-string subpath)))
(cond
(subpath
(let ((curdir (eshell/pwd)))
(if (string-match path curdir)
(setq path (replace-match subpath nil nil curdir))
(error "Path substring `%s' not found" path))))
((and path (string-match "^-\\([0-9]*\\)$" path))
(let ((index (match-string 1 path)))
(setq path
(ring-remove eshell-last-dir-ring
(if index
(string-to-number index)
0)))))
((and path (string-match "^=\\(.*\\)$" path))
(let ((oldpath (eshell-find-previous-directory
(match-string 1 path))))
(if oldpath
(setq path oldpath)
(let ((len (ring-length eshell-last-dir-ring))
(index 0))
(if (= len 0)
(error "Directory ring empty"))
(eshell-with-buffered-print
(while (< index len)
(eshell-buffered-print
(concat (number-to-string index) ": "
(ring-ref eshell-last-dir-ring index) "\n"))
(setq index (1+ index))))
(setq handled t)))))
(path
(setq path (eshell-expand-multiple-dots path))))
(unless handled
(let ((curdir (eshell/pwd))
(newdir (or path "~")))
(unless (equal curdir newdir)
(eshell-add-to-dir-ring curdir))
(let ((result (cd newdir)))
;; If we're in "/" and cd to ".." or the like, make things
;; less confusing by changing "/.." to "/".
(when (equal (file-truename result) "/")
(setq result (cd "/")))
(and eshell-cd-shows-directory
(eshell-printn result)))
(run-hooks 'eshell-directory-change-hook)
(when eshell-list-files-after-cd
;; Call "ls", but don't update the last-command information.
(let ((eshell-last-command-name)
(eshell-last-command-status)
(eshell-last-arguments))
(eshell-plain-command "ls" (cdr args))))
nil))))