commit 42c8d92f544b3042c8e852daa4d02287dec08782 Author: me Date: Sun Jun 27 19:28:31 2021 +0200 Primo commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d7e189 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/emacs +# Edit at https://www.toptal.com/developers/gitignore?templates=emacs + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# network security +/network-security.data + + +# End of https://www.toptal.com/developers/gitignore/api/emacs + +# Temporanei dell'export in pdf dei files di org +*.tex \ No newline at end of file diff --git a/README.org b/README.org new file mode 100644 index 0000000..9daeab8 --- /dev/null +++ b/README.org @@ -0,0 +1,15 @@ +* Appunti per la "Serata Dotfiles" + + La serata è dedicata alla gestione dei /dotfiles/. + + Nel repository sono presenti files e directory utili per la serata. + - [[seratadotfiles.org][File con gli appunti sull'argomento]] ([[seratadotfiles.pdf][anche in versione pdf]]) + - [[homerepo.org][File con gli appunti sul ~bare repository~ nella home]] + - [[gnu_stow.org][File con gli appunti su ~GNU Stow~]] + - [[dotbot.org][File con gli appunti su ~dotbot~]] + - [[chezmoi.org][File con gli appunti su ~chezmoi~]] + - [[yadm.org][File con gli appunti su ~yadm~]] + - [[base][Directory con elementi di base per le demo]] + + Ci sono poi altri repository utilizzati per le varie demo + diff --git a/base/dotfiles/.emacs.d/.gitignore b/base/dotfiles/.emacs.d/.gitignore new file mode 100644 index 0000000..bb05f42 --- /dev/null +++ b/base/dotfiles/.emacs.d/.gitignore @@ -0,0 +1,15 @@ +# -*- mode: gitignore; -*- +auto-save-list/ +elpa/ +emms/ +eshell/ +games/ +server/ +transient/ +url/ + +amx-items +gb-init.el +package-quickstart.el +recentf +projectile-bookmarks.eld diff --git a/base/dotfiles/.emacs.d/early-init.el b/base/dotfiles/.emacs.d/early-init.el new file mode 100644 index 0000000..de511d8 --- /dev/null +++ b/base/dotfiles/.emacs.d/early-init.el @@ -0,0 +1,163 @@ +;;; early-init.el --- File di configurazione "early-init" di GNU Emacs -*- mode: emacs-lisp; lexical-binding: t;-*- + +;; Copyright (C) 2020 Geraldo Biotti + +;; Author: Geraldo Biotti +;; Created: 20200731 +;; Keywords: init, early-init, .emacs.d, startup +;; Compatiblity: emacs-version >= 27 + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Questo file contiene le impostazioni di GNU Emacs che vengono eseguite +;; durante la fase di Early Init. +;; +;; La fase di Early Init e' stata introdotta con GNU Emacs versione 27 +;; +;; Per maggiori informazioni fare riferimento al manuale di GNU Emacs +;; versione 27 o successiva: 49.4.6 - The Early Init File + +;;; To do: + +;;; Change log: + +;;; Code: + +;; N.B.: Ho rimosso l'impostazione del lexical-binding: +;; -*- lexical-binding: t; -*- + + +;; Imposto l'ora di avvio di Emacs +;; Servira' alla fine per determinare quanto tempo e' trascorso +(defconst gb/emacs/emacs-startup-time (current-time)) + +;; Imposto le varibili di appoggio usate per ripristinare +;; le impostazioni di default procedura di inizializzazione +(defvar gb/emacs/gc-cons-threshold-original gc-cons-threshold + "Valore originale di 'gc-cons-threshold' prima della modifica. +Salvato per ripristinarlo alla fine della procedura di inizializzazione") + +(defvar gb/emacs/gc-cons-percentage-original gc-cons-percentage + "Valore originale di 'gc-cons-percentage' prima della modifica. +Salvato per ripristinarlo alla fine della procedura di inizializzazione") + +(defvar gb/emacs/file-name-handler-alist-original file-name-handler-alist + "Valore originale di 'file-name-handler-alist' prima della modifica. +Salvato per ripristinarlo alla fine della procedura di inizializzazione") + +;; Imposta la soglia del garbage collector +;; Da reimpostare poi ai valori corretti con apposito +;; codice richiamato in after-init-hook +(setq gc-cons-threshold (* 1024 (* 1024 1024)) ; 1 GByte + gc-cons-percentage 0.6) + +;; Imposta file-name-handler-alist +;; Da reimpostare poi ai valori corretti con apposito +;; codice richiamato in after-init-hook +(setq file-name-handler-alist nil) + +;; Aggiungo ad after-init-hook il codice necessario +;; per reimpostare i valori di default nelle variabili +;; usate qui sopra e fare una garbage-collect finale. +;; Si usa una depth 90 (vedi docstring di di "add-hook") +(add-hook 'after-init-hook + '(lambda () + ;; Non imposto piu' 'gc-cons-threshold' al suo valore originale ma, come + ;; riportato in molti siti ad un valore molto piu' alto. + ;; Si veda, ad esempio qui: https://emacs-lsp.github.io/lsp-mode/page/performance/ + ;; (consultato 31/08/2020) + ;; (setq gc-cons-threshold gb/emacs/gc-cons-threshold-original) + ;; 100 Mb = (* 1024 (* 1024 100))) + (setq gc-cons-threshold (* 1024 (* 1024 100))) + ;; Sempre https://emacs-lsp.github.io/lsp-mode/page/performance/ + ;; raccomanda di impostare 'read-process-output-max' ad un valore di 1Mb + ;; (numero massimo di bytes letti in un singolo chunk dai subprocess) + (setq read-process-output-max (* 1024 1024)) + (setq gc-cons-percentage gb/emacs/gc-cons-percentage-original) + (setq file-name-handler-alist gb/emacs/file-name-handler-alist-original) + (garbage-collect) + (defvar gb/emacs/elapsed (float-time + (time-subtract (current-time) gb/emacs/emacs-startup-time)) + ) + (message (emacs-init-time)) + (message "Loading done in %.3fs seconds and %d garbage collections [after-init]" + gb/emacs/elapsed + gcs-done) + ) + 90 + ) + +;; Non rende disponibili i package all'avvio di Emacs +;; da usare qui e non in init.el +(setq package-enable-at-startup nil) + +;; Per GNU Emacs versione 27 e successive +(when (not (version< emacs-version "27")) + (progn + ;; Consente il caricamento dalla cache dei package + (setq package-quickstart t) + ) + ) + +;; Non ridimnensiona il frame in questo momento +(setq frame-inhibit-implied-resize t) + +;; Su Windows, assumendo di aver installato Scoop, ne metto il path +;; in testa, altrimenti vengono prima trovati gli eseguibili nelle +;; directory di sistema. Questo crea confusione, ad esempio concat +;; "find" che esiste sia in ambiente Linux che in Windows, ovviamente +;; con sintassi completamente diverse. Generalmente mi apsetto che +;; le funzionalita' siano quelle del mondo Linux e non quelle del +;; mondo Windows per cui faccio in modo che vengano lette per prima. +;; Da notare che Scoop aggiunge le sue directory al Path, ma queste +;; sono di tipo utente e vengono aggiunte al path dopo quelle di +;; sistema. Si avra' un "doppione" nel path, ma va bene. +(when (eq system-type 'windows-nt) + (defvar gb/emacs/scoop-shim-path + (concat (expand-file-name "~/scoop/shims") + path-separator) + "Percorso per 'scoop/shims' da aggiungere in testa al PATH." + ) + ;;(add-to-list 'exec-path "c:/Users/Geraldo/scoop/shims") + (add-to-list 'exec-path gb/emacs/scoop-shim-path) + ;; (setenv "PATH" (concat gb/emacs/scoop-shim-path + ;; (getenv "PATH"))) + ) + +(provide 'early-init) + +;;(progn +;; (setq gb/frame-font +;; (cond ((find-font (font-spec :name "DejaVu Sans mono")) '(font . "DejaVu Sans Mono-10")) +;; ((find-font (font-spec :name "Consolas")) '(font . "Consolas-10")) +;; ((find-font (font-spec :name "Inconsolata")) '(font . "Inconsolata-10")) +;; ((find-font (font-spec :name "Courier New")) '(font . "Courier New-10")) +;; )) +;; (print gb/frame-font) +;; (add-to-list 'default-frame-alist gb/frame-font) +;; (add-to-list 'initial-frame-alist gb/frame-font)) + +;; =========================================================================== +;; Local Variables: +;; coding: utf-8-unix +;; indent-tabs-mode: nil +;; tab-width: 4 +;; End: +;; =========================================================================== + +;;; early-init.el ends here diff --git a/base/dotfiles/.emacs.d/gb-init.org b/base/dotfiles/.emacs.d/gb-init.org new file mode 100644 index 0000000..7c0d196 --- /dev/null +++ b/base/dotfiles/.emacs.d/gb-init.org @@ -0,0 +1,2165 @@ +#+Title: File di configurazione di GNU Emacs +#+AUTHOR: Geraldo Biotti +#+EMAIL: wont.tell@example.com +#+STARTUP: showeverything +#+PROPERTY: header-args:conf :comments link :tangle-mode (identity #o444) + +* Configurazione di Emacs con literate programming + +** Cosa e' il paradigma "literate programming" + + Inserire qui la spiegazione di cosa e' il paradigma di literate programming, + quali benefici porta nella gestione dei files di configurazione di Emacs + e come funzione con Emacs + +** I files di inizializzazione "standard" di Emacs + + Il funzionamento dei files di inizializzazione e' spiegato nel manuale + di Emacs alla voce [[info:emacs#Init File][Init File]]. All'avvio Emacs cerca secondo un certo + ordine di priorita' e carica il primo che trova tra questi (vedi: [[info:emacs#Find Init][Find Init]]). + Tralasciando gli altri, a noi interessano quelli che si trovano nella + directory =~/.emacs.d=. + I files di inizializzazione di Emacs *non* sono scritti secondo il paradigma + di literate programming, ma sono lasciati in emacs-lisp in modo da poter + gestire altri files creati secondo quel paradigma in modo piu' semplice + e comprensibile. + + Qui di seguito viene riportato, a solo titolo di esempio, il contenuto + dei files di inizializzazione standard. Nel sorgente di questo file + il contenuto viene racchiuso tra =#+begin_src emacs-lisp :tangle no= e =#+end_src#=, + da notare che si usa il parametro =:tangle no= perche' altrimenti l'operazione + =org-babel-load-file= presente in =init.el= andrebbe a fare il [[info:org#Working with Source Code][tangle]] + di questi blocchi di codice con il risultato di avere un file .el che richiama + all'infinito l'operazione di [[info:org#Working with Source Code][tangle]] e generando un errore in avvio. + +*** Il file "early init.el" (Emacs 27+) + + A partire dalla versione 27 di Emacs esiste un nuovo file di inizializzazione + che, come spiegato nella [[info:emacs#Early Init File][pagina del manuale di Emacs per Early Init File]], se + presente, viene caricato prima di [[info:emacs#Init File][init.el]] e prima che siano stati + inizializzati sia il sistema di gestione dei package che la GUI. + Fare riferimento alla [[info:emacs#Early Init File][pagina del manuale di Emacs per Early Init File]], + per la spiegazione sull'uso corretto. + + Il contenuto viene qui suddiviso in porzioni per spiegarne la logica. + +**** Commenti iniziali + + Contiene la parte di commento iniziale del file + + Da notare che l'impostazione del major mode deve avvenire qui nella + prima linea e non nella sezione "local variables" in coda, altrimenti si genera + un errore nel [[info:org#Working with Source Code][tangling]]. + + #+begin_src emacs-lisp :tangle no + ;;; early-init.el --- File di configurazione "early-init" di GNU Emacs -*- mode: lisp; lexical-binding: t; -*- + + ;; Author: Geraldo Biotti + ;; Created: 20200731 + ;; Keywords: init, early-init, .emacs.d, startup + ;; Compatiblity: emacs-version >= 27 + + ;; This file is not part of GNU Emacs. + + ;; This program is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or (at + ;; your option) any later version. + + ;; This program is distributed in the hope that it will be useful, but + ;; WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ;; General Public License for more details. + + ;; You should have received a copy of the GNU General Public License + ;; along with GNU Emacs. If not, see . + + ;;; Commentary: + + ;; Questo file contiene le impostazioni di GNU Emacs che vengono eseguite + ;; durante la fase di Early Init. + ;; + ;; La fase di Early Init e' stata introdotta con GNU Emacs versione 27 + ;; + ;; Per maggiori informazioni fare riferimento al manuale di GNU Emacs + ;; versione 27 o successiva: 49.4.6 - The Early Init File + + ;;; Code: + #+end_src + +**** Salvo il contenuto delle variabili cha vado a modificare + + Per prima cosa creo delle variabili di appoggio dove vado a salvare i + valori standard del di Emacs prima della modifica. + Questo mi consente di riportare le impostazioni allo standard dopo + il termine della procedura di inizializzazione con un apposito codice + da definire in =after-init-hook= + + #+begin_src emacs-lisp :tangle no + ;; Imposto l'ora di avvio di Emacs + ;; Servira' alla fine per determinare quanto tempo e' trascorso + (defconst gb/emacs/emacs-startup-time (current-time)) + + ;; Imposto le varibili di appoggio usate per ripristinare + ;; le impostazioni di default procedura di inizializzazione + (defvar gb/emacs/gc-cons-threshold-original gc-cons-threshold + "Valore originale di gc-cons-threshold prima della + modifica. Salvato per ripristinarlo alla fine della + procedura di inizializzazione") + + (defvar gb/emacs/gc-cons-percentage-original gc-cons-percentage + "Valore originale di gc-cons-percentage prima della + modifica. Salvato per ripristinarlo alla fine della + procedura di inizializzazione") + + (defvar gb/emacs/file-name-handler-alist-original file-name-handler-alist + "Valore originale di file-name-handler-alist prima della + modifica. Salvato per ripristinarlo alla fine della + procedura di inizializzazione") + #+end_src + +**** Impostazione del Garbage Collector (gc) + + L'impostazione di default e' alquanto conservativa. Con i moderni pc + la disponibilita' di RAM e' decisamente ampia e questo consente la + possibilita' di "spendere" un po' di RAM in "oggetti" non piu' usati + senza creare disagi. Impostando il GC in modo che in fase di init + entri in funzione molto di rado si ha un buon incremento di prestazioni. + + Imposto quindi il GC in modo che non entri praticamente mai in funzione: + - gc-cons-threshold :: Indica il numero di bytes che devono essere + consumanti tra un intervento di GC e l'altro. Impostandolo a + 1073741824 (1 GByte) ho la ragionevole certezza che non entri in funzione. + - gc-cons-percentage :: Indica la porzione di heap che deve essere + allocata dall'ultima GC perche' il garbage collector entri nuovamente + in funzione + + #+begin_src emacs-lisp :tangle no + ;; Imposta la soglia del garbage collector + ;; Da reimpostare poi ai valori corretti con apposito + ;; codice richiamato in after-init-hook + (setq gc-cons-threshold (* 1024 (* 1024 1024)) ; 1 GByte + gc-cons-percentage 0.6) + #+end_src + +**** Imposto file-name-handler-alist + + Come riportato nelle FAQ di [[https://github.com/hlissner/doom-emacs/blob/develop/docs/faq.org#unset-file-name-handler-alist-temporarily][Doom Emacs]], Emacs consulta questa variabile + ogni volta che deve leggere un file o una libreria. Impostarla a ~nil~ + migliora le prestazioni di avvio. Occorre pero' *ricordarsi di ripristinarla* + quando la procedura di inizializzazione e' terminata (sempre con + apposito hook). + + #+begin_src emacs-lisp :tangle no + ;; Imposta file-name-handler-alist + ;; Da reimpostare poi ai valori corretti con apposito + ;; codice richiamato in after-init-hook + (setq file-name-handler-alist nil) + #+end_src + +**** Reimposto i default alla fine dell'init + + Alla fine dell'init vado a reimpostare con i valori originali le + variabili che ho modificato in precedenza. Per questo uso + =after-init-hook= + + #+begin_src emacs-lisp :tangle no + ;; Aggiungo ad after-init-hook il codice necessario + ;; per reimpostare i valori di default nelle variabili + ;; usate qui sopra e fare una garbage-collect finale. + ;; Si usa una depth 90 (vedi docstring di di "add-hook") + (add-hook 'after-init-hook + '(lambda () + ;; Non imposto piu' 'gc-cons-threshold' al suo valore originale ma, come + ;; riportato in molti siti ad un valore molto piu' alto. + ;; Si veda, ad esempio qui: https://emacs-lsp.github.io/lsp-mode/page/performance/ + ;; (consultato 31/08/2020) + ;; (setq gc-cons-threshold gb/emacs/gc-cons-threshold-original) + ;; 100 Mb = (* 1024 (* 1024 100))) + (setq gc-cons-threshold (* 1024 (* 1024 100))) + ;; Sempre https://emacs-lsp.github.io/lsp-mode/page/performance/ + ;; raccomanda di impostare 'read-process-output-max' ad un valore di 1Mb + ;; (numero massimo di bytes letti in un singolo chunk dai subprocess) + (setq read-process-output-max (* 1024 1024)) + (setq gc-cons-percentage gb/emacs/gc-cons-percentage-original) + (setq file-name-handler-alist gb/emacs/file-name-handler-alist-original) + (garbage-collect) + (defvar gb/emacs/elapsed (float-time + (time-subtract (current-time) gb/emacs/emacs-startup-time)) + ) + (message (emacs-init-time)) + (message "Loading done in %.3fs seconds and %d garbage collections [after-init]" + gb/emacs/elapsed + gcs-done) + ) + 90 + ) + #+end_src + +**** Imposta il package manager + + In questa configurazione di Emacs sara' utilizzato il pacchetto + =use-package=, che consente una gestione "particolare" dei packages. + Per ottimizzare l'esecuzione si deve impostare il package manager + (=package=) di Emacs in modo che venga "caricato", ma non "attivato". + + #+begin_src emacs-lisp :tangle no + ;; Non rende disponibili i package all'avvio di Emacs + ;; da usare qui e non in init.el + (setq package-enable-at-startup nil) + #+end_src + +**** Attivo package-quickstart (Emacs 27+) + + Quando questa variabile e' =t= attiva la preelaborazione dei package + rendendo piu' veloce l'avvio. + + #+begin_src emacs-lisp :tangle no + ;; Per GNU Emacs versione 27 e successive + (when (not (version< emacs-version "27")) + (progn + ;; Consente il caricamento dalla cache dei package + (setq package-quickstart t) + ) + ) + #+end_src + +**** Impedisce il ridimensionamento del frame + + #+begin_src emacs-lisp :tangle no + ;; Non ridimnensiona il frame in questo momento + (setq frame-inhibit-implied-resize t) + #+end_src + +**** Impostazioni per MS-Windows + + Emacs e' multipiattaforma, ma capita spesso che le configurazioni di + default e il codice creato da terze parti si basino sull'assunto di + funzionare su una piattaforma di Unix-like utilizzandone alcuni + comandi eseguibili. E' facile in MS-Windows ottenere questi eseguibili, + si veda sia [[info:emacs#Microsoft Windows][MS-Windows]] che [[info:efaq-w32#Other useful ports][porting di strumenti unix-like in windows]]. + + #+begin_src emacs-lisp :tangle no + ;; Su Windows, assumendo di aver installato Scoop, ne metto il path + ;; in testa, altrimenti vengono prima trovati gli eseguibili nelle + ;; directory di sistema. Questo crea confusione, ad esempio concat + ;; "find" che esiste sia in ambiente Linux che in Windows, ovviamente + ;; con sintassi completamente diverse. Generalmente mi apsetto che + ;; le funzionalita' siano quelle del mondo Linux e non quelle del + ;; mondo Windows per cui faccio in modo che vengano lette per prima. + ;; Da notare che Scoop aggiunge le sue directory al Path, ma queste + ;; sono di tipo utente e vengono aggiunte al path dopo quelle di + ;; sistema. Si avra' un "doppione" nel path, ma va bene. + (when (eq system-type 'windows-nt) + (defvar gb/emacs/scoop-shim-path + (concat (expand-file-name "~/scoop/shims") + path-separator) + "Percorso per 'scoop/shims' da aggiungere in testa al PATH." + ) + (add-to-list 'exec-path "c:/Users/Geraldo/scoop/shims") + ;; (setenv "PATH" (concat gb/emacs/scoop-shim-path + ;; (getenv "PATH"))) + ) + #+end_src + +**** Commenti finali + + Contiene la parte di commento finale e l'impostazione delle variabili + locali del file + + Da notare che l'impostazione del major mode *NON* deve avvenire qui + nella sezione "local variables", ma nella prima linea con la classica + notazione =-*- mode: lisp; -*-=, altrimenti si genera un errore nel tangling. + + #+begin_src emacs-lisp :tangle no + ;; =========================================================================== + ;; Local Variables: + ;; coding: utf-8-unix + ;; indent-tabs-mode: nil + ;; tab-width: 4 + ;; End: + ;; =========================================================================== + + ;;; early-init.el ends here + #+end_src + +*** Il file "init.el" + + Il file [[info:emacs#Init File][init.el]] contiene tutte le impostazioni di Emacs. + Deve essere organizzato per poter gestire le differenze che sono state introdotte + con Emacs 27. + Sono quindi presenti delle funzioni che vengono richiamate ripettivamente per le + versioni precedentei alla 27 e per la 27+. + Visto che certe impostazioni potrebbero creare problemi per versioni antecedenti + alla 26.1 se ci troviamo in questa situazione viene emesso un warning (che va + a finire nell'apposito buffer) + + Il contenuto viene qui suddiviso in porzioni per spiegarne la logica. + +**** Commenti iniziali + + Contiene la parte di commento iniziale del file + + Da notare che l'impostazione del major mode deve avvenire qui nella + prima linea e non nella sezione "local variables" in coda, altrimenti si genera + un errore nel tangling. + + #+begin_src emacs-lisp :tangle no + ;;; init.el --- File di configurazione di GNU Emacs -*- mode: lisp; lexical-binding: t; -*- + + ;; Author: Geraldo Biotti + ;; Created: 20200731 + ;; Keywords: init, early-init, .emacs.d, startup + ;; Compatiblity: emacs-version >= 27 + + ;; This file is not part of GNU Emacs. + + ;; This program is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or (at + ;; your option) any later version. + + ;; This program is distributed in the hope that it will be useful, but + ;; WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ;; General Public License for more details. + + ;; You should have received a copy of the GNU General Public License + ;; along with GNU Emacs. If not, see . + + ;;; Commentary: + + ;; Questo file contiene le impostazioni di GNU Emacs che vengono eseguite + ;; durante la fase di Init. + ;; La fase di Init viene eseguita successivamente a quella di Early Init + ;; + ;; Per maggiori informazioni fare riferimento al manuale di GNU Emacs: + ;; 49.4 The Emacs Initialization File + + ;;; Code: + #+end_src + +**** Verifica versione Emacs + + Verifico che la versione di Emacs sia almeno la 26.1. Se non lo e' + emetto un warning. + + #+begin_src emacs-lisp :tangle no + ;; Se la versione e' inferiore alla 26.1 emetto un warning + (when (version< emacs-version "26.1") + (warn "E' necessario che GNU Emacs sia in versione 26.1 o successiva!")) + #+end_src + +**** Dichiaro la funzione di impostazione di package + + Questa funzione viene richiamata dalle due funzioni che usate a seconda + della versione di Emacs. Carica =package= che verra' utilizzato dopo + e aggiunge alla lista dei repository da dove scaricare i packages anche + /Melpa/. Infine inizializza =package=, ma solo se non e' gia' stato + inizializzato. + + #+begin_src emacs-lisp :tangle no + (defun gb/emacs/package-setup () + "Function che imposta 'package'" + ;; Carico il modulo di gestione dei packages + (require 'package) + ;; Carica sempre il file piu' recente tra '.el' e '.elc' + (setq load-prefer-newer t) + ;; Aggiungo all'elenco dei repositories da cui scaricare i packages + ;; la versione "unstable" di Melpa + (add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/")) + ;; Genera dei warnings con i package-install + (unless (bound-and-true-p package--initialized) + (package-initialize)) + ) + #+end_src + +**** Dichiaro la funzioone di impostazione per le vecchie versioni di Emacs + + Le versioni di Emacs antecedenti alla 27 non gestiscono =early-init.el=. + Per questo, se esiste, devo caricarlo quanto prima. Dopo aver caricato + =early-init.el= provvedo a chiamare la funzione che imposta =package= + + #+begin_src emacs-lisp :tangle no + (defun gb/emacs/init-old-emacs-version () + "Function eseguita per il setup di init.el quando si sta usando Emacs + in versione precedente alla 27" + ;; Early-init e' gestito automaticamente dalla versione 27 in poi + ;; Se esiste early-init.el lo carico + (let ((gb/emacs/early-init-file (expand-file-name "early-init.el" user-emacs-directory))) + (when (file-exists-p gb/emacs/early-init-file) + (require 'early-init gb/emacs/early-init-file))) + (gb/emacs/package-setup) + ) + #+end_src + +**** Dichiaro la funzione di impostazione per le nuove versioni di Emacs + + Le versioni di Emacs successive alla 27 gestiscono automaticamente + =early-init.el=. Mi limito quindi a richiamare la funzione che + imposta =package= + + #+begin_src emacs-lisp :tangle no + (defun gb/emacs/init-new-emacs-version () + "Function eseguita per il setup di init.el quando si sta usando Emacs + in versione 27+" + ;; Avvio package + (gb/emacs/package-setup) + ) + #+end_src + +**** Eseguo impostazioni di base + + La versione 27 di Emacs ha introdotto il concetto di =early-init.el=. + Devo quindi prevedere una gestione per le versioni precedenti che + faccia in modo di andare a caricarlo se presente. Questa cosa + deve avvenire quanto prima all'interno del file =init.el= + + #+begin_src emacs-lisp :tangle no + ;; Eseguo le impostazioni in base alla versione di GNU Emacs + (if (version< emacs-version "27") + (gb/emacs/init-old-emacs-version) + (gb/emacs/init-new-emacs-version)) + #+end_src + +**** Carico il package "delight" + + =delight= e' un package che, se presente, viene usato + da =use-package=. Se non viene installato prima di + =use-package= risultera' erroneamente come dipendenza + nella lista dei package installati. + + #+begin_src emacs-lisp :tangle no + ;; Delight e' un package che viene usato da use-package + ;; mi accerto che sia installato, se non lo e' lo installo + ;; N.B.: Se non si vuole averlo come dipendenza e' bene + ;; installarlo prima di use-package + (unless (package-installed-p 'delight) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'delight)) + #+end_src + +**** Carico il package "diminish" + + =diminish= e' un package che, se presente, viene usato + da =use-package=. Se non viene installato prima di + =use-package= risultera' erroneamente come dipendenza + nella lista dei package installati. + + #+begin_src emacs-lisp :tangle no + ;; Diminish e' un package che viene usato da use-package + ;; mi accerto che sia installato, se non lo e' lo installo + ;; N.B.: Se non si vuole averlo come dipendenza e' bene + ;; installarlo prima di use-package + (unless (package-installed-p 'diminish) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'diminish)) + #+end_src + +**** Use-package + + =use-package= e' un package che consente una gestione + migliorata rispetto a =package= + + #+begin_src emacs-lisp :tangle no + ;; Mi accerto che use-package sia installato + ;; se non lo e' lo installo + (unless (package-installed-p 'use-package) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'use-package)) + #+end_src + + #+begin_src emacs-lisp :tangle no + ;; Carico use-package + (eval-when-compile + (require 'use-package)) + #+end_src + + #+begin_src emacs-lisp :tangle no + ;; Configuro use-package prima di caricarlo + (eval-and-compile + (if init-file-debug + (setq use-package-verbose t + use-package-expand-minimally nil + use-package-compute-statistics t + debug-on-error t) ; True + (setq use-package-verbose nil + use-package-expand-minimally t) ; False + ) + (setq use-package-enable-imenu-support t + ;; Quanto segue e' MOLTO IMPORTANTE: + ;; Usare sempre gli hook con il loro nome completo + ;; al posto del nome abbreviato: + ;; after-init --> after-init-hook + ;; Questo migliora la gestione della documentazione + ;; a riconoscere il contesto (vedi, ad esempio 'describe-symbol) + use-package-hook-name-suffix nil) + ) + #+end_src + +**** Configuro vc + + Configuro =vc= in modo che gestisca i link simbolici. + + #+begin_src emacs-lisp :tangle no + ;; Configuro vc (package gestione "version cotrol" + (use-package vc + :config + ;; Questo perche' i miei "dotfiles" usano i link simbolici + (setq vc-follow-symlinks t) + ) + #+end_src + +**** Org & Babel: gb-init.org + + In Emacs il paradigma di literate programming si appoggia a =org-mode=. + _Org_ e' un package (built-in) estremamente potente che, tra le altre cose, + consente l'esecuzione di /codice sorgente/ all'interno di un dile di + testo. Questa operazione avviene tramite la sua funzionalita' _Babel_. + Usando queste funzionalita' si va quindi a caricare =org-mode= e a leggere + il file di "inizializzazione" scritto in "literate programming" facendo + produrre a Babel il corrispondente file =emacs-lisp= che viene infine + caricato come se fosse una "libreria" di =init.el= + + Il file che viene letto, convertito in emacs-lisp e caricato si chiama + *=gb-init.el=* + + #+begin_src emacs-lisp :tangle no + ;; Carico org + (use-package org) + + ;; Qui avviene la magia. + ;; Carico la configurazione dal file "org" + ;; Cerco pero' di ottimizzare un mimino la cosa: + ;; se il file "el" generato da org-babel e' piu' recente + ;; del file "org" allora carico "el" altrimenti passo + ;; all'uso di org-babel + (progn (defvar gb/emacs/gb-init "gb-init") + (defvar gb/emacs/conf-filename (expand-file-name gb/emacs/gb-init user-emacs-directory)) + (defvar gb/emacs/el-conf-filename (concat gb/emacs/conf-filename ".el")) + (defvar gb/emacs/org-conf-filename (concat gb/emacs/conf-filename ".org")) + (if (file-exists-p gb/emacs/el-conf-filename) + (if (file-newer-than-file-p gb/emacs/org-conf-filename gb/emacs/el-conf-filename) + (progn (message "%s e' piu' recente di %s, ricreo e carico il .el" + gb/emacs/org-conf-filename + gb/emacs/el-conf-filename) + (org-babel-load-file gb/emacs/org-conf-filename)) + (progn (message "%s e' meno recente di %s, carico il .el senza ricrearlo" + gb/emacs/org-conf-filename + gb/emacs/el-conf-filename) + (load-file gb/emacs/el-conf-filename))) + (progn (message "Creo e carico %s" gb/emacs/el-conf-filename) + (org-babel-load-file gb/emacs/org-conf-filename)) + ) + ) + #+end_src + +**** Custom + + E' la parte di =init.el= che contiene le impostazioni gestite direttamente + dall'interfacia di configurazione di Emacs ([[info:emacs#Easy customization][Easy customization]]). + + _E' importante che venga mantenuta all'interno del file =init.el=_ perche' + altrimenti non verrebbe aggiornato correttaemtne il contenuto della variabile + =package-selected-packages= e i vari package installati tramite =use-package= + risulterebbero sempre come dipendenze. + + Da notare che qui la =custom-set-variables= e' vuota in cosndierazione che, + trattandosi di un esempio di base, non ci dovrebbero gia' essere impostazioni. + + Naturalmente, con l'uso di Emacs questa parte sara' valorizzata dallo + stesso Emacs ad esempio nell'elenco dei packages installati. + + #+begin_src emacs-lisp :tangle no + ;; NON RIMUOVERE CUSTOM DA QUI + ;; --------------------------- + ;; Si potrebbe cedere alla tentazione di avere un init.el piu' "pulito" + ;; spostando custom-set-variables e custom-set-faces in un file separato, + ;; ma questo porta spesso a comportamenti altalenanti: se si installa un + ;; package con use-package e la sua opzione :ensure, capita che il package + ;; venga installato, ma la variabile package-selected-packages non venga + ;; aggiornata correttamente portanto il package installato ad uno stato + ;; di "dependency" in list-packages con invito alla rimozione qualora questo + ;; non fosse effettivamente utilizzato anche come dipendenza da qualche altro + ;; package + (custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) + (custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) + #+end_src + +**** Commenti finali + + Contiene la parte di commento finale e l'impostazione delle variabili + locali del file + + Da notare che l'impostazione del major mode *NON* deve avvenire qui + nella sezione "local variables", ma nella prima linea con la classica + notazione =-*- mode: lisp; -*-=, altrimenti si genera un errore nel tangling. + + #+begin_src emacs-lisp :tangle no + ;; =========================================================================== + ;; Local Variables: + ;; coding: utf-8-unix + ;; indent-tabs-mode: nil + ;; tab-width: 4 + ;; End: + ;; =========================================================================== + + ;;; init.el ends here + #+end_src + +** Il file di inizializazione "literate programmming" + + Qui inizia la vera e propria configurazione di Emacs secondo il paradigma + di "literate programming". + + Ogni parte di questo file definita in spezzoni di codice viene poi unificata + in un singolo file transcodificato in emacs-lisp da Babel. + +*** Intestazione del file + + Da notare che l'impostazione del major mode deve avvenire qui nella + prima linea e non nella sezione "local variables" in coda, altrimenti si genera + un errore nel tangling. + + #+begin_src emacs-lisp + ;;; gb-init.el --- Emacs tangled config -*- mode: emacs-lisp; lexical-binding: t; -*- + + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; ATTENZIONE: NON MODIFICARE QUESTO FILE! + ;; File generato automaticamente + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; Copyright (C) 2020 Geraldo Biotti + + ;; Compatiblity: emacs-version >= 27 + + ;; This file is not part of GNU Emacs. + + ;; This program is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or (at + ;; your option) any later version. + + ;; This program is distributed in the hope that it will be useful, but + ;; WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ;; General Public License for more details. + + ;; You should have received a copy of the GNU General Public License + ;; along with GNU Emacs. If not, see . + + ;;; Commentary: + + ;; Questo file viene generato automaticamente a partire dal + ;; suo file sorgente scritto in org-mode usando la tecnica + ;; del "literate-programming" + ;; Non modificare questo file. Ogni modifica a questo file + ;; e' destinata ad essere persa e sovrascritta alla prossima + ;; generazione dal file sorgente. + + ;; ATTENZIONE: NON MODIFICARE QUESTO FILE! + + ;;; Code: + #+end_src + +*** Impostazioni di Emacs + +**** Helper functions + + Funzioni che vengono utilizzate per semplificare le opreazioni. + +***** Funzioni relative al file di configurazione "literate" + + Qui si trovano funzioni che si riferiscono alla gestione del + file di configurazione "literate programming" (org) + +****** gb/emacs/config-visit() + + Apre questo file di configurazione in literate programming + + Da notare che uso la variabile =gb/emacs/org-conf-filename= + precedentemente definita in =init.el= + + #+begin_src emacs-lisp + (defun gb/emacs/config-visit () + "Visita il file di configurazione 'literate programming'. + Da notare che il file deve essere impostato nella variabile + 'gb/emacs/org-conf-filename' che deve essere definita in 'init.el'" + (interactive) + (find-file gb/emacs/org-conf-filename) + ) + #+end_src + +****** gb/emacs/config-reload() + + #+begin_src emacs-lisp + (defun gb/emacs/config-reload () + "Effettual il reload del file di configurazione. + Esegue quindi nuovamente quelle operazioni sul file di configurazione + 'literate programming' che sono state eseguite in 'int.el' all'avvio di Emacs. + Da notare che il file deve essere impostato nella variabile + 'gb/emacs/org-conf-filename' che deve essere definita in 'init.el' + Assume che 'org' sia gia' stato caricato." + (interactive) + (org-babel-load-file gb/emacs/org-conf-filename) + ) + #+end_src + +**** Imposto il font di default + + All'avvio Emacs utilizza un font di default che cambia a senconda + del sistema operativo in uso. + + In MS Windows usa il Courier New che, pur se storicamente valido, + lascia oggi a desiderare se confrontato con i moderni font non + proporzionali (a spaziatura fissa) usati dagli sviluppatori. + + Per questo, quando sto eseguendo Emacs in MS Windows, imposto sia + il font di default che quello corrente sceliendo, fra i font + eventualmente esistenti in base a questo ordine: + 1. Cascadia Mono Pl - 10 punti + 2. DejaVu Sans mono - 10 punti + 3. Consolas - 10 punti + 4. Inconsolata - 10 punti + + Impostando sia il font di default che quello corrente si evita il + brutto effetto di mostrare prima il font standard di Emacs (Courier + New) per poi, ad un certo punto, veder cambiare il tutto con il + nuovo font. + + Nel caso nessuno dei fonts desiderati sia presente nel sistema + si resta con le impostazioni di default che prevedono Courier + New. + + *N.B.*: Valutare l'uso di =window-system-default-frame-alist=. + + #+begin_src emacs-lisp + (when (eq system-type 'windows-nt) + (cond ((find-font (font-spec :name "Cascadia Code PL")) + (add-to-list 'default-frame-alist '(font . "Cascadia Code PL-10")) + (set-face-attribute 'default nil :font "Cascadia Code PL-10")) + ((find-font (font-spec :name "DejaVu Sans mono")) + (add-to-list 'default-frame-alist '(font . "DejaVu Sans Mono-10")) + (set-face-attribute 'default nil :font "DejaVu Sans Mono-10")) + ((find-font (font-spec :name "Consolas")) + (add-to-list 'default-frame-alist '(font . "Consolas-10")) + (set-face-attribute 'default nil :font "Consolas-10")) + ((find-font (font-spec :name "Inconsolata")) + (add-to-list 'default-frame-alist '(font . "Inconsolata-10")) + (set-face-attribute 'default nil :font "Inconsolata-10")) + ) + ) + #+end_src + +**** Gestisce la startup screen + + Il buffer "\ast{}About GNU Emacs\{}" e' la startup screen standard + di Emacs e contiene alcuni link utili, soprattutto nei primi tempi + che si usa questo editor. Ma dopo un po' di tempo diventa inutile + e la sua visualizzazione all'avvio puo' essere tranquillamente + disattivata. Per gestirne l'attivazione o la disattivazione si + imposta la variabile ~inhibit-startup-screen~ + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |------------------+----------------------------| + | ~nil~ | Mostra la startup screen | + | non ~nil~ | Nasconde la startup screen | + + E' comunque richiamabile manualmente con ~M-x about-emacs~ + + #+begin_src emacs-lisp + (setq inhibit-startup-screen t) + #+end_src + +**** Gestisce la barra del menu (menu-bar) + + Mantiene attiva all'avvio la menu-bar. Per gestire la visualizzazione o + meno della menu-bar si usa il comando ~menu-bar-mode~ passandogli + un argomento. + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |------------------+-----------------------------------| + | ~>0~ | Abilita (mostra) la menu-bar | + | ~<=0~ | Disabilita (nasconde) la menu-bar | + + La menu-bar e' comunque attivabile/disattivabile manualmente con il + comando ~M-x menu-bar-mode~ + + #+begin_src emacs-lisp + (menu-bar-mode -1) + #+end_src + +**** Gestisce la barra gli strumenti (tool-bar) + + In modalitaì GUI mantiene attiva all'avvio la tool-bar. Per gestire la + visualizzazione o meno della tool-bar si usa il comando + ~tool-bar-mode~ passandogli un argomento. + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |------------------+-----------------------------------| + | ~>0~ | Abilita (mostra) la tool-bar | + | ~<=0~ | Disabilita (nasconde) la tool-bar | + + La tool-bar e' comunque attivabile/disattivabile manualmente con il + comando ~M-x tool-bar-mode~ + + Come l'attivazione o disattivazione della tool-bar si va ad impostare + e' opportuno andare ad impostare anche la "forma estetica" di come i + puslanti andaranno ad apparire nella tool-bar stessa. + Questa impostazione e' importante soprattutto in ambito GNU/Linux con + KDE dove la toolbar verrebbe mostrata con le sole etichette e senza + le icone (mentre in Windows lo standard mostra soltanto le icone). + L'impostazione vale per GTK+ ma influisce anche su KDE dove + il rendering dei widget GTK viene "emulato". + + Per fare questo si imposta la variabile =tool-bar-style= che puo' + assumere i seguenti valori: + + | valore argomento | Descrizione | + |------------------+---------------------------------------------------| + | image | show images only | + | text | show text only | + | both | show both, text below image | + | both-horiz | show text to the right of the image | + | text-image-horiz | show text to the left of the image | + | any other | use system default or image if no system default. | + + #+begin_src emacs-lisp + (tool-bar-mode -1) + (setq tool-bar-style 'image) + #+end_src + +**** Gestisce la scroll-bar verticale + + Nasconde all'avvio la scroll-bar verticale. Per gestire la + visualizzazione o meno della scroll-bar si usa il comando + ~toggle-scroll-bar-mode~ passandogli un argomento. + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |--------------------+-----------------------------------------------| + | ~>0~ oppure ~t~ | Abilita (mostra) la scroll-bar verticale | + | ~<=0~ oppure ~nil~ | Disabilita (nasconde) la scroll-bar verticale | + + La menu-bar e' comunque attivabile/disattivabile manualmente con il + comando ~M-x toggle-scroll-bar~ + + #+begin_src emacs-lisp + (toggle-scroll-bar -1) + #+end_src + +**** Gestisce la file-dialog + + Questa opzione entra in gioco in modalita' GUI quando, tramite menu-bar + o tool-bar, si esegue una operazione che richiede un file. Se la + file-dialog e' abilitata viene mostrata una dialog box grafica secondo + le impostazioni del sistema operativo; se invece e' disabilitata si + opera nel minibuffer come quando, ad esempio, si visita un file con + ~C-x C-f~. Per gestire questa impostazione si imposta la variabile + ~use-file-dialog~ + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |------------------+------------------------------------| + | non ~nil~ | Abilita l'uso della file-dialog | + | ~nil~ | Disabilita l'uso della file-dialog | + + #+begin_src emacs-lisp + (setq use-file-dialog nil) + #+end_src + +**** Gestisce le dialog-box per le conferme + + Questa opzione gestisce l'uso o meno delle richieste di conferma + "grafiche" tramite l'uso di una dialog-box quando un "evento" + scatenato dal mouse necessita di una conferma. Si applica alle + richieste ~y-or-n-p~ e ~yes-or-no-p~. Per fare questo si imposta + la variabile ~use-dialog-box~ + + Sarebbe da valutare l'opportunita' di gestire questa impostazione + in =early-init.el=. + + | Valore argomento | Descrizione | + |------------------+-----------------------------------| + | non ~nil~ | Abilita l'uso della dialog-box | + | ~nil~ | Disabilita l'uso della dialog-box | + + #+begin_src emacs-lisp + (setq use-dialog-box nil) + #+end_src + +**** Imposta la gestione dei backup e degli auto-save + + E' possibile disabilitare sia la creazione dei files di backup + che gli auto-saves. + + Tutte e due queste variabili accettano: + + | Valore argomento | Descrizione | + |------------------+----------------------------| + | non ~nil~ | Attiva la funzionalita' | + | ~nil~ | Disattiva la funzionalita' | + + #+begin_src emacs-lisp + (setq make-backup-files t + auto-save-default t) + #+end_src + +**** Gestisce le combinazioni "fastidiose" + + Alcune combinazioni di tasti presenti per impostazione predefinita sono + piuttosto infelici. + - ~C-z~: "sospende" il frame. In ambiente GUI riduce semplicemente + ad icona, in ambiente terminale sospende il processo di Emacs + mettendolo in background e uscendo alla shell; il processo puo' + poi essere "ripreso". _Non funziona in Microsoft Windows_. + La combinazione e' infelice perche' universalmente abbinata alla + funzionalita' di "undo" e per questo facilmente richiamabile + per errore. Volendo puo' comunque essere richiamata tramite il + comando ~M-x suspend-frame~ + - ~C-h h~: funzionalita' inutile che mostra le capacita' di rendering + dei font non latini di Emacs. Volendo puo' essere richiamata + tramite il comando ~M-x view-hello-file~ + + Per gestire quest impostazioni si utilizza una funzionalita' messa + a disposizione da =use-package=. La funzionalita' ~:bind~ consente + la gestione degli abbinamenti tra comandi e combinazioni di tasti. + + E' possibile richimare =use-package= con un nome di package "speciale": + =emacs= che non e' un package vero e proprio, ma e' comunque gestito + correttamente (esempio trovato in rete: [[https://protesilaos.com/dotemacs/]]). + + Oltretutto sembra possibile richiamare piu' volte =use-package= sullo stesso + package fornento integrazioni alle impostazioni. Impostazioni che vengono + gestite nell'ordine che si presentano. + + #+begin_src emacs-lisp + (use-package emacs + :bind (("C-z" . nil) + ("C-h h" . nil)) + ) + #+end_src + +**** Gestisce le combinazioni di tasti per ibuffer + + =ibuffer= e' un'alternativa avanzata al =buffer-menu= e alla funzione + =list-buffers= e consente di gestire i buffers in una modalita' + simile a =dired=. + + Vado a modificare l'abbinamento standard di Emacs per la combinazione + di tasti =C-x C-b= sostituendo la chiamata a =list-buffers= con + =ibuffer=. + + #+begin_src emacs-lisp + ;; (use-package emacs + ;; :bind ([remap list-buffers] . ibuffer) + ;; ) + (global-set-key [remap list-buffers] 'ibuffer) + #+end_src + +**** Gestisce le richieste Si/No + + In Emacs le richieste che prevedono risposta Si/No sono di due tipi e + e gestite da due funzioni: + - =y-or-n-p= :: Richiesta Yes/No a cui e' possibile rispondere con un + solo tasto (Y/N). Generalmente usata per richieste alle quali una + risposta poco attenta non provoca gravi consequenze + - =yes-or-no-p= :: Richiesta Yes/No che necessita di una maggiore attenzione + perche' una risposta errata potrebbe creare dei problemi maggiori, + per questo necessitano di una risposta esplicita. Per queto e' necesario + risponere in modo completo. + + E' possibile "accorciare" la riposta usando l'istruzione + =(fset 'yes-or-no-p 'y-or-n-p)=. Al momento preferisco pero' non usare questa + scorciatoia. + +**** Imposta il sistema di encoding + + Imposta il sistema di encoding predefinito a =utf-8= questo uniforma il + comportamento tra GNU/Linux e MS Windows. Si potrebbero comunque verificare + disagi quando si andranno a modificare files gia' esistenti, creati con un + altro editor che, in MS Windows, hanno mantenuto l'impostazione di default + del sistema opreativo e' solitamente "Windows-1252" (almeno in Italia). + + [[https://www.masteringemacs.org/article/working-coding-systems-unicode-emacs]] + + #+begin_src emacs-lisp + (prefer-coding-system 'utf-8) + (set-default-coding-systems 'utf-8) + (set-terminal-coding-system 'utf-8) + (set-keyboard-coding-system 'utf-8) + + ;; backwards compatibility as default-buffer-file-coding-system + ;; is deprecated in 23.2. + (if (boundp 'buffer-file-coding-system) + (setq-default buffer-file-coding-system 'utf-8) + (setq default-buffer-file-coding-system 'utf-8)) + + ;; Treat clipboard input as UTF-8 string first; compound text next, etc. + (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) + + ;; Messages encoding system + (setq locale-coding-system 'utf-8) + #+end_src + +**** Mostra la "highlight line" + + Lo faccio soltanto se sono nella GUI altrimenti e' troppo invasivo + dal punto di vista visuale. + + #+begin_src emacs-lisp + (when (window-system) + (global-hl-line-mode 1)) + #+end_src + +**** Disattiva il continuamento riga + + L'impostazione di default di Emacs prevede che righe contenenti + testo piu' lungo della dimensione della window vengano + continuate nella riga successiva ed evidenziate con un apposito + simbolo. + Con questa impostazione si imposta il funzionamento piu' o meno + consolidato nel resto del mondo: la riga prosegue "uscendo" + dallo schermo. + + E' possibile alternare questa impostazione anche una volta che + Emacs e' partito usando il comando =M-x toggle-truncate-line= + + #+begin_src emacs-lisp + (setq-default truncate-lines t) + #+end_src + +**** Mostra la parentesi abbinata + + #+begin_src emacs-lisp + (show-paren-mode 1) + #+end_src + +**** Scroll verticale "come te lo aspetteresti" + + L'impostazione di default di Emacs per lo scroll verticale e' quella di + portare il cursore al centro della window quando questo esce dall'area + visibile. Questo causa uno spostamento "a balzi" che puo' essere fastidioso. + + Questo e' uno dei metodi per impostare uno scroll verticale che incontri + le normali aspettative. + + #+begin_src emacs-lisp + (setq scroll-conservatively most-positive-fixnum) + #+end_src + +**** Scroll orizzontale come te lo aspetteresti + + L'impostazione di default porta il cursore al centro del buffer quando si + esegue uno scroll orizzontale e il cursore esce dallo schermo causando un + movimento "a balzi" che puo' essere fastidioso. + + Con questa impostazione lo scroll orizzontale viene impostato per comportarsi + come normalmente avviene: un carattere per volta. + + #+begin_src emacs-lisp + (setq hscroll-step 1) + #+end_src + +**** Bell + + Disattiva il "ding", per il momento mantengo attivo il "flashing" check + mostra visivamente l'equivalente del "ding". E' possibile disattivare anche + il flashing impostando =visbile-bell nil=. Il ding audio e' disattivato + usando come funzione associata una funzione inesistente "ignore". + + #+begin_src emacs-lisp + (setq visible-bell t + ring-bell-function 'ignore) + #+end_src + +**** Delete selection + + Il comportamento normale di Emacs e' quello di inserire il testo dove e' + posizionato il cursore anche quando e' in corso una selezione del testo + (si e' selezionata auna "region"). Questo comportamento e' diverso da + quello usato dalla maggior parte delle applicazioni attuali dove la + digitando il testo questo va a sostituire quello selezionato. + + #+begin_src emacs-lisp + (delete-selection-mode t) + #+end_src + +**** Tabulazioni + + Gestione delle impostazioni relative alle tabulazioni. + In certi ambiti le impostazioni sono "arcaiche" o diverse da quelle che + normalmente ci si possono aspettare. + + L'impostazione predefinita sara' di usare gli spazi al posto dei "tab". + + #+begin_src emacs-lisp + (setq-default indent-tabs-mode nil) + #+end_src + + Con la dimensione di una tabulazione espressa come 4 spazi. + + #+begin_src emacs-lisp + (setq-default tab-width 4) + #+end_src + + Creo quindi una "lista" di tabulazioni ogni 4 caratteri (un po' come + nelle vecchie macchine per scrivere o nei programmi tipo Word), iniziando + dal 4° carattere e ogni 4 caratteri fino al raggiungimento dei 200 caratteri. + + #+begin_src emacs-lisp + (setq tab-stop-list + (number-sequence 4 200 4)) + #+end_src + +**** Impostazioni per la stampa + + #+begin_src emacs-lisp + ;; Devo caricare il modulo di supporto per la stgampa + (require 'ps-print) + ;; Imposto il formato pagina a "A4" + (setq ps-paper-type 'a4) + ;; (setq ps-print-color-p 'black-white) + (setq doc-view-continuous t) + (cond ((eq system-type 'windows-nt) + ;; Windows-specific code goes here. + ;; ATTENZIONE + ;; Se si installa una versione diversa di GhostScript RICORDARSI + ;; di modificare qui i percorsi!!!!! + (setq ps-lpr-command "C:/Program Files/gs/gs9.50/bin/gswin64c.exe") + (setq ps-lpr-switches '("-q" + "-dNOPAUSE" + "-dBATCH" + "-dNoCancel" + "-sDEVICE=mswinpr2" + ;; "-IC:/Program Files/gs/gs9.50/lib" + ;; "-sFONTPATH=C:/Windows/Fonts" + ;; "-sOutputICCProfile=default_cmyk.icc" + ;; "-dBitsPerPixel=24" + ;; "-dEmbedAllFonts=true" + )) + (setq doc-view-ghostscript-program "C:/Program Files/gs/gs9.50/bin/gswin64c.exe") + (setq ps-printer-name t) + (setq ps-printer-name-option nil) + ) + ((eq system-type 'gnu/linux) + ;; Linux-specific code goes here. + )) + + ;; Start Emacs fullscreen mode + ;; (add-hook 'emacs-startup-hook 'toggle-frame-maximized) + #+end_src + +*** Package aggiuntivi + +**** Async + + Consente l'uso di processi asincroni quando possibile. + + #+begin_src emacs-lisp + (use-package async + :ensure t + :init + (dired-async-mode 1) + ) + #+end_src + +**** All-the-icons + + I package /all-the-icons/ installano font e immagini che possono essere + usati in abbinamento alle varie voci che Emacs mostra. Ad esempio + mostrando una lista di files ecc. + +***** All-the-icons + + =all-the-icons= e' un package che installa una quantita' di immagini + grafiche che possono essere usate per identificare meglio files e/o + contesti. Il package necessita di una parte di configurazione + manuale (in MS Windows) per l'installazione dei fonts necessari. + + Occorre leggere la documentazione sul sito del produttore: + [[https://github.com/domtronn/all-the-icons.el]] + + Il package deve essere attivato immediatamente dopo l'installazione + altrimenti gli altri package che lo usano non lo troveranno attivo + e non mostreranno le icone. Per questo si usa =:demand t= + + Naturalmente ha senso usare questo package soltanto quando siamo + in ambiente grafico, per questo uso =:if (window-system)= + + #+begin_src emacs-lisp + (use-package all-the-icons + :if (window-system) + :ensure t + :demand t + ) + #+end_src + +***** All-the-icons-dired + + Usa quanto fornito da =all-the-icons= nei buffer =dired= + + Questo package viene caricato in modalita' differita (non viene + caricato al momento della lettura di =use-package=) quando viene + attivato. L'attivazione avviene, tramite =dired-mode-hook=, + quando si apre un buffer =dired=. + + #+begin_src emacs-lisp + (use-package all-the-icons-dired + :if (window-system) + :ensure t + :defer t + :after all-the-icons + :hook (dired-mode-hook . all-the-icons-dired-mode) + ) + #+end_src + +***** All-the-icons-ibuffer + + Mostra le icone di =all-the-icons= negli =ibuffer= + + Questo package viene caricato in modalita' differita quando si + apre un buffer =ibuffer= (tramite =ibuffer-mode-hook=). + + #+begin_src emacs-lisp + (use-package all-the-icons-ibuffer + :if (window-system) + :ensure t + :defer t + :hook (ibuffer-mode-hook . all-the-icons-ibuffer-mode) + :after all-the-icons + ) + #+end_src + +**** Color themes + + Sono i temi di Emacs. Ce ne sono veramente una quantita' enorme ed esistono + anche siti che ne consentono la ricerca con anteprima ([[https://emacsthemes.com/][emacsthemes]]). + + Qui installo con =use-package= alcuni temi. E' necessario che i temi vengano + installati con l'opzione =:defer t= altrimenti, dopo l'installazione vengono + anche attivati con lo sgradevole effetto del passaggio in serie da un tema + all'altro ciclando su tutti i temi scelti. + + Naturalmente ha senso usare questi package soltanto quando siamo + in ambiente grafico, per questo uso =:if (window-system)= in ciascun blocco + =use-package= + + Alla versione 27.1 con Emacs vengono distribuiti i seguenti temi: + - =adwaita-theme= + - =deeper-blue-theme= + - =dichromacy-theme= + - =leuven-theme= + - =light-blue-theme= + - =manoj-dark-theme= + - =misterioso-theme= + - =tango-dark-theme= + - =tango-theme= + - =tsdh-dark-theme= + - =tsdh-light-theme= + - =wheatgrass-theme= + - =whiteboard-theme= + - =wombat-theme= + +***** Installo i package dei temi aggiuntivi + +****** Doom + + Questo package contiene una raccolta di color-themes usati dal + produttore di doom-emacs. + + Molti di questi temi sono riproduzioni o adattamenti di temi + prodotti da altri. Tra questi si possono trovare versioni di + /Gruvbox/, /Monokai/ ecc. + + Qui ho utilizzato la configurazione di esempio mostrata sul sito + del produttore: [[https://github.com/hlissner/emacs-doom-themes]] + togliendo soltanto l'istruzione che attiva il tema: + =(load-theme 'doom-one t)= + + #+begin_src emacs-lisp + (use-package doom-themes + :if (window-system) + :ensure t + :defer t + :config + ;; Global settings (defaults) + (setq doom-themes-enable-bold t ; if nil, bold is universally disabled + doom-themes-enable-italic t) ; if nil, italics is universally disabled + + ;; Enable flashing mode-line on errors + (doom-themes-visual-bell-config) + + ;; Enable custom neotree theme (all-the-icons must be installed!) + ;; (doom-themes-neotree-config) + ;; or for treemacs users + (setq doom-themes-treemacs-theme "doom-colors") ; use the colorful treemacs theme + (doom-themes-treemacs-config) + + ;; Corrects (and improves) org-mode's native fontification. + (doom-themes-org-config) + ) + #+end_src + +****** Modus themes + + Temi creati da [[https://protesilaos.com/][Protesilaos Stavrou]] + + Sono due temi di tipo [[https://www.w3.org/WAI/standards-guidelines/][WCAG AAA]]. + + I due vecchi packages (modus-vivendi e modus-operandi) sono stati recentemente unificati in un unico + package "modus-themes". La distribuzione e' inoltre passata da MELPA a ELPA + + #+begin_src emacs-lisp + (use-package modus-themes + ;; Da notare che questo tema e' valido sia in ambiente grafico + ;; che in ambiente terminale. Per questo lo carico comunque + ;; indipendentemente dal fatto che sia in "window-system" o meno + ;; :if (window-system) + :ensure t + :defer t + ) + #+end_src + +***** Attivo il tema che piu' mi piace in questo momento + + Imposto il tema considerando il fatto che emacs sia in esecuzione in + modalita' grafica o terminale. + + Di seguito un elenco dei vari temi che possono essere installati + + #+begin_src emacs-lisp :tangle no + ;; doom-themes contiene molti themes, qui uno dei piu' noti + ;; (load-theme 'doom-one t) + ;; + ;; (progn + ;; ;; Add all your customizations prior to loading the themes + ;; (setq modus-themes-slanted-constructs t + ;; modus-themes-bold-constructs nil + ;; modus-themes-region 'no-extend) + ;; ;; Load the theme files before enabling a theme (else you get an error). + ;; (modus-themes-load-themes) + ;; ;; Load the theme of your choice: + ;; ;; OR (modus-themes-load-vivendi) + ;; ;; OR (modus-themes-load-operandi) + ;; (modus-themes-load-vivendi) + ;; ) + #+end_src + + #+begin_src emacs-lisp + ;; (if (display-graphic-p) + ;; (load-theme 'doom-one t) + ;; (load-theme 'doom-dracula t) + ;; (load-theme 'doom-material t) + (progn + ;; Add all your customizations prior to loading the themes + (setq modus-themes-slanted-constructs t + modus-themes-bold-constructs nil + modus-themes-region 'no-extend) + ;; Load the theme files before enabling a theme (else you get an error). + (modus-themes-load-themes) + ;; Load the theme of your choice: + ;; OR (modus-themes-load-vivendi) + ;; OR (modus-themes-load-operandi) + (modus-themes-load-vivendi) + ) + ;; ) + #+end_src + +**** Gestione della modeline + + Nell'[[info:emacs#Screen][organizzazione dello schermo]] di Emacs la [[info:emacs#Mode Line][modeline]] e' quella parte del + [[info:emacs#Frames][frame]] di Emacs che si va a trovare nella parte inferiore di ogni [[info:emacs#Windows][window]] e, + come spiegato nel manuale di Emacs, "descrive cosa sta accadendo nel [[info:emacs#Buffers][buffer]] + corrente" + +***** Doom modeline + + Esistono molti modi di "personalizzare" la modeline. E' possibile farlo + direttamente nella configurazione di Emacs oppure e' possibile usare uno + dei tanti package disponibili. Tra i vari package ho scelto =doom-modeline= + perhche' mi sembra un buon compromesso tra la veste grafica e la quantita' + di informazioni presentate. + + *N.B:*: =doom-modeline= richiede, per funzionare correttamente che in precedenza + sia stato installato, configurato e caricato correttamente il package + =all-the-icons=. E' inoltre /fortemente consigliato/ l'abbiamenteo ad uno + dei =doom-themes= + + Le impostazioni di sono quelle suggerite dal produttore. + + Naturalmente ha senso usare questo package soltanto quando siamo + in ambiente grafico, per questo uso =:if (window-system)= + + #+begin_src emacs-lisp + (use-package doom-modeline + :if (window-system) + :ensure t + :after all-the-icons + ;;:init (doom-modeline-mode 1) + :hook (after-init-hook . doom-modeline-mode) + ) + #+end_src + +***** Minions + + Questo package consente la gestione dei minor modes tramite un menu della tool-bar. + Riduce quindi il numero di voci "lighter" presenti nella toolbar e li raggruppa + in una sola voce. + + Attivo =minions-mode= quando ho terminato l'inizializzazione tramite l'apposito + hook. + + Imposto =toom-modeline-minor-modes= a =t= per mostrare i minor modes nella + =doom-modeline= + + Naturalmente ha senso usare questo package soltanto quando siamo + in ambiente grafico, per questo uso =:if (window-system)= + + #+begin_src emacs-lisp + (use-package minions + :if (window-system) + :ensure t + :hook (after-init-hook . minions-mode) + :custom (doom-modeline-minor-modes t) + ) + #+end_src + +***** Mostra informazioni sulla riga e colonna e colonna corrente + + Con queste impostazioni sia il numero di riga che il numero di colonna + vengono mostrati nella modeline. + + #+begin_src emacs-lisp + (setq line-number-mode t + column-number-mode t) + #+end_src + + Queste impostazioni, invece, servono a mostrare il numero accanto ad ogni riga + del buffer. + + #+begin_src emacs-lisp + ;; Per adesso non mostro i numeri di riga sul lato della window + ;; (global-display-line-numbers-mode) + #+end_src + +<<<<<<< HEAD +**** Dashboard + + Dasboard attiva soltanto in ambiente grafico + + #+begin_src emacs-lisp + (use-package dashboard + :ensure t + :if (window-system) + :config + (dashboard-setup-startup-hook) + ;; (setq dashboard-startup-banner "~/.emacs.d/img/Logog-b.png") + (setq dashboard-startup-banner "~/.emacs.d/img/Logog-b.png" + ;; dashboard-startup-banner "~/.emacs.d/img/Logob-w.png" + dashboard-set-heading-icons t + dashboard-set-file-icons t + dashboard-image-banner-max-height 250 + dashboard-image-banner-max-width 250) + ) + #+end_src + +**** Discoverability + +***** Which-key + + Si tratta di un package che aiuta nella comprensione delle combinazione + dei tasti di Emacs. Iniziando a digitare una qualsiasi combinazione + di tasti =C-=, =M-=, =S-= ecc. mostra in un buffer popup tutti i tasti + che possono essere scelti con una breve spiegazione. + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + + #+begin_src emacs-lisp + (use-package which-key + :ensure t + :defer 5 + :delight + :commands which-key-mode + :config + (which-key-mode) + ) + #+end_src + +***** Hydra + + Consente la creazione di "popup" personalizzati che, alla pressione di + una combinazione di tasti, si attivano mostrando quali ulteriori tasti + possono essere utilizzati e a quale funzionalita' sono abbinati. + + Mentre =which-key= mostra le combinazioni "standard", =hydra= consente + la crazioni di reaggruppamenti non standard. + + #+begin_src emacs-lisp + (use-package hydra + :ensure t + :defer t + ) + #+end_src + +**** Ivy / Counsel / Swiper + +***** Ivy + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + #+begin_src emacs-lisp + (use-package ivy + :ensure t + :delight + ;; :hook (after-init-hook . ivy-mode) + :custom + (ivy-use-virtual-buffers t) + (enable-recursive-minibuffers t) + (ivy-count-format "%d/%d ") + :config + ;; Key bingings - Ivy based interface to stanard commands + ;; (global-set-key (kbd "C-x b") 'ivy-switch-buffer) + (global-set-key (kbd "C-c v") 'ivy-push-view) + (global-set-key (kbd "C-c V") 'ivy-pop-view) + ;; Key bindints - Ivy resume + (global-set-key (kbd "C-c C-r") 'ivy-resume) + (ivy-mode 1) + ) + #+end_src + +***** Swiper + + #+begin_src emacs-lisp + (use-package swiper + :ensure t + :after ivy + :config + ;; Key bindings - Ivy based interface to standard commands + (global-set-key (kbd "C-s") 'swiper-isearch) + ) + #+end_src + +***** Counsel + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + #+begin_src emacs-lisp + (use-package counsel + :ensure t + :delight + :after (ivy swiper) + :config + (counsel-mode t) + ;; (global-set-key (kbd " u") 'counsel-unicode-char) + ;; (global-set-key (kbd "C-c g") 'counsel-git) + ;; (global-set-key (kbd "C-c j") 'counsel-git-grep) + ;; ;; (global-set-key (kbd "C-c k") 'counsel-ag) + ;; ;; (global-set-key (kbd "C-x l") 'counsel-locate) + ;; ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox) + (define-key read-expression-map (kbd "C-r") 'counsel-expression-history) + ;; Key bindings - Ivy/Counsel interface to standard commands + (global-set-key (kbd "M-x") 'counsel-M-x) + (global-set-key (kbd "C-x C-f") 'counsel-find-file) + (global-set-key (kbd "M-y") 'counsel-yank-pop) + (global-set-key (kbd " f") 'counsel-describe-function) + (global-set-key (kbd " v") 'counsel-describe-variable) + (global-set-key (kbd " l") 'counsel-find-library) + (global-set-key (kbd " i") 'counsel-info-lookup-symbol) + (global-set-key (kbd " u") 'counsel-unicode-char) + (global-set-key (kbd " j") 'counsel-set-variable) + (global-set-key (kbd "C-x b") 'counsel-switch-buffer) + ;; Key bindings - Ivy/Counsel interface to shell and system tools + (global-set-key (kbd "C-c c") 'counsel-compile) + (global-set-key (kbd "C-c g") 'counsel-git) + (global-set-key (kbd "C-c j") 'counsel-git-grep) + (global-set-key (kbd "C-c L") 'counsel-git-log) + (global-set-key (kbd "C-c k") 'counsel-rg) + (global-set-key (kbd "C-c m") 'counsel-linux-app) + (global-set-key (kbd "C-c n") 'counsel-fzf) + (global-set-key (kbd "C-x l") 'counsel-locate) + (global-set-key (kbd "C-c J") 'counsel-file-jump) + (global-set-key (kbd "C-S-o") 'counsel-rhythmbox) + (global-set-key (kbd "C-c w") 'counsel-wmctrl) + ;; Key bindings - Counsel other commands + (global-set-key (kbd "C-c b") 'counsel-bookmark) + (global-set-key (kbd "C-c d") 'counsel-descbinds) + (global-set-key (kbd "C-c g") 'counsel-git) + (global-set-key (kbd "C-c o") 'counsel-outline) + (global-set-key (kbd "C-c t") 'counsel-load-theme) + (global-set-key (kbd "C-c F") 'counsel-org-file) + ) + #+end_src + +****** Counsel-etags + + _*Per il momento disabilitato, da valutare se serve veramente*_ + + #+begin_src emacs-lisp + (use-package counsel-etags + :disabled + :ensure t + :after counsel + ;; :bind (("C-]" . counsel-etags-find-tag-at-point)) + :init + (add-hook 'prog-mode-hook + (lambda () + (add-hook 'after-save-hook + 'counsel-etags-virtual-update-tags 'append 'local))) + :custom + (counsel-etags-update-interval 60) + :config + (push "build" counsel-etags-ignore-directories) + ) + #+end_src + +****** Counsel-css + + _*Per il momento disabilitato, da valutare se serve veramente*_ + + #+begin_src emacs-lisp + (use-package counsel-css + :disabled + :ensure t + :defer t + :after counsel + :hook (css-mode-hook . counsel-css-imenu-setup) + ) + #+end_src + +***** Ivy-rich + + #+begin_src emacs-lisp + (use-package ivy-rich + :ensure t + :after (ivy counsel) + ;; :init + ;; (ivy-rich-mode 1) + :config + (ivy-rich-mode 1) + ) + #+end_src + +***** All-the-icons-ivy-rich + + #+begin_src emacs-lisp + (use-package all-the-icons-ivy-rich + :if (window-system) + :ensure t + :after (ivy counsel ivy-rich all-the-icons) + ;; :init + ;; (all-the-icons-ivy-rich-mode 1) + :config + (all-the-icons-ivy-rich-mode 1) + ) + #+end_src + +***** Ivy-Hydra + + #+begin_src emacs-lisp + (use-package ivy-hydra + :ensure t + :defer t + :after (ivy hydra) + ) + #+end_src + +**** Amx + +#+begin_src emacs-lisp + (use-package amx + :ensure t + :defer t + :after (:all counsel) + ;; :bind (("M-X" . amx-major-mode-commands)) + :config (amx-mode t) + ) +#+end_src + +**** Org-mode + + Org-mode e' gia' stato caricato in =init.el=, qui si vanno ad aggiungere + alcune impostazioni. + + #+begin_src emacs-lisp + (use-package org + :defer t + :config + ;; Aggiungo exporter normalmente non abilitati + (add-to-list 'org-export-backends 'ascii) + (add-to-list 'org-export-backends 'beamer) + (add-to-list 'org-export-backends 'md) + (add-to-list 'org-export-backends 'org) + (progn (add-to-list 'org-latex-packages-alist '("" "tabularx" nil)) + (add-to-list 'org-latex-packages-alist '("" "tabu" nil)) + ) + ) + #+end_src + +***** Org-bullets + + Miglioramento grafico dei simboli per gli header di org. + Normalmente sarebbero degli asterischi, qui si unsano dei simboli. + + *N.B.*: ricordarsi che nel cosa si voglia stampare un file org + e' necessario disattivare =org-bullets-mode= altrimenti la stampa + che si ottiene presenta degli asterischi (secondo lo standar org) + e dei punti interrogativi (?) dovuti a problemi di rendering dei + caratteri utilizzati per i bullets. + + Questo package ha senso solo in ambiente grafico. + + Imposto qui =org-hide-leading-stars= e non in org perche' + qui mi interessa non mostrare artefatti prima del simbolo + grafico. + + #+begin_src emacs-lisp + (use-package org-bullets + :if (window-system) + :ensure t + :defer t + :hook (org-mode-hook . org-bullets-mode) + :after (org) + :custom + (org-hide-leading-stars t) + ) + #+end_src + +***** Org-superstar-mode + + Il nuovo package che mira a sostituire =org-bullet= + + Questo package ha senso solo in ambiente grafico. + + Imposto qui =org-hide-leading-stars= e non in org perche' + qui mi interessa non mostrare artefatti prima del simbolo + grafico. + + *DISATTIVO PERCHE' HA PERFORMACNES _PESSIME_ NELLA RICERCA!!!!* + + #+begin_src emacs-lisp + (use-package org-superstar + :disabled + :if (window-system) + :ensure t + :defer t + :after org + :hook (org-mode-hook . org-superstar-mode) + :custom + (org-hide-leading-stars t) + ) + + #+end_src + +***** Org-edna + + #+begin_src emacs-lisp + (use-package org-edna + :ensure t + :defer t + :after org + :hook (org-mode-hook . org-edna-mode) + :config + (org-edna-load) + ) + #+end_src + +**** Beacon + + Mostra un artifatto grafico partendo dal punto in cui si trova il cursore + rendendone piu' visibile la posizione secondo la metafora del fascio di + luce di un faro (beacon = faro). + + - beacon-mode :: E' la funzione che attiva o disattiva il beacon + + | Valore argomento | Descrizione | + |------------------+----------------------| + | ~>0~ | Abilita il beacon | + | ~<=0~ | Disabilita il beacon | + + Il beacon puo' essere attivato/disattivato manualmente con il + comando ~M-x beacon-mode~ + + - beacon-blink-when-focused :: E' la variabile che indica se il + beacon deve essere visualizzato anche quando Emacs riprende il + focus dopo che si e' passati ad un'altra finestra. + + | Valore argomento | Descrizione | + |------------------+----------------------| + | ~t~ | Mostra il beacon | + | non ~t~ | Non mostra il beacon | + + - beacon-size :: Imposta la lunghezza in caratteri del beacon. + La sua impostazione di default (40 caratteri) non rende particolarmente + visibile il beacon. Si puo' pero' allungare cambiando l'impostazione + con un valore maggiore + + Purtroppo sembra che Beacon abbia dei problemi con di funzionamento + in modalita' non grafica (terminale). Con il terminale il beacon + viene mostrato, ma non viene poi sempre rimosso. Per questo lo + abilito soltanto in modalita' GUI usando =:if (window-system)= + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + #+begin_src emacs-lisp + (use-package beacon + :if (window-system) + :ensure t + :defer t + :delight + :hook (after-init-hook . beacon-mode) + :custom + (beacon-blink-when-focused t) + ;;(beacon-size 64) + :config + (beacon-mode 1) + ) + #+end_src + +**** Avy + + #+begin_src emacs-lisp + (use-package avy + :ensure t + ) + #+end_src + +**** Gestione windows e buffers + +***** Ace-window + + Vado a modificare l'abbinamento standard di Emacs per la combinazione + di tasti =C-x o= sostituendo la chiamata a =other-window= con + =ace-window= + + #+begin_src emacs-lisp + (use-package ace-window + :ensure t + :defer t + :after avy + :bind ([remap other-window] . ace-window) + ) + #+end_src + +**** Autocompletamento + + Emacs consente la scelta tra vari strumenti di autocompletamento. + Company quello che sembra ricevere maggiori apprezzamenti. + +***** Company + + Company consente l'uso di diversi backand aggiuntivi per l'autocompletamento. + + Imposto il ritardo per attivare l'autocompletamento a 0 ms in modo da avere + una risposta immediata (per default richiede comunque 3 caratteri). + + Attivo company-mode globalmente in modo che funzioni su qualsiasi buffer. + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + #+begin_src emacs-lisp + (use-package company + :ensure t + :defer t + :delight + ;; :after yasnippet + :custom + (company-idle-delay 0.5) + (company-mimimum-prefix-length 3) + :hook (;;(prog-mode-hook . company-mode) + (after-init-hook . global-company-mode)) + ) + #+end_src + +***** Company quickhelp + + Un backend aggiuntivo per company. Mostra la documentazione relativa + all'elemento selezionato. + + #+begin_src emacs-lisp + (use-package company-quickhelp + :ensure t + :defer t + :after company + :custom + (company-quickhelp-delay 0.1) + :config + (company-quickhelp-mode 1) + ) + #+end_src + +**** Undo-tree + + #+begin_src emacs-lisp + (use-package undo-tree + ;; Treat undo history as a tree + :ensure t + :defer t + :delight "Ut" + :bind (("C-z" . undo) + ("C-S-z" . undo-tree-redo)) + :config + (progn + (global-undo-tree-mode) + (setq undo-tree-visualizer-timestamps t) + (setq undo-tree-visualizer-diff t)) + ) + #+end_src + +**** Git + +***** Magit + + In Emacs standard (27,1) =C-x g= non e' agganciato a nessuna + funzionalita' + + #+begin_src emacs-lisp + (use-package magit + :ensure t + :defer t + :after (ivy) + :bind ("C-x g" . 'magit-status) + ) + #+end_src + +***** gitconfig-mode + + #+begin_src emacs-lisp + (use-package gitconfig-mode + :ensure t + :defer 5 + :mode ("/\\.gitconfig\\'" + "/\\.git/config\\'" + "/modules/.*/config\\'" + "/git/config\\'" + "/\\.gitmodules\\'" + "/etc/gitconfig\\'") + ) + #+end_src + +***** gitignore-mode + + #+begin_src emacs-lisp + (use-package gitignore-mode + :ensure t + :defer 5 + :mode ("/\\.gitignore\\'" + "/info/exclude\\'" + "/git/ignore\\'") + ) + #+end_src + +***** gitattribute-mode + + #+begin_src emacs-lisp + (use-package gitattributes-mode + :ensure t + :defer 5 + :mode ("/\\.gitattributes\\'" + "/info/attributes\\'" + "/git/attributes\\'") + ) + #+end_src + +***** git-timemachine + + #+begin_src emacs-lisp + (use-package git-timemachine + :ensure t + :defer t + :commands git-timemachine + ) + #+end_src + +**** Programmazione + +***** Aggressive-indent + + #+begin_src emacs-lisp + (use-package aggressive-indent + :ensure t + :defer t + :diminish + :hook (emacs-lisp-mode-hook . aggressive-indent-mode) + ) + #+end_src + +***** Highlight-indent-guides + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre + il minor-mode. + + #+begin_src emacs-lisp + (use-package highlight-indent-guides + :ensure t + :defer t + :delight + :hook (prog-mode-hook . highlight-indent-guides-mode) + :custom + ((highlight-indent-guides-method 'character) + (highlight-indent-guides-responsive 'stack)) + :config + (unless (window-system) + (set-face-background 'highlight-indent-guides-odd-face "darkgray") + (set-face-background 'highlight-indent-guides-even-face "dimgray") + (set-face-foreground 'highlight-indent-guides-character-face "dimgray")) + ) + #+end_src + +***** Flycheck + + #+begin_src emacs-lisp + (use-package flycheck + :ensure t + ;;:init (global-flycheck-mode) + :defer t + :hook (prog-mode-hook . flycheck-mode) + ) + #+end_src + + E' possibile avere informazioni da FlyCheck sia in un "pos-tip" che in + un "popup-tip". + La differenza e' tecnica mentre dal punto di vista visuale non e' cosi' + evidente. Sembra che il pos-tip possa avere problemi in modalita' TTY. + Vediamo, per ora uso pos-tip + + #+begin_src emacs-lisp + (use-package flycheck-pos-tip + :ensure t + ;;:defines flycheck-pos-tip-timeout + :hook (flycheck-mode-hook . flycheck-pos-tip-mode) + :config (setq flycheck-pos-tip-timeout 30) + ) + #+end_src + + #+begin_src emacs-lisp + (use-package flycheck-popup-tip + :disabled + :ensure t + :defer t + ;;:defines flycheck-pos-tip-timeout + :hook (flycheck-mode-hook . flycheck-popup-tip-mode) + ;; :config (setq flycheck-pos-tip-timeout 30) + ) + #+end_src + +***** Smartparens + + Elimino il lighter dalla modeline: serve soltanto per attivare/disattivare + il minor-mode. + + #+begin_src emacs-lisp + (use-package smartparens + :ensure t + :defer t + :delight + :hook (prog-mode-hook . smartparens-mode) + :config + (require 'smartparens-config) + ;; (smartparens-global-mode) + ) + #+end_src + +***** Rainbow-delimiters + + #+begin_src emacs-lisp + (use-package rainbow-delimiters + :ensure t + :defer t + :hook (prog-mode-hook . rainbow-delimiters-mode) + ) + #+end_src + +***** Snippets + +****** Yasnippet + + #+begin_src emacs-lisp + (use-package yasnippet + :ensure t + :defer t + :hook (after-init-hook . yas-global-mode) + ;; :init (yas-global-mode 1) + :config (yas-reload-all) + ) + #+end_src + +****** Yasnippet-snippets + + #+begin_src emacs-lisp + (use-package yasnippet-snippets + :ensure t + :defer t + :after yasnippet + ) + #+end_src + +*** Piede del file di inizializzazione + + Qui vanno le impostazioni delle variabili locali del file. + + Da notare che l'impostazione del major mode *NON* deve avvenire qui + nella sezione "local variables", ma nella prima linea con la classica + notazione =-*- mode: lisp; -*-=, altrimenti si genera un errore nel tangling. + + #+begin_src emacs-lisp + ;; =========================================================================== + ;; Local Variables: + ;; coding: utf-8-unix + ;; indent-tabs-mode: nil + ;; tab-width: 4 + ;; End: + ;; =========================================================================== + + ;;; gb-init ends here + #+end_src + +** Variabili locali di file :noexport: + + Qui si e' utilizzato l'attributo =:noexport= perche' l'intenzione e' stata + quella di raggruppare le variaibli locali di questo file in un header + specifico; ma mentre le variabili locali sono "commenti" (iniziano per =#= e + non vengono quindi esportate, l'header non lo e' e senza questo attributo + verrebbe esportato. + + # =========================================================================== + # Local variables: + # coding: utf-8-unix + # mode: org + # indent-tabs-mode: nil + # tab-width: 4 + # end: + # =========================================================================== diff --git a/base/dotfiles/.emacs.d/img/Logob-w.png b/base/dotfiles/.emacs.d/img/Logob-w.png new file mode 100644 index 0000000..211212f Binary files /dev/null and b/base/dotfiles/.emacs.d/img/Logob-w.png differ diff --git a/base/dotfiles/.emacs.d/img/Logog-b.png b/base/dotfiles/.emacs.d/img/Logog-b.png new file mode 100644 index 0000000..0ce2631 Binary files /dev/null and b/base/dotfiles/.emacs.d/img/Logog-b.png differ diff --git a/base/dotfiles/.emacs.d/img/logo-BlackGreen-noText.svg b/base/dotfiles/.emacs.d/img/logo-BlackGreen-noText.svg new file mode 100644 index 0000000..a46f6b4 --- /dev/null +++ b/base/dotfiles/.emacs.d/img/logo-BlackGreen-noText.svg @@ -0,0 +1,89 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/base/dotfiles/.emacs.d/img/logo-GOLEM-text.svg b/base/dotfiles/.emacs.d/img/logo-GOLEM-text.svg new file mode 100644 index 0000000..d1c7a4a --- /dev/null +++ b/base/dotfiles/.emacs.d/img/logo-GOLEM-text.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/base/dotfiles/.emacs.d/img/logo-GOLEM-website.svg b/base/dotfiles/.emacs.d/img/logo-GOLEM-website.svg new file mode 100644 index 0000000..be25552 --- /dev/null +++ b/base/dotfiles/.emacs.d/img/logo-GOLEM-website.svg @@ -0,0 +1,72 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/base/dotfiles/.emacs.d/img/logo-WhiteBlack-noText.svg b/base/dotfiles/.emacs.d/img/logo-WhiteBlack-noText.svg new file mode 100644 index 0000000..42ed0a6 --- /dev/null +++ b/base/dotfiles/.emacs.d/img/logo-WhiteBlack-noText.svg @@ -0,0 +1,89 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/base/dotfiles/.emacs.d/img/original_Logob-w.png b/base/dotfiles/.emacs.d/img/original_Logob-w.png new file mode 100644 index 0000000..703d16e Binary files /dev/null and b/base/dotfiles/.emacs.d/img/original_Logob-w.png differ diff --git a/base/dotfiles/.emacs.d/img/original_Logog-b.png b/base/dotfiles/.emacs.d/img/original_Logog-b.png new file mode 100644 index 0000000..6dfbf2f Binary files /dev/null and b/base/dotfiles/.emacs.d/img/original_Logog-b.png differ diff --git a/base/dotfiles/.emacs.d/init.el b/base/dotfiles/.emacs.d/init.el new file mode 100644 index 0000000..365f344 --- /dev/null +++ b/base/dotfiles/.emacs.d/init.el @@ -0,0 +1,227 @@ +;;; init.el --- File di configurazione di GNU Emacs -*- mode: emacs-lisp; lexical-binding: t;-*- + +;; Copyright (C) 2020 Geraldo Biotti + +;; Author: Geraldo Biotti +;; Created: 20200731 +;; Keywords: init, early-init, .emacs.d, startup +;; Compatiblity: emacs-version >= 27 + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Questo file contiene le impostazioni di GNU Emacs che vengono eseguite +;; durante la fase di Init. +;; La fase di Init viene eseguita successivamente a quella di Early Init +;; +;; Per maggiori informazioni fare riferimento al manuale di GNU Emacs: +;; 49.4 The Emacs Initialization File + +;;; To do: + +;;; Change log: + +;;; Code: + +;; ---------------------------------------------------------------------------------------- +;; https://etienne.depar.is/emacs.d/init.html +;; https://github.com/MatthewZMD/.emacs.d + +;; https://www.reddit.com/r/emacs/comments/2edbau/what_are_some_great_emacsd_examples/ +;; https://www.reddit.com/r/emacs/comments/2edbau/what_are_some_great_emacsd_examples/ + +;; https://github.com/AndreaCrotti + +;; https://github.com/grettke/ + +;; Pastebin off topic: +;; https://www.privacytools.io/ +;; https://alternativeto.net/list/18434/xenmaster-s-privacy-tools + +;; https://send-anywhere.com/ +;; https://framasoft.org/en/ +;; https://gofile.io/welcome +;; ---------------------------------------------------------------------------------------- + +;; N.B.: Ho rimosso l'impostazione del lexical-binding: +;; -*- lexical-binding: t; -*- + +;; Se la versione e' inferiore alla 26.1 emetto un warning +(when (version< emacs-version "26.1") + (warn "E' necessario che GNU Emacs sia in versione 26.1 o successiva!")) + +(defun gb/emacs/package-setup () + "Function che imposta 'package'" + ;; Carico il modulo di gestione dei packages + (require 'package) + ;; Carica sempre il file piu' recente tra '.el' e '.elc' + (setq load-prefer-newer t) + ;; Aggiungo all'elenco dei repositories da cui scaricare i packages + ;; la versione "unstable" di Melpa + (add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/")) + ;; Genera dei warnings con i package-install + (unless (bound-and-true-p package--initialized) + (package-initialize)) + ) + +(defun gb/emacs/init-old-emacs-version () + "Function eseguita per il setup di init.el quando si sta usando Emacs + in versione precedente alla 27" + ;; Early-init e' gestito automaticamente dalla versione 27 in poi + ;; Se esiste early-init.el lo carico + (let ((gb/emacs/early-init-file (expand-file-name "early-init.el" user-emacs-directory))) + (when (file-exists-p gb/emacs/early-init-file) + (require 'early-init gb/emacs/early-init-file))) + (gb/emacs/package-setup) + ) + +(defun gb/emacs/init-new-emacs-version () + "Function eseguita per il setup di init.el quando si sta usando Emacs + in versione 27+" + ;; Avvio package + (gb/emacs/package-setup) + ) + +;; Eseguo le impostazioni in base alla versione di GNU Emacs +(if (version< emacs-version "27") + (gb/emacs/init-old-emacs-version) + (gb/emacs/init-new-emacs-version)) + +;; Delight e' un package che viene usato da use-package +;; mi accerto che sia installato, se non lo e' lo installo +;; N.B.: Se non si vuole averlo come dipendenza e' bene +;; installarlo prima di use-package +(unless (package-installed-p 'delight) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'delight)) + +;; Diminish e' un package che viene usato da use-package +;; mi accerto che sia installato, se non lo e' lo installo +;; N.B.: Se non si vuole averlo come dipendenza e' bene +;; installarlo prima di use-package +(unless (package-installed-p 'diminish) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'diminish)) + +;; Mi accerto che use-package sia installato +;; se non lo e' lo installo +(unless (package-installed-p 'use-package) + (unless package-archive-contents + (package-refresh-contents)) + (package-install 'use-package)) + +;; Carico use-package +(eval-when-compile + (require 'use-package)) + +;; Configuro use-package prima di caricarlo +(eval-and-compile + (if init-file-debug + (setq use-package-verbose t + use-package-expand-minimally nil + use-package-compute-statistics t + debug-on-error t) ; True + (setq use-package-verbose nil + use-package-expand-minimally t) ; False + ) + (setq use-package-enable-imenu-support t + ;; Quanto segue e' MOLTO IMPORTANTE: + ;; Usare sempre gli hook con il loro nome completo + ;; al posto del nome abbreviato: + ;; after-init --> after-init-hook + ;; Questo migliora la gestione della documentazione + ;; a riconoscere il contesto (vedi, ad esempio 'describe-symbol) + use-package-hook-name-suffix nil) + ) + +;; Configuro vc (package gestione "version cotrol" +(use-package vc + :config + ;; Questo perche' i miei "dotfiles" usano i link simbolici + (setq vc-follow-symlinks t) + ) + +;; Carico org +(use-package org + ;; Accertarsi di caricare quello presente nel repository GNU + ;; e non quello "builtin": quello in GNU e' sempre aggiornato. + :pin gnu + :ensure org + ) + +;; Qui avviene la magia. +;; Carico la configurazione dal file "org" +;; Cerco pero' di ottimizzare un mimino la cosa: +;; se il file "el" generato da org-babel e' piu' recente +;; del file "org" allora carico "el" altrimenti passo +;; all'uso di org-babel +(progn (defvar gb/emacs/gb-init "gb-init") + (defvar gb/emacs/conf-filename (expand-file-name gb/emacs/gb-init user-emacs-directory)) + (defvar gb/emacs/el-conf-filename (concat gb/emacs/conf-filename ".el")) + (defvar gb/emacs/org-conf-filename (concat gb/emacs/conf-filename ".org")) + (if (file-exists-p gb/emacs/el-conf-filename) + (if (file-newer-than-file-p gb/emacs/org-conf-filename gb/emacs/el-conf-filename) + (progn (message "%s e' piu' recente di %s, ricreo e carico il .el" + gb/emacs/org-conf-filename + gb/emacs/el-conf-filename) + (org-babel-load-file gb/emacs/org-conf-filename)) + (progn (message "%s e' meno recente di %s, carico il .el senza ricrearlo" + gb/emacs/org-conf-filename + gb/emacs/el-conf-filename) + (load-file gb/emacs/el-conf-filename))) + (progn (message "Creo e carico %s" gb/emacs/el-conf-filename) + (org-babel-load-file gb/emacs/org-conf-filename)) + ) + ) + +;; NON RIMUOVERE CUSTOM DA QUI +;; --------------------------- +;; Si potrebbe cedere alla tentazione di avere un init.el piu' "pulito" +;; spostando custom-set-variables e custom-set-faces in un file separato, +;; ma questo porta spesso a comportamenti altalenanti: se si installa un +;; package con use-package e la sua opzione :ensure, capita che il package +;; venga installato, ma la variabile package-selected-packages non venga +;; aggiornata correttamente portanto il package installato ad uno stato +;; di "dependency" in list-packages con invito alla rimozione qualora questo +;; non fosse effettivamente utilizzato anche come dipendenza da qualche altro +;; package +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(package-selected-packages + '(modus-themes dockerfile-mode cargo docker docker-compose-mode flycheck-rust impatient-mode simple-httpd yasnippet yasnippet-snippets org projectile company-go go-errcheck go-mode company-auctex auctex sql-indent markdown-mode csharp-mode powershell counsel-projectile ibuffer-projectile rainbow-delimiters smartparens flycheck-pos-tip flycheck highlight-indent-guides aggressive-indent pcre2el emms pdf-tools csv-mode pretty-mode elfeed-protocol elfeed-org elfeed-goodies elfeed company-restclient restclient treemacs-all-the-icons treemacs-projectile treemacs-magit treemacs git-timemachine gitattributes-mode gitignore-mode gitconfig-mode magit undo-tree origami company-quickhelp ace-window avy symon beacon htmlize org-edna org-bullets amx ivy-hydra all-the-icons-ivy-rich ivy-rich swiper hydra which-key dashboard minions doom-modeline base16-theme seti-theme moe-theme solarized-theme color-theme-sanityinc-tomorrow dracula-theme atom-one-dark-theme zerodark-theme gruvbox-theme monokai-theme zenburn-theme material-theme spacemacs-theme doom-themes all-the-icons-ibuffer all-the-icons-dired all-the-icons async use-package diminish delight))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) + +;; =========================================================================== +;; Local Variables: +;; coding: utf-8-unix +;; indent-tabs-mode: nil +;; tab-width: 4 +;; End: +;; =========================================================================== + +;;; init.el ends here diff --git a/base/dotfiles/.git_template/hooks/.gitattributes b/base/dotfiles/.git_template/hooks/.gitattributes new file mode 100644 index 0000000..c3cd4ec --- /dev/null +++ b/base/dotfiles/.git_template/hooks/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +pre-commit text eol=lf diff --git a/base/dotfiles/.git_template/hooks/pre-commit b/base/dotfiles/.git_template/hooks/pre-commit new file mode 100644 index 0000000..44cda68 --- /dev/null +++ b/base/dotfiles/.git_template/hooks/pre-commit @@ -0,0 +1,30 @@ +#!/bin/bash + +function get_org_of_current_repo() { + local orgs_from_global_config=$(git config --get-regexp ^orgs. | cut -d . -f 2) + + for org in $orgs_from_global_config; do + local org_remotes=$(git remote -v | grep -i $org/) + + if [ ! -z "$org_remotes" ]; then + echo $org + fi + done +} + + +org=$(get_org_of_current_repo) + +if [ ! -z "$org" ]; then + organization_email=$(git config orgs\.$org\.email) + repository_email=$(git config --local user.email) + + if [ "$organization_email" != "$repository_email" ]; then + echo "Organization '$org' identified!" + echo "Setting the configured e-mail <$organization_email>" + git config --local user.email $organization_email + + echo "Please repeat the commit command to use the new e-mail" + exit 1 + fi +fi diff --git a/base/dotfiles/.gitconfig b/base/dotfiles/.gitconfig new file mode 100644 index 0000000..f87d0f2 --- /dev/null +++ b/base/dotfiles/.gitconfig @@ -0,0 +1,19 @@ +[core] + editor = vi + quotepath = false +[alias] + graph = log --decorate --oneline --graph + whatsnew = !git log ..origin/`git rev-parse --abbrev-ref HEAD` +[include] + path = ~/.gitconfig_user + path = ~/.gitconfig_include +[init] + templatedir = ~/.git_template +[pull] + rebase = false +[fetch] + prune = false +[rebase] + autoStash = false + +# vim: set ft=gitconfig : \ No newline at end of file diff --git a/base/dotfiles/.gitignore b/base/dotfiles/.gitignore new file mode 100644 index 0000000..c9a447c --- /dev/null +++ b/base/dotfiles/.gitignore @@ -0,0 +1,99 @@ +# -*- mode: gitignore; -*- +# +# https://www.toptal.com +# +# ------------------------------------------------------------------------ +# WINDOWS gitignore settings +# ------------------------------------------------------------------------ +# Windows image file caches +Thumbs.db +ehthumbs.db +# Folder config file +Desktop.ini +# Recycle Bin used on file shares +$RECYCLE.BIN/ +# Windows Installer files +*.cab +*.msi +*.msm +*.msp +# Windows shortcuts +*.lnk +# ------------------------------------------------------------------------ + +# ------------------------------------------------------------------------ +# EMACS gitignore settings +# ------------------------------------------------------------------------ +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive +ltximg/** + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# network security +/network-security.data +# ------------------------------------------------------------------------ + +# ------------------------------------------------------------------------ +# VIM gitignore settings +# ------------------------------------------------------------------------ +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ +# ------------------------------------------------------------------------ diff --git a/base/dotfiles/.vim/.gitattributes b/base/dotfiles/.vim/.gitattributes new file mode 100644 index 0000000..2be8980 --- /dev/null +++ b/base/dotfiles/.vim/.gitattributes @@ -0,0 +1 @@ +* text eol=lf diff --git a/base/dotfiles/.vimrc b/base/dotfiles/.vimrc new file mode 100644 index 0000000..b92ae58 --- /dev/null +++ b/base/dotfiles/.vimrc @@ -0,0 +1,136 @@ +set nocompatible + +if has("gui_running") + let do_syntax_sel_menu=1 +endif + +set langmenu=none +if has("win32") || has("win64") + language messages en_US +else + language messages en_US.UTF-8 +endif + +if has("multi_byte") + if has("win32") || has("win64") + if has("gui_running") + set encoding=utf-8 + endif + endif + set encoding=utf-8 +endif + +set nocompatible + +" set modeline + +set backspace=indent,eol,start + +" Highlight problematic whitespace +" set listchars=tab:>.,trail:.,extends:#,nbsp:. +" set listchars=eol:¶,tab:»,trail:·,extends:>,precedes:<,nbsp:¤ +" il carattere per eol (¶) si ottiene con CTRL-vu00b6 +" il carattere per tab (») si ottiene con CTRL-vu00bb +" seguito da \ oppure +" il carattere per trail (·) si ottiene con CTRL-vu00b7 +" il carattere per extends (>) e' il carattere di maggiore +" il carattere per precedes (<) e' il carattere di minore +" il carattere per nbsp (¤) si ottiene con CTRL-vu00a4 +set listchars=eol:¶,tab:»\ ,trail:·,extends:>,precedes:<,nbsp:¤ + +set number +set relativenumber +set history=50 +set incsearch +set ignorecase +set smartcase +set wrapscan + +" Make the 'cw' and like commands put a $ at the end instead of +" just deleting the text and replacing it +set cpoptions=ces$ + +set statusline=%<%F\ %h%m%r%w%q\ %y\(%{&ff}\)\ %=\ \#%n\ ln:%l\/%L[%P]\ co:%c%V\ %b + +set lazyredraw +set showmode +set foldenable +set foldopen=block,insert,jump,mark,percent,quickfix,search,tag,undo +set whichwrap=b,s,h,l,<,>,[,] +set scrolljump=0 +set scrolloff=0 +set sidescrolloff=0 +set wildmenu +set showfulltag +set diffopt+=iwhite +set clipboard+=unnamed +set grepprg=grep\ -nH\ $* + +" let loaded_matchparen=1 + +set showtabline=2 +set nostartofline +set nospell " spell checking off (default!) +if has("autocmd") + filetype plugin indent on + augroup vimrcEx + au! + autocmd BufReadPost * + \ if line("'\"") > 1 && line("'\"") <= line("$") | + \ exe "normal! g`\"" | + \ endif + augroup END + +endif " has("autocmd") + +set nowrap +set autoindent +set tabstop=4 +set shiftwidth=4 +set softtabstop=4 +set noexpandtab + +if has("mouse") + set mouse=a +endif + +if &t_Co > 2 || has("gui_running") + syntax enable + set hlsearch + set synmaxcol=2048 +endif + +if has("cmdline_info") + set noruler + set showcmd +endif + +if has("statusline") + set laststatus=2 + set statusline=%<%f\ " Filename + set statusline+=%w%h%m%r " Options + set statusline+=\ [%{&ff}/%Y] " filetype + set statusline+=\ [%{getcwd()}] " current dir + "set statusline+=\ [A=\%03.3b/H=\%02.2B] " ASCII / Hexadecimal value of char + set statusline+=%=%-14.(%l,%c%V%)\ %p%% " Right aligned file nav info +endif + +if has("gui_running") + " GUI + set cursorline + set guicursor=n-v-c:block-Cursor-blinkon0,ve:ver35-Cursor,o:hor50-Cursor,i-ci:ver25-Cursor,r-cr:hor20-Cursor,sm:block-Cursor-blinkwait175-blinkoff150-blinkon175 + set cmdheight=2 " Abbreviato: set ch=2 + set mousehide +endif + +set shortmess+=I + +" CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo, +" so that you can undo CTRL-U after inserting a line break. +inoremap u + +set background=dark + +" +" vim: set tabstop=4:shiftwidth=4:filetype=vim:fdm=marker:fileformat=unix: +" diff --git a/base/sdf.bash b/base/sdf.bash new file mode 100755 index 0000000..6ac444b --- /dev/null +++ b/base/sdf.bash @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +echo "Per eliminare l'utente usare : 'userdel -r '" +echo "Per creare l'utente usare : 'useradd -m '" +echo "Per impostare la password usare: 'passwd'" +echo "" +echo "Se quando si elimina l'utente non viene eliminata anche la \$HOME" +echo "puo' dipendere dal fatto che esistono processi in esecuzione'" +echo "lanciati dall'utente, userdel lo dice." +echo "" +echo "" +if [ $(id -u) -eq 0 ]; then + USN="sdf" + USP="sdf" + egrep "^$USN" /etc/passwd >/dev/null + if [ $? -eq 0 ]; then + echo "Sto per eliminare l'utente $USN" + userdel -r $USN + echo "Ho eliminato l'utente $USN" + else + echo "L'utente $USN non esiste ancora" + fi + echo "Proseguo con la creazione dell'utente $USN" + useradd -m $USN + echo $USN:$USP | chpasswd + echo "Utente $USN aggiunto al sistema" +else + echo "Script eseguile soltanto come root!!!" + exit 2 +fi diff --git a/chezmoi.org b/chezmoi.org new file mode 100644 index 0000000..b357a28 --- /dev/null +++ b/chezmoi.org @@ -0,0 +1,142 @@ +* Chezmoi + + E' uno strumento che negli ultimi tempi è argomento di molti articoli e/o video. + + Si tratta di uno strumento scritto in GO e che quindi, oltre ad offrire il vantaggio di non avere + dipendenze esterne, è effettivamente multipiattaforma potendo funzionare sui canonici Linux/MacOS, + ma anche su Windows. + +* La filosofia + + Chezmoi si differenzia un po' dal resto degli strumenti in quanto tende a non usare i link simbolici + ma una "copia" dei files. + +* Installazione + + Sul sito github di Chezmoi c'è un comando da copiare che consente l'installazione del programma + (e anche la clonazione del repository). + + Il comando può essere scomposto andando ad utilizzare soltanto la parte relativa al download e + all'installazione del programma. + + L'installazion può avvenire con diversi metodi. Il metodo che funziona sempre è quello di usare + lo script presente su Github. Qui sarà mostrato lo script per Linux basato su "sh", ma è possibile + usare anche lo script basato su "poeershell": vedere la documentazione. + +** Prima installazione con repository da creare + + Se non diversamente indicato lo script di installazione posiziona il programma nella ~$HOME/.bin~, + posizione che a me non piace particolarmente; preferisco che l'eseguibile venga posizionato nella + ~$HOME/.local/bin~ che un po' tutte le versioni recenti di Linux hanno già nel path. + + Per installare il programma nella ~$HOME/.local/bin~ occorre eseguire quindi il comando così modificato: + #+begin_example + sh -c "$(curl -fsLS git.io/chezmoi)" -- -b $HOME/.local/bin + #+end_example + +** Installazione con clone del repository esistente + + Qui la situazione è praticamente quella descritta nella documentazione. + + L'unica differenza continua ad essere la preferenza personale nel voler installare l'eseguibile + nella ~$HOME/.local/bin~ + + Assumendo che il repository sia su Github: + #+begin_example + sh -c "$(curl -fsLS git.io/chezmoi)" -- -b $HOME/.local/bin init --apply + #+end_example + + La connessione al repository avviene normalmente usando il protocollo HTTPS, è possibile usare + il protocollo SSH usando il parametro aggiuntivo ~--ssh~. + + Il pattern ~~ può assumere, secondo la documentazione: + + | Pattern | HTTPS Repo | SSH repo | + |------------------+--------------------------------------+----------------------------------| + | user | https://github.com/user/dotfiles.git | git@github.com:user/dotfiles.git | + | user/repo | https://github.com/user/repo.git | git@github.com:user/repo.git | + | site/user/repo | https://site/user/repo.git | git@site:user/repo.git | + | ~sr.ht/user | https://git.sr.ht/~user/dotfiles | git@git.sr.ht:~user/dotfiles.git | + | ~sr.ht/user/repo | https://git.sr.ht/~user/repo | git@git.sr.ht:~/user/repo.git | + +* Partendo da un repository esistente + + Una volta installato il programma e clonato il repository l'unica azione da eseguire per avere + la configurazione dei dotfiles funzionante è: + + #+begin_example + chezmoi apply + #+end_example + + E' possibile aggiungere al comando dei parametri, tra questi sono utili: + - ~-v~ :: verbose, mostra il dettaglio delle operazioni effettuate + - ~-n~ :: dry-run, esegue un "giro di prova" senza applicare effettivamente le modifiche + +* Aggiunta di elementi alla gestione + + Per aggiungere un nuovo dotfile alla gestione si usa il comando ~chezmoi add ~ + + Assmendo di avere i dotfiles già presenti nella nostra home e volendoli aggiungere alla gestione + possiamo fare: + +** Emacs + + Con questi comandi si aggiungo in files e le directories alla gestione + + #+begin_example + chezmoi add ~/.emacs.d/early-init.el + chezmoi add ~/.emacs.d/init.el + chezmoi add ~/.emacs.d/gb-init.org + chezmoi add ~/.emacs.d/img + chezmoi add ~/.emacs.d/snippets + #+end_example + + Per vedere le modifiche che chezmoi applicherà si può usare il comando + + #+begin_example + chezmoi diff + #+end_example + + Per applicare le modifiche: + + #+begin_example + chezmoi -v apply + #+end_example + + A questo punto abbiamo operato le varie modifiche al repository locale. Chezmoi non interagisce + direttamente con git, per cui occorre entrare nella directory del repository ed eseguire sia il commit + che il push: + + #+begin_example + chezmoi cd # apre una shell posizionandosi nella directory del repository + git add . # aggingiamo il tutto allo sage + git commit -m "Aggiunto Emacs" + exit # esce dalla shell creata da chezmoi + #+end_example + + Per aggiornare poi il repository remoto: + + #+begin_example + chezmoi cd + git push origin master + exit + #+end_example + +** Vim + + #+begin_example + chezmoi add ~/.vimrc + chezmoi add ~/.vim + chezmoi -v apply + chezmoi cd + git add . + git commit -m "Aggiunto Vim" + git push origin master + exit + #+end_example + +** Git + + Nel repository di esempio si è usato il meccanimso dei template per configurare l'utente di Git + (in .gitconfig) in base all'hostname. + diff --git a/dotbot.org b/dotbot.org new file mode 100644 index 0000000..8385196 --- /dev/null +++ b/dotbot.org @@ -0,0 +1,195 @@ +* Dotbot + + Si tratta di uno strumento simile a GNU Stow ma che rispetto a questo + presenta delle migliorie. + + Come Stow anche Dotbot funziona soltanto su Linux/MacOS. E' scritto + in Python che, almeno sulle macchine Linux, è solitamente preinstallato. + + La metodologia standard per l'uso di Dotbot consiste nel creare un + repository per contenere i dotfiles e, all'interno di questo, clonare + come submodule Dotbot stesso. Questo sistema rende tutta la gestione + in qualche modo "self contained" mentre Stow, ad esempio, deve essere + installato. + + La pagine di riferimento per il progetto su Github è: + [[https://github.com/anishathalye/dotbot][https://github.com/anishathalye/dotbot]] dove si trova anche la documentazione + +* Partendo da zero + + Se si inizia a lavorare con Dotbot partendo da zero occorre creare un + nuovo repository che andrà a contenere i files da gestire, assumiamo + che il repository si troverà nella directory ~$HOME/.dotfiles~ e che + questa sia già stata creata: + + #+begin_example + # Mi posiziono nella directory del repository + cd ~/.dotfiles + # Inizializzo il repository se non esiste + git init + # Aggiungo dotbot come submodule + git submodule add https://github.com/anishathalye/dotbot + # Dico a git di ignorare eventuali modifiche alla workdir del submodule + git config -f .gitmodules submodule.dotbot.ignore dirty + # Copio il comando di "install" dal submodule nella root del repository + cp dotbot/tools/git-submodule/install . + # Creo il file di configurazione (vuoto) + touch install.conf.yaml + #+end_example + + A questo punto non si deve fare altro che iniziare a impostare il + contenuto di ~install.conf.yaml~ e spostare i dotfiles dalla posizione + origine all'interno del repository. + + Una volta impostato il tutto il comando ~install~ provvederà alla + creazione dei link. + +* Il file ~install.conf.yaml~ + + E' il motore di tutto il procedimento. E' un file in formato [[https://it.wikipedia.org/wiki/YAML][YAML]] e come tale necessita + di una corretta gestione dell'indentazione delle righe. + Dotbot consente anche l'uso del formato [[https://www.json2yaml.com/][JSON]], in questo caso il file si dovrà + chiare ~install.conf.json~ + + ~install.conf.yaml~ è suddiviso in "comandi": + - Defaults :: Qui vanno le impostazioni di default valide per tutte la varie + situazioni. E' utile per non dover specificare le stesse impostazioni + in ogni singolo altro ramo. + - Link :: Contiene, in forma di dizionario, gli abbinamenti tra destinazione + e origine. L'origine è il file presente nel repository e deve essere + specificato sempre relativamente alla radice del repository stesso (che + è dove si sta eseguendo l'installer). + Se si creano link a directory si deve omettere la barra finale. + - Create :: Indica le directory che devono essere create. Utile per creare + la struttura che poi andrà a contenere i link o che comunque è richiesta + dalle varie applicazioni. + - Shell :: Specifica i comandi di shell da eseguire. I comandi eseguiti + fanno riferimento alla directory in cui l'installer viene eseguito. + - Clean :: Specifica le directory che dovranno essere esaminate per la + presenza di "dead links". Nel caso in cui si trovi la presenza di un + link simbolico che non porta a niente questo viene eliminato. + + Ciascun "comando" prevede vari parametri, vedere la documentazione di Dotbot + per approfondire. + +* Impostiamo la gestione + + Con un editor andiamo a descrivere le opzioni di installazione in ~install.conf.yaml~ + +** Le impostazioni di default + + Le impostazioni di default sono quelle che, una volta specificate, valgono per + tutti gli altri "comandi". Nello specifico vogliamo che ciascun link utilizzi + l'opzione "relink" che rimuove il vecchio target se è un link simbolico. + + #+begin_example + - defaults: + link: + relink: true + #+end_example + +** Facciamo rimuovere i "dead link" + + Con l'opzione ~clean~ si indicano le directory in cui deve avvenire un + controllo per la verifica dei dead link verso il repository. + + #+begin_example + - clean: ['~'] + #+end_example + +** Impostiamo la creazione dei link simbolici + + #+begin_example + - link: + ~/.emacs.d: emacs/.emacs.d + ~/.vim: vim/.vim + ~/.vimrc: vim/.vimrc + #+end_example + + Nell'esmpio ho creato i collegamenti per VIM e Emacs. Ho preferito mantenere + nel repository i nomi dei files e delle directory che iniziano con il + punto, ma non è strettamente necessario. + + L'impostazione che ho dato è quella di avere nel repository delle directory + che andranno a contenere tutti gli elementi di una applicazione. + + In questo semplice esempio si sono creati i soli link simbolici non sfruttando + le possibilità di creare directory, eseguire script o utilizzare plugins. + +** Il risultato finale + + Il risultato finale del contenuto di ~install.conf.yaml~ dovrebbe quindi essre: + + #+begin_example + - defaults: + link: + relink: true + + - clean: ['~'] + + - link: + ~/.emacs.d: emacs/.emacs.d + ~/.vim: vim/.vim + ~/.vimrc: vim/.vimrc + #+end_example + +** Copiamo nel repository + + A questo punto dobbiamo spostare nel repository i files e le directory. + + Occorre spostare la directory ~$HOME/.emacs.d~ in ~$HOME/.dotfiles/emacs/~ + + Occorre anche spostare sia il file ~$HOME/.vimrc~ che la directory + ~$HOME/vim~ in ~$HOME/.dotfiles/vim/~ + +** Commit & push + + Stiamo lavorando in un repository. Non dimentichiamo di fare commit e push! + +** Install + + Una volta configurato il tutto non resta che far lavorare dotbot. + + Con il comando ~install~ (presente in ~$HOME/.dotfiles~) saranno creati i + link simbolici e fatto tutto quanto indicato nel file di configurazione. + +* Bootstrap + + Una volta creato il repository, configurato e messo su di un server raggiungibile + il bootstrap in un ambiente nuovo si riduce ad una linea di codice: + #+begin_example + cd ~ && git clone https://url/to/git/server/.dotfiles && cd ~/.dotfiles && ./install + #+end_example + + L'esempio assume l'uso di un repository che si chiama ~.dotfiles~ che sarà clonato + nella ~$HOME~ mantenendo lo stesso nome. + + *CAVEAT* + + Dotbot NON crea i link simbolici se il target già esiste come file o directroy normale. + Eventuali link simbolici esistenti sono sostituiti in presenza della direttiva ~relink: true~ + +* Informazioni aggiuntive + +** Plugins + + Una caratteristica interessante di dotbot è quella di avere un'architettura + che consente l'uso di plugins. + + Tra i plugins disponibili ([[https://github.com/anishathalye/dotbot/wiki/Plugins][https://github.com/anishathalye/dotbot/wiki/Plugins]]) + si trovano, ad esempio, quelli per clonare repository git, per installare + Visual studo code, per installare Rust. + + La lista non è enorme, ma comprende comunque elementi utili. + +** Repository di esempio + + Oltre all'autore del software che nel suo spazio su Github rende disponibile + la propria gestione dotfiles, nelle pagine Wiki del progetto si trova una + (lunga) [[https://github.com/anishathalye/dotbot/wiki/Users][lista di utenti che gestiscono i propri dotfiles con dotbot]] + +** Tips-And-Tricks + + Nella pagina wiki [[https://github.com/anishathalye/dotbot/wiki/Tips-and-Tricks][tips & triks]] del progetto si trovano spunti interessanti + sia per risolvere situazioni particolari, ma anche come punti di partenza + per approfondire ulteriori argomenti correlati alla gestione dei dotfiles. diff --git a/gnu_stow.org b/gnu_stow.org new file mode 100644 index 0000000..67eb5e3 --- /dev/null +++ b/gnu_stow.org @@ -0,0 +1,118 @@ +* Gestire i dotfiles con GNU Stow + + GNU Stow è uno strumento nato per gestire in modo massivo + i link simbolici nell'installazione di pacchetti software + compilati dai sorgenti. + + La sua specializzazione è gestire i link simbolici e per + questo è perfettamente adatto allo scopo di gestire i + dotfiles in un repository git, files che poi saranno + aggancciati come link simbolici nelle directory standard. + +* I "package" + + Stow definisce come package delle collezioni di elementi + correlati allo stesso contesto e che si vogliono gestire + come elemento unitario. Un package è una directory che + contiene al suo interno tutta la struttura che si vuole + replicare. + + Il package "vim" (quindi la directory "vim") conterrà tutti + i files e le directory necessari per la configurazione di + vim. Il nome del package non è necessariamente lo stesso + del programma di cui andremo a gestire i dotfiles, ma è + sicuramente buona pratica dare dei nomi significativi. + +* La "stow directory" + + E' la directory che contiene i package che vogliamo + gestire. + + Se non indicato in modo esplicito Stow considera come + stow directory la directory corrente. + +* La "target directory" + + E' la directory di destinazione dove Stow andrà a creare + i link simbolici. Se non indicata in modo esplicito + Stow assume come target directory la parent della + directory corrente. + +* Creazione della struttura. + + Assumendo che la stow directory si chiami ".dotfile" + un esempio di struttura potrebbe essere questo: + + #+begin_example + $HOME + +-- .dotfiles + + bash (directory - package) + | +-- .bash_aliases (file) + +-- vim (directory - package) + | +-- .vim (directory) + | +-- .vimrc (file) + +-- htop (directory - package) + +-- .config (directory) + +-- htop (directory) + +-- htoprc (file) + #+end_example + +* Esecuzione + + ~stow bash~ crea i limk simbolici del package "bash". Mantenendo le impostazioni + predefinite e assumendo di aver eseguito il comando posizionati nella directory + $HOME/.dotfiles Stow creerà un link simbolico di nome ".bash_alias" nella $HOME + che andrà a puntare a ~$HOME/.dotfiles/bash/.bas_alias~ + + E' possibile indicare più package: ~stow bash htop~ creerà i link simbolici per + i package "bash" e "htop". + + E' possibile anche far girare stow per tutti i package della stow directory: + ~stow *~ + +* ~--adopt~ + + Un parametro estremamente utile, ma da usare con cautela è ~--adopt~. + + Una volta creata la struttura dei package dove i files possono essere vuoti, si + può utilizzare questa opzione per automatizzare lo spostamento del file effettivo + nella sua posizione del package e la creazione del link simbolico. + + Quindi, assumendo di aver creato la struttura e che nel package "bash" il file + ~bash_aliases~ sia presente ma vuoto e assumendo anche che esista il file + ~$HOME/.bash_aliases~, l'uso del comando ~stow --adopt bash~ andrà a spostare + il file ~$HOME/.bash_aliases~ nella ~$HOME/.dotfiles/bash~ sovrascrivendo + il file esistente e creerà un link simbolico che vi punta. + a spostare + +* Rimozione dei link simbolici + + Può capitare di voler far pulizia: è possibile rimuovere i link simbolici + creati usando il parametro ~-D~ + +* Configurazioni separate per macchine separate + + E' un funzionalità non gestità direttamente da Stow. + Tuttavia, con un po' di manualità si possono creare package specifici sfruttando + il fatto che Stow non funziona con dei "sotto-package" e utilizzando in modo + corretto i parametri ~-d~ e ~-t~ + + E' possibile creare una struttura simile a questa: + + #+begin_example + $HOME + +-- .dotfiles + +-- bash (directory - package) + +-- PC1 (directory - macchina 1) + | +-- .bash_aliases (file per macchina 1) + +-- PC2 (directory - macchina 2) + +-- .bash_aliases (file per macchina 2) + #+end_example + + A questo punto si dovrà indicare a Stow che, per la macchina 1, la stow directory + è la ~$HOME/.dotfiles/bash~ e che la target directory è la ~$HOME~. + + Il comando sarà quindi qualcosa di simile (usando il parametro ~-n~ per simulare + l'esecuzione: + ~stow -n -d $HOME/.dotfiles/bash -t $HOME PC1~ + diff --git a/homerepo.org b/homerepo.org new file mode 100644 index 0000000..b1bb7fc --- /dev/null +++ b/homerepo.org @@ -0,0 +1,90 @@ +* Gestione della ~$HOME~ direttamente come repository + + E' un metodo che consiste nel fare in modo che il contenuto della $HOME + sia gestito direttamente come un repository Git. + + La forma più comune con cui questo metodo viene messo in pratica consiste + nella creazione di un repository Git di tipo "bare" nella ~$HOME~ e poi + utlizzarlo con le opzioni standard di Git. + + Git consente infatti di indicare, tramite appositi parametri, sia la + directory con i files da tracciare, sia la directory con i suoi dati. + + Per evitare di ripetere ogni volta questi parametri e anche per evitare + di sbagliarli si crea comunemente un alias. + +* Il metodo di lavoro + +** Creazione del repository "bare" + + Il repository può essere creato da zero o clonato da un server + remoto. + + Per convenzione si utilizzerà un repository che localmente si chiama + ~.dotfiles~. Si assume che i comandi siano dati avendo la $HOME come + directory corrente. + + Se si vuole creare un nuovo repository il comando da dare è: + ~git init --bare .dotfiles~ + + Se invece si vuole clonare un repository remoto il comendo da dare è: + ~git clone --bare ~ dove con ~~ si indica l'indirizzo da + cui clonare con l'accesso http/https o con l'accesso ssh. + +** Definizione dell'alias + + Per rendere più semplice l'operatività si utilizza un alias. + Si può scegliere un qualisi nome per l'alias. + + L'alias va reso disponibile ad ogni login, qui si aggiunge al + ~.bashrc~. Per aggiungerlo si può modiificare il file con un editor + o accodarlo con i comandi di shell. + + Per aggiungere l'alias accodandolo: + ~echo "alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME'" >> $HOME/.bashrc + +** Configurazione del repository + + Per evitare di vedere sempre come "non gestiti" tutti i files di cui non + ci importa e che non devono andare nel repository occorre configurare Git + in modo che non ce li mostri: + ~dotfiles config --local status.showUntrackedFiles no~ + + Infine, solo Se si è creato un nuovo repository e si intende appoggiare + il tutto ad un server remoto occorre configurare il "remote": + ~dotfiles remote add ~ + +** Operatività: + + A questo punto si usano i normali comandi Git avendo l'unica accortezza + di usare ~dotfiles~ invece di ~git~ + + Alcuni esempi + +*** Aggiuntere un nuovo file all'area di stage + + ~dotfiles add /path/to/file~ + +*** Commit + + ~dotfiles commit~ + +*** Push + + ~dotfiles pull~ + +** Caveats + + Non è tutto oro quello che luccica. + + Questo metodo rende complessa la gestione di files di configurazione di macchie + diverse. Si può ricorrere all'uso delle branch per identificare la macchina, ma + questo funziona soltanto se il numero di macchine è limitato e si lavora con + molta diligenza. + + Non è semplice avere dei diff tra le versioni proprio perchè si usa un + repository bare. + + ~dotfiles reset --hard~ potrebbe causare un infarto. + + "Varie ed eventuali". diff --git a/seratadotfiles.org b/seratadotfiles.org new file mode 100644 index 0000000..7d85f39 --- /dev/null +++ b/seratadotfiles.org @@ -0,0 +1,473 @@ +#+TITLE: Ora del GOLEM - i dotfiles +#+SUBTITLE: Una gestione ragionata dei files di configurazione +#+LANGUAGE: it +#+DATE: 22/06/2021 +#+OPTIONS: toc:t +#+LATEX_CLASS: article +# #+LATEX_CLASS: report +#+LATEX_HEADER: \usepackage[margin=1.5cm]{geometry} +#+LATEX_CLASS_OPTIONS: [a4paper,12pt] +#+LATEX_HEADER: \usepackage[italian]{babel} +#+LATEX_HEADER: \usepackage[hyphenbreaks]{breakurl} + +#+LATEX: \pagebreak + +* Riscopriamo l'acqua calda: cosa sono i "dotfiles"? + + Tutti lo sapete già: i dotfiles sono quei files (o directory) che iniziano con il carattere punto (".") e + che proprio per questa caratteristica risultano normalmente non visibili con gli strumenti che elencano + il contenuto del filesystem. + + Sono prevalentemente dominio del mondo Unix-like dove vengono tradizionalmente utilizzati per memorizzare, + relativamente allo user space, i dati utili al funzionamento dei programmi, ma si possono tranquillamente + trovare anche in sistemi con Windows. + + Rob Pike[fn:1] racconta che i dotfiles sono nati come effetto collaterale di una scorciatoia nel codice + di Unix presa, non si sa se da Ken (Thompson)[fn:2] o da Dennis (Ritchie)[fn:3] [!], fatta per non mostrare + le entries "." e ".." quando il filesystem di Unix divenne gerarchico[fn:4]. + + Da sempre i dotfiles, nell'accezione di files di configurazione, sono posizionati nella ~$HOME~ e questo + porta, con l'avanzare del tempo dalla prima installazione, ad un certo affollamento fisiologicamente + dovuto ai nuovi programmi che vengono di volta in volta installati e che hanno bisogno di memorizzare + i propri dati. + + Questa condizione di affollamento ha iniziato a migliorare con la progressiva adozione dello standard + "XDG Base Directory Specification"; standard che si prefigge lo scopo di mettere ordine nel marasma + dei files creati dai vari programmi nella home directory. + +* Note sullo standard "XDG Base Directory Specification" + + Si tratta di un insieme di specifiche, redatte dal X Desktop Group, che puntano standardizzare il + posizionamento dei dotfiles, definendone delle categorie e indicando le directory all'interno della + home destinate ad essere usate per ciascuna categoria. + + Molte delle applicazioni preesistenti sono state adeguate o sono in fase di adeguamento. + + Ciascuna applicazione segue però le proprie scelte per la compatibilità con la gestione legacy delle + impostazioni. Mentre alcune danno precedenza alla ricerca nelle directory indicate dalle specifiche e solo + se la ricerca non ha esito proseguono con il metodo legacy, altre agiscono in modo diametralmente opposto. + Allo stesso modo la posizione dove i files vengono creati automaticamente varia da un'applicazione + all'altra. Occorre quindi consultare la documentazione dell'applicazione per i dettagli. + + Da notare infine che il files e le directory poste all'interno della struttura definita dalle specifiche + normalmente non sono nascosti. + + Il wiki di Arch contiene un elenco di applicazioni che supportano le specifiche con indicazioni + relative anche ai percorsi legacy. + + Un paio di link esplicativi: + - [[https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html][XDG Base Directory Specification (X Desktop Group)]][fn:5] + - [[https://wiki.archlinux.org/title/XDG_Base_Directory][XDG Base Directory (Arch Wiki)]][fn:6] + + Le categorie e le directory associate sono tipicamente indicate con delle variabili d'ambiente che, + se non impostate, prevedono dei percorsi predefiniti. + +** ~$XDG_CONFIG_HOME~ + + Destinata a contenere i files e le directory di configurazione specifici dell'utente. + E' analoga a ~/etc/~. + Se la variabile non è impostata assume solitamente il valore predefinito di ~$HOME/.config~. + +** ~$XDG_CACHE_HOME~ + + Destinata a contenere dati non essenziali (cache) dell'utente. + E' analoga a ~/var/cache~. + Se la variabile non è impostata assume solitamente il valore predefinito di ~$HOME/.cache~. + +** ~$XDG_DATA_HOME~ + + Destinata a contenere i files di dati dell'utente. + E' analoga a ~/usr/share~. + Se la variabile non è impostata assume solitamente il valore predefinito di ~$HOME/.local/share~. + +** ~$XDG_STATE_HOME~ + + Destinata a contenere i files di stato delle applicazioni. + E' analoga a ~/var/lib~. + Se la variabile non è impostata assume solitamente il valore predefinito di ~$HOME/.local/state~. + + Con i files di stato si intendono files che contengono informazioni di cui è necessaria la + persistenza tra i riavvii delle applicazioni ma che comunque non sono fondamentali. + Un esempio tipico è rappresentato da logs, history, recents ecc. + +** Altre variabili + + Lo standard prevede anche altre variabili d'ambiente che consentono di specificare elenchi ordinati + di percorsi di ricerca quando i files non sono presenti nelle directory ~$XDG_???_HOME~. Si veda la + documentazione dello standard. + +** Estensioni alla specifica + + Molte distribuzioni Linux prevedono delle estensioni alla specifica che stanno diventando standard + de-facto. Una estensione molto comune è l'uso della directory ~$HOME/.local/bin~ che normalmente + non esiste ma che è sempre più spesso inclusa nel $PATH come impostazione predefinita. + +* E' importante gestire i dotfiles + + I dotfiles contengono dati importanti, per questo è bene gestirli in modo adeguato. + + Si potrebbe pensare che con le normali operazioni di backup si risolva definitivamente il problema. + Soluzione semplice, senza troppi sbattimenti ed efficace. + + In realtà i backup sono il minimo sindacale sotto il quale non si deve mai scendere, e la cosa deve + riguardare tutto il sistema e non i soli dotfiles. Repetita iuvant. + + Ma i dotfiles sono spesso più complessi di semplici elenchi di parametri composti da chiave/valore. + Capita non di rado che contengano script di shell o scritti in altri linguaggi. + + C'è di più: a differenza di Windows sono praticamente sempre files di testo (ma quella è un'altra storia) + e quando si parla di files di testo la prima cosa che viene in mente a un programmatore è VCS, alias Git! + +* Perché usare Git per i dotfiles? + + Perché no? L'uso Git e un minimo di organizzazione porta in dote tutti quei vantaggi tipici dei VCS: + - E' possibile vedere tutte le modifiche che sono state fatte nel tempo e, compatibilmente con la qualità + della descrizione inserita nel commit, risalire alla motivazione della modifica. + - E' possibile ripristinare velocemente modifiche fatte per errore; molto più semplice e veloce che + ripristinare un backup. + - E' relativamente semplice e veloce gestire le configurazioni di più macchine in un unico repository. + - Usando un repository in hosting è facile accedere ai propri files di configurazione in ogni parte + del mondo. + - Per lo stesso motivo di cui sopra è possibile e semplice condividere le proprie impostazioni con altri. + + Mettere i dotfiles in un repository è indubbiamente utile. Occorre però ricordarsi di prestare attenzione + a cosa ci si mette: _evitare assolutamente di mettere nel repository file che contengano informazioni sensibili_. + Qualcuno ha detto ~$HOME/.ssh~? In realtà vedremo che certi strumenti consento la memorizzazione crittografata + di questi files. + +* Stessi dotfiles su macchine diverse + + Si diceva che è relativamente facile gestire le configurazioni su macchine diverse. Con un po' di impegno in + più si può anche avere un certo automatismo anche su piattaforme diverse. + + Questa funzionalità è raggiungibile sia tramite l'uso di script personalizzati che tramite l'uso di strumenti + che prevedono l'uso multi-piattaforma. + + Occorre però tenere presente che, mentre per il mondo Linux/Mac il numero di strumenti utilizzabili è elevato, + lo stesso con accade per il mondo Windows dove il numero di strumenti decisamente ridotto. + +* Ok, da dove comincio? + + Occorre usare un "qualcosa", software o metodo, che aiuti in questa gestione. + + Parlando di dotfiles mantenuti in repository Git, le argomentazioni sul metodo che si trovano in rete portano + essenzialmente a due scuole di pensiero: + - Uso di un bare repository. all'interno della home. :: E' solitamente posizionato nella home, ma contrariamente + a quanto si possa pensare in prima battuta, non si tratta far diventare la home un repository. + Si tratta appunto di creare un bare repository che sarà contenuto in una subdirectory della home, subdirectory + che può essere nascosta e spesso è chiamata ~.dotfiles~. + Le operazioni di interazione con il repository saranno definite con degli alias di shell. + Questo approccio è veramente semplice ed efficace, ma soffre di qualche idiosincrasia. + Mentre è immediatamente fattibile con Linux e similari, con Windows ci si può arrivare soltanto con l'uso della + git-bash, di WSL o di powershell (questa sconosciuta). + Questo metodo diventa infine sempre più complicato se si vogliono avere configurazioni leggermente diverse + da macchina a macchina e mantenere un repository unico. + Alcuni link sull'argomento: + - [[https://www.atlassian.com/git/tutorials/dotfiles][The best way to store your dotfiles: A bare Git repository (Atlassian)]][fn:7] + - [[https://www.ackama.com/blog/posts/the-best-way-to-store-your-dotfiles-a-bare-git-repository-explained][The best way to store your dotfiles: A bare Git repository \ast{}\ast{}EXPLAINED\ast{}\ast{}]][fn:8] + - [[https://daniele.tech/2021/03/how-to-manage-dotfiles-with-a-git-bare-repository][How to manage dotfiles with a Git bare repository]][fn:9] + + - Uso di un repository normale. :: Si tratta di un normale repository Git con la sua working directory e + contenuto all'interno della home o in una qualsiasi altra directory. Anche qui non si tratta di far diventare + la home un repository. + Si differenzia dall'altro approccio perché mentre nel primo i files sono effettivamente presenti nella + home, in questo si andrà tipicamente ad utilizzare dei link simbolici. Con questo metodo si sfruttano + le capacità del filesystem per operare direttamente sul file nel repository come se fosse nella home. + La gestione del repository avviene normalmente e con l'uso di script personalizzati o strumenti appositi + è possibile gestire facilmente i link simbolici ma anche eventuali differenze tra vari PC. + + La differenza tra le due scuole di pensiero si evidenzia anche nel come si devono gestire le modifiche. + + Con il metodo del bare repository tutto si limita ad usare degli alias che prevedano i parametri necessari + ma continuando a ragionare come se si avesse a che fare con un normale repository. + + Con il repository normale, invece, occorre avere un qualcosa che ne consenta la gestione. + + Da questo punto di vista, scartando l'opzione di fare tutto a mano di volta in volta, si può + affrontare la cosa in vari modi. + +** Mi faccio la gestione in casa + + Con le giuste competenze e dedicandoci tempo si possono creare delle procedure che consentano la gestione + dei dotfiles accontentando le nostre più particolari esigenze. E' la strada scelta da molti e, quasi + certamente, è alla base dei tool che nel tempo sono stati presentati in rete. E' probabilmente l'unica + strada per raggiungere il massimo grado di soddisfazione, ma è anche quella più impegnativa. + + Questo approccio consente anche la gestione di elementi non necessariamente attinenti ai dotfiles. + Facendo tutto su misura si può naturalmente andare a gestire anche impostazioni di sistema e non + limitatamente al solo utente. + + La prima cosa ch viene in mente è usare uno script di shell, ma ovviamente non è un dogma. + Girando in rete ho trovato questo video su Youtube dove viene mostrato un approccio basato su + Make: [[https://www.youtube.com/watch?v=aP8eggU2CaU][How To Manage Your Dotfiles With Make]][fn:10] + +** Uso strumenti già pronti + + E' probabilmente la soluzione più semplice. In rete sono presenti molti strumenti che coprono con varie + modalità le esigenza più comuni. + + Se poi lo strumento scelto non fosse perfetto per noi possiamo sempre sfruttare i vantaggi messi a + disposizione dal mondo dell'open source: proporre delle patch o fare un fork. + + L'elenco degli strumenti reperibili in rete è discretamente lungo e in continuo aggiornamento. + + Tra questi quelli che hanno in qualche modo attirato la mia attenzione quelli che: + - Sono multi-piattaforma e oltre ai canonici Linux/Mac includono anche Windows. + - Sono per quanto possibili esenti da dipendenze esterne intendendo questa affermazione in modo + "lasco", nel senso che se le dipendenze sono normalmente presenti nel sistema e non devo + installare niente allora va bene, ma va bene anche usare un singolo eseguibile che magari può + essere inserito nel repository stesso. + - Non soddisfano i criteri precedenti, ma appartengono comunque al gruppo dei più utlizzati in + base ad una statistica veloce e non ortodossa risultante da qualche ricerca in rete. + +*** GNU Stow + + E' un software che nasce essenzialmente per gestire la creazione di link simbolici. + E' nativo Linux e credo funzioni anche su Mac, ma non Windows. + + Gode di una certa fama in quanto semplice ed immediato, ma si limita a fare una ed una sola cosa, + anche se la fa bene. + Con Stow, infatti, potete soltanto gestire i link simbolici. + + Il funzionamento è appunto molto semplice: è sufficiente creare una directory in cui andare + a creare tante sottodirectory quanti sono i "moduli" che vogliamo gestire. Questa semplicità + rende più complicata la gestione di configurazioni diverse su macchine diverse. L'ostacolo si + può in qualche modo aggirare con degli script, ma non si possono gestire parti in comune. + + [[https://www.gnu.org/software/stow/][Link alla pagina del software]][fn:11] + +*** dotbot + + Uno "Stow on steroid" per forza di cose un po' più complesso, ma non troppo. + + Scritto in Python consente la gestione dei dotfiles come link simbolici ma anche molto altro come, + ad esempio, configurazioni separate per macchina/profilo o l'esecuzione di comandi. Da notare + la possibilità di usare dei plug-in oltre al fatto che, dando per scontato la presenza di Python su + tutte le installazioni Linux, la replica di una configurazione si limita ad una riga di bash. + + Purtroppo non funziona in modo nativo in Windows. + + Pur mantenendo una relativa semplicità offre molte funzionalità in più rispetto a Stow. + + [[https://github.com/anishathalye/dotbot][Link alla pagina del software]][fn:12] + [[https://github.com/anishathalye/dotfiles][I dotfiles dello sviluppatore]][fn:13] + +*** Chezmoi + + Scritto in GO - quindi senza dipendenze - funziona in ambiente Linux/Mac e Windows. + + Usa un approccio diverso rispetto agli altri perché invece di usare dei link simbolici gestisce + a livello applicativo i dotfiles. + + Sulla carta offre capacità notevoli, tra cui il funzionamento in Windows. Ad una prima prova + è però risultato poco confortevole, forse anche a causa di una documentazione che trovo poco + chiara. + + Occorre comunque tenere presente questo strumento che gode di molti giudizi positivi in rete. + + [[https://github.com/twpayne/chezmoi][Link alla pagina del software]][fn:14] + [[https://github.com/twpayne/dotfiles][I dotfiles dello sviluppatore]][fn:15] + +*** Yadm + + E' uno degli strumenti per la gestione dei dotfiles che si trovano più frequentemente nelle + discussioni in rete. + + Scritto in Python, funziona soltanto su Linux/Mac, ma offre molte funzionalità comunemente + apprezzate quale la gestione sia di files specifici per sistema che l'uso di template. + Apprezzabile la possibilità di crittografare dati sensibili. + + [[https://yadm.io][Link alla pagina del software]][fn:16] + +*** Toml-bombadil + + Scritto in Rust, multi-piattaforma + + Interessante progetto che prendendo come modello Chezmoi cerca di semplificarne + un po' l'uso gestendo soltanto alcune funzionalità peculiari. A differenza di + Chezmoi presenta una documentazione scritta discretamente e quindi facilmente + comprensibile + + [[https://github.com/oknozor/toml-bombadil][Link alla pagina del software]][fn:17] + [[https://github.com/oknozor/dotfiles][I dotfiles dello sviluppatore]][fn:18] + [[https://rgoswami.me/posts/dotfiles-dotgit-bombadil][L'esperienza d'uso di un utilizzatore]][fn:19] + +*** Varie ed eventuali + + Il mondo degli strumenti di ausilio alla gestione dei dotfiles è i continuo fermento e + il loro numero aumenta quasi giornalmente, per cui è praticamente impossibile approfondire tutta + la produzione disponibile. + + Alcuni tra quelli trovati nelle varie ricerche in rete sono comunque degni di nota e da considerare, + se non altro, per vedere come evolvono. + +**** Homeshick + + Completamente scritto in Bash - quindi senza dipendenze. + + Un altro gestore di link simbolici. + + [[https://github.com/andsens/homeshick][Link alla pagina del software]][fn:20] + +**** Dotprop + + Scritto in Python. + + Offre alcune caratteristiche interessanti quali la possibilità di gestire configurazioni + separate per macchina di destinazione e l'utilizzo di template per avere impostazioni + differenti all'interno dello stesso dotfile. + + [[https://github.com/deadc0de6/dotdrop][Link alla pagina del software]][fn:21] + +**** Dotter + + Un altro "Stow on steroid" che però offre alcuni importanti vantaggi: + - E scritto in Rust: non ha dipendenze e funziona su tutte le piattaforme + - Consente l'uso di template anche se files originati da template non sono link simbolici + ma files veri e propri: se si deve modificare qualcosa occorre modificare il template + e poi ricreare il dotfile con dotter + - Consente una qualche forma di gestione differenziata tra le macchine target, ma deve + essere gestita manualmente. + + [[https://github.com/SuperCuber/dotter][Link alla pagina del software]][fn:22] + [[https://github.com/SuperCuber/dotfiles][I dotfiles dello sviluppatore]][fn:23] + +**** Pearl + + Scritto in Python è usabile soltanto in ambito Linux/Mac. + Approccio interessante basato sulla modularità. + + [[https://github.com/pearl-core/pearl][Link alla pagina del software]][fn:24] + +**** Comtrya + + Scritto in Rust, multi-piattaforma. + + Un progetto nato da poco che coniuga la gestione dei dotfiles con l'installazione + del sistema da zero consentendo l'installazione anche del software. + Nella documentazione del progetto viene definito una versione semplificata di + Ansible o Salt. + + Il progetto e' ancora molto giovane, ma certamente interessante. + + [[https://github.com/comtrya/comtrya][Link alla pagina del software]][fn:25] + + +** Una via di mezzo + + Quello che può capitare è che magari non si ha il tempo o le conoscenze per potersi mettere + a sviluppare un proprio modo per gestire i dotfiles e che non si trovino strumenti che ci + piacciono. + + Mantenendo l'intenzione di gestire in qualche modo i dotfiles non rimane che cercare in + rete quello che più si avvicina al nostro pensiero e poi provare a modificarlo. Si può + magari fare un lavoro di collage prendendo spezzoni e idee provenienti da più progetti. + + Anche se utile non è necessario essere profondi conoscitori del linguaggio usato dal + creatore originale. Certo che prima di eseguire sulla propria macchina un pezzo di codice + preso da uno "sconosciuto" è buona regola provare almeno a capire se presenta situazioni + in cui si possono creare dei danni. + + Quello che si otterrà è un franken-qualcosa che magari legato con il filo di ferro fa + quello che volevamo. Più o meno. + + Storicamente le mie conoscenze di Bash sono sempre state piuttosto misere. Quelle di Powershell + sono probabilmente ancora minori. Con i vecchi script ".bat" o ".cmd" di Windows si possono + fare diverse cose ma forse questa sarebbe stata un po' troppo complessa. + + Qualche anno fa mi sono messo alla ricerca di qualcuno che avesse risolto il mio "problema". + Dopo vari tentativi ho trovato un qualcosa che si avvicinava alle mie esigenze, ho spudoratamente + copiato quello che aveva fatto lui e con qualche modifica fatta cercando di limitare al massimo + i danni mi sono avvicinato ancora di più a quello che volevo. + + Nella realtà le mie necessità erano e sono abbastanza semplici: poter gestire i files di configurazione + dei programmi che uso sia sulle macchine Windows che su quelle Linux. + + Sono passati degli anni e non ho più memoria di chi è la persona da cui ho spudoratamente copiato, + la ringrazio comunque. + + Ad oggi ho un paio di script che, seguendo delle convenzioni nel naming dei files, mi consentono di + gestire i miei files di configurazione partendo dallo stesso repository sia su Windows che su Linux. + +* Conclusioni + + Come dicevo la mia esigenza rispetto ai dotfiles è sempre stata piuttosto semplice: avere per quanto + possibile un unico file di configurazione che possa andare bene sia su Windows che su Linux e mettere + questi files di configurazione in un repository Git in modo da poterlo facilmente scaricare da + più macchine sfruttando tutti i vantaggi di un VCS. A corollario di questo un qualche sistema che + mi consenta un qualche automatismo nel bootstrap della configurazione. + + Fino a quando non ho cominciato ad accarezzare l'idea di parlare dei dotfiles quello che avevo + mi è sempre stato più che sufficiente. Cercando però documentazione per approfondire ho trovato che + l'argomento è molto più trattato di quanto potessi pensare e non è considerato affatto banale come + credevo. + + Nell'ambito dei dotfiles C'è una certa effervescenza sia negli articoli di blog che spiegano i vari + approcci, sia negli strumenti di gestione che presentano con una certa frequenza nuovi elementi. + +* Possibili approfondimenti + + La classica ricerca su Google mostrerà la solita quantità infinita di link. + + Ho però trovato due punti da cui partire e che, in linea di massima, concentrano quanto di più + importante c'è da sapere. Sono due pagine che in realtà si mettono nei riferimenti l'una + dell'altra, per questo potrei anche metterne una sola, ma per quanto alla fine contengano + molte informazioni duplicate, si completano in quelle mancanti: + - [[https://github.com/webpro/awesome-dotfiles][Awesome dotfiles - A curated list of dotfiles resources]][fn:26] + - [[https://dotfiles.github.io][Your unofficial guide to dotfiles on GitHub.]][fn:27] + +* Footnotes + +[fn:27]https://dotfiles.github.io + +[fn:26]https://github.com/webpro/awesome-dotfiles + +[fn:25]https://github.com/comtrya/comtrya + +[fn:24]https://github.com/pearl-core/pearl + +[fn:23]https://github.com/SuperCuber/dotfiles + +[fn:22]https://github.com/SuperCuber/dotfiles + +[fn:21]https://github.com/deadc0de6/dotdrop + +[fn:20]https://github.com/andsens/homeshick + +[fn:19]https://rgoswami.me/posts/dotfiles-dotgit-bombadil + +[fn:18]https://github.com/oknozor/dotfiles + +[fn:17]https://github.com/oknozor/toml-bombadil + +[fn:16]https://yadm.io + +[fn:15]https://github.com/twpayne/dotfiles + +[fn:14]https://github.com/twpayne/chezmoi + +[fn:13]https://github.com/anishathalye/dotfiles + +[fn:12]https://github.com/anishathalye/dotbot + +[fn:11]https://www.gnu.org/software/stow + +[fn:10]https://www.youtube.com/watch?v=aP8eggU2CaU + +[fn:9]https://daniele.tech/2021/03/how-to-manage-dotfiles-with-a-git-bare-repository + +[fn:8]https://www.ackama.com/blog/posts/the-best-way-to-store-your-dotfiles-a-bare-git-repository-explained + +[fn:7]https://www.atlassian.com/git/tutorials/dotfiles + +[fn:6]https://wiki.archlinux.org/title/XDG_Base_Directory + +[fn:5]https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + +[fn:4]https://web.archive.org/web/20190202170417/https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp + +[fn:3]https://it.wikipedia.org/wiki/Dennis_Ritchie + +[fn:2]https://it.wikipedia.org/wiki/Ken_Thompson + +[fn:1]https://it.wikipedia.org/wiki/Rob_Pike diff --git a/seratadotfiles.pdf b/seratadotfiles.pdf new file mode 100644 index 0000000..303a84c Binary files /dev/null and b/seratadotfiles.pdf differ diff --git a/yadm.org b/yadm.org new file mode 100644 index 0000000..0b6a337 --- /dev/null +++ b/yadm.org @@ -0,0 +1,116 @@ +* yadm + + Scritto in Python. Non funziona su Windows, ma non ha dipendenze aggiuntive su Linux. + + Consente la gestione dei dotfiles in un repository con l'aggiunta dei template e anche dei dati + crittografati (come anche chezmoi). + +* Installazione + + E' possibile installare il programma in vari modi (elencati nella documentazione). Un modo che + consente l'installazione senza necessità di particolari diritti e' quello di scaricare il + programma direttamente dal repository github: + + #+begin_example + mkdir ~/.local/bin + + curl -fLo ~/.local/bin/yadm \ + https://github.com/TheLocehiliosan/yadm/raw/master/yadm \ + && chmod a+x ~/.local/bin/yadm + #+end_example + + Yadm funziona come un wrapper attorno a Git con l'aggiunta di alcune particolarità specifiche per + la gestione dei dotfiles. + +* Partendo da zero + + Partendo da zero la procedura prevede + - La creazione del repository dove yadm gestirà i dotfiles + - La sua configurazione (ricordarsi di impostare user.name e user.email) + - La configurazione del link al repository remoto + - L'aggiunta dei dotfiles al repository + - Il commit + - Il push + + #+begin_example + # Inizializzo il repository + # (ricordarsi di aggiungere poi a mano user.name e user.email) + # il repository viene creato in ~/.local/share/yadm/repo.git + yadm init + + # Aggiungere il server remoto + # yadm remote add origin + + # Aggiungo vim + yadm add .vimrc + yadm add .vim + yadm commit -m "Aggiunto vim" + yadm push -u origin master + #+end_example + + Si possono aggiungere files o directory come se si stesse lavorando con Git + +* Partendo con un nuova installazione, ma con repository remoto già pronto + + Partendo da una home "vuota" ed avendo a disposizione un repository già configurato + si procede con l'installazione del programma + + #+begin_example + mkdir ~/.local/bin + + curl -fLo ~/.local/bin/yadm \ + https://github.com/TheLocehiliosan/yadm/raw/master/yadm \ + && chmod a+x ~/.local/bin/yadm + #+end_example + + A questo punto si clona il repository + + #+begin_example + # yadm clone + yadm status + #+end_example + + Il comando ~clone~ cerca di fare il checkout di tutti i files presenti nel reposiotry. + *Se un file esiste già localmente e il suo contenuto differisce da quello nel repository* + *il file locale sarà lasciato invariato e occorrerà verificare e risolvere le differenze*. + +* Funzionalità particolari + + Yadm offre alcune funzionalità particolari + +* Bootstrap + + E' possibile posizionare uno script di nome ~bootstrap~ (deve chiamarsi così) in + ~$HOME/.config/yadm~. + + Questo file, che deve essere posizionato manualmente e deve essere eseguuibile, + sarà richiamato ed eseguito con il comando + + #+begin_example + yadm bootstrap + #+end_example + +* Alternate files + + E' possibile usare files diversi per situazioni diverse. La gestione avviene appendendo un suffisso + al nome del file da aggiungere al repository (vedi documentazione). + +* Templates + + Il concetto è simile agli alternate files. I template contengono dati specifici per un host che + saranno gestiti in input da un template processor per produrre in output il file elaborato. + +* Encryption + + Se vi fidate, consente la memorizzazione nel repository di informazioni crittate. L'esempio tipico + è quello relativo alla gestione delle chiavi SSH. + +* Hooks + + Per ogni comando di yadm è possible fornire degli script da eseguire prima e/o dopo l'esecuzione del + comando stesso. + + Gli hook sono gestiti con attenzione al risultato dell'esecuzione dello script. Se, ad esempio, + uno script di "pre_commit" viene eseguito ritornando un valore diverso da zero, allora il comando + commit non viene eseguito e il processo si ferma. +