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:

    :let $TERM = 'dumb'
    :shell

This should make your workaround in the zshrc file work. You will probably run in to problems with other commands though. Also see [How do I know I am in a shell from vi command :sh?](https://vi.stackexchange.com/q/12311/51)

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`.