This is my zsh terminal configuration, complete with personalized tools, aliases, and OMZ theme.
Configured to work in both WSL and native Linux with integrated keyboard selection similar to text editors using ZLE.
Feel free to disect it and scrutinize.
- I highly recommend using FiraCode Mono with this config. It includes all the necessary glyphs for the theme in addition to supporting font ligatures. However, your terminal must support font ligatures for those to work (GNOME terminal does not). The FiraCode repository can be found here and the installation instructions here.
With most desktop-oriented distributions, double-clicking each font file in the ttf folder and selecting “Install font” should be enough.
From the installation instructions - If you use this, it will backup, then overwrite the
.zshrc
,.gitconfig
,.tmux.conf
, and.tmux.conf.local
files in your$HOME
directory. Dated backups can be found in$HOME/.zshconfig/.cache/.old
. - For git, some functions are defaulted to certain values, see the section on git.
- For tmux, I don't use tmux. I really only included a tmux conf for the sake of novelty, feel free to remove the config that comes with this.
- See the section on ssh. Automatically adds any ssh keys that aren't already added to the ssh-agent. Works best with OMZ's
ssh
plugin. Probably not the most secure solution to add keys automatically, feel free to disable.
The install script is located at install/install.bash
. I know that OMZ uses Bourne shell for their install script, I don't care enough to do that. If your machine can use zsh, it can probably use bash.
You can run the script remotely using curl
or wget
using the following commands:
# For `curl`
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Sargates/.zshconfig/master/install/install.bash)"
# For `wget`
bash -c "$(wget https://raw.githubusercontent.com/Sargates/.zshconfig/master/install/install.bash -O -)"
While this script isn't system dependent, the install script installs packages automatically using the apt
command and will only work on debian based systems that support it. Support may come for other package managers, but right now the apt
command is baked into the install script. Installation will work on other systems, but functionality may be buggy if the correct tools are not installed. See install/packages.txt
for the list of packages that would be installed automatically.
Everything related to this package is contained within the .zshconfig
folder, however it does also install a few packages directly (assuming you're on debian and the install was successful). These packages aren't associated with this project and are ok to leave, but a list of all installed packages can be found in .zshconfig/install/packages.txt
.
The themes
and plugins
directory is used by oh-my-zsh to automatically source prompt themes and plugins. The install
, .cache
, config
, and scripts
folders are all for this setup.
The order of execution is pretty straightforward, .zshrc
get sourced automatically by zsh, this defines $ZDOTDIR
as $HOME/.zshconfig
, $ZSH
as $ZDOTDIR/ohmyzsh
, $ZSH_CUSTOM
as $HOME/.zshconfig
, and sources the ohmyzsh (OMZ) initialization script located at $ZSH/.oh-my-zsh
. OMZ sources all .zsh
files located in $ZSH_CUSTOM
which in this case will only source profile.zsh
. Then, profile.zsh
recursively sources all .zsh
files in the $ZDOTDIR/scripts
directory allowing for an organizable way to extend this configuration.
See the documentation section for more on each script.
scritps/kbhelper.zsh
- Integrates text-editor-like prompt selection using the ZLEscripts/symlinks.zsh
- Automatically links files in$HOME
to their respective file inconfigs
. Makes a backup of any files that would be overwriten, can be found in.cache/.old
.scripts/utils/ssh.zsh
- Script to automatically add ssh identities to the ssh agent, works best with OMZ'sssh-agent
plugin.configs/.gitconfig
- Custom git aliases for custom logging or for specific functionality
This is a script that uses the ZSH line editor to introduce baked in text selection similar to something like notepad or gedit. The ZLE can be very confusing and the only good resources I found were this article and the documentation.
I got the code from stackoverflow (see source for credits) and plan on improving it eventually as I finally got around to learning how it actually works. Essentially, it defines a "widget" as a callback function and then binds that callback to a keysequence in the terminal. The correct keysequences might vary depending on your terminal, use either the "Verbatim Insert" keystrok, normally Ctrl + V (^V
), or run showkey -a
and hit certain key combinations to see what bytesequence the terminal is receiving. In the future, I may add some interactive program that will prompt the user for certain keycombinations to cache them and use that for the bindings.
This script just adds specific things to $PATH and prevents the addition of duplicates
git log
aliases- These aliases are meant to be the default for
git log
. I got them from here and modified them as I wanted. I prefergit lg1
so I aliased that togit lg
. lg = lg1
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
- The spaces in the middle are necessary for the commit message to be evenly spaced
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' --all
- These aliases are meant to be the default for
- Utility Aliases
root = rev-parse --show-toplevel
- Usage:git root
. Used to show the root directory of the repository. Purely functionalwhatadded = lg --diff-filter=A
- Used to show which commit added a filewhattouched = lg --diff-filter=M
- Used to show which commits edited a file. "whattouched
" might seem weird, feel free to change.
The aliases and commands defined in here pair well with the git
plugin from ohmyzsh (defined as plugins
in .zshrc
).
grset [remote] [url]
-git remote set-url [remote] [url]
- A custom defined function that takes in two parameters,
remote
andurl
, to either set the url of a current remote repo or add it if it doesnt exist already. - Notice the
unalias
call right before, this is to undo the alias defined by OMZ in thegit
plugin. This is redirected to/dev/null
to silence the warning ifgrset
is not defined when called.
- A custom defined function that takes in two parameters,
grget [remote]
-git remote get-url [remote]
gl
-git lg
- See .gitconfiggl
-git lg --all
- Useful for including remote branches and stashed changesgmff
-git merge --ff-only
gmnff
-git merge --no-ff
glgrep
- Used to search for a regex pattern on
git log
. Used for when you don't want to search through commits manually to find that one change you made.
- Used to search for a regex pattern on
github [repository|user] [repository]
- Used to construct thessh
address for pulling from github. Wrap in `` to execute inline. Ex:git clone `github Sargates .zshconfig`
gitlab [repository|user] [repository]
- Exactly the same thing asgithub
, but usesed
to replacegithub
withgitlab
Probably not the most secure solution to add keys automatically, feel free to disable. See source code here.