#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle yes

* Shell

** Bash completion

#+begin_src elisp
  (use-package bash-completion
    :config
    (require 'bash-completion)
    (bash-completion-setup)
    )
#+end_src

#+begin_src elisp
(defvar shell-dynamic-complete-functions t)
#+end_src

** Eshell

Add programmable bash completion to Emacs shell-mode
#+begin_src elisp :tangle yes
  (require 'bash-completion)
  (add-hook 'eshell-mode-hook
          (lambda ()
            (add-hook 'completion-at-point-functions
                      'bash-completion-capf-nonexclusive nil t
                      )
            )
          )
#+end_src

Use colors in eshell
#+begin_src elisp :tangle yes
  (use-package xterm-color
    :commands (xterm-color-filter)
    )

  (use-package eshell
    :after xterm-color
    :config
    (define-key eshell-hist-mode-map (kbd "M-r") #'consult-history)
    (add-hook 'eshell-mode-hook
              (lambda ()
                (setenv "TERM" "xterm-256color")))
    (add-hook 'eshell-before-prompt-hook (setq xterm-color-preserve-properties t))
    (add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
    (setq eshell-output-filter-functions
          (remove 'eshell-handle-ansi-color eshell-output-filter-functions)
          )
    )
#+end_src

Eshell completion
#+begin_src elisp :tangle yes
  (add-hook 'eshell-mode-hook
          (lambda ()
            (add-hook 'completion-at-point-functions
                      'bash-completion-capf-nonexclusive nil t)))
#+end_src

Emulate A Terminal (EAT)
#+begin_src elisp :tangle yes
  (use-package eat
    :config
    ;; For `eat-eshell-mode'.
    (add-hook 'eshell-load-hook #'eat-eshell-mode)

    ;; For `eat-eshell-visual-command-mode'.
    (add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode)
    )
#+end_src