zkk / Building mouseless environment - Matthieu Cneude



Parte I - Linux

A General Linux Overview

The Fabulous Manual

man <comando>
man <section> <commando>
<comando> -h
<comando> --help

Troubleshooting

Going Deeper

The Power Is In Your Fingers

Efficient Typing: The Two Rules

Due regole da seguire per due settimane:

Going Deeper

Siti per verificare la velocità di battitura:

Preparing Your System for Arch Linux

Burning the Arch Linux ISO

Andare alla pagina di download di archlinux-2023.10.14-x86_64.ISO. Caratteristiche della Macchina Virtuale (virt-manager):

Personalizzare la configurazione per aggiungere una cartella condivisa, aggiungere hardware tipo Filesystem:

Flaggare Enable shared memory nella scheda Memory. Riga da aggiungere in /etc/fstab:

/<target-path>  /<mount-point>  virtiofs  defaults  0 0

AVVIA INSTALLAZIONE

Configuring the Arch Linux Live System

Keyboard Layout
clear
ls /usr/share/kbd/keymaps/**/*.map.gz | grep "it"
loadkeys it
Connecting to the internet
ip link
iwctl  # WiFi connection
[iwd]# device list
[iwd]# station <device> get-networks
[iwd]# station <device> connnect "<network>"
[iwd]# station <device> show
[iwd]# exit
ping -c 5 google.com
ping -c 8.8.8.8
dhcpcd &  # start DHCP client
System Clock
timedatectl set-ntp true
BIOS or UEFI?

Se esiste la seguente directory significa che il nostro sistema monta UEFI:

ls /sys/firmware/efi/efivars

Partitioning the Hard Disk

lsblk
Wiping Your Hard Disk
dd if=/dev/zero of=/dev/vda status=progress
Using fdisk
fdisk /dev/vda
Boot Partition
Command (m for help): g
Created a new GPT disklabel (GUID: <some_GUID>).
  
Command (m for help): n
Partition number (1-128, default 1): <ENTER>
First sector (2048-71567838, default 2048): <ENTER>
Last sector, +sectors or +size{K,M,G,T,P} (2048-71567838, default 71567838): +512M
Created a new partition 1 of type Linux filesystem and of size 512MiB.
UEFI Boot Mode
Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 1
Changed type of partition 'Linux filesystem' to 'EFI System'
BIOS Boot Mode
Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 4
Changed type of partition 'Linux filesystem' to 'BIOS boot'
Root and Swap Partition

Scrivo le variazioni su disco:

  Command (m for help): w

Formatting the Partitions

The UEFI Boot partition
mkfs.fat -F32 <your_boot_partition>

Nessuna formattazione in caso di BIOS Boot partition.

Root and Swap Filesystem
mkswap /dev/vda2
swapon /dev/vda2
mkfs.ext4 /dev/vda3

Mounting the Filesystems

Mounting the Root Partition
mount /dev/vda3 /mnt
ls /mnt
UEFI and the Boot Partition
mkdir -p /mnt/boot/efi
mount /dev/vda1 /mnt/boot/efi

Nel caso di BIOS non servirebbe neanche la partizione creata.

Troubleshooting Your Internet Access

Going Deeper

man fdisk

Installing Arch Linux

Installing the Base Packages

pacstrap /mnt base base-devel linux linux-firmware

Mounting Partitions Automatically

genfstab -U /mnt >> /mnt/etc/fstab

Changing The Root Directory

arch-chroot /mnt

The Root User’s Password

passwd

Through Time and Space: Configuring the Timezone

ln -sf /usr/share/zoneinfo/Europe/Rome /etc/localtime

Choose Your Locale

echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
echo "KEYMAP=it" > /etc/vconsole.conf

Naming Your New World

echo "MyArch" > /etc/hostname

GRUB, The Linux Bootloader

Bootloader With a UEFI
pacman -S grub efibootmgr
grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/boot/efi
Bootloader With a BIOS
pacman -S grub
grub-install /dev/vda
Creating The GRUB Configuration (BIOS and UEFI)
grub-mkconfig -o /boot/grub/grub.cfg

Enabling the Network Manager

pacman -S networkmanager
systemctl enable NetworkManager.service

Diving in the Shell

Command-Line 101
man <command
ls
grep <pattern> <input>
cat <input>
less <input>
ip <object>
ping <host>
dd if=<source> of=<destination>
fdisk <device>
mount <device> <directory>
timedatectl
A Good Complement to the Manual
pacman -S tldr
tldr <comando>
Input Output Redirections
touch test
echo "hello" > test
cat test
echo "bye" > test
cat test
echo "good morning" >> test
cat test
Pipes

Redirige l’output di un comando verso l’input di un altro comando:

echo "hello" | cat
Input and Arguments

Se ne deduce che echo, non avendo il flusso input, non può essere concatenato dopo la pipe:

