Powerline on Linux: An Integration Guide

Render clean status lines and prompts in Vim, Bash, i3 and tmux

Image for post
Image for post

Introduction

System Dependencies

$ sudo pacman -S python      # Arch
$ sudo apt install python # Debian and Ubuntu
$ sudo dnf install python # Fedora and CentOS
$ sudo pacman -S git         # Arch
$ sudo apt install git # Debian and Ubuntu
$ sudo dnf install git # Fedora and CentOS

Installation

Installing Pip

$ cd ~/Downloads
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3.8 get-pip.py# Output
Successfully installed pip-20.2.4 setuptools-50.3.2 wheel-0.35.1
$ sudo find / -name pip# Output
/home/dane/.local/bin/pip
$ echo $PATH
$ vim ~/.bashrc
# In bash.rc
export PATH="~/.local/bin:$PATH"
# Provide an absolute path
alias pip=”/home/dane/.local/bin/pip”
$ source ~/.bashrc
$ pip --version
# Output
pip 20.2.4 from /home/dane/.local/lib/python3.8/site-packages/pip (python 3.8)
# Display pip help
$ pip -h

Installing Powerline

$ pip install powerline-status
$ pip show powerline-status# Output
...
Location: /home/dane/.local/lib/python3.8/site-packages
$ pip uninstall powerline-status

Python Packages

$ pip install psutil i3ipc# Installs to:
# ~/.local/lib/python3.8/site-packages/psutil
# ~/.local/lib/python3.8/site-packages/i3ipc

Font Installation

$ git clone https://github.com/powerline/fonts.git --depth=1 
powerline-fonts
$ cd powerline-fonts
$ ./install.sh
# Output
Copying fonts...
Resetting font cache, this may take a moment...
Powerline fonts installed to /home/dane/.local/share/fonts
# List fonts directory to confirm the copy was successful
$ ls ~/.local/share/fonts
$ yay -S font-manager              # Arch
$ sudo apt install font-manager # Debian and Ubuntu
$ sudo dnf install font-manager # Fedora
# Run
$ font-manager
Image for post
Image for post
Previewing powerline fonts with the Font Manager application.

Using Powerline with Vim

$ vim — version | grep +python# Output
+python/dyn +python3/dyn
set laststatus=2           " Always display the status bar
set powerline_cmd="py3" " Tell powerline to use Python 3
python3 from powerline.vim import setup as powerline_setup
python3 powerline_setup()
python3 del powerline_setup
Image for post
Image for post
The Vim status line being rendered with powerline.

Using Powerline with Bash

Modifying .bashrc

# Run powerline daemon
# To locate this file, run: sudo find / -name powerline-deamon

/home/dane/.local/bin/powerline-daemon -q
# Cache powerline location
# To locate this directory, run: pip show powerline-status

export POWERLINE_LOCATION="/home/dane/.local/lib/python3.8/site-packages/powerline"
# Set up powerline environment
export POWERLINE_CONFIG_COMMAND=powerline-config
export POWERLINE_BASH_CONTINUATION=1
export POWERLINE_BASH_SELECT=1
# Invoke binding script
. "$POWERLINE_LOCATION/bindings/bash/powerline.sh"
# Kill the powerline daemon process
$ powerline-daemon -k
# Start the powerline daemon process quietly
$ powerline-daemon -q
# in .bashrc
alias pd=”powerline-daemon -k && powerline-daemon -q”
# Refresh configuration on the command line
$ source ~/.bashrc
Image for post
Image for post
Restarting the powerline daemon with an alias.

Setting Up a Configuration Directory

$ mkdir ~/.config/powerline
$ cp -fr {powerline_location}/config_files ~/.config/powerline

The Configuration Directory Structure

- powerline/
- config.json # Main configuration
- colors.json # Colors and gradient definitions
- colorschemes/ # Directory for all color schemes
- default.json
- <extension>/
- <scheme_name>.json
...
...
- themes/ # Directory for all themes
- <top_level>.json
- <extension>/
- <theme_name>.json
...
...

Creating a Theme for the Bash Prompt

"function": "powerline.segments.module.segment_name"
"args": {
"arg1": "val1",
"arg2": "val2", ...
}
{
"function": "powerline.segments.common.env.cwd",
"args": {
"ellipsis": "..", # String to use for omitted directories
"dir_shorten_len": 20, # Max directory character length
"dir_limit_depth": 2 # Max directory depth to render
},
"after": " ", # String to display after the output
"priority": 20 # Give a high rendering priority
},
The bash theme configuration file.
The segments used for our custom Bash prompt.
"shell": {
"colorscheme": "default",
"theme": "default_leftonly",
"local_themes": {
"continuation": "continuation",
"select": "select"
}
},

Creating a Color Scheme for the Bash Prompt

“teal”: 6,
“navyblue”: 17,
“darkblue2”: 18,
“slateblue”: 61,
“purpleturquoise”: 66,
“steelblue”: 67,
“gray01”: 234,
$ cd ~/.config/powerline/colorschemes
$ mkdir shell && cd shell
$ touch teal_dark.json
"group_name": { "fg": "color", "bg": "color", 
"attrs": ["bold", "italic", "underline"] }
The color scheme configuration file for the Bash prompt.
"shell": {
"colorscheme": "teal_dark",
"theme": "default_leftonly",
"local_themes": {
"continuation": "continuation",
"select": "select"
}
},
Image for post
Image for post
Our configured Bash prompt rendered with powerline.

Using Powerline with i3

bar {
status_command python3 {powerline_root}/powerline/bindings
/i3/powerline-i3.py
font pango:Hacker 11
}
Image for post
Image for post
The i3 bar rendered with the default theme and color scheme configurations applied.

Installing a Powerline Extension for Memory Segments

pip install powerline-mem-segment

Creating a Theme for the i3 Bar

The theme configuration file for the i3 bar.
The segments used for our custom i3 bar.

Creating a Color Scheme for the i3 Bar

$ cd ~/.config/powerline/colorschemes
$ mkdir wm && cd wm
$ touch i3_dark.json
The color scheme configuration file for the i3 bar.
"wm": {
"colorscheme": "i3_dark",
"theme": "default",
"update_interval": 2
}
Image for post
Image for post
Our configured i3 bar without the external IP address segment.

Using Powerline with tmux

# Ensure the powerline daemon is running
run-shell "powerline-daemon -q"
# Invoke the tmux powerline binding
source "{powerline_root}/bindings/tmux/powerline.conf"
$ tmux new-session
Image for post
Image for post
Powerline rendering both the tmux status line and Bash prompt.

In Conclusion

MSc. Programmer and fan of open source software.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store