The problem is that MacVim only provides some bare-bones facilities for emulating a terminal, and doesn't support "advanced" features such as a wide range of common terminal escape characters. You'll get the same problem when running :shell
from Gvim on Windows or Linux.
Vim doesn't change the TERM
when using :shell
. You can still set it yourself. See: How do I know I am in a shell from vi command :sh?. This should make your workaround in the zshrc file work. You will probably run in to problems with other commands though.
You'll have to either run Vim from a terminal or use NeoVim – which includes a full terminal emulator – if you want to use a fully-functional :shell
.