ls | echo

Non produce nessun output. Viceversa, xargs trasforma l’output di ls in argomenti che possono essere ricevuti da echo:

ls | xargs | echo

Rebooting The System

exit
reboot

Troubleshooting Pacman

pacman -Syu

Going Deeper

Welcome To Linux

Collegare SPICE

Una volta verificato che la macchina funziona (entriamo come root in quanto non abbiamo ancora creato un utente) spegnamo la macchina:

poweroff

Tramite virt-manager modifichiamo lo Schermo Spice settando la porta in modo manuale al numero 59** (per comodità) per non farla confliggere con le altre macchine in caso siano utilizzate insieme. Ora predispongo un tasto rapido per avviare la macchina in modalità Full Screen nel Window Manager i3-wm e ricarico la configurazione ($mod+Shift+c):

bindsym $mod+k exec virsh -c qemu:///system start VM-Arch && sleep 2 && spicy -h localhost -p 5903 -f

Preferisco utilizzare Spice perchè, con Window Manager i3-wm, posso cambiare WorkSpace facilmente mentre con virt-viewer mi crea problemi.

Connecting to The Internet, Third Round

Using the Wi-Fi

Attivare la connessione inserendo, se necessario, la password:

nmtui

Se non dovesse funzionare provare i seguenti comandi:

systemctl enable NetworkManager.service
systemctl start NetworkManager.service

Installing the Manuals

pacman -S man man-pages

Processes

The Init Process: systemd

systemd è il primo processo avviato da Linux (PID 1) dal quale partono tutti gli altri:

pstree
ps -eF
systemctl list-unit-files
systemctl list-unit-files --type service

systemd gestisce 11 tipi di unit che possono essere abilitate, disabilitate e configurate:

systemctl enable <unit>.<type>
systemctl disable <unit>.<type>

Esempio:

systemctl enable NetworkManager.service
systemctl start NetworkManager.service
cat /usd/lib/systemd/system/NetworkManager.service
Logging the Init Process With journald

journald registra tutti gli eventi del sistema:

journalctl
journalctl -f
journalctl -b
journalctl -k
journalctl -u <service>
journalctl --since='yesterday'
journalctl -p err
journalctl -o verbose
Processes As Files

Il seguente comando mostra tutti i file del processo che si riferisce al terminale in utilizzo:

ls -l "/proc/$$"

Mantre il seguente comando stampa tutte le variabili d’ambiente:

cat /proc/$$/environ
Environment Variables

Le variabili d’ambiente sono strettamente collegate al processo e sono utilizzabili anche dai processi figli. Per stampare le variabili d’ambiente collegate alla shell di lavoro:

printenv
printenv SHELL

Creating A New User

useradd -m -g wheel -s /bin/bash max
passwd max
cat /etc/passwd

Verifichiamo se funziona il comando sudo:

su max
sudo echo "Prova"
exit

Corregeremo più avanti l’errore, intanto installiamo neovim:

pacman -S neovim

The Default Text Editors

Il seguente comando segnala errore in quanto non è stata ancora dichiarata la variabile d’ambiente EDITOR:

visudo
The Return of the Environment Variable
export EDITOR=nvim
echo EDITOR
echo "$EDITOR"
Trying visudo Again
cp /etc/sudoers ~/sudoers-backup
cp /etc/sudoers "$HOME/sudoers-backup"

First Steps In Neovim

Neovim Modes

Modalità e come entrare:

Per avere aiuto:

<nvim>:help vim-mode
Editing with Neovim

Abilitare l’utilizzo di sudo, salvare ed uscire dal file:

visudo

Quindi digitare /wheel.

Using Sudo

Ora la seguente sequenza non dovrebbe più dare errori:

su max
sudo echo "Prova"
exit

Cartella Condivisa (KVM)

Modifico il file /etc/fstab per aggiungere la cartella condivisa Guest/Host:

su max
cd
mkdir ~/shared
sudo nvim /etc/fstab

Inserisco le seguenti righe:

# shared
/shared    /home/max/shared    virtiofs    0    0

Carico la nuova configurazione e riavvio:

sudo mount -a
ls ~/shared
exit
reboot

Best Practices For Linux Shells

Strings
echo hello
echo "hello"
echo 'hello'
Globbing
ls /usr/share/kbd/keymaps/**/*.map.gz
Strings And Quotes
export LS=*.txt
touch uno.txt
touch due.txt
ls
ls $LS
ls "$LS"
ls '$LS'

Going Deeper

Manual
man boot
man useradd
man systemd
man systemd.unit
man systemd.service
man systemd.target
man nvim
man 7 glob

Graphical Interface

The X Window System

Installing X
sudo pacman -S xorg

URxvt, Our Terminal Emulator

pacman -S rxvt-unicode
sudo !!

Video Terminals and TTYs

