Switching to zsh (updated for Emacs M-x shell)
I may be late to the party, but I’ve finally switched from
zsh. It wasn’t due to any failings of bash, it’s because I’ve been using it inside of Emacs M-x shell and never felt the need the fancy features of Oh My Zsh or any of the other new and improved shells. The Starship shell prompt is a vast improvement on the
PS1 settings and scripts available in bash as well. What prompted the change was macOS and Arch Linux both defaulting to it on installation.
Making the Switch
There were a pair of useful articles I read beforehand:
[Switching to ZSH](http://zpalexander.com/switching-to-zsh/) [Moving to zsh](https://scriptingosx.com/2019/06/moving-to-zsh/)
After reading through those, I figured I’d just make the switch and suffer the fallout.
The .zshenv file is used for setting user’s environment variables. I didn’t really have too many to set, but it is convenient to keep them in 1 place.
HISTSIZE=200000 GOPATH=$HOME/go PATH=$PATH:$HOME/bin:$GOPATH/bin EDITOR=emacsclient GIT_EDITOR=$EDITOR
HISTSIZE is used for maintaining the maximum size of the
.zsh_history file. The
$PATH settings are adding my home and local Go
EDITOR is set for anything that needs to access my preferred editor of Emacs and
GIT_EDITOR is specific to Git.
The .zshrc is used for setting user’s interactive shell configuration and executing commands, and is read when starting an interactive shell. The advice was to forgo using an additional .zsh_profile and just use a .zshrc.
There are several setopt commands for setting .zsh_history settings (documented in the file) and the various aliases I prefer. The block
# emacs M-x shell if [[ "dumb" == $TERM ]] ; then alias l='cat' alias less='cat' alias m='cat' alias more='cat' export PAGER=cat export TERM=xterm-256color else alias l='less' alias m='more' fi
explicitly sets behavior so
M-x shell and iTerm behaved as expected. The
GIT_EDITOR was not picked up when commiting files from the CLI within
M-x shell, so I had to
export GIT_EDITOR=$EDITOR to get the desired behavior of not opening another Emacs window when commiting. The
export TERM=xterm-256color is to get around this Starship bug.
PS1 is managed by my Starship config file.
To ensure that
M-x shell used zsh instead of bash I set the custom variables
'(explicit-shell-file-name "/bin/zsh") '(explicit-zsh-args '("--interactive" "--login"))
and to off echoed commands from zsh added
to my .emacs.d/init.el.
I did not use
AUTO_CD settings because Emacs tended to lose track of the
CWD and I don’t care enough to figure out how to use Dirtrack.
I added the following to my
.zshrc to prevent Tramp from hanging on remote ssh zsh connections.
[[ $TERM == "dumb" ]] && unsetopt zle && PS1='$ '