Decio (beta)

Decio (beta)

Rambling notes from a sherpa sysadmin security informed tourist

12 Nov 2020

Ma config zsh

J’ai, donc, passé tout mon bazar en zsh 😀 en venant renforcer le front bien nourri des sysadmins, développeurs et blogueurs ayant franchi le pas.

Il faut dire qu’à ce trend comme à ma décision, a fortement contribué l’annonce du passage à zsh comme shell par défaut de macOS et Kali Linux, les deux systèmes que j’utilise le plus.

Dans le respect de cette tendance, je détaille ici mon fichier de configuration .zshrc ainsi que les options et gadgets introduits au fil des des expériences d’utilisation. Si vous n’avez pas encore franchi le pas et vous voulez changer votre shell par défaut pour zsh, vous pouvez utiliser la commande chsh:

chsh -s /bin/zsh

Quelques annotations techniques en préambule:

Dans macOS, à la place de l’émulateur proposé par défaut, j’utilise l’excellent iTerm2 qui propose des intégrations fort pratiques comme les notifications, la recherche contextuelle dans lhistorique et des utilitaires de gestion de fichiers en cli

Pour la partie “pimp” j’utilise le thème powerlevel10k

Pour pouvoir jouir de l’agrément graphique apporté par les symboles des services (comme github par ex.) et des systèmes d’exploitation dans la barre de statut du shell, il faut installer une police de caractère prenant en charge ces icônes. Dans mon cas j’ai choisi une version patché de la police FireCode appartenant à la collection Nerd Fonts Cette version particulière de FireCode a été opportunément patché pour afficher le dragon de Kali 😀👍

Comme éditeur de texte j’utilise vim (oui, j’ai appris à en sortir 😂), pour optimiser sa présentation je renseigne son fichier de configuration .vimrc

set hlsearch " met en évidence tous les résultats de la recherche
set ignorecase " recherche insensible à la casse 
set incsearch " affiche les résultats de la recherche de manière incrémentielle
set number " affiche le numéro de ligne
set noswapfile " Désactiver le fichier d'échange (swap)

Je complète les fonctionalités de base du système avec les outils & gadgets en ligne de commande suivants:

cheat cheatsheets en cli

thefuck magnifique correction de la commande précedente 😀

broot (pour macOS via Homebrew ➡️ brew install broot) pour naviger dans les dossiers (tree view)

speedtest-cli (pour macOS via Homebrew ➡️ brew install speedtest-cli)

Disk Usage/Free (pour macOS via Homebrew ➡️ brew install duf)

HSTR -HiSToRy- (pour macOS via Homebrew ➡️ brew install hstr)

duck le CLI de cyberduck (pour macOS via Homebrew ➡️ brew install duck)

noti (pour macOS via Homebrew ➡️ brew install noti)

fd alternative à find (pour macOS via Homebrew ➡️ brew install fd )

The Silver Searcher alternative rapide à find pour chercher dans le code (pour macOS via Homebrew ➡️ brew install the_silver_searcher)

et encore sous macOS:

brew install wget alternative à curl

brew install fortune pour les citations de la vachette

brew install cowsay la vachette parlante/pensante


voilà mon fichier de config macOS/linux .zshrc

#cowsay
cowsay "$(fortune -s)" | lolcat

# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

setopt AUTO_CD
setopt BEEP
#setopt CORRECT
setopt HIST_BEEP
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_FIND_NO_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_DUPS
setopt HIST_REDUCE_BLANKS
setopt HIST_SAVE_NO_DUPS
setopt HIST_VERIFY
# https://superuser.com/questions/232457/zsh-output-whole-history
setopt EXTENDED_HISTORY
setopt INC_APPEND_HISTORY
setopt INTERACTIVE_COMMENTS
setopt MAGIC_EQUAL_SUBST
setopt NO_NO_MATCH
setopt NOTIFY
setopt NUMERIC_GLOB_SORT
setopt PROMPT_SUBST
setopt SHARE_HISTORY
setopt histignorespace           # skip cmds w/ leading space from history