L’emulatore di terminale può interagire solo con un processo per volta. Tutti possono essere messi in background o richiamati in foregroud:

bg
fg

Per cambiare TTY usando SPICE e senza X:

tty
<ALT+FX>

Per cambiare TTY usando SPICE in ambiente X:

sudo chvt <N>

Quando viene lanciato l’emulatore (es. URxvt) vengono creati (vedi figura):

PTY (master) gestisce input da tastiera ed output sul display passando i dati a PTS che interroga e riceve risposta dalla shell.

Installing i3 Window Manager

sudo pacman -S i3-wm
i3

L’ultimo comando da un errore in quanto non c’è ancora X-Server in esecuzione.

Launching X

sudo pacman -S xorg-xinit
nvim ~/.xinitrc

Insersco il seguente codice:

exec i3

Keyboard Layout for X

localectl --no-convert set-x11-keymap it

Installing Fonts

sudo pacman -S ttf-dejavu

Launching i3

Dovrebbe funzionare senza reboot:

startx

Going Deeper

Part II - Mouseless Tools

First Steps in i3 Window Manager

Per le Macchine Virtuali create con virt-manager scelgo Alt come tasto funzione invece che Win.

Screen Resolution

<Alt+Ener> apre l’emulatore di terminale, quindi:

sudo pacman -S arandr
arandr

Per chiudere l’applicazione (da terminale) premo la combinazione di tasti <Ctrl+c>. Per aprire l’applicazione e metterla in background:

arandr &

L’utilizzo di arandr ha evidenziato che non è presente la risoluzione corretta dei 2 display, sia del portatile Asus che il display Samsung, per Asus:

cvt 1366 768
# 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
xrandr --newmode "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
xrandr --addmode Virtual-1 1368x768_60.00
xrandr --output Virtual-1 --mode 1368x760_60.00

Per il display Samsung:

cvt 1600 900
# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
xrandr --newmode "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
xrandr --addmode Virtual-1 1600x900_60.00
xrandr --output Virtual-1 --mode 1600x900_60.00

Per rendere definitiva la configurazione aggiungo i 3 comandi xrandr nel file ~/.xinitrc prima dell’esecuzione del Window Managera secondo del display che voglio usare.

i3bar and i3status

sudo pacman -S i3status

Poi la combinazione di tasti <Alt+Shift+r> per riavviare il window manager e rendere effettiva l’installazione di i3status.

Installing Your Favorite Browser

sudo pacman -S chromium

Program Launcher

sudo pacman -S dmenu

Copy and Paste

sudo pacman -S xsel

Istruzioni:

Pasting From a PDF

sudo pacman -S zathura-pdf-mupdf
chromium <file.pdf>
zathura <file.pdf>

zathura funziona come neovim, per abilitare la possibilità di copiare testo nella clipboard aggiungiamo la seguente riga nel file di configurazione ~/.config/zathura/zhaturarc:

set selection-clipboard clipboard

The Book Companion

sudo pacman -S unzip
curl -L -o ~/companion.zip https://github.com/Phantas0s/mouseless-book-companion/archive/master.zip
cd
unzip ./companion.zip
mv ~/mouseless-book-companion-master ~/mouseless_book_companion
cd ~/mouseless_book_companion

Going Deeper

Configuring URxvt

The Colors of the Terminal

mkdir "~/.config/X11"
touch "~/.config/X11/.Xresources"
cd ~/.config/X11/
nvim ~/.config/X11/.Xresources

Aggiungo le personalizzazioni presenti nel corrispondente file scaricato poi le carico:

xrdb -merge ~/.config/X11/.Xresources
xrdb -query -all

Restart URxvt. Aggiungo la seguente riga al file ~/.xinitrc:

xrdb -merge ~/.config/X11/.Xresources

Configuring URxvt

Character Fonts
fc-list

Ed aggiungo il font che voglio utilizzare nel file ~/.config/X11/.Xresources:

URxvt*font: xft:DejaVuSansMono:size=14:antialias=true
URxvt*letterSpace: -1
Window Default

Agginugo le seguenti righe al file ~/.config/X11/.Xresources:

URxvt*borderLess: false
URxvt*externalBorder: 0
URxvt*internalBorder: 0
URxvt*scrollBar: false
URxvt*saveLines: 5000

URxvt Daemon

Aggiungo la seguente riga al file ~/.xinitrc:

urxvtd -o -q -f

Going Deeper

The Basics of Neovim

Configuring Neovim

file init.vi

Inserisco la seguente riga nel file ~/.config/nvim/init.vi (linguaggio vim script):

set clipboard+=unnamedplus
file init.lua

Ho fatto la scelta di configurare Neovim tramite init.lua. Abilito la possibilità di incollare in Neovim (p) qualcosa che si è copiato da altre applicazioni. Inserisco quindi la seguente riga nel file ~/.config/nvim/init.lua (linguaggio lua):

