I use the GRML zshrc for more than 10 years, and still find it better than the oh-my-zsh
prompts especially regarding version control integration (e.g. it shows cleanly whether you are in a git rebase
or git cherry-pick
).
Here’s how I use it on NixOS, based on my previous post on reddit (which I cannot update any more because Reddit crappily forbids that).
It explains some pitfalls I encountered, and also features showing (nix-shell)
in the prompt when I’m in nix-shell.
{
# zsh
programs.zsh.enable = true;
programs.zsh.interactiveShellInit = ''
# Note that loading grml's zshrc here will override NixOS settings such as
# `programs.zsh.histSize`, so they will have to be set again below.
source ${pkgs.grml-zsh-config}/etc/zsh/zshrc
alias d='ls -lah'
alias g=git
# Increase history size.
HISTSIZE=10000000
# Prompt modifications.
#
# In current grml zshrc, changing `$PROMPT` no longer works,
# and `zstyle` is used instead, see:
# https://unix.stackexchange.com/questions/656152/why-does-setting-prompt-have-no-effect-in-grmls-zshrc
# Disable the grml `sad-smiley` on the right for exit codes != 0;
# it makes copy-pasting out terminal output difficult.
# Done by setting the `items` of the right-side setup to the empty list
# (as of writing, the default is `items sad-smiley`).
# See: https://bts.grml.org/grml/issue2267
zstyle ':prompt:grml:right:setup' items
# Add nix-shell indicator that makes clear when we're in nix-shell.
# Set the prompt items to include it in addition to the defaults:
# Described in: http://bewatermyfriend.org/p/2013/003/
function nix_shell_prompt () {
REPLY=''${IN_NIX_SHELL+"(nix-shell) "}
}
grml_theme_add_token nix-shell-indicator -f nix_shell_prompt '%F{magenta}' '%f'
zstyle ':prompt:grml:left:setup' items rc nix-shell-indicator change-root user at host path vcs percent
'';
programs.zsh.promptInit = ""; # otherwise it'll override the grml prompt
users.users.root.shell = pkgs.zsh;
}
PS:
- The code highlighting here on Discourse is broken, it does not understand the
''$VARIABLE
escape to write a verbatim$
into the config in Nix multi-line strings (''
).