HISTFILE="$HOME/.cache/zsh_history"
HIST_STAMPS=mm/dd/yyyy
HISTSIZE=5000
SAVEHIST=5000
ZLE_RPROMPT_INDENT=0
WORDCHARS=${WORDCHARS//\/} # Don't consider certain characters part of the word
export HISTTIMEFORMAT="[%F %T] "

# hide EOL sign ('%')
PROMPT_EOL_MARK=""

# ZSH completion system
autoload -Uz compinit
# -U history-search-end https://unix.stackexchange.com/questions/97843/how-can-i-search-history-with-text-already-entered-at-the-prompt-in-zsh
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end

compinit -d ~/.cache/zcompdump
zstyle ':completion:*:*:*:*:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"

# configure key keybindings
bindkey -e                                        # emacs key bindings
bindkey ' ' magic-space                           # do history expansion on space
bindkey '^[[3;5~' kill-word                       # ctrl + Supr
bindkey '^[[3~' delete-char                       # delete
bindkey '^[[1;5C' forward-word                    # ctrl + ->
bindkey '^[[1;5D' backward-word                   # ctrl + <-
bindkey '^[[5~' beginning-of-buffer-or-history    # page up
bindkey '^[[6~' end-of-buffer-or-history          # page down
bindkey '^[[H' beginning-of-line                  # home
bindkey '^[[F' end-of-line                        # end
bindkey '^[[Z' undo                               # shift + tab undo last action
## bindkey for hstr control-r
bindkey -s "\C-r" "\C-a hstr -- \C-j"
#binfkey for history search https://unix.stackexchange.com/questions/97843/how-can-i-search-history-with-text-already-entered-at-the-prompt-in-zsh
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

# force zsh to show the complete history
# https://www.dontclickthis.run/zsh-expanded-history/
#   alias history="history 0"
    alias ls='ls --color=auto'
    alias ls='lsd --group-dirs first'
    alias treenav='broot'
    alias lstree='lsd --tree'	
    alias btop='btm -cT'
    alias bat='bat --theme=ansi-dark'
    alias cat='bat --pager=never'
    alias sc="source $HOME/.zshrc"
    alias c='clear' 
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    #upgrade Powerlevel10k
    alias p10kup='git -C ~/powerlevel10k pull'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
    alias diff='diff --color=auto'
#    alias ip='ip --color=auto'
    alias mylocalip="ifconfig en0 inet | grep 'inet ' | awk ' { print $2 } '"

## INTERNET meteo widgets wttr.in    
    alias meteo='curl -H "Accept-Language: fr" wttr.in'
    alias meteo2='curl -H "Accept-Language: fr" v2.wttr.in'
## INTERNET current public IP address
    alias myip='curl http://ipecho.net/plain; echo'
    alias myip2='curl icanhazip.com'
    alias myip3="dig +short myip.opendns.com @resolver1.opendns.com"
## INTERNET sppedtest (from brew)
    alias speedtest='speedtest-cli'
    alias hh=hstr
## better find (via brew)
    alias find=fd
## better grep (via brew)
    alias sgrep='ag'
## get rid of command not found ##
   alias cd..='cd ..'
 
## a quick way to get out of current directory ##
   alias ..='cd ..'
   alias ...='cd ../../../'
   alias ....='cd ../../../../'
   alias .....='cd ../../../../'
   alias .4='cd ../../../../'
   alias .5='cd ../../../../..'

# macOS aliasses
if [[ $OSTYPE == darwin* ]]; then
    alias flush='dscacheutil -flushcache'
# Apps
    alias browse="open -a /Applications/Brave\ Browser.app/"
    alias preview='open -a "Preview"'
# suffix aliases on the mac
    alias -s flac=open
    alias -s mp3=open
    alias -s ogg=open
    alias -s wav=open
    alias -s avi=open
    alias -s mpeg=open
    alias -s mpg=open
    alias -s wmv=open
    alias -s bmp=open
    alias -s png=open
    alias -s jpg=open
    alias -s jpeg=open
    alias -s gif=open
    alias -s pdf=open
    alias -s org=$BROWSER
    alias -s com=$BROWSER
    alias -s net=$BROWSER
    alias -s html=$BROWSER
# network
    alias mylocalip="ifconfig en0 inet | grep 'inet ' | awk ' { print $2 } '"
# cyberduck via brew
    alias ftp='duck'
# integration iTerm2 
    test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
fi

    export LESS_TERMCAP_mb=$'\E[1;31m'     # begin blink
    export LESS_TERMCAP_md=$'\E[1;36m'     # begin bold
    export LESS_TERMCAP_me=$'\E[0m'        # reset bold/blink
    export LESS_TERMCAP_so=$'\E[01;33m'    # begin reverse video
    export LESS_TERMCAP_se=$'\E[0m'        # reset reverse video
    export LESS_TERMCAP_us=$'\E[1;32m'     # begin underline
    export LESS_TERMCAP_ue=$'\E[0m'        # reset underline

    # Take advantage of $LS_COLORS for completion as well
    zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"

# some more ls aliases
    alias ll='ls -l'
    alias la='ls -A'
    alias l='ls -CF'

export VISUAL=vim
export EDITOR=$VISUAL
export HSTR_CONFIG=hicolor

eval $(thefuck --alias)
source ~/powerlevel10k/powerlevel10k.zsh-theme
source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
export PATH="/usr/local/sbin:$PATH"

Le résultat visuel dans MacOS:

Le résultat visuel dans Kali Linux

Mis à part le côté satisfaisant pour l’œil du tuning graphique, à l’usage, je suis trés content du résultat notamment par les prestations et les avantages apportés par ce shell comme l’historique partagé entre les différentes consoles et l’autocomplétion des commandes, par ex.

Un seul petit problème à l’actif, rencontré sous macOS qui se manifestait par un lag de quelques seconds lors du premier lancement du terminal pour arriver à l’invite de commande du shell, probablement causé par la routine de mise à jour du thème qui s’effectue à chaque démarrage.

J’ai pu résoudre en mesurant les performances au boot et en installant une version de git indépendant du -trés lourd- xcode.