vim.opt.clipboard:append { "unnamedplus" }

Forget the Arrow Keys

Inserisco le seguenti configurazioni nel file ~/.config/nvim/init.vi, (linguaggio init script):

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

Viceversa le seguenti righe per il file ~/.config/nvim/init.lua, (linguaggio lua):

vim.keymap.set('!', '<Up>', '<Nop>')
vim.keymap.set('!', '<Down>', '<Nop>')
vim.keymap.set('!', '<Left>', '<Nop>')
vim.keymap.set('!', '<Right>', '<Nop>')

Undo And Redo

The Language of Neovim

Operators

All’interno di neovim:

:help operator
Text Objects

All’interno di neovim digitare:

help text-objects

A Basic Configuration

Neovim’s Options

Istruzioni da digitare all’interno di neovim:

Swap Files

Aggiungo la seguente configurazione al file ~/.config/nvim/init.vim (linguaggio vim script):

" no swap file
set noswapfile
Undo Tree

Creo la cartella ~/.config/nvim/undo ed inserisco la seguente configurazione nel file ~/.config/nvim/init.vim (linguaggio vim script):

" save undo-trees in files
set undofile
set undodir=$HOME/.config/nvim/undo
set undolevels=10000
set undoreload=10000
General Options

Altre configigurazioni da aggiungere al file ~/.config/nvim/init.vim (linguaggio vim script):

" set line number
set number

" use 2 spaces instead of tab copy indent from
" current line when starting a new line
set autoindent
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
~/.config/nvim/init.lua

Medesime configurazioni dei paragrafi precendenti inserite nel file ~/.config/nvim/init.lua (linguaggio lua):

" noswapfile
vim.opt.swapfile = false
  
" save undo-trees in files
vim.opt.undofile = true
vim-opt.undodir = {"$HOME/.config/nvim/undo"}
vim.opt.undolevels = 10000
vim.opt.undoreload = 10000
  
" set line number
vim.opt.number = true
  
" use 2 spaces instead of tab
" copy indent from current line when starting a new line
vim.opt.autoindent = true
vim.opt.expandtab = true
vim.opt.tabstop = 2
vim.opt.softtabstop = 2
vim.opt.shiftwidth = 2

Going Deeper

Pacman and Yay

Official Repositories

Updating Your System

sudo pacman -Syu

Removing Packages

sudo pacman -Rs <package>

Searching Packages

Informazioni sui pacchetti disponibili nei repository:

sudo pacman -Ss php

Informazioni sui pacchetti installati:

sudo pacman -Qs php

Informazioni sui pacchetti del repository AUR:

sudo pacman -Qm php

Pacman Cache

Pulire la cache:

sudo pacman -Scc

The Arch User Repository (AUR)

The Package Manager Yay

Installazione:

sudo pacman -S git
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -s
sudo pacman -U yay-<version>.pkg.tar.zst
yay --version

Clearing Yay Cache

yay -Sc --aur

Installing Packages With Yay

yay -S urxvt-tabbedex-mina86-git

Adding Tabs for URxvt

Copio dai files scaricati la configurazione all’interno del file ~/.config/X11/.Xresources e ricarico la configurazione:

xrdb -merge $HOME/.config/X11/.Xresources

Neovim Language Extensions

yay -S python-neovim python2-neovim ruby-neovim

Ulteriori informazioni all’interno di neovim:

:help provider

Pacman Troubleshooting

cat /var/log/pacman.log

Pacman Configuration

cat /etc/pacman.conf

Going Deeper

Pagine del manuale:

man 5 pacman.conf

Dotfiles

Utile il programma Stow :

sudo pacman -S stow

Istruzioni per come funziona il programma al seguente Link .

Nel libro viene invece creato uno script che, ogni volta che viene eseguito, elimina cartelle e files del computer sostituendoli con dei link simbolici ai corrispondenti che sono presenti nella cartella dotfiles. Questo script, eseguito su una nuova installazione dopo avere scaricato i dotfiles dal sito GitHub, come detto sopra cancella file e directory del sistema appena installato e li sostituisce con quelli appena scaricati da GitHub.

The Structure of the Dotfiles Project

utilizzo di Stow

All’interno della cartella ~/dotfiles vengono create le cartelle dei progetti. Ad esempio nella cartella ~/dotfiles/i3 mettiamo tutti i file o le cartelle che riguardano il window manager i3. La stessa cosa facciamo per tenere traccia dei file di configurazione di neovim o X11 creando le rispettive cartelle:

mkdir ~/dotfiles
cd ~/dotfiles
mkdir i3
mkdir nvim
mkdir X11

