--- title: 03 Terminal description: published: true date: 2024-11-24T11:45:11.626Z tags: editor: markdown dateCreated: 2023-04-30T06:05:33.890Z --- # Installing ZSH ZSH is a pretty cool lightweight shell that is very configurable, Install it with the following command sudo pacman -S zsh Now we are going to make ZSH the default shell with the following command chsh -s $(chsh -l | grep -m1 zsh) We are going to create zshrc config files in a central config folder for easy backups. mkdir ~/Config then create 2 files in there touch ~/Config/zshrc-global ~/Config/zshrc-user Now we need to create a new user zsh config folder mkdir ~/.config/zsh now we are going to symlink the config files to where zsh expects them to be sudo ln -sf ~/Config/zshrc-global /etc/zsh/zshrc ln -sf ~/Config/zshrc-user ~/.config/zsh/.zshrc Now we need to set the dotfile location in zshenv sudo vim /etc/zsh/zshenv Add in the following line export ZDOTDIR=~/.config/zsh Save and exit ZSH should be functional with a terrible prompt, so lets fix that first. # Installing a Powerline Font We are gonna need the right fonts for all the icons sudo pacman -S ttf-meslo-nerd Change the terminal/monospace font to MesloLGS NF Regular in your terminal or DE settings # Configuring Guake Guake is my terminal of choice, I like that it can split the window and it opens and closes fullscreen with a single button nice quick and easy. For KDE users there is Yauake, It is very much like Guake, but there are a ton more Guake clones out there, You should be able to follow this guide for most of them. Install Guake with the following command sudo pacman -S guake Now open guake preferences from your menu. Under General disable the tray icon and the startup popup Under Main Window Disable the Tab Bar and put the height and width full Under Appearance Set Meslo LGS Nerd Font Regular as your font, set Tango as your color scheme and set the transparency to your liking. Under Keyboard Shortcuts I set "Toggle Guake Visibility" to \`, this can give problems, in this case also set the hotkey in your DE to "guake", set "Split tab vertical" to CTRL + N, "Split tab horizontal" to CTRL + B, "Focus terminal above" to Ctrl + Up, "Focus terminal below" to Ctrl + Down, "Focus terminal on the left" to Ctrl + Left, "Focus terminal to the right" to Ctrl + Right, "Increase heigth" to Ctrl + Shift + Down, "Decrease Height" to Ctrl + Shift + Up, "Increase transparency" to Ctrl + Shift + Left and finally "Decrease transparancy" to Ctrl + Shift + Right Ofcourse you can config anything else you like, but for me this is enough # Configuring Alacritty I use Alacritty for a quick and fast terminal it works especially great with tiling window managers you can install it with the following command sudo pacman -S alacritty First we are going to create a config file for Alacritty touch ~/Config/alacritty.yml Now we are going to create the config folder alacritty expects mkdir ~/.config/alacritty And finally symlink the file to the location alacritty expects it to be. ln -sf ~/Config/alacritty.yml ~/.config/alacritty/alacritty.yml Now it is time to configure alacritty using the file nvim ~/Config/alacritty.yml We are gonna need some fonts to properly display the icons with our theme so add in the following lines, you can change the font, But I recommend putting this one first to follow along with the guide. ``` #MesloLGS font font: normal: family: MesloLGS Nerd Font style: Regular bold: family: MesloLGS Nerd Font style: Bold italic: family: MesloLGS Nerd Font style: Italic bold_italic: family: MesloLGS Nerd Font style: Bold Italic size: 11 ``` Setting a nice color theme is vital, The same applies here, you can change it later, but I recommend just following along for now. There are tons of color schemes available. ``` #Tango color theme colors: primary: background: '#000000' foreground: '#ffffff' normal: black: '#000000' red: '#cc0000' green: '#4e9a06' yellow: '#c4a000' blue: '#3465a4' magenta: '#75507b' cyan: '#06989a' white: '#d3d7cf' bright: black: '#555753' red: '#ef2929' green: '#8ae234' yellow: '#fce94f' blue: '#729fcf' magenta: '#ad7fa8' cyan: '#34e2e2' white: '#eeeeec' ``` Spawn a new terminal in the current location with CTRL + SHIFT + N ``` key_bindings: - { key: N, mods: Control|Shift, action: SpawnNewInstance } ``` # Powerlevel10K Powerlevel10K is a great theme for ZSH, it is very configurable and has a lot of cool features Sadly it is unmaintained, but it works fine, we can clone the repo into our /usr/share folder. sudo git clone https://github.com/romkatv/powerlevel10k.git /usr/share/zsh-theme-powerlevel10k/ Now we need to include the following lines in our zshrc-global file ``` #P10k source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme ``` And the following lines to our zshrc-user file ``` #P10k [[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh ``` To configure Powerlevel10K you must run the following command p10k configure Have some patience and run trough the interactive configuration Now we just need to symlink the config file to the expected location ln -sf ~/Config/p10k.zsh ~/.config/zsh/.p10k.zsh When you exit the terminal and start it again it should look all nice :) # Installing LSD lsd is like ls with colors, nice icons and other visual cues that help you. It is in the repos, simply install it with the following command sudo pacman -S lsd You can now run it with lsd, we will later alias ls to lsd in our zsh configuration. try the following command for example lsd -la ~ # Adding ZSH Options and Keybinds ZSH options change the default behavior so do keybinds You can add them all or just the ones you like to your zshrc-global file Give flag suggestions for programs ``` autoload -Uz compinit && compinit ``` Gives you a menu when navigating suggestions ``` zstyle ':completion:*' menu select zstyle ':completion::complete:*' gain-privileges 1 ``` History settings for ZSH ``` export HISTFILE=~/.config/zsh/.zsh_history export HISTSIZE=1000000 export SAVEHIST=1000000 setopt EXTENDED_HISTORY setopt HIST_IGNORE_ALL_DUPS setopt HIST_FIND_NO_DUPS setopt inc_append_history ``` Press up and down to search to matching history ``` bindkey "^[[A" history-beginning-search-backward bindkey "^[[B" history-beginning-search-forward ``` Case insensitive tab completion, Also enables cd doc/fo/su to go to /documents/folder/subfolder ``` zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' ``` I really don't see the use for Flow Control ``` unsetopt flow_control ``` Fix navigation keys ``` bindkey "^[[H" beginning-of-line bindkey "^[[F" end-of-line bindkey "^[[3~" delete-char bindkey "^[[5~" beginning-of-line bindkey "^[[6~" end-of-line ``` # Adding Aliases Aliases are simply alternatives for a string of text, as an easy example, v will type nvim, and sv will type sudo nvim. You can also chose to remove some or add more. Simply add the following text to one of your ~/config/zshrc files, user will set it for you, and global will set it for everyone, ``` alias a="awk" alias b="btrfs" alias c="cryptsetup" alias d="docker" alias e="echo" alias f="fdisk" alias g="git" alias h="history" alias j="jobs -l" alias k="kubectl" alias l="ls -la" alias m="man" alias n="neofetch" alias o="openssl" alias p="pacman" alias r="reboot" alias s="sudo" alias t="tail -f" alias u="uname" alias v="nvim" alias w="whence" alias sudo="sudo " alias ffs="sudo !!" alias distro="cat /etc/*-release" alias hk="cat ~/config/hotkeys" alias sv="sudo v" alias md="mkdir -p" alias tk="take" alias rmd="rm -rf" alias sgrep="grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} " alias hgrep="fc -El 0 | grep" alias please='sudo' alias phone='ssh houtworm@pinephone' alias server='ssh houtworm@server' alias game='gamemoderun mangohud' alias ytflac="youtube-dl -x --audio-format flac --prefer-ffmpeg" alias ytmkv="youtube-dl -F" alias lol='lolcat' alias cd1="cd .." alias cd2="cd ../.." alias cd3="cd ../../.." alias cd4="cd ../../../.." alias cd5="cd ../../../../.." alias cd6="cd ../../../../../.." alias cd7="cd ../../../../../../.." alias cd8="cd ../../../../../../../.." alias cd9="cd ../../../../../../../../.." alias scls="systemctl list-unit-files" alias scs="sudo systemctl status " alias scre="sudo systemctl restart " alias scst="sudo systemctl start " alias scsp="sudo systemctl stop " alias scen="sudo systemctl enable " alias scenn="sudo systemctl enable now " alias scdi="sudo systemctl disable " alias fwd="firewall-cmd" alias fwdlist="firewall-cmd --list-all-zones" alias fwdre="firewall-cmd --reload" alias gi="git init" alias ga="git add *" alias gc="git commit -m" alias gp="git push" alias me="ifconfig | grep "inet " | cut -b 9- | cut -d" " -f2" alias allcolor="for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$"\n"}; done" alias rainbow="printf "$BBLA\n$BRED\n$BGRE\n$BYEL\n$BBLU\n$BMAG\n$BCYA\n$BWHI\n\n"" alias dud="du -d 1 -h" alias duf="du -sh *" alias :q="exit" alias ls="lsd" alias ports="netstat -tulanp" alias compr="gcc -Wall -Wextra -Werror *.c && ./a.out && rm a.out" alias compra="gcc -Wall -Wextra -Werror *.c && ./a.out" alias norme="norminette -R CheckForbiddenSourceHeader" alias valg="gcc *.c -ggdb3 && valgrind --show-leak-kinds=all --leak-check=full --track-origins=yes ./a.out && rm a.out" alias valga="gcc *.c -ggdb3 && valgrind --show-leak-kinds=all --leak-check=full --track-origins=yes ./a.out" alias normsh="checkbashisms" alias banned='sudo fail2ban-client banned | tr -t "[{" " \n" | tr -d ":]},"' ``` # Adding ZSH Functions ZSH functions are like tiny scripts that perform a task, you can add the ones you think are useful to you to one of the zshrc files, I suggest global so anyone can use them :) Press Ctrl + Z to bring stuff to the background but also bring stuff back to the foreground instead of typing fg ``` backforeswitch () { if [[ $#BUFFER -eq 0 ]]; then BUFFER="fg" zle accept-line -w else zle push-input -w zle clear-screen -w fi } zle -N backforeswitch bindkey '^Z' backforeswitch ``` Press Esc twice to put sudo in front of your previous command. ``` sudoswitch() { [[ -z $BUFFER ]] && zle up-history if [[ $BUFFER == sudo\ * ]]; then LBUFFER="${LBUFFER#sudo }" elif [[ $BUFFER == $EDITOR\ * ]]; then LBUFFER="${LBUFFER#$EDITOR }" LBUFFER="sudoedit $LBUFFER" elif [[ $BUFFER == sudoedit\ * ]]; then LBUFFER="${LBUFFER#sudoedit }" LBUFFER="$EDITOR $LBUFFER" else LBUFFER="sudo $LBUFFER" fi } zle -N sudoswitch bindkey "\e\e" sudoswitch bindkey -M vicmd '\e\e' sudoswitch ``` Make the man pages all colorful ``` function man() { env \ LESS_TERMCAP_mb=$(printf "\e[1;31m") \ LESS_TERMCAP_md=$(printf "\e[1;31m") \ LESS_TERMCAP_me=$(printf "\e[0m") \ LESS_TERMCAP_se=$(printf "\e[0m") \ LESS_TERMCAP_so=$(printf "\e[0;37;102m") \ LESS_TERMCAP_ue=$(printf "\e[0m") \ LESS_TERMCAP_us=$(printf "\e[4;32m") \ PAGER="${commands[less]:-$PAGER}" \ _NROFF_U=1 \ GROFF_NO_SGR=1 \ PATH=${HOME}/bin:${PATH} \ man "$@" } ``` Creates a TAR archive of a file or folder. ``` function maketar() { tar cvzf "${1%%/}.tar.gz" "${1%%/}/"; } ``` Create a ZIP archive of a file or folder. ``` function makezip() { zip -r "${1%%/}.zip" "$1" ; } ``` Extracts any type of archive automagically ``` function extract { if []; then echo "Usage: extract ." else if [] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.tar.xz) tar xvJf $1 ;; *.lzma) unlzma $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x -ad $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *.xz) unxz $1 ;; *.exe) cabextract $1 ;; *) echo "extract: '$1' - unknown archive method" ;; esac else echo "$1 - file does not exist" fi fi } ``` The git riddle ``` function iacp() { if [] then echo "Usage: iacp " else git init git add * git commit -m "$3" git remote add $1 $2 git push --set-upstream $1 master fi } ``` The git push ``` function acp() { if [] then echo "Usage: acp " else git add * git commit -m "$1" git push fi } ``` take or tk = mkdir -p and cd in one ``` function take() { md "$1" cd "$1" } ``` Really clear the screen with Ctrl + L ``` clearbetter () { BUFFER="clear" zle accept-line -w } zle -N clearbetter bindkey '^L' clearbetter ``` Reload ZSH with Ctrl + S ``` resourcezsh () { BUFFER="exec -l zsh" zle accept-line -w BUFFER="clear" zle accept-line -w } zle -N resourcezsh bindkey '^S' resourcezsh ``` Exit with Ctrl + Q ``` ctrlqexit () { BUFFER=":q" zle accept-line -w } zle -N ctrlqexit bindkey '^Q' ctrlqexit ``` Unban IPs with fail2ban ``` unban () { sudo fail2ban-client unban $@ } ``` # ZSH Plugins To add plugins to ZSH we simply need to download them and source the main .zsh file of that plugin in one of your zshrc files. Below are the ones I use Fast Syntax Highlighting is great, it gives your input color based on brackets, if it is correct or not, etc git clone https://github.com/z-shell/F-Sy-H /usr/share/zsh/plugins/F-Sy-H Now simply source the .zsh file in your global zshrc by adding the following line to it ``` source /usr/share/zsh/plugins/F-Sy-H/F-Sy-H.plugin.zsh ``` Alias Tips helps you remember the aliases you set, if you don't use a set alias it will notify you of the alias in a way that doesn't annoy you. git clone https://github.com/djui/alias-tips /usr/share/zsh/plugins/alias-tips Now simply source the .zsh file in your global zshrc by adding the following line to it ``` source /usr/share/zsh/plugins/alias-tips/alias-tips.plugin.zsh ``` ZSH Autosuggestions is nice, it tries to complete a command based on your history git clone https://github.com/zsh-users/zsh-autosuggestions /usr/share/zsh/plugins/zsh-autosuggestions Now simply source the .zsh file in your global zshrc by adding the following line to it ``` source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh ``` Also add the following line to the /etc/zsh/zshenv file to drastically speed up this plugin ``` export ZSH_AUTOSUGGEST_MANUAL_REBIND ``` Z is a pretty cool plugin for fast navigation just type z nameoffolder and it will jump to it based on history. git clone https://github.com/agkozak/zsh-z /usr/share/zsh/plugins/z Now simply source the .zsh file in your global zshrc by adding the following line to it ``` source /usr/share/zsh/plugins/z/zsh-z.plugin.zsh ``` Also be sure to set the ZSHZ_DATA variable in /etc/zsh/zshenv by adding the following line to it ``` export ZSHZ_DATA=~/.config/zsh/.z ``` You can install any more you like, just be sure it doesn't slow down your shell. # Updating ZSH Plugins with Pacman Updating these plugins is important for compatibility and new features. Create a file for the script vim ~/Scripts/update-zshplugins.sh Add in the following content ``` git -C /usr/share/zsh/plugins/F-Sy-H pull git -C /usr/share/zsh/plugins/alias-tips pull git -C /usr/share/zsh/plugins/zsh-autosuggestions pull git -C /usr/share/zsh/plugins/z pull ``` create a file in the pacman hooks directory for zsh plugins sudo vim /usr/share/libalpm/hooks/zsh.hook Add in the following text ``` [Trigger] Operation = Upgrade Type = Package Target = * [Action] Description = Update ZSH Plugins When = PostTransaction Exec = /bin/bash /home/USERNAME/Scripts/update-zshplugins.sh ``` Save and exit and try to update your system, if you are lucky you have an update and you can see the script in action after the update. # ZSH Hotkeys Just a simple overview of all the hotkeys you can use Up and Down Arrow = Browse history matching current line Ctrl + A = Go to start of line Ctrl + B = Move 1 character back Ctrl + C = Cancel, Stop the current operation. Ctrl + D = Quit the session Ctrl + E = Go to end of line Ctrl + F = Move 1 character forward Ctrl + G = Nothing Ctrl + H = DOUBLE Delete Character before the cursor Ctrl + I = Nothing Ctrl + J = Nothing Ctrl + K = Remove everything behind the cursor Ctrl + L = clear screen Ctrl + M = Nothing Ctrl + N = Browse History matching current line Ctrl + O = Nothing Ctrl + P = Browse History matching current line Ctrl + Q = Quit, Types exit and presses enter. Ctrl + R = Search in History Ctrl + S = Nothing Ctrl + T = Nothing Ctrl + U = Delete everything before the cursor Ctrl + V = Nothing Ctrl + W = Delete the word before the cursor Ctrl + X = Nothing Ctrl + Y = Undo Ctrl + Z = toggle program to background and foreground # Installing Neofetch Neofetch is a cool tool that shows some system information and a asci art logo of your distro. Install it with the following command sudo pacman -S neofetch Now you can run it by just typing neofetch in a terminal :)