After reading Andrey Listopadov's You don't need a terminal emulator (mentioned
at Irreal too) I decided to give up on using Emacs as a terminal for my shell.
In my experience Emacs simply isn't a very good terminal to run a shell in
anyway. I removed the almost completely unused shell-pop from my configuration
and the keybinding with a binding to
async-shell-command. I'm keeping
terminal-here in my config for the time being though.
I realised projectile didn't have a function for running it in the root of a
project, so I wrote one heavily based on
(defun mep-projectile-async-shell-command () "Run `async-shell-command' in the current project's root directory." (declare (interactive-only async-shell-command)) (interactive) (let ((default-directory (projectile-project-root))) (call-interactively #'async-shell-command)))
I quickly found that the completion offered by Emacs for
async-shell-command is far from as sophisticated as what I'm used to from Z
shell. After a bit of searching I found emacs-bash-completion. Bash isn't my
shell of choice, partly because I've found the completion to not be as good as
in Z shell, but it's an improvement over what stock Emacs offers. The
instructions in the repo was good, but had to be adjusted slightly:
(use-package bash-completion :straight (:host github :repo "szermatt/emacs-bash-completion") :config (add-hook 'shell-dynamic-complete-functions 'bash-completion-dynamic-complete))
I just wish I'll find a package offering completions reaching Z shell levels.