Adesso sposto files e cartelle avendo cura di mantenere, all’interno delle cartelle create, la stessa struttura che hanno nella mia home directory. Ad esempio il file ~/.config/nvim/init.vim verrà spostato in ~/dotfiles/nvim/.config/nvim/init.vim. Una volta spostato tutti i file e cartelle di cui vogliamo tenere traccia possiamo utilizzare stow:

cd ~/dotfiles
stow i3
stow nvim
stow X11

Il programma ricrea, tramite link simbolici sotto la mia home directory /home/max, la medesima struttura che trova all’interno delle varie cartelle dei progetti presenti nelle varie cartelle sotto ~/dotfiles. Il difetto principale di stow è che se trova già un file presente nella cartella di destinazione (cosa che succederebbe in caso di prima installazione di una macchina Linux) abortisce l’operazione. Ne consegue che, prima di creare i link simbolici alla cartella ~/dotfiles dovremo cancellare i vari file che saranno sostituita da questi.

Se questa è un’operazione abbastanza semplice da mano mano che si aggiungono files al nostro archivio (si spostano file o cartelle intere e poi si esegue stow) la cosa diventa un po’ più difficile se l’operazione va fatta massivamente su tutti i file presenti in ~/dotfiles (come nel caso di una nuova installazione. Per questo motivo è utile creare uno script che, in ogni momento (ed a maggior ragione alla prima installazione di una nuova macchina), cancella files e directory di destinazione (se esistenti) e li sostituisce con dei link simbolici a quelli presenti nella directory ~/dotfiles.

utilizzo di install.sh

Iniziamo con la preparazione della ~/dotfiles inserendo i file di configurazione:

E’ da sottolineare che nel caso della creazione di uno script /ad hoc/ possiamo evitare di replicare, all’interno della cartella ~/dotfiles, la stessa struttura che i files hanno nella nostra home directory ma possiamo mettere i file dove e come vogliamo e scrivere lo script di conseguenza.

mkdir ~/dotfiles
cd ~/dotfiles
mkdir nvim X11
cp -R ~/.config/nvim/init.vim ~/dotfiles/nvim
cp -R ~/.config/X11/.Xresources ~/dotfiles/X11

Our First Bash Script

Vedere tra i file caricati delle lezioni ~/dotfiles/install.sh.

Running A Shell Script

./install.sh  # With this command, the OS will run the script as a program. The OS doesn’t know what program to use to read the file, so it will use the one specified by the shebang. A new non-interactive subshell will be created where the script will run.
bash install.sh  # This command bypasses the shebang and will run the shell in a Bash subshell.
source ./install.sh  # If you don’t want to use a subshell to run the script, this command will run it in your actual shell

Vengono dati i permessi di esecuzione al file e successivamente eseguito:

chmod u+x ~/dotfiles/install.sh
./install.sh

Making Our Dotfiles Public

sudo pacman -S git
git config --global user.email "maxmatty@gmail.com"
git config --global user.name "Massimo Fontana"

Creazione account su GitHub .

The SSH Protocol

Creazione della chiave pubblica e privata:

sudo pacman -S openssh
ssh-keygen

Vengono creati i seguenti files:

Adding Your SSH Public Key to GitHub

Dall’account GitHub: “Settings” > “SSH and GPG keys” > “New SSH key”. Copiare il contenuto della chiave pubblica (rsa.pub). Dall’account GitHub premere “New” e creare il repository dotfiles. Inizializzo il progetto in locale:

cd ~/dotfiles
git config --global init.defaultBranch main
git init
git remote add origin git@github.com:max-matty/dotfiles.git

Eseguo il commit iniziale:

git add *
git commit -m "First commit"
git push origin main

Going Deeper

General Articles
Getting Inspired

i3: A Deeper Dive

Configuring i3

Default Configuration

Il file di configurazione è ~/.config/i3/config. Per vedere i possibili tasti da utilizzare come tasto $mod:

xmodmap

Per aumentare la grandezza del carattere modifico la seguente riga:

font pango:monospace 12
Moving Windows and Changing Focus

Sposta il focus tra le varie finestre:

# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right

La scorciatoria $mod+h confligge con un’altra già definita (vedi punto successivo Split containers).

Muove le varie finestre:

# change move focus window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
Split containers

$mod+h confligge, quindi modifico la configurazione:

# split in horizontal orientation
bindsym $mod+Ctrl+h split v
# split in vertical orientation
bindsym $mod+Ctrl+v split h
Workspaces
workspace_auto_back_and_forth yes  # premendo uno workspace una seconda volta torna al precedente

Per far partire un programma nel Workspace 2:

assign [class="firefox" instance="Navigator"] $ws2

Per conoscere class e instance lanciare il seguente comando da terminale:

xprop | grep WM_CLASS

E cliccare all’interno della finestra del programma di cui si vuole conoscere i valori, esempio per firefox risulterà:

WM_CLASS(STRING) = "Navigator", "firefox"

Il primo elemento è instance ed il secondo è class.

Resizing Windows
bindsym h resize shrink width 10 px or 10 ppt
bindsym j resize grow height 10 px or 10 ppt
bindsym k resize shrink height 10 px or 10 ppt
bindsym l resize grow width 10 px or 10 ppt

Disabilitare il focus sulla finestra in cui si trova il mouse:

focus_follows_mouse no
Locking Your Screen
sudo pacman -S i3lock
sudo pacman -S xss-lock
sudo pacman -S imagemagick
sudo pacman -S scrot
Salvaschermo con immagine

Crea scorciatoia per bloccare lo schermo. Aggiungo il seguente codice di configurazione al file ~/.config/i3/config:

set $i3lockwall i3lock -n -i image.png
bindsym $mod+x exec --no-startup-id $i3lockwall

Ed imposto il salvaschermo per X aggiungendo le seguenti righe al file ~/.xinitrc:

xset s 300
xss-lock -l -- i3lock -n -i image.png &
Salvaschermo con effetto blur

Crea scorciatoia per bloccare lo schermo scrivendo uno script all’indirizzo ~/.config/i3/scripts/lock.sh come segue:

#!/bin/sh
img=/tmp/i3lock.png
scrot -o $img
convert $img -scale 10% -scale 1000% $img
i3lock -n -i $img

Ed aggiungendo le seguenti righe al file di configurazione ~/.config/i3/config:

set $i3lockwall sh ~/.config/i3/scripts/lock.sh
bindsym $mod+x exec --no-startup-id $i3lockwall

Ed imposto il salvaschermo per X aggiungendo le seguenti righe al file di configurazione ~/.xinitrc:

xset s 300
xss-lock -l -- sh ~/.config/i3/scripts/lock.sh &
TODO Lock, Shutdown, and Reboot Menu

Wallpaper

sudo pacman -S feh
mkdir -p ~/.config/i3/feh

Ed inserisco la seguente riga di codice all’interno del file ~/.config/i3/config:

exec --no-startup-id feh --no-fehbg --bg-fill ~/.config/i3/feh/<my_image>`

Necessario logout e login da i3wm.

Floating Windows

Modifico il file di configurazione ~/.config/i3/config aggiungendo le seguenti righe:

# floating pop up automatically
for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
for_window [class="Arandr"] floating enable

Colors and Style

Copiare dai file scaricati la configurazione da inserire nel file ~/.config/i3/config.

Scratchpad

Creo uno shortcut per visualizzare il terminale “al volo” e per visualizzare il comando htop.

sudo pacman -S htop

E procedo alla configurazione del file ~/.config/i3/config:

# Terminal scratchpad
for_window [instance="urxvt_scratchpad"] move to scratchpad, border none
bindsym $mod+Shift+t [instance="urxvt_scratchpad"] scratchpad show
exec urxvtc -name urxvt_scratchpad

# htop scratchpad
for_window [instance="htop_scratchpad"] move to scratchpad, border none
bindsym $mod+Shift+p [instance="htop_scratchpad"] scratchpad show
exec urxvtc -name htop_scratchpad -e htop

Se si esce dal terminale scratchpad tramite exit non si potra più utilizzarlo nella stessa sessione di X ma si dovrà fare logout e login. Stesso discorso per htop.

The i3 Status Bar

Copiare dai files scaricati la configurazione ed inserirla nel file ~/.config/i3/i3status.conf. Sostituire quindi all’interno del file ~/.config/i3/config la sezione bar {} copiando dal file scaricato.

Managing Your Screen

Tramite l’utilizzo di arandr salvo i files di configurazione dei 2 monitors all’interno dei seguenti files:

Successivamente modifico la configurazione del file ~/.config/i3/config come segue:

set $mode_display Choose monitor: [a]cer [s]amsung

mode "$mode_display" {
    bindsym a exec --no-startup-id sh "$HOME/.config/X11/acer-monitor.sh",
        \ mode "default"
    bindsym s exec --no-startup-id sh "$HOME/.config/X11/samsung-monitor.sh",
        \ mode "default"
    # back to normal: Enter or Escape
    bindsym Return mode "default"
    bindsym Escape mode "default"
}

bindsym $mod+a mode "$mode_display"

Updating Our Dotfiles

utilizzo di Stow

Vedi le sezioni più sopra relative all’utilizzo di Stow, quindi aggiorna il repository in GitHub:

git add *
git commit -m "Add i3 config"
git push origin main
utilizzo di install.sh

Prima sposto la cartella di configurazione:

mv ~/.config/i3 ~/dotfiles

Poi aggiungo le seguenti righe di codice allo script ~/dotfiles/install.sh:

######
# i3 #
######

rm -rf "$HOME/.config/i3"
ln -s "$HOME/dotfiles/i3" "$HOME/.config"

Infine aggiorno il repository di GitHub:

cd ~/dotfiles
./install.sh
git add *
git commit -m "Add i3 config"
git push origin main

Going Deeper

The Z-Shell (Zsh)

Zsh Config Files

sudo pacman -S zsh

Files di configurazione:

Verranno utilizzati solamente .zshrc e .zshenv pertanto creiamoli già dentro la nostra cartella ~/dotfiles:

mkdir ~/dotfiles/zsh
touch ~/dotfiles/zsh/.zshrc
touch ~/dotfiles/zsh/.zshenv

Ed aggiorniamo lo script ~/dotfiles/install.sh:

mkdir -p "$HOME/.config/zsh"
ln -sf "$HOME/dotfiles/zsh/.zshenv" "$HOME"
ln -sf "$HOME/dotfiles/zsh/.zshrc" "$HOME/.config/zsh"

Infine aggiorniamo il repository gitHub:

git add *
git commit -m "Add Zsh config"

Basic Zsh Configuration

Environment Variables

Copio dai files scaricati all’interno del file ~/dotfiles/zsh/.zhenv.

Aliases

Creiamo qualche alias nel file ~/dotfiles/zsh/aliases:

alias ll='ls -lah'
alias ga='git ass'
alias gc='git commit'
alias gp='git push'

Che andremo a caricare direttamente da ~/dotfiles/zsh/.zshrc tramite la seguente istruzione inserita nel medesimo file:

source "$XDG_CONFIG_HOME/zsh/aliases"

Aggiorniamo il file ~/dotfiles/install.sh:

ln -sf "$HOME/dotfiles/zsh/aliases" "$HOME/.config/zsh/aliases"

Ed eseguiamolo in modo che vengano creati i link simbolici:

nvim ~/dotfiles/zsh/aliases
Options

Aggiungiamo le seguenti opzioni al file ~/dotfiles/zsh/.zshrc:

setopt AUTO_PARAM_SLASH
unsetopt CASE_GLOB
Zsh Completion System

Aggiungo le seguenti righe di configurazione al file ~/dotfiles/zsh/.zshrc:

autoload -U compinit; compinit

# Autocomplete hidden files
comp_options+=(globdots)
source ~/dotfiles/zsh/external/completion.zsh

Aggiungo il file ~/dotfiles/zsh/external/completion.zsh reperibile da quelli scaricati per il corso ed effettuo le seguenti aggiunnte al file ~/dotfiles/install.sh:

rm -rf "$HOME/.config/zsh/external"
ln -sf "$HOME/dotfiles/zsh/external" "$HOME/.config/zsh"

Aggiungo anche la seguente riga al file ~/dotfiles/zsh/.zshrc:

fpath=($ZDOTDIR/external $fpath)

Ed eseguo il file ~/dotfiles/install.sh:

cd
./dotfiles/install.sh

La funzione completion viene utilizzata come segue:

<inizio-comando><TAB>  # visualizza tutti i comandi che iniziano con le lettere digitate
<comando> -<TAB>  # visualizza tutte le opzioni del comando
Pimp My Zsh Prompt

Il file ~/dotfiles/zsh/external/prompt_purification_setup modifica il prompt di Zsh ed è reperibile dai file a corredo del libro. Aggiungo quindi la seguente riga al file di configurazione ~/dotfiles/zsh/.zshrc per caricarlo:

autoload -Uz promp_purification_setup; prompt_purification_setup
Zsh Directory Stack

La seguente configurazione permette di visualizzare le ultime 10 directory visitate tramile la pressione del comando d, ogni directory è contrassegnata da un numero da 0 a 9 (il numero 0 contrassegna la directory corrente. Per poter ternare ad una determinata directory è sufficiente digitare seguito dal tasto INVIO il numero collegato al percorso al quale si vuole tornare.

Configurazione da inserire nel file ~/dotfiles/zsh/.zshrc:

# Push the current directory visited on to the stack.
setopt AUTO_PUSHD
# Do not store duplicate directories in the stack.
setopt PUSHD_IGNORE_DUPS
# Do not print the directory stack after using pushd or popd.
setopt PUSHD_SILENT

Configurazione da inserire nel file ~/dotfiles/zsh/aliases:

alias d='dirs -v'
for index ({1..9}) alias "$index"="cd +${index}"; unset index
Zsh, Your New Best Friend
chsh -s $(which zsh)
reboot

Zsh With Vim Flavors

Enabling the Vi Mode

Aggiungo le seguenti righe al file di configurazione ~/dotfiles/zsh/.zshrc:

bindkey -v
export KEYTIMEOUT=1

Zsh Plugins

Zsh Additional Completion
sudo pacman -S zsh-completions

Da vedere insieme al precedente paragrafo Zsh Completion Systrem.

Zsh Syntax Highlighting
sudo pacman -S zsh-syntax-highlighting
Jumping To A Parent Directory

Aggiunto ~/dotfiles/zsh/external/bd.zsh che è uno script per risalire la struttura delle directories (con autocompletion):

bd <Tab>  # visualizza la struttura a monte della directory corrente per retrocedere anche di molte cartelle

Il comando sta per [b]ack [d]irectory.

Custom Scripts

Inserite altre funzioni caricate nel file $DOTFILES/zsh/scripts.sh che viene caricato all’interno di .zshrc:

source $DOTFILES/zsh/scripts.sh
The Fuzzy Finder fzf
sudo pacman -S fzf
sudo pacman -S ripgrep

Going Deeper

Zsh Documentation
Author’s dotfiles

Improving Your Mouseless Development Environment

Improving the Dotfiles Install Script

Modifica il file install.sh inserendo il nome delle variabili.

Adding And Configuring Fonts

mkdir ~/dotfiles/fonts

Cartella in cui metto i files dei fonts, poi modifico install.sh per fare copiare la cartella in ~/.local/share:

fc-cache -f
fc-list | grep -i <stringa>

Il comando fc-list ci permette di vedere il nome del font da inserire nei file di configurazione Xresources ed i3/config. Scegliamo 2 font diversi per poterne gestire la dimensione.

Desktop Notification With Dunst

sudo pacman -S dunst libnotify

Anche per dunst creo la cartella in ~/dotfiles/ e modifico il flie install.sh di conseguenza. Modifico anche ~/dotfiles/i3/config per avere tasti di scelta rapida:

# launch dunst and keybinding
exec --no-startup-id dunst
bindsym $mod+x exec dunstctl close-all
bindsym Ctrl+BackSpace exec dunstctl history-pop

Montaggio automatico chiavette usb

sudo pacman -S udiskie

Temi per le finestre

sudo pacman -S lxappearance

TODO Remapping Your Caps Lock

sudo pacman -S xcape
setxkbmap -option 'caps:ctrl_modifier'

TODO diff-so-fancy

sudo pacman -S diff-so-fancy
git config --global core.pager "diff-so-fancy | less --tabs=4 -RFX"
git add *
git commit -m "Some improvement"
git push origin main

Neovim: A Deeper Dive

TODO Mapping Keystrokes

:help key-notation
nnoremap <space> <nop>

Cercare nella cronologia dei comandi:

TODO CONFIGURAZIONI INTERMEDIE

sudo pacman -S tree
sudo pacman -S fd
sudo pacman -S glow
sudo pacman -S nodejs
sudo pacman -S yarn
sudo pacman -S npm
sudo pacman -S haskell-pandoc
sudo pacman -S pandoc-crossref
sudo pacman -S texlive-context
sudo pacman -S groff - non disinstallato
sudo pacman -S python-weasyprint
sudo pacman -S typst
sudo pacman -S tectonic
sudo pacman -S texlive-fontsrecommended
sudo pacman -S texlive-latex
sudo pacman -S texlive-xetex
sudo pacman -S pandoc-cli
sudo pacman -S texlive-bin
sudo pacman -S texlive-core
sudo pacman -S texlive-basic
sudo pacman -S texlive-latex
sudo pacman -S texlive-latexrecommanded
sudo pacman -S texlive-picture
sudo pacman -S texlive-latexextra
sudo pacman -S texlive-fontsrecommended
sudo pacman -S texlive-xetex

TODO The Terminal Multiplexer tmux

sudo pacman -S tmux

Tmux è sostanzialmente un server che gestisce sessioni (collegamenti tramite client). Si possono avere più sessioni attive e, ad ogni sessione, si possono collegare più terminali. Ogni terminale può aprire più finestre che, a loro volta, possono essere suddivise in diversi pannelli (pane), alcuni comandi:

tmux list-sessions
tmux attach-session -t <sessiond-name>
tmux new-session -s <session_name>
tmux kill-session -t <session_name>
tmux kill-server

The tmux’s prefix key is Ctrl+b by default che verrà combiato nel file di configurazione in Ctrl+Space.

mkdir $DOTFILES/tmux
touch $DOTFILES/tmux/tmux.conf

Aggiorno lo script ~/dotfiles/install.sh.

Nota che in tmux:

Installare i plugins tramite PREFIX SHIFT + I.

Il seguente plugin (inserito nel file di configurazione ~/dotfiles/tmux/tmux.conf:

set -g @plugin 'tmux-plugins/tmux-copycat'

Permette di cercare nell’output del pannello di tmux semplicemente tramite PREFIX /.

Altre installazioni:

sudo pacman -S tmuxp
tmuxp load dotfiles
pacman -S vi
pacman -S os-prober
pacman -S rofi
pacman -S network-manager-applet
pacman -S git-delta
pacman -S alsa-utils
pacman -S dialog
pacman -S xss-lock
pacman -S tree