It looks like your font is fine, (some of) the special glyphs show up as expected. It's the colour that's broken. The following settings should sort out the colour:

(add-to-list 'comint-output-filter-functions 'ansi-color-process-output) (ansi-color-for-comint-mode-on)

With this config, the Hack font, and an appropriate definition of $PS1 I have the following prompt in shell-mode :

Warning!

Using a spectacular prompt like this will cause problems with modes that need to be able to detect your prompt. Notably, this includes Tramp (i.e., see Tramp using su fails with powerline prompt) and org-babel. You'll need to update a few other variables to avoid this.

For my config, this includes the following:

Fancy prompt defined in ~/.emacs.d/init_bash.sh :

export PS1="\[\e[36;40m\]\[\e[31;46m\]\D{%x} \A\[\e[36;42m\]\[\e[30;42m\]\w\[\e[32;41m\]\$(exitstatus)\$(jobscount)\[\e[0;32m\]\[\e[m\] " export PS2="\[\e[0;32m\]❱ \[\e[m\]"

Adding the special glyphs to the comint prompt regexp (which I do in my shell-mode-hook):

(defun tws-shell-mode-hook () ... (setq comint-prompt-regexp "\\(?:^\\| \\)[^]#$%> ]*#?[]#$%>❱] *\\(\\[[0-9;]*[a-zA-Z] *\\)*") ...) (add-hook 'shell-mode-hook 'tws-shell-mode-hook)

You also need to add the glyphs to tramp-shell-mode-hook , which I've done vis the customization interface (you could just as easily use (setq ...) in init.el ):

(tramp-shell-prompt-pattern "\\(?:^\\| \\)[^]#$%> ]*#?[]#$%>❱] *\\(\\[[0-9;]*[a-zA-Z] *\\)*" nil (tramp))

The specific details will depend on what glyphs you've used in your prompt, so you'll have to play around with the above for your own situation. The sorts of problems you can expect without this configuration include Tramp failing to read your root password, and spewing garbage when you try to use it; and in org-mode, when you evaluate a bash code block, any code that would cause bash to respond with a prompt (e.g., a multi-line for loop) will cause Emacs to hang while babel waits for a recognizable prompt to appear.