This is in preparation for general.el integration coming in 2.1.1. It is very likely that map! will change (and even more, be split into several macros). Not much, but change none-the-less. Specifically, the state keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state property that takes a list, e.g. (normal visual insert). In any case, both map! and general are also relatively expensive compared to define-key and evil-define-key* (and the new define-key! macro), so use that when we can. This also means changes to either API won't affect Doom's modules in the long term.
77 lines
3 KiB
EmacsLisp
77 lines
3 KiB
EmacsLisp
;;; emacs/eshell/config.el -*- lexical-binding: t; -*-
|
|
|
|
;; see:
|
|
;; + `+eshell/open': open in current buffer
|
|
;; + `+eshell/open-popup': open in a popup
|
|
;; + `+eshell/open-workspace': open in separate tab (requires :feature
|
|
;; workspaces)
|
|
|
|
(def-package! eshell ; built-in
|
|
:defer t
|
|
:init
|
|
(setq eshell-directory-name
|
|
(let ((dir (expand-file-name "eshell" doom-private-dir)))
|
|
(if (file-directory-p dir)
|
|
dir
|
|
"~/.eshell"))
|
|
eshell-scroll-to-bottom-on-input 'all
|
|
eshell-scroll-to-bottom-on-output 'all
|
|
eshell-buffer-shorthand t
|
|
eshell-kill-processes-on-exit t
|
|
eshell-error-if-no-glob t
|
|
eshell-hist-ignoredups t
|
|
;; em-prompt
|
|
eshell-prompt-regexp "^.* λ "
|
|
eshell-prompt-function #'+eshell-prompt
|
|
;; em-glob
|
|
eshell-glob-case-insensitive t
|
|
eshell-error-if-no-glob t)
|
|
|
|
:config
|
|
;; Consider eshell buffers real
|
|
(defun +eshell-p (buf)
|
|
(eq (buffer-local-value 'major-mode buf) 'eshell-mode))
|
|
(add-to-list 'doom-real-buffer-functions #'+eshell-p nil #'eq)
|
|
|
|
;; Keep track of open eshell buffers
|
|
(add-hook 'eshell-mode-hook #'+eshell|init)
|
|
(add-hook 'eshell-exit-hook #'+eshell|cleanup)
|
|
|
|
(after! em-term
|
|
;; Visual commands require a proper terminal. Eshell can't handle that, so
|
|
;; it delegates these commands to a term buffer.
|
|
(setq eshell-visual-commands
|
|
(append eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim"))
|
|
eshell-visual-subcommands '(("git" "log" "l" "diff" "show"))))
|
|
|
|
(defun +eshell|init-evil ()
|
|
"Replace `evil-collection-eshell-next-prompt-on-insert' with
|
|
`+eshell|goto-prompt-on-insert'."
|
|
(dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook))
|
|
(remove-hook hook 'evil-collection-eshell-next-prompt-on-insert t)
|
|
(add-hook hook '+eshell|goto-prompt-on-insert nil t)))
|
|
(add-hook 'eshell-mode-hook #'+eshell|init-evil)
|
|
|
|
(defun +eshell|init-keymap ()
|
|
"Setup eshell keybindings. This must be done in a hook because eshell-mode
|
|
redefines its keys every time `eshell-mode' is enabled."
|
|
(when (featurep 'evil)
|
|
(evil-define-key* 'normal eshell-mode-map
|
|
[return] #'+eshell/goto-end-of-prompt
|
|
"c" #'+eshell/evil-change
|
|
"C" #'+eshell/evil-change-line
|
|
"d" #'+eshell/evil-delete
|
|
"D" #'+eshell/evil-delete-line)
|
|
(evil-define-key* 'insert eshell-mode-map
|
|
"\C-d" #'+eshell/quit-or-delete-char
|
|
"\C-p" #'eshell-previous-input
|
|
"\C-n" #'eshell-next-input))
|
|
(define-key! eshell-mode-map
|
|
[remap split-window-below] #'+eshell/split-below
|
|
[remap split-window-right] #'+eshell/split-right
|
|
[remap doom/backward-to-bol-or-indent] #'eshell-bol
|
|
[remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input
|
|
[remap evil-window-split] #'+eshell/split-below
|
|
[remap evil-window-vsplit] #'+eshell/split-right))
|
|
(add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap))
|
|
|