(require 'eshell) (require 'shell-switcher) (setq shell-switcher-mode t) (add-hook 'eshell-mode-hook 'shell-switcher-manually-register-shell) (add-hook 'shell-mode-hook 'shell-switcher-manually-register-shell) (setq shell-switcher-new-shell-function 'shell-switcher-make-shell) (setq eshell-history-size 10000) ;; author: KaiGrossjohann on EmacsWiki (defun eshell/ff (&rest args) "Invoke `find-file' on the file. \"ff +42 foo\" also goes to line 42 in the buffer." (while args (if (string-match "\\`\\+\\([0-9]+\\)\\'" (car args)) (let* ((line (string-to-number (match-string 1 (pop args)))) (file (pop args))) (find-file file) (goto-line line)) (find-file (pop args))))) ;; convenience functions to input the remote root/home dir when in a ;; directory on a remote host (defun my/tramp-root () "Print root directory on the remote host." (interactive) (let ((pieces (split-string (eshell/pwd) ":/"))) (insert-string (if (> (length pieces) 1) (concat (car pieces) ":/") "/")))) (defun my/tramp-home () "Print home directory path on the remote host." (interactive) (let ((pieces (split-string (eshell/pwd) ":/"))) (insert-string (if (> (length pieces) 1) (concat (car pieces) ":~/") "~/")))) (add-hook 'eshell-mode-hook '(lambda () (define-key eshell-mode-map (kbd "C-c /") 'my/tramp-root) (define-key eshell-mode-map (kbd "C-c ~") 'my/tramp-home))) ;; use cat as the pager in shell mode, because shell-mode is not an ANSI terminal (setenv "PAGER" "cat") ;; C-d on an empty line in the shell terminates the process. (defun my/comint-delchar-or-eof-or-kill-buffer (arg) (interactive "p") (if (null (get-buffer-process (current-buffer))) (kill-buffer) (comint-delchar-or-maybe-eof arg))) (add-hook 'shell-mode-hook (lambda () (define-key shell-mode-map (kbd "C-d") 'my/comint-delchar-or-eof-or-kill-buffer) (define-key shell-mode-map (kbd "") 'comint-previous-matching-input-from-input))) ;; TODO: this isn't working (add-hook 'term-mode-hook (lambda () (define-key term-mode-map (kbd "C-d") 'my/comint-delchar-or-eof-or-kill-buffer)))