Parte I - Linux
A General Linux Overview
The Fabulous Manual
man <comando>
man <section> <commando>
<comando> -h
<comando> --helpTroubleshooting
Going Deeper
The Power Is In Your Fingers
Efficient Typing: The Two Rules
Due regole da seguire per due settimane:
- Appoggiare le dita correttamente sui tasti a,s,d,f e j,k,l,@;
- Sforzarsi di non guardare la tastiera.
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):
- Ram: 2.048 MB;
- Core: 2;
- Hard Disk: 20 GB;
- Nome: MyArch;
- Rete Virtuale: NAT.
Personalizzare la configurazione per aggiungere una cartella condivisa, aggiungere hardware tipo Filesystem:
- Driver: virtiofs;
- Source path: /home/max/shared;
- Target path: /shared.
Flaggare Enable shared memory nella scheda Memory. Riga da aggiungere in /etc/fstab:
/<target-path> /<mount-point> virtiofs defaults 0 0AVVIA INSTALLAZIONE
Configuring the Arch Linux Live System
Keyboard Layout
clear
ls /usr/share/kbd/keymaps/**/*.map.gz | grep "it"
loadkeys itConnecting 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 clientSystem Clock
timedatectl set-ntp trueBIOS or UEFI?
Se esiste la seguente directory significa che il nostro sistema monta UEFI:
ls /sys/firmware/efi/efivarsPartitioning the Hard Disk
lsblkWiping Your Hard Disk
dd if=/dev/zero of=/dev/vda status=progressUsing fdisk
fdisk /dev/vdaBoot 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
- swap: 2GB;
- root: lo spazio rimanente.
Scrivo le variazioni su disco:
Command (m for help): wFormatting 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/vda3Mounting the Filesystems
Mounting the Root Partition
mount /dev/vda3 /mnt
ls /mntUEFI and the Boot Partition
mkdir -p /mnt/boot/efi
mount /dev/vda1 /mnt/boot/efiNel caso di BIOS non servirebbe neanche la partizione creata.
Troubleshooting Your Internet Access
- Arch Wiki - Network Configuration / Wireless
- Arch Wiki - Network Configuration / Wireless Troubleshooting
- Arch Wiki - Android tethering
Going Deeper
man fdiskInstalling Arch Linux
Installing the Base Packages
pacstrap /mnt base base-devel linux linux-firmwareMounting Partitions Automatically
genfstab -U /mnt >> /mnt/etc/fstabChanging The Root Directory
arch-chroot /mntThe Root User’s Password
passwdThrough Time and Space: Configuring the Timezone
ln -sf /usr/share/zoneinfo/Europe/Rome /etc/localtimeChoose 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.confNaming Your New World
echo "MyArch" > /etc/hostnameGRUB, The Linux Bootloader
Bootloader With a UEFI
pacman -S grub efibootmgr
grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/boot/efiBootloader With a BIOS
pacman -S grub
grub-install /dev/vdaCreating The GRUB Configuration (BIOS and UEFI)
grub-mkconfig -o /boot/grub/grub.cfgEnabling the Network Manager
pacman -S networkmanager
systemctl enable NetworkManager.serviceDiving 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>
timedatectlA 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 testPipes
Redirige l’output di un comando verso l’input di un altro comando:
echo "hello" | catInput and Arguments
- echo, stampa (output) gli argomenti del comando;
- cat, concatena l’input e lo stampa (output);
- xargs, converte l’input in argomenti.
Se ne deduce che echo, non avendo il flusso input, non può essere concatenato dopo la pipe:
ls | echoNon produce nessun output. Viceversa, xargs trasforma l’output di ls in argomenti che possono essere ricevuti da echo:
ls | xargs | echoRebooting The System
exit
rebootTroubleshooting Pacman
pacman -SyuGoing Deeper
- Arch Wiki - Locale
- Arch Wiki - chroot
- Arch Wiki - UEFI
- Arch Wiki - GRUB
- Arch Wiki - fstab
- Arch Wiki - Man page
- tldr-pages
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:
poweroffTramite 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 -fPreferisco 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:
nmtuiSe non dovesse funzionare provare i seguenti comandi:
systemctl enable NetworkManager.service
systemctl start NetworkManager.serviceInstalling the Manuals
pacman -S man man-pagesProcesses
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 servicesystemd 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.serviceLogging 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 verboseProcesses 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/$$/environEnvironment 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 SHELLCreating A New User
useradd -m -g wheel -s /bin/bash max
passwd max
cat /etc/passwdVerifichiamo se funziona il comando sudo:
su max
sudo echo "Prova"
exitCorregeremo più avanti l’errore, intanto installiamo neovim:
pacman -S neovimThe Default Text Editors
Il seguente comando segnala errore in quanto non è stata ancora dichiarata la variabile d’ambiente EDITOR:
visudoThe 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:
- NORMAL (
); - INSERT (i,a,A);
- COMMAND-LINE (:).
Per avere aiuto:
<nvim>:help vim-modeEditing with Neovim
Abilitare l’utilizzo di sudo, salvare ed uscire dal file:
visudoQuindi digitare /wheel
Using Sudo
Ora la seguente sequenza non dovrebbe più dare errori:
su max
sudo echo "Prova"
exitCartella Condivisa (KVM)
Modifico il file /etc/fstab per aggiungere la cartella condivisa Guest/Host:
su max
cd
mkdir ~/shared
sudo nvim /etc/fstabInserisco le seguenti righe:
# shared
/shared /home/max/shared virtiofs 0 0Carico la nuova configurazione e riavvio:
sudo mount -a
ls ~/shared
exit
rebootBest Practices For Linux Shells
Strings
echo hello
echo "hello"
echo 'hello'Globbing
ls /usr/share/kbd/keymaps/**/*.map.gzStrings And Quotes
export LS=*.txt
touch uno.txt
touch due.txt
ls
ls $LS
ls "$LS"
ls '$LS'Going Deeper
Links
- Arch Wiki - Sudo
- Arch Wiki - Environment variables
- Arch Wiki - Users and groups
- Arch Wiki - mkinitcpio
- Article announcing systemd
Manual
man boot
man useradd
man systemd
man systemd.unit
man systemd.service
man systemd.target
man nvim
man 7 globGraphical Interface
The X Window System
Installing X
sudo pacman -S xorgURxvt, 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
fgPer cambiare TTY usando SPICE e senza X:
tty
<ALT+FX>Per cambiare TTY usando SPICE in ambiente X:
sudo chvt <N>- TTY, (Tele TYpe) emulato dal kernel (in ambiente testuale);
- PTY, (Pseudo Terminal) emulatore di terminale in ambiente X.
Quando viene lanciato l’emulatore (es. URxvt) vengono creati (vedi figura):
- PTY (master);
- PTS (PTY slave);
- shell sub-processo di PTS.
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
i3L’ultimo comando da un errore in quanto non c’è ancora X-Server in esecuzione.
Launching X
sudo pacman -S xorg-xinit
nvim ~/.xinitrcInsersco il seguente codice:
exec i3Keyboard Layout for X
localectl --no-convert set-x11-keymap itInstalling Fonts
sudo pacman -S ttf-dejavuLaunching i3
Dovrebbe funzionare senza reboot:
startxGoing Deeper
- Arch Wiki - General Recommendations
- Arch Wiki - Xorg
- Arch Wiki - Xorg Keyboard configuration
- Arch Wiki - URxvt
- Arch Wiki - Hardware video acceleration
- Arch Wiki - Intel Graphics
- Arch Wiki - Nvidia
- The TTY demystified
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
arandrPer 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.00Per 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.00Per 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 i3statusPoi 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 chromiumProgram Launcher
sudo pacman -S dmenuCopy and Paste
sudo pacman -S xselIstruzioni:
- <Ctrl+Alt+v>, incollare in urxvt;
- <Ctrl+Alt+v>, incollare in neovim (INSERT MODE only);
- <Ctrl+Alt+c>, copia da urxvt (funziona anche il Mouse).
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 clipboardThe 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_companionGoing Deeper
Configuring URxvt
The Colors of the Terminal
mkdir "~/.config/X11"
touch "~/.config/X11/.Xresources"
cd ~/.config/X11/
nvim ~/.config/X11/.XresourcesAggiungo le personalizzazioni presenti nel corrispondente file scaricato poi le carico:
xrdb -merge ~/.config/X11/.Xresources
xrdb -query -allRestart URxvt. Aggiungo la seguente riga al file ~/.xinitrc:
xrdb -merge ~/.config/X11/.XresourcesConfiguring URxvt
Character Fonts
fc-listEd aggiungo il font che voglio utilizzare nel file ~/.config/X11/.Xresources:
URxvt*font: xft:DejaVuSansMono:size=14:antialias=true
URxvt*letterSpace: -1Window Default
Agginugo le seguenti righe al file ~/.config/X11/.Xresources:
URxvt*borderLess: false
URxvt*externalBorder: 0
URxvt*internalBorder: 0
URxvt*scrollBar: false
URxvt*saveLines: 5000URxvt Daemon
Aggiungo la seguente riga al file ~/.xinitrc:
urxvtd -o -q -fGoing 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+=unnamedplusfile 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
- u, annulla l’effetto dell’azione appena compiuta;
- <Ctrl+r>, riesegue l’azione appena annullata.
The Language of Neovim
Operators
All’interno di neovim:
:help operatorText Objects
All’interno di neovim digitare:
help text-objectsA Basic Configuration
Neovim’s Options
Istruzioni da digitare all’interno di neovim:
- :set no, unset the option;
- :set, toggle the option;
- :set, return the option’s value;
- :set, set a value
(string or number); - :set, add the value
for a number option, append a string for a string option; - :set, subtract the value
for a number option, delete the string for a string option; - :set, reset the option to its default value;
- :help options;
- :help option-list.
Swap Files
Aggiungo la seguente configurazione al file ~/.config/nvim/init.vim (linguaggio vim script):
" no swap file
set noswapfileUndo 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=10000General 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 = 2Going Deeper
Pacman and Yay
Official Repositories
- Core repository, in this repository, the community accepts only packages with very strict quality requirements;
- Extra repositories, includes every package which is not in core;
- Communities, packages from trusted users of the Arch Linux User Repository (AUR);
- Multilib, allows you to build and run 32-bit applications on 64-bit installations of Arch Linux (which is normally what we install), it’s disabled by default.
Updating Your System
sudo pacman -SyuRemoving Packages
sudo pacman -Rs <package>Searching Packages
Informazioni sui pacchetti disponibili nei repository:
sudo pacman -Ss phpInformazioni sui pacchetti installati:
sudo pacman -Qs phpInformazioni sui pacchetti del repository AUR:
sudo pacman -Qm phpPacman Cache
Pulire la cache:
sudo pacman -SccThe 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 --versionClearing Yay Cache
yay -Sc --aurInstalling Packages With Yay
yay -S urxvt-tabbedex-mina86-gitAdding 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/.XresourcesNeovim Language Extensions
yay -S python-neovim python2-neovim ruby-neovimUlteriori informazioni all’interno di neovim:
:help providerPacman Troubleshooting
cat /var/log/pacman.logPacman Configuration
cat /etc/pacman.confGoing Deeper
- Arch Wiki - Pacman
- Arch Wiki - Pacman Troubleshooting
- Arch Wiki - Pacman Tips and Tricks
- Arch Wiki - System Maintenance
Pagine del manuale:
man 5 pacman.confDotfiles
Utile il programma Stow :
sudo pacman -S stowIstruzioni 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 X11Adesso 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 X11Il 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:
- di neovim, file ~/.config/nvim/init.vim;
- di X, file ~/.config/X11/.Xresources.
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/X11Our 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 shellVengono dati i permessi di esecuzione al file e successivamente eseguito:
chmod u+x ~/dotfiles/install.sh
./install.shMaking 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-keygenVengono creati i seguenti files:
- ~/.ssh/id_rsa.pub;
- ~/.ssh/id_rsa.
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.gitEseguo il commit iniziale:
git add *
git commit -m "First commit"
git push origin mainGoing Deeper
General Articles
- Arch Wiki - Dotfiles
- Arch Wiki - File Permissions and Attributes
- Arch Wiki - OpenSSH
- Arch Wiki - Git
- Arch Wiki - Command-line Shell
- GNU Stow
- dotbot
- Unofficial guide to dotfiles on GitHub
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:
xmodmapPer aumentare la grandezza del carattere modifico la seguente riga:
font pango:monospace 12Moving 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 rightLa 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 rightSplit 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 hWorkspaces
workspace_auto_back_and_forth yes # premendo uno workspace una seconda volta torna al precedentePer far partire un programma nel Workspace 2:
assign [class="firefox" instance="Navigator"] $ws2Per conoscere class e instance lanciare il seguente comando da terminale:
xprop | grep WM_CLASSE 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 pptDisabilitare il focus sulla finestra in cui si trova il mouse:
focus_follows_mouse noLocking Your Screen
sudo pacman -S i3lock
sudo pacman -S xss-lock
sudo pacman -S imagemagick
sudo pacman -S scrotSalvaschermo 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 $i3lockwallEd 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 $imgEd 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 $i3lockwallEd 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/fehEd 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- move with Alt+Shift+(h|j|k|l);
- resize $mod+r;
- resize $mod+MouseRightClick.
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 htopE 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 htopSe 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:
- ~/dotfiles/X11/acer-monitor.sh;
- ~/dotfiles/X11/samsung-monitor.sh.
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 mainutilizzo di install.sh
Prima sposto la cartella di configurazione:
mv ~/.config/i3 ~/dotfilesPoi 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 mainGoing Deeper
The Z-Shell (Zsh)
Zsh Config Files
sudo pacman -S zshFiles di configurazione:
- .zshenv, should only contain user’s environment variables;
- .zprofile, can be used to execute commands just after logging in;
- .zshrc, should be used to configure the shell itself and for running commands;
- .zlogin, same purpose as .zprofile except that it’s read just after the file .zshrc;
- .zlogout, can be used to execute commands when a shell exits.
Verranno utilizzati solamente .zshrc e .zshenv pertanto creiamoli già dentro la nostra cartella ~/dotfiles:
mkdir ~/dotfiles/zsh
touch ~/dotfiles/zsh/.zshrc
touch ~/dotfiles/zsh/.zshenvEd 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/aliasesOptions
Aggiungiamo le seguenti opzioni al file ~/dotfiles/zsh/.zshrc:
setopt AUTO_PARAM_SLASH
unsetopt CASE_GLOBZsh 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.zshAggiungo 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.shLa 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 comandoPimp 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_setupZsh 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_SILENTConfigurazione da inserire nel file ~/dotfiles/zsh/aliases:
alias d='dirs -v'
for index ({1..9}) alias "$index"="cd +${index}"; unset indexZsh, Your New Best Friend
chsh -s $(which zsh)
rebootZsh With Vim Flavors
Enabling the Vi Mode
Aggiungo le seguenti righe al file di configurazione ~/dotfiles/zsh/.zshrc:
bindkey -v
export KEYTIMEOUT=1Zsh Plugins
Zsh Additional Completion
sudo pacman -S zsh-completionsDa vedere insieme al precedente paragrafo Zsh Completion Systrem.
Zsh Syntax Highlighting
sudo pacman -S zsh-syntax-highlightingJumping 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 cartelleIl 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.shThe Fuzzy Finder fzf
sudo pacman -S fzf
sudo pacman -S ripgrepGoing 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/fontsCartella 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 libnotifyAnche 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-popMontaggio automatico chiavette usb
sudo pacman -S udiskieTemi per le finestre
sudo pacman -S lxappearanceTODO 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 mainNeovim: A Deeper Dive
TODO Mapping Keystrokes
:help key-notation
nnoremap <space> <nop>- g;, jump to the next change;
- g,, jump to the previous change;
- ., repeat the last change;
- @:, repeat the last command executed.
Cercare nella cronologia dei comandi:
- q:, apre la cronologia, poi /;
- q/, oppure q? apre la cronologia della ricerca, poi /;
- Ctrl+f, apre la cronologia quando si è già in commandline (dopo :).
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-xetexTODO The Terminal Multiplexer tmux
sudo pacman -S tmuxTmux è 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-serverThe tmux’s prefix key is Ctrl+b by default che verrà combiato nel file di configurazione in Ctrl+Space.
- <Ctrl+b> “, apre un nuovo pannello in orizzontale o verticale;
- <Ctrl+b> :, entra nel prompt dei comandi.
mkdir $DOTFILES/tmux
touch $DOTFILES/tmux/tmux.conf- PREFIX ARROW KEY, permette di cambiare pannello;
- set -g mouse on, permette di ridimensionare i pannelli con il mouse.
Aggiorno lo script ~/dotfiles/install.sh.
- PREFIX
, selezione window; - PREFIX [, entra in copy mode ossia si può cercare e copiare porzione delle righe di tmux (ne abbiamo configurate da tenere in memoria fino a 10000) di schermo utilizzando i tasti come in neovim:
- v, per selezione sulla riga;
- V, per selezione intera riga;
- y, per copiare;
- poi su, giù, dx e sx con i tasti h|j|k|l;
- PREFIX ] oppure p per incollare in tmux;
- semplicemente p per incollare fuori da tmux.
Nota che in tmux:
- PREFIX ], prende il contenuto dalla clipboard di tmux;
- p, dalla clipboard di sistema.
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