Hi. I’ve been using powerlevel10k for a long time, but a few days ago, I decided I wanted to customize it a bit. I opened the .p10k.zsh file, and I was shocked. It’s really massive, with TONS of options. I’ve been digging through for a few hours already, and it’s absolutely amazing how much you can customize it without actually programming anything. I was wondering what other people are using. So my questions are:
- Do you customize your shell prompt?
- If yes, do you use some framework or pre-made theme, or do you just configure it the vanilla way in your bashrc/zshrc/…
- How is your experiences with it so far?
- Share screenshot of your prompts, please (Sadly, my prompt is currently half done, so I can’t really share it)
I use plain old bash with the plain old .bashrc that ships with Debian. I’ll bolt on a git-branch-aware function into the prompt here and there, but that’s about it.
Why? I ssh into a few dozen machines most days and my shitty little lizard brain can’t deal with everything being different on each box. So as much as I appreciate zsh, powerline plug-ins, all that glitzy stuff, I’ll be a late adopter when it comes to plain old Debian stable…
I wrote an Ansible playbook to install my zsh stuffs into a remote machine. I don’t run it against every machine though, just the ones where I ssh into particularly often and have the freedom to customize the shell.
freedom to customize the shell
This is always the issue for me – I ssh into several machines for various clients every day. All of those clients have one thing in common: equally strict and inconsistent policies about what packages you can use from where and for what reason. “I like this shell better” would never fly, sadly.
The only way i function. Am usualy ssh’d into 3-5 machines at any given time.
This was me until the kubernetes transition occurred. Now I ssh into nothing unless it’s a personal box. I’ve become a zsh convert.
I’ve been casually transitioning to kubernetes and zsh, but I’m just too comfortable with bash and my os running on bare metal. (He says with more than half his apps switched to containers.) It’s simple, effective, and is always available. I should take the plunge, someday.
FWIW, once I got deep enough into it, the thought of going back to the old way seemed like a crazy idea. I don’t want to manage servers like that again if it can be avoided. YMMV.
Yes, I use starship with nushell.
Starship is great! I use it with zsh
And i use it with fish :)
How is Nushell? Is it stable?
There are some breaking changes made to config sometimes, it’s v0.x after all.
Fish, with Starship. It does everything I need it to, completely unmodified. In comparison, zsh barely reached feature parity with a dozen plugins, and I just don’t want to spend my time on that
I love fish.
Sometimes I wonder why people think using the terminal is so hard, then every once in a while when I’m not on my home PC and have to use Bash I get reminded of why
I’ve been meaning to try zsh since it can supposedly do everything fish can while still being posix compliant, but I’ve never felt the need to not be using fish so I just never got around to it
Fish, with Starship.
Also a Garuda user?
No
Ah, okay. The reason why I ask is because it ships with starship, and fish is the default shell.
Or, at least, it used to be. I think they might’ve switched to bash recently. Using Garuda is what got me hooked on fish and starship.
Same. Its simple, has great autocomplete, and customizeable if you want.
I’ve been using zsh with oh-my-zsh for almost a decade, but sounds like I might want to try Fish + Starship.
Give it a shot. It’s a great shell, but be prepared to learn new things. It works differently in a lot of fundamental ways, but to me they just make sense
I use fish + tide
I tried zsh+p10k before fish+tide, but zsh felt annoying in subtle ways that weren’t fixable with (existing) plugins, so I switched back to fish, but installed tide to mimic my previous p10k theme.
Didn’t know about Tide, super neat! ✨
I use Zsh with the Oh My Zsh! framework, and I use a different theme depending on which subuserland I’m in, by customising
~/.zshrc
. For example, I use the gentoo theme on Debian and its derivatives, agnoster on NixOS, darkblood on Arch, strug for Mageia, apple on my macOS device, aussiegeek on FreeBSD, and gallifrey on OpenBSD. Different themes helps me remember which package manager to use and which distro-specific commands will work.I’ll send some screenshots in a bit, when I boot up my PC.
I like Zsh because of its tab completion and command history. I also quite like its plugins.
Before anyone asks, I have tried Fish before, and I prefer Zsh. I have tried configuring Bash before, and I prefer Zsh. I have played with Ksh and Tcsh on BSD, and I prefer Zsh. I used PowerShell a long time ago, and I prefer Zsh.
I designed this prompt shortly after I switched to Linux, I’ve been using it for a while, it has a few features like putting the exit code if it isn’t 0, changing the hostname color if its detected that you are over ssh, changing the directory color to red if it isn’t writeable, changing the prompt color to red if your euid is 0, and instead of printing
I have no name!
when your user does not have an entry in the passwd file, it will just print your uid in red. I also have a version that I wrote in C that works the same way with a subsitution shell, but it was harder to sync across all my devices when I made a change, so I rewrote it in posix shell that could be synced with just my.bashrc
and work almost anywhere.I don’t know how to post a screenshot, sorry for the long paragraph, but here is the source code, feel free to share or do whatever with it!
#-----PS1-----# BOLDRED="\001\033[1;31m\002" BOLDBLUE="\001\033[1;34m\002" BOLDPURPLE="\001\033[1;35m\002" BOLDCYAN="\001\033[1;36m\002" BOLDGREEN="\001\033[1;32m\002" COLORRESET="\001\033[0m\002" CURSOR_BLINK="\001\033[5 q\002" INFO_COLOR=$BOLDGREEN SUPERUSER_COLOR=$BOLDRED NORMALUSER_COLOR=$BOLDCYAN SSH_COLOR=$BOLDPURPLE __shellprompt () { if [ "$(id -u)" = 0 ]; then PROMPT_COLOR=$SUPERUSER_COLOR PROMPT_EMBLEM='#' else PROMPT_COLOR=$NORMALUSER_COLOR PROMPT_EMBLEM='$' fi # [user@hostname] printf "%b%s%b" "${PROMPT_COLOR}[${INFO_COLOR}" "$(whoami 2>/dev/null || (printf "%b%s" "${BOLDRED}" "UID:$(id -u)"))" "${PROMPT_COLOR}@" if [ -n "${SSH_TTY}" ] || [ -n "${SSH_CLIENT}" ]; then printf "%b" "$SSH_COLOR" else printf "%b" "$INFO_COLOR" fi printf "%s%b" "$(hostname)" "${PROMPT_COLOR}]" # : printf "%b" "${COLORRESET}:" # (/pwd) printf "%b" "${PROMPT_COLOR}(" if [ -w "$PWD" ]; then printf "%b" "${INFO_COLOR}" else printf "%b" "${BOLDRED}" fi if [ -n "$HOME" ] && [ "$HOME" != "/" ] && { [ "$PWD" = "$HOME" ] || [ "$PWD" != "${PWD#"$HOME/"}" ]; }; then printf "%s" "~${PWD#"$HOME"}" else printf "%s" "${PWD}" fi printf "%b" "${PROMPT_COLOR})${COLORRESET}" # :(EXITCODE) if [ "$1" != 0 ]; then printf "%b" "${COLORRESET}:" printf "%b%s%b" "${PROMPT_COLOR}(${BOLDRED}" "${1}" "${PROMPT_COLOR})${COLORRESET}" fi # ->$ # -># printf "%b" "\n${PROMPT_COLOR}->${PROMPT_EMBLEM} ${COLORRESET}${CURSOR_BLINK}" } export PS1='$(__shellprompt $?)' #-----PS1-----#
deleted by creator
I’m on the boring side…
PS1="% "
I like it though, it gives me more room for commands !
Most of the pre-built prompts have two lines to give enough space for commands. The first line has all the info, and the second line is something like your prompt. If your prompt works for you, it’s great, though.
But I have more vertical space too ;)
That’s fair. Powerlevel10k actually has a very smart feature for this called transient prompt that removes the first line full of info from every executed command. It’s hard to explain. There is a screen recording in the README I have linked.
That sounds really cool! Do you know if I could do with default zsh?
I’m sure you can since powerlevel10k is also written in pure zsh. I have no idea how to do it or how difficult it would be, however.
I just use the default fish without any modifications.
To be fair, I don’t use the terminal that often.
Even for my homeserver, I access most stuff (containers, updates, etc.) graphically with CasaOS (a web interface), and as a more “casual” PC user, I work with the tools given by my DE. I don’t do much fancy stuff.
And when I really need the CLI, fish is alright for me. It’s simple, has sane defaults, and feels (thanks to the automatically activated spell check and completion) very efficient for me.
Bash isn’t bad, but feels a bit lackluster. Zsh may be better, but requires too much configuration for what it’s worth for me.
You’ll want to start toning your skills with Bash and other POSIX shells like AT&T ksh, zsh, and dash if you ever wish to do serious scripting for work… either that, or start learning Python. That is, unless you already have those under your belt. Apology in advance if you already do… I just couldn’t understand switching to Fish after already having those skills. If you do, and you then switched to Fish, what was the benefit of that? Just curious.
I’ve been using zsh for some time, but I finally switched to fish. I also checked out Nushell, it lacks some features, but it’s really interesting. On zsh I was using Powerlevel10k, on Fish I used oh-my-fish with the shellder theme before I switched to Starship. I’m very happy with this setup. My prompt looks like this:
My Terminal Emulator of choice is kitty, the font is Monocraft.
Wow, that’s a really original prompt. I love it!
I tried oh-my-bash with some fancy theme, but went back to plain old bash from my distro since suggestions for autocomplete had suddenly started to lag. Went back to default and it’s as quick as ever to suggest.
I’m not willing to trade efficiency for bells and whistles
I don’t know about oh-my-bash themes, but on the zsh side, the powerlevel10k can display a lot of information without any lag due to asynchronous implementation. I’m sure there is something similar for bash too.
I edited my PS1 variable
I’m old school, I use Bash and do the basic " [user@hostname working-directory]$ " but there’s a newline before the first bracket so there’s always a line break and an indent after STDOUT so I can tell where the command output ends if it’s huge. I also tend to colorize it a bit.
I’ve tried ZSH and I like it, but as a Linux System Engineering overseeing thousands of servers, they all use Bash, so that’s what I’ve stuck with as well.
Vanilla zsh prompt. I had a thing that told me which git branch I was on for a while but my editor tells me that so I decided I didn’t need it
starship.rs on zsh
As I use bash basically for everything, I wanted my prompt to be as basic as possible (No newlines, fixed format) and compatible across my PC, Laptop as well as server and Pi via SSH.
Therefore, it’s a simple __prompt_command function in my .bashrc (nearly) everywhere.
It’s structured as:- Terminal/TTY number in orange
- Username in green (for roots .bashrc it’s red)
- Hostname in green
- Current working dir in blue
- Current git branch in yellow (if in a git repo)
- Exit code in red (if not 0)
Looks like this:
I used some prompt generator to get the variables and colors right, and then wrapped parts in if-then where needed.
The result is:__prompt_command() { local EXIT="$?" PS1="\[\033[38;5;216m\](\l)\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;85m\]\u@\H\[$(tput sgr0)\]:\[$(tput sgr0)\]\[\033[38;5;68m\][\w\[$(tput sgr0)\]" local GIT_BRANCH="$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/')" if ! [[ -z "$GIT_BRANCH" ]]; then PS1+=":\[$(tput sgr0)\]\[\033[38;5;142m\]${GIT_BRANCH}\[$(tput sgr0)\]" fi PS1+="\[\033[38;5;68m\]]\[$(tput sgr0)\]" if [ $EXIT != 0 ]; then PS1+=":\[$(tput sgr0)\]\[\033[38;5;1m\]${EXIT}\[$(tput sgr0)\]" fi PS1+="\\$ \[$(tput sgr0)\]" }
In practice I use every aspect of it. The terminal number is useful for sorting, the username is needed especially when handling e.g. git or db servers with specific users, and one has a terminal as the user, one as root and one as normal user. Hostname is obviously important with multiple ssh sessions open all the time (especially without terminal emulator titles). Typing pwd all the time would be very tedious, as I only move around my system in bash, so having it in the prompt is nice. If I am in a git repo I also need to know the branch and otherwise it’s not displayed anyway. Quickly identifying silently failed commands is tedious, especially because issuing one command overwrites $? again, so ‘logging’ it if necessary is nice.