Custom Unix Terminal
This document serves as an informational guide on how I've customized my terminal in macOS and Linux. It includes a variety of configurations, settings, and programs that enhance my productivity and improve my overall experience within the terminal environment. The document is divided into several sections, each focusing on a different aspect of terminal customization, such as shell frameworks, themes, resource files, plugins, and more.
Disclaimer
This guide assumes you have a basic understanding of the Unix terminal and are comfortable working with configuration files. If you're new to the terminal or need clarification on any of the instructions provided, I recommend proceeding with caution and seeking additional resources or assistance.
Useful Programs
The following table consists of CLI programs that have been useful to me in my day-to-day work. These programs are divided into two categories: Third Party Package Managers (TPPM) and Native Package Managers (NPM).
The TPPM section features programs that can be installed via package managers like Homebrew, Pip, Cargo, Npm, Gem, or Git(1). For each program, I've included a brief description, the operating systems it supports, and the package managers available for installation.
- While all of these programs can be installed manually with
git
, they will only be marked as such if it is recommended by the program's documentation, myself, or if it's the only available method.
The NPM section lists programs that can be installed using the system's default package manager. Since I primarily use Debian and Arch-based Linux distributions, all the programs in this section are confirmed to be installable via apt
or pacman
. For other Linux distributions, refer to Repology to see if the program is available via your distribution's package manager. Like the TPPM section, I've included additional information such as a brief description of each program and a link to its Repology page.
Programs | Description | Applicable OS's | Available Package Managers | Is a Command | Other Info |
---|---|---|---|---|---|
.tmux | Oh my tmux! My self-contained, pretty & versatile tmux configuration made with. | macOS Linux |
No | Requires tmux to be installed. |
|
bandwhich | Terminal bandwidth utilization tool. | macOS Linux |
Yes | ||
bat | A cat(1) clone with wings. | macOS Linux |
Yes | ||
black | The uncompromising Python code formatter. | macOS Linux |
Yes | ||
cheat | Cheat allows you to create and view interactive cheatsheets on the command-line. | macOS Linux |
Yes | ||
codespell | Check code for common misspellings. | macOS Linux |
Yes | ||
coreutils | These are the GNU core utilities. This package is the union of the GNU fileutils , sh-utils , and textutils packages. |
macOS | Collection | All GNU commands installed via coreutils, are the same as they are on Linux, but prefixed with a g (i.e. gcp for cp ). |
|
duf | Disk Usage/Free Utility - a better 'df' alternative. | macOS Linux |
Yes | ||
eza | A modern, maintained replacement for ls . |
macOS Linux |
Yes | ||
ffmpeg | FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata. | macOS Linux |
Yes | ||
fzf | A command-line fuzzy finder. | macOS Linux |
Yes | ||
fzf-tab | Replace zsh's default completion selection menu with fzf! | macOS Linux |
No | ||
gallery-dl | Command-line program to download image galleries and collections from several image hosting sites. | macOS Linux |
Yes | ||
git | Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals. | macOS Linux |
Yes | ||
git-delta | A syntax-highlighting pager for git, diff, and grep output | macOS Linux |
No | ||
git-open | Type git open to open the GitHub page or website for a repository in your browser. |
macOS Linux |
Yesgit open |
||
gnupg | The GNU Privacy Guard | macOS Linux |
Yesgpg or gpg2 |
||
htop | Improved top (interactive process viewer). | macOS Linux |
Yes | ||
imagemagick | Use ImageMagick® to create, edit, compose, or convert digital images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, WebP, HEIC, SVG, PDF, DPX, EXR and TIFF. | macOS Linux |
Yesmagick |
More info here. | |
isort | A Python utility / library to sort imports. | macOS Linux |
Yes | ||
lazygit | Simple terminal UI for git commands. | macOS Linux |
Yes | ||
lynis | Security and system auditing tool to harden systems. | macOS Linux |
Yes | Recommended install method: Git. | |
ncdu | ncdu (NCurses Disk Usage) is a curses-based version of the well-known 'du'. | macOS Linux |
Yes | ||
neovim | Vim-fork focused on extensibility and usability. | macOS Linux |
Nonvim |
||
prettier | Code formatter for JavaScript, CSS, JSON, GraphQL, Markdown, YAML. | macOS Linux |
Yes | ||
pstree | List processes as a tree. | macOS Linux |
Yes | ||
pipenv | Python dependency management tool. | macOS Linux |
Yes | ||
pipx | Install and Run Python Applications in Isolated Environments. | macOS Linux |
Yes | ||
pyenv | Simple Python version management. | macOS Linux |
Yes | ||
pylint | It's not just a linter that annoys you! | macOS Linux |
Yes | ||
shellcheck | Shell script analysis tool. | macOS Linux |
Yes | ||
shellharden | Shellharden is a syntax highlighter and a tool to semi-automate the rewriting of scripts to ShellCheck conformance, mainly focused on quoting. | macOS Linux |
Yes | ||
terminal-notifier | Send macOS User Notifications from the command-line. | macOS Linux |
No | Also see the bgnotify plugin. | |
tmux | tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. | macOS Linux |
|||
trash-cli | Command line interface to the freedesktop.org trashcan. | macOS Linux |
Collection | ||
tree | Display directories as trees (with optional color/HTML output). | macOS Linux |
Yes | ||
tree-sitter | Tree-sitter is a parser generator tool and an incremental parsing library. | macOS Linux |
No | ||
wget | Wget is a free utility for non-interactive download of files from the Web. | macOS Linux |
Yes | ||
yt-dlp | A feature-rich command-line audio/video downloader. | macOS Linux |
Yes | ||
zip | Compression and file packaging/archive utility. | macOS Linux |
Yes | ||
zsh | UNIX shell (command interpreter). | macOS Linux |
No | ||
zsh-autosuggestions | Fish-like autosuggestions for zsh. | macOS Linux |
No | Zsh must be installed. Install instructions. |
|
zsh-completions | Additional completion definitions for Zsh. | macOS Linux |
No | Zsh must be installed. | |
zsh-syntax-highlighting | Fish shell like syntax highlighting for Zsh. | macOS Linux |
No | Zsh must be installed. Install instructions. |
Applicable Operating Systems: Linux
Programs | Description | Number of Repository Families Featuring this Package | Is a Command | Other Info |
---|---|---|---|---|
apt-listchanges | Package change history notification tool. | Yes | Specific to Debian based distributions. Rarely used as a command. |
|
bandwhich | Terminal bandwidth utilization tool. | Yes | ||
bat-cat | A cat(1) clone with wings. | Yesbat or batcat or bat-cat |
||
black | The uncompromising Python code formatter. | Yes | Recommended install method: Homebrew OR Pip. | |
codespell | Check code for common misspellings. | Yes | ||
deborphan | Program that can find unused packages, e.g. libraries. | Yes | Specific to Debian based distributions. | |
duf | Disk Usage/Free Utility - a better 'df' alternative. | Yes | ||
eza | A modern, maintained replacement for ls . |
Yes | For the apt package installation, see here. | |
ffmpeg | FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata. | ??? | ||
fzf | A command-line fuzzy finder. | Yes | Recommended install method: Git OR Oh My Zsh | |
gallery-dl | Command-line program to download image galleries and collections from several image hosting sites. | Yes | ||
git | Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals. | Yes | ||
git-delta | A syntax-highlighting pager for git, diff, and grep output | No | ||
gnupg | The GNU Privacy Guard | Yesgpg or gpg2 |
||
htop | A cross-platform interactive process viewer. | Yes | ||
imagemagick | Use ImageMagick® to create, edit, compose, or convert digital images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, WebP, HEIC, SVG, PDF, DPX, EXR and TIFF. | Yesmagick |
More info here. Recommended install method: Homebrew. |
|
lazygit | Simple terminal UI for git commands. | Yes | ||
lynis | Security and system auditing tool to harden systems. | Yes | Recommended install method: Git. | |
ncdu | ncdu (NCurses Disk Usage) is a curses-based version of the well-known 'du'. | Yes | ||
neovim | Vim-fork focused on extensibility and usability. | Yesnvim |
||
pstree | List processes as a tree. | Yes | ||
pipenv | Python dependency management tool. | Yes | ||
pipx | Install and Run Python Applications in Isolated Environments. | Yes | Recommended install method: Homebrew OR Pip. | |
python-is-python3 | symlinks /usr/bin/python to python3. | nan | No | |
shellcheck | Shell script analysis tool. | Yes | ||
tmux | tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. | Yes | ||
trash-cli | Command line interface to the freedesktop.org trashcan. | Collection | Recommended install method: Homebrew OR Pip. | |
tree | Display directories as trees (with optional color/HTML output). | nan | Yes | |
yt-dlp | A feature-rich command-line audio/video downloader. | Yes | ||
zip | Compression and file packaging/archive utility. | Yes | ||
zsh | UNIX shell (command interpreter). | No | ||
zsh-autosuggestions | Fish-like autosuggestions for zsh. | No | Not a command. Zsh must be installed. Recommended install method: Git. |
|
zsh-completions | Additional completion definitions for Zsh. | No | Not a command. Zsh must be installed. Recommended install method: Git. |
|
zsh-syntax-highlighting | Fish shell like syntax highlighting for Zsh. | No | Not a command. Zsh must be installed. Recommended install method: Git. |
Z Shell (Zsh)
The Z shell, or zsh
, is a powerful and feature-rich shell that offers many improvements over the default shells provided by most Unix-based operating systems. It includes advanced features such as improved tab completion, spelling correction, and shared command history, making it a popular choice among developers and power users. This section covers the shell framework, theme, resource file, plugins, and aliases that I use to customize my zsh
environment.
Shell Framework
A framework makes customizing the shell much more manageable, whether it be through plugins or themes. I often prefer complete control over my configurations, but the convenience provided by a framework has dramatically improved my workflow and ease of management.
Due to its popularity, reliability, and consistent updates, my framework of choice has become oh-my-zsh. As one of the leading zsh
frameworks, it made its initial commit on August 23, 2009, allowing it enough time to improve and refine its features.
Shell Theme
Similar to how a shell framework enhances the shell's functionality, a shell theme improves its appearance and user experience. A well-designed theme can provide valuable information at a glance, such as the current directory, git branch, and other relevant details.
My preferred shell theme is Starship, which draws inspiration from several well-known and popular shell themes. It is written in Rust, making it fast, lightweight, and highly customizable. Starship is designed to support a wide range of shells and external tools, making it a versatile choice for users across different platforms.
Before Starship, I used Powerlevel10k, which is another excellent shell theme. However, as of May 21, 2024, Powerlevel10k has entered a "life support" mode. In the maintainer's words, "The project has very limited support", with "no new features [in the works]", "most bugs will go unfixed", and "help requests will be ignored". As a result, I searched for an alternative and found Starship to be a suitable replacement.
Zsh Resource File
The .zshrc
file is where all the configurations for zsh
are stored. It's the primary resource file for customizing the shell, containing settings, aliases, and other configurations that define its behavior and appearance.
Below is the content of my .zshrc
file, divided into two sections: one for macOS and one for Linux. Each section is tailored to its respective operating system. You're welcome to use this resource however you like. I offer it as a guide for structuring your own .zshrc
file and to present additional configurations not detailed elsewhere in this document.
My Zsh Resource File
.zshrc | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
|
.zshrc | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
|
Oh-my-zsh Plugins
oh-my-zsh
provides more than 325 built-in plugins that are regularly updated and maintained by the community. These plugins offer a wide range of features, from syntax highlighting and auto-completion to git integration and directory navigation.
Below are all the plugins that I use, along with a brief description of their functionality:
Plugins | Description | Is a Command | Other Info |
---|---|---|---|
colored-man-pages | Adds colors to man pages | No | |
copybuffer | Allows you to copy what you are currently typing, via Ctrl+O | Yes/No | Key Combination: Ctrl+O |
copypath | Copies the path of your working directory | Yes | |
copyfile | Copies the contents of a file | Yes | |
bgnotify | cross-platform background notifications for long running commands | Yes/No | Extra install instructions |
command-not-found | This plugin uses the command-not-found package for zsh to provide suggested packages to be installed if a command cannot be found. | No |
Aliases
Many frameworks, such as oh-my-zsh
, provide their own set of aliases to simplify and improve common commands. Any CLI user will tell you that aliases are a powerful tool for increasing productivity and efficiency. They allow you to create shortcuts for frequently used commands, reducing the time and effort required to type them out.
Below are aliases I've create, organized into two groups: Group 1 and Group 2. Group 1 contains general aliases, while Group 2 includes aliases for displaying useful programs I don't frequently use and often forget about.
Modifying CLI Colors
You can customize the colors of folders, files, and other items in the terminal by setting the LS_COLORS
or LSCOLORS
environment variables.(1) Each variable uses a unique format to specify the colors and styles of different file types and directories. For more information regarding these variables, refer to the "CLI Colors Explained" drop-down.
- Linux only requires
LS_COLORS
, while macOS needs bothLS_COLORS
andLSCOLORS
to be set.
CLI Colors Explained
Between macOS and Linux, there is a slight difference in how CLI colors are configured. macOS requires both LSCOLORS
and LS_COLORS
to fully enable and set CLI colors within the terminal. Conversely, Linux only needs LS_COLORS
to achieve the same.
This difference arises from the distinct version of the ls
command on macOS and Linux. macOS employs the FreeBSD version of ls
, which relies on LSCOLORS
to define the color scheme for file and directory listings. In contrast, Linux uses the GNU version, which depends on LS_COLORS
for the same purpose. On both systems, LS_COLORS
is also used by shells like zsh
to colorize other tools and utilities.
Included below is a key that explains the values of LSCOLORS
and LS_COLORS
in my configurations:
LSCOLORS | LS_COLORS | Type | Text Color | Foreground/Background Color |
---|---|---|---|---|
ex | di=34 | Directories | blue | default |
gx | ln=36 | Symbolic link | cyan | default |
fx | so=35 | Socket | magenta | default |
Dx | pi=1;33 | Pipe | bold yellow | default |
cx | ex=32 | Executable | green | default |
eg | bd=34;46 | Block special | green | cyan |
Da | cd=1;33;40 | Character special | bold yellow | black |
ab | su=30;41 | Executable with setuid bit set | black | red |
ag | sg=30;46 | Executable with setgid bit set | black | cyan |
ac | tw=30;42 | Directory writeable to others (with a sticky bit) | black | green |
aD | ow=30;1;43 | Directory writeable to others (without sticky bit) | black | bold yellow |
I recommend visiting this gist for an in-depth understanding of the LS_COLORS
and LSCOLORS
values.
The below configurations are my LS_COLORS
and LSCOLORS
settings for macOS and Linux. To use them, add the code to your .zshrc
file:
CLI Color Configuration | |
---|---|
You can further modify the shading and appearance of CLI colors by adjusting the ANSI color scheme in your terminal profile. This can be done manually, with guides available for macOS and Linux (specific to GNOME). Alternatively, you can use my custom profile schemes, with instructions detailed in the Terminal Profile section.
Text Editor
There are many terminal-based text editors to choose from, each with unique features and capabilities. I've found that Neovim is the most powerful and versatile option for my needs.
Neovim Resource File
Like the .zshrc
file for zsh
, Neovim has its own resource file, located at ~/.config/nvim/init.vim
, where all the configurations for the editor are stored. This file contains settings, key mappings, and other configurations that define Neovim's behavior and appearance.
Below is the content of my init.vim
file, divided into two sections: with plugins and without plugins. The former includes configurations for various plugins I use, while the latter is a more streamlined setup without any plugins. You can choose the configuration that best suits your needs and add it to your ~/.config/nvim/init.vim
file.
I manage all of my Neovim plugins using vim-plug, a self-described minimalist Vim plugin manager. It simplifies the process of installing, updating, and removing plugins, making it easier to manage and maintain a large number of plugins. While other Vim package managers are available, my configurations are specifically tailored to vim-plug
.
To use these configurations, you'll first need to install vim-plug. Once installed, you can add the following code to your init.vim
file. With init.vim
open in Neovim, initiate the plugin installation by entering :source %
(1) followed by :PlugInstall
.
- When using
:source %
, you can safely ignore any errors that may appear, as they are most likely caused by Neovim searching for plugins that have yet to be installed.
init.vim | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
|
These configurations are designed for users who prefer a more straightforward setup without the features provided by plugins. They tweak Neovim's default settings without changing its core functionality, offering a more streamlined experience while preserving Vim's essential behavior.
Syntax Highlighting
Assumptions
This section assumes you are using a plugin manager like vim-plug
, or are comfortable installing plugins manually.
Neovim leverages TreeSitter to provide features such as advanced syntax highlighting, offering more precision and speed than traditional regex-based methods. However, its default installation includes a limited set of parsers for programming languages. This is where the nvim-treesitter plugin shines. Acting as an enhanced interface for TreeSitter, nvim-treesitter
provides:
- Parser Management: It automatically handles downloading, installing, and updating TreeSitter parsers for a wide range of languages.
- Enhanced Syntax Highlighting: With custom configurations, it delivers consistent and accurate syntax highlighting tailored to each language.
- Advanced Code Features: Besides highlighting, it enables and enhances features like structural code navigation, incremental selection, code folding, and extensions like rainbow parentheses.
Below are my configurations for nvim-treesitter
. Currently, they ensure that the specified parsers are automatically installed and loaded. To use these settings, add the following code to ~/.config/nvim/second_init.lua
(1):
-
nvim-treesitter
configurations are written in Lua. Therefore, if your primaryinit
file is written in Vimscript, you must(1) place these configurations in a separate Lua file; I've named minesecond_init.lua
. Myinit.vim
file, provided above, sources this Lua file to load thenvim-treesitter
settings. -
Technically, you can place the Lua code within the
init.vim
file, but using a separate Lua file keeps the configurations organized and easier to manage.
If you're NOT using the init.vim
file I provided, you'll want to add the following line to your version of the file:
init.vim | |
---|---|
Terminal Profile
A terminal profile is a set of configurations that define the visual appearance and behavior of the terminal window, including the color scheme, font style, and other visual elements. Customizing the terminal profile can improve the user experience, making the terminal more visually appealing and easier to work with.
My custom profile is a modified version of the "Basic" profile that comes pre-installed on macOS. To add it to your list of profiles, follow the instructions below:
- Download the terminal profile: Basic (Modified).terminal
- Open a new terminal window.
- Import the profile:
- Go to Preferences.
- Navigate to the Profiles tab.
- Click on the gear icon at the bottom left of the window.
- Select Import....
- Locate and select the downloaded Basic (Modified).terminal file.
- Set as default profile:
- Select the newly imported profile from the list.
- Click the Default button at the bottom of the window.
My custom profile is based on the one I use for macOS. To add it to your list of profiles, follow the instructions below:
- Download the terminal profile: Gnome Basic (Modified).dconf
- Download the profile setup script: terminal-profile-setup.bash
- Open a new terminal window.
- Navigate to the directory where both files were downloaded to (e.g.,
~/Downloads
). - Execute the setup script: