Zsh – Removing Strange Characters from a Zsh Prompt

debianpromptthemezsh

I installed zsh 5.3 and am using it.

Now in .zshrc I have done the following –

autoload -Uz compinit promptinit
compinit
promptinit
# End of lines added by compinstall

Now I cycled through some of the prompts and liked one big_fade

The big_fade looks like this –

۲��shirish@think-debian���۲�� Mon Dec 26 02:24:01am
/usr/share/zsh/functions/Prompts>

The builtin code of the prompt is at /usr/share/zsh/functions/Prompts/prompt_bigfade_setup

/usr/share/zsh/functions/Prompts> cat prompt_bigfade_setup
# Generic large colour fade-bar prompt theme from bashprompt
# Created by James Manning <jmm@raleigh.ibm.com>
# Changed by Spidey 08/06
# Converted to zsh prompt theme by <adam@spiers.net>

prompt_bigfade_help () {
  cat <<EOH
This prompt is color-scheme-able.  You can invoke it thus:

  prompt bigfade [<fade-bar> [<userhost> [<date> [<cwd>]]]]

where the parameters are the colors for the fade-bar, user@host text,
date text, and current working directory respectively.  The default
colors are blue, white, white, and yellow.  This theme works best with
a dark background.


Recommended fonts for this theme: either UTF-8, or nexus or vga or similar.
If you don't have any of these, the 8-bit characters will probably look
stupid.
EOH
}

prompt_bigfade_setup () {
  local fadebar=${1:-'blue'}
  local userhost=${2:-'white'}
  local date=${3:-'white'}
  local cwd=${4:-'yellow'}

  local -A schars
  autoload -Uz prompt_special_chars
  prompt_special_chars

  PS1="%B%F{$fadebar}$schars[333]$schars[262]$schars[261]$schars[260]%B%F{$userhost}%K{$fadebar}%n@%m%b%k%f%F{$fadebar}%K{black}$schars[260]$schars[261]$schars[262]$schars[333]%b%f%k%F{$fadebar}%K{black}$schars[333]$schars[262]$schars[261]$schars[260]%B%F{$date}%K{black} %D{%a %b %d} %D{%I:%M:%S%P}$prompt_newline%B%F{$cwd}%K{black}%d>%b%f%k "
  PS2="%B%F{$fadebar}$schars[333]$schars[262]$schars[261]$schars[260]%b%F{$fadebar}%K{black}$schars[260]$schars[261]$schars[262]$schars[333]%F{$fadebar}%K{black}$schars[333]$schars[262]$schars[261]$schars[260]%B%F{$fadebar}>%b%f%k "

  prompt_opts=(cr subst percent)
}

prompt_bigfade_preview () {
  if (( ! $#* )); then
    prompt_preview_theme bigfade
    print
    prompt_preview_theme bigfade red white grey white
  else
    prompt_preview_theme bigfade "$@"
  fi
}

prompt_bigfade_setup "$@"

Now while all this is good, I want to do some changes to the prompt. For instance I don't want the special symbols '۲��' .

Also, at the very end the prompt ends with > . I want to end it as $ (similar to bash) . Can somebody help?

Best Answer

Recommended fonts for this theme: either UTF-8, or nexus or vga or similar.
If you don't have any of these, the 8-bit characters will probably look stupid.

You read this comment in the script, did you not? ☺

The prompt_special_chars module is setting up an array variable named schars that contains the output sequences for various characters that then get used in your prompt as you can see. They are line drawing and block characters, mainly. The prompt_special_chars module is right there next to the one that you are already looking at.

Your terminal (emulator) is apparently correctly configured to recognize the UTF-8 encoded output that prompt_special_chars puts into these strings. (This is a good thing, given that the Debian people, now in December 2016, are resurrecting the proposal to outright do away with any terminal emulators in Debian that aren't UTF-8.) But it lacks the font support for the relevant glyphs, and is substituting a replacement character because your fonts do not have the actual line-drawing and box characters.

So as the comment said, set your terminal emulator up with fonts that incorporate these Unicode line-drawing and block characters. Look for a font that has the Windows Glyph List 4 (WGL4) repertoire, for instance.

If you don't like the block characters, then a prompt design where that is the primary point is not for you. You are essentially saying that you like the prompt design except that you dislike the distinctive thing that it does, which is a contradiction. The block characters are used for the "colour fading" effect that is in the name "bigfade".

Related Question