119 KiB
File di configurazione di GNU Emacs
- Configurazione di Emacs con literate programming
- Cosa e' il paradigma "literate programming"
- I files di inizializzazione "standard" di Emacs
- Il file "early init.el" (Emacs 27+)
- Commenti iniziali
- Salvo il contenuto delle variabili cha vado a modificare
- Impostazione del Garbage Collector (gc)
- Imposto file-name-handler-alist
- Reimposto i default alla fine dell'init
- Imposta il package manager
- Attivo package-quickstart (Emacs 27+)
- Impedisce il ridimensionamento del frame
- Impostazioni per MS-Windows
- Commenti finali
- Il file "init.el"
- Commenti iniziali
- Verifica versione Emacs
- Dichiaro la funzione di impostazione di package
- Dichiaro la funzioone di impostazione per le vecchie versioni di Emacs
- Dichiaro la funzione di impostazione per le nuove versioni di Emacs
- Eseguo impostazioni di base
- Carico il package "delight"
- Carico il package "diminish"
- Use-package
- Configuro vc
- Org & Babel: gb-init.org
- Custom
- Commenti finali
- Il file "early init.el" (Emacs 27+)
- Il file di inizializazione "literate programmming"
- Intestazione del file
- Impostazioni di Emacs
- Helper functions
- Imposto il font di default
- Gestisce la startup screen
- Gestisce la barra del menu (menu-bar)
- Gestisce la barra gli strumenti (tool-bar)
- Gestisce la scroll-bar verticale
- Gestisce la file-dialog
- Gestisce le dialog-box per le conferme
- Imposta la gestione dei backup e degli auto-save
- Gestisce le combinazioni "fastidiose"
- Gestisce le combinazioni di tasti per ibuffer
- Gestisce le richieste Si/No
- Imposta il sistema di encoding
- Mostra la "highlight line"
- Disattiva il continuamento riga
- Mostra la parentesi abbinata
- Scroll verticale "come te lo aspetteresti"
- Scroll orizzontale come te lo aspetteresti
- Bell
- Delete selection
- Tabulazioni
- Impostazioni per la stampa
- Package aggiuntivi
- Async
- All-the-icons
- Color themes
- Gestione della modeline
- Dashboard
- Discoverability
- Dashboard
- Ivy / Counsel / Swiper
- Amx
- Org-mode
- htmlize
- Beacon
- System monitor
- Try
- Avy
- Gestione windows e buffrs
- Autocompletamento
- Fondling - Origami
- Undo-tree
- Git
- Treemacs
- Internet
- PDF-Tools
- EMMS (The Emacs Multimedia System)
- Docker
- Simple httpd
- Impatient mode
- Formati di documento
- Programmazione
- Piede del file di inizializzazione
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 Init File. All'avvio Emacs cerca secondo un certo
ordine di priorita' e carica il primo che trova tra questi (vedi: 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 tangle
di questi blocchi di codice con il risultato di avere un file .el che richiama
all'infinito l'operazione di 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 pagina del manuale di Emacs per Early Init File, se presente, viene caricato prima di init.el e prima che siano stati inizializzati sia il sistema di gestione dei package che la GUI. Fare riferimento alla 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 tangling.
;;; early-init.el --- File di configurazione "early-init" di GNU Emacs -*- mode: lisp; lexical-binding: t; -*-
;; Author: Geraldo Biotti <wont.tell@example.com>
;; 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 <https://www.gnu.org/licenses/>.
;;; 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:
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
;; 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")
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
;; 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)
Imposto file-name-handler-alist
Come riportato nelle FAQ di 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).
;; 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)
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
;; 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
)
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".
;; Non rende disponibili i package all'avvio di Emacs
;; da usare qui e non in init.el
(setq package-enable-at-startup nil)
Attivo package-quickstart (Emacs 27+)
Quando questa variabile e' t
attiva la preelaborazione dei package
rendendo piu' veloce l'avvio.
;; 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)
)
)
Impedisce il ridimensionamento del frame
;; Non ridimnensiona il frame in questo momento
(setq frame-inhibit-implied-resize t)
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 MS-Windows che porting di strumenti unix-like in windows.
;; 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")))
)
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.
;; ===========================================================================
;; Local Variables:
;; coding: utf-8-unix
;; indent-tabs-mode: nil
;; tab-width: 4
;; End:
;; ===========================================================================
;;; early-init.el ends here
Il file "init.el"
Il 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.
;;; init.el --- File di configurazione di GNU Emacs -*- mode: lisp; lexical-binding: t; -*-
;; Author: Geraldo Biotti <wont.tell@example.com>
;; 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 <https://www.gnu.org/licenses/>.
;;; 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:
Verifica versione Emacs
Verifico che la versione di Emacs sia almeno la 26.1. Se non lo e' emetto un warning.
;; 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!"))
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.
(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))
)
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
(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)
)
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
(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 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
;; 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))
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.
;; 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))
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.
;; 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))
Use-package
use-package
e' un package che consente una gestione
migliorata rispetto a package
;; 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
Configuro vc
in modo che gestisca i link simbolici.
;; Configuro vc (package gestione "version cotrol"
(use-package vc
:config
;; Questo perche' i miei "dotfiles" usano i link simbolici
(setq vc-follow-symlinks t)
)
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
;; 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))
)
)
Custom
E' la parte di init.el
che contiene le impostazioni gestite direttamente
dall'interfacia di configurazione di Emacs (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.
;; 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.
)
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.
;; ===========================================================================
;; Local Variables:
;; coding: utf-8-unix
;; indent-tabs-mode: nil
;; tab-width: 4
;; End:
;; ===========================================================================
;;; init.el ends here
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.
;;; 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 <https://www.gnu.org/licenses/>.
;;; 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:
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)
Apre questo file di configurazione in literate programming
Da notare che uso la variabile gb/emacs/org-conf-filename
precedentemente definita in init.el
(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)
)
(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)
)
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:
- Cascadia Mono Pl - 10 punti
- DejaVu Sans mono - 10 punti
- Consolas - 10 punti
- 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
.
(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"))
)
)
Gestisce la startup screen
Il buffer "*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
(setq inhibit-startup-screen t)
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
(menu-bar-mode -1)
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. |
(tool-bar-mode -1)
(setq tool-bar-style 'image)
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
(toggle-scroll-bar -1)
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 |
(setq use-file-dialog nil)
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 |
(setq use-dialog-box nil)
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' |
(setq make-backup-files t
auto-save-default t)
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 comandoM-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 comandoM-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.
(use-package emacs
:bind (("C-z" . nil)
("C-h h" . nil))
)
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
.
;; (use-package emacs
;; :bind ([remap list-buffers] . ibuffer)
;; )
(global-set-key [remap list-buffers] 'ibuffer)
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
(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)
Mostra la "highlight line"
Lo faccio soltanto se sono nella GUI altrimenti e' troppo invasivo dal punto di vista visuale.
(when (window-system)
(global-hl-line-mode 1))
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
(setq-default truncate-lines t)
Mostra la parentesi abbinata
(show-paren-mode 1)
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.
(setq scroll-conservatively most-positive-fixnum)
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.
(setq hscroll-step 1)
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".
(setq visible-bell t
ring-bell-function 'ignore)
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.
(delete-selection-mode t)
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".
(setq-default indent-tabs-mode nil)
Con la dimensione di una tabulazione espressa come 4 spazi.
(setq-default tab-width 4)
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.
(setq tab-stop-list
(number-sequence 4 200 4))
Impostazioni per la stampa
;; 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)
Package aggiuntivi
Async
Consente l'uso di processi asincroni quando possibile.
(use-package async
:ensure t
:init
(dired-async-mode 1)
)
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)
(use-package all-the-icons
:if (window-system)
:ensure t
:demand t
)
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
.
(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)
)
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
).
(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
)
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 (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
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)
(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)
)
Tema standad per Spacemacs.
Dispone di due modalita':
- Dark:
spacemacs-dark
- Light:
spacemacs-light
(use-package spacemacs-theme
:if (window-system)
:ensure t
:defer t
)
Tema basato sui colori proposti dal Google Material Design
Dispone di due modalita':
- Dark:
material
- Light:
material-light
(use-package material-theme
:if (window-system)
:ensure t
:defer t
)
Trasposizione per Emacs del popolare colorscheme di Vim. Tema dark a basso contrasto.
(use-package zenburn-theme
:if (window-system)
:ensure t
:defer t
)
Trasposizione per Emacs del popolare tema Monokai di Textmate.
(use-package monokai-theme
:if (window-system)
:ensure t
:defer t
)
Trasposizione per Emacs del popolare colorscheme di Vim.
Dispone delle seguenti modalita':
-
Dark
- medium:
gruvbox-dark-medium
(default) - soft:
gruvbox-dark-soft
- hard:
gruvbox-dark-hard
- medium:
-
Light
- medium:
gruvbox-light-medium
- soft:
gruvbox-light-soft
- hard:
gruvbox-light-hard
- medium:
(use-package gruvbox-theme
:if (window-system)
:ensure t
:defer t
)
Temi creati da Protesilaos Stavrou
Sono due temi di tipo 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
(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
)
Un tema dark suggerito da Uncle Dave.
(use-package zerodark-theme
:if (window-system)
:ensure t
:defer t
)
(use-package atom-one-dark-theme
:if (window-system)
:ensure t
:defer t
)
(use-package dracula-theme
:if (window-system)
:ensure t
:defer t
)
(use-package color-theme-sanityinc-tomorrow
:if (window-system)
:ensure t
:defer t
)
(use-package solarized-theme
:if (window-system)
:ensure t
:defer t
)
(use-package moe-theme
:if (window-system)
:ensure t
:defer t
)
(use-package seti-theme
:if (window-system)
:ensure t
:defer t
)
(use-package base16-theme
:if (window-system)
:ensure t
:defer t
)
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
;; (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)
;; )
;;
;; (load-theme 'spacemacs-dark t)
;;
;; (load-theme 'monokai t)
;;
;; (load-theme 'gruvbox t)
;;
;; (load-theme 'zenburn t)
;;
;; (load-theme 'zerodark t)
;;
;; (load-theme 'atom-one-dark-theme t)
;;
;; (load-theme 'material t)
(if (display-graphic-p)
(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))
(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))
)
Gestione della modeline
Nell'organizzazione dello schermo di Emacs la modeline e' quella parte del frame di Emacs che si va a trovare nella parte inferiore di ogni window e, come spiegato nel manuale di Emacs, "descrive cosa sta accadendo nel 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)
(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)
)
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)
(use-package minions
:if (window-system)
:ensure t
:hook (after-init-hook . minions-mode)
:custom (doom-modeline-minor-modes t)
)
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.
(setq line-number-mode t
column-number-mode t)
Queste impostazioni, invece, servono a mostrare il numero accanto ad ogni riga del buffer.
;; Per adesso non mostro i numeri di riga sul lato della window
;; (global-display-line-numbers-mode)
<<<<<<< HEAD
Dashboard
Dasboard attiva soltanto in ambiente grafico
(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)
)
=====
>>>>>>> 882e78da61898ea1a55ccd08f8d569598fe1179c
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.
(use-package which-key
:ensure t
:defer 5
:delight
:commands which-key-mode
:config
(which-key-mode)
)
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.
(use-package hydra
:ensure t
:defer t
)
Dashboard
Dashboard attiva soltanto in ambiente grafico
(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)
)
Ivy / Counsel / Swiper
Ivy
Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre il minor-mode.
(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)
)
Swiper
(use-package swiper
:ensure t
:after ivy
:config
;; Key bindings - Ivy based interface to standard commands
(global-set-key (kbd "C-s") 'swiper-isearch)
)
Counsel
Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre il minor-mode.
(use-package counsel
:ensure t
:delight
:after (ivy swiper)
:config
(counsel-mode t)
;; (global-set-key (kbd "<f2> 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 "<f1> f") 'counsel-describe-function)
(global-set-key (kbd "<f1> v") 'counsel-describe-variable)
(global-set-key (kbd "<f1> l") 'counsel-find-library)
(global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
(global-set-key (kbd "<f2> 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)
)
Per il momento disabilitato, da valutare se serve veramente
(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)
)
Per il momento disabilitato, da valutare se serve veramente
(use-package counsel-css
:disabled
:ensure t
:defer t
:after counsel
:hook (css-mode-hook . counsel-css-imenu-setup)
)
Ivy-rich
(use-package ivy-rich
:ensure t
:after (ivy counsel)
;; :init
;; (ivy-rich-mode 1)
:config
(ivy-rich-mode 1)
)
All-the-icons-ivy-rich
(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)
)
Ivy-Hydra
(use-package ivy-hydra
:ensure t
:defer t
:after (ivy hydra)
)
Amx
(use-package amx
:ensure t
:defer t
:after (:all counsel)
;; :bind (("M-X" . amx-major-mode-commands))
:config (amx-mode t)
)
Org-mode
Org-mode e' gia' stato caricato in init.el
, qui si vanno ad aggiungere
alcune impostazioni.
(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))
)
)
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.
(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)
)
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!!!!
(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)
)
Org-edna
(use-package org-edna
:ensure t
:defer t
:after org
:hook (org-mode-hook . org-edna-mode)
:config
(org-edna-load)
)
htmlize
(use-package htmlize
:ensure t
:defer t
)
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.
(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)
)
System monitor
Un piccolo monitor di sistema.
(use-package symon
:ensure t
:defer t
)
Try
NON USARE!
Try crea dei problemi enormi con Emacs 27+ perche' in questa versione
di emacs viene gestito il file package-quickstart.el
dove vengono
memorizzati i dati di autoload di tutti i packages. Peccato che vi
vengano memorizzati anche quelli che sono "temporanei" grazie alla
funzionalita' di try
ma che non vengano rimossi alla chiusura di
Emacs. Quindi quando si apre nuovamente Emacs si ottengono degli
errori di inizializzazione.
Per il momento non e' assolutamente da usare! Se proprio si vuole
usare occorre ricordarsi di eliminare il file package-quickstart.el
(e' la cosa piu' semplice) che comunque verra' ricreato auotomaticamente
da Emacs al primo riavvio.
(use-package try
:disabled
:ensure t
:defer t
)
Avy
(use-package avy
:ensure t
)
Gestione windows e buffrs
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
(use-package ace-window
:ensure t
:defer t
:after avy
:bind ([remap other-window] . ace-window)
)
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.
(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))
)
Company quickhelp
Un backend aggiuntivo per company. Mostra la documentazione relativa all'elemento selezionato.
(use-package company-quickhelp
:ensure t
:defer t
:after company
:custom
(company-quickhelp-delay 0.1)
:config
(company-quickhelp-mode 1)
)
Fondling - Origami
(use-package origami
:ensure t
:defer t
:commands origami-mode
)
Undo-tree
(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))
)
Git
Magit
In Emacs standard (27,1) C-x g
non e' agganciato a nessuna
funzionalita'
(use-package magit
:ensure t
:defer t
:after (ivy)
:bind ("C-x g" . 'magit-status)
)
gitconfig-mode
(use-package gitconfig-mode
:ensure t
:defer 5
:mode ("/\\.gitconfig\\'"
"/\\.git/config\\'"
"/modules/.*/config\\'"
"/git/config\\'"
"/\\.gitmodules\\'"
"/etc/gitconfig\\'")
)
gitignore-mode
(use-package gitignore-mode
:ensure t
:defer 5
:mode ("/\\.gitignore\\'"
"/info/exclude\\'"
"/git/ignore\\'")
)
gitattribute-mode
(use-package gitattributes-mode
:ensure t
:defer 5
:mode ("/\\.gitattributes\\'"
"/info/attributes\\'"
"/git/attributes\\'")
)
git-timemachine
(use-package git-timemachine
:ensure t
:defer t
:commands git-timemachine
)
Treemacs
(use-package treemacs
:ensure t
:defer t
:commands treemacs
:init
(with-eval-after-load 'winum
(define-key winum-keymap (kbd "M-0") #'treemacs-select-window))
:config
(progn
(setq treemacs-collapse-dirs (if treemacs-python-executable 3 0)
treemacs-deferred-git-apply-delay 0.5
treemacs-directory-name-transformer #'identity
treemacs-display-in-side-window t
treemacs-eldoc-display t
treemacs-file-event-delay 5000
treemacs-file-extension-regex treemacs-last-period-regex-value
treemacs-file-follow-delay 0.2
treemacs-file-name-transformer #'identity
treemacs-follow-after-init t
treemacs-git-command-pipe ""
treemacs-goto-tag-strategy 'refetch-index
treemacs-indentation 2
treemacs-indentation-string " "
treemacs-is-never-other-window nil
treemacs-max-git-entries 5000
treemacs-missing-project-action 'ask
treemacs-move-forward-on-expand nil
treemacs-no-png-images nil
treemacs-no-delete-other-windows t
treemacs-project-follow-cleanup nil
treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
treemacs-position 'left
treemacs-recenter-distance 0.1
treemacs-recenter-after-file-follow nil
treemacs-recenter-after-tag-follow nil
treemacs-recenter-after-project-jump 'always
treemacs-recenter-after-project-expand 'on-distance
treemacs-show-cursor nil
treemacs-show-hidden-files t
treemacs-silent-filewatch nil
treemacs-silent-refresh nil
treemacs-sorting 'alphabetic-asc
treemacs-space-between-root-nodes t
treemacs-tag-follow-cleanup t
treemacs-tag-follow-delay 1.5
treemacs-user-mode-line-format nil
treemacs-user-header-line-format nil
treemacs-width 35
treemacs-workspace-switch-cleanup nil)
;; The default width and height of the icons is 22 pixels. If you are
;; using a Hi-DPI display, uncomment this to double the icon size.
;;(treemacs-resize-icons 44)
(treemacs-follow-mode t)
(treemacs-filewatch-mode t)
(treemacs-fringe-indicator-mode t)
(pcase (cons (not (null (executable-find "git")))
(not (null treemacs-python-executable)))
(`(t . t)
(treemacs-git-mode 'deferred))
(`(t . _)
(treemacs-git-mode 'simple))))
:bind
(:map global-map
("M-0" . treemacs-select-window)
("C-x t 1" . treemacs-delete-other-windows)
("C-x t t" . treemacs)
("C-x t B" . treemacs-bookmark)
("C-x t C-t" . treemacs-find-file)
("C-x t M-t" . treemacs-find-tag)))
(use-package treemacs-magit
:after (treemacs magit)
:ensure t
:defer t
)
(use-package treemacs-projectile
:after (treemacs projectile)
:ensure t
:defer t
)
(use-package treemacs-all-the-icons
:after (treemacs all-the-icons)
:ensure t
:defer t
)
Internet
Restclient
(use-package restclient
:ensure t
:defer t
)
(use-package company-restclient
:ensure t
:after (company restclient)
:config
(add-to-list 'company-backends 'company-restclient)
)
Elfeed
Devo disabilitare la cosa perche' ci sono problemi con org 9.4.4
(use-package elfeed
;;
:disabled
;;
:ensure t
:defer t
;; Imposto la directory del db di elfeed per stare dentro .emacs.d
:custom ((elfeed-db-directory "~/Dropbox/Sync/emacs/elfeed/db")
(elfeed-enclosure-default-dir "~/Downloads/elfeed"))
:config
;; (setq elfeed-feeds
;; '("http://status.register.it/history.rss"
;; "https://golem.linux.it/wp/feed/"
;; ("http://dilbert.com/feed" Divertimento Webcomic)
;; ("https://xkcd.com/rss.xml" Divertimento Webcomic)
;; ("http://www.soft-land.org/rss/softland/commenti.rss" Divertimento Soft-land)
;; ("http://www.soft-land.org/rss/softland/sdsm.rss" Divertimento Soft-land)
;; ("http://www.soft-land.org/rss/softland/ospiti.rss" Divertimento Soft-land)
;; ("https://bufalopedia.blogspot.com/feeds/posts/default" Antibufala Attivissimo)
;; ("http://feeds.feedburner.com/Disinformatico" Antibufala Attivissimo)
;; ("https://undicisettembre.blogspot.com/feeds/posts/default" Antibufala Attivissimo)
;; ("https://complottilunari.blogspot.com/feeds/posts/default" Antibufala Attivissimo)
;; ("http://www.valigiablu.it/feed/" Antibufala)
;; ("https://blog.mikrotik.com/rss/?cat=security" CyberSecurity MikroTi)
;; ("https://www.cert.garr.it/certrss" CyberSecurity CERT Cert-Italiani)
;; ("https://www.certnazionale.it/news/feed/" CiberSecurity CERT Cert-Italiani)
;; ("https://www.commissariatodips.it/feeds/rss.xml" CiberSecurity CERT Cert-Italiani)
;; ("https://www.cert-pa.it/feed/" CiberSecurity CERT Cert-Italiani)
;; ("https://www.us-cert.gov/ncas/all.xml" CiberSecurity CERT Cert-USA)
;; ("https://www.us-cert.gov/ncas/alerts.xml" CiberSecurity CERT Cert-USA)
;; ("https://www.us-cert.gov/ncas/bulletins.xml" CiberSecurity CERT Cert-USA)
;; ("https://www.us-cert.gov/ncas/tips.xml" CiberSecurity CERT Cert-USA)
;; ("https://www.us-cert.gov/ncas/current-activity.xml" CiberSecurity CERT Cert-USA)
;; ("https://www.microsoft.com/technet/security/bulletin/secrss.aspx" CiberSecurity CERT Cert-USA Cert-Microsoft)
;; ("https://www.microsoft.com/technet/security/bulletin/RssFeed.aspx?snscomprehensive" CiberSecurity CERT Cert-USA Cert-Microsoft)
;; ("https://blogs.technet.microsoft.com/msrc/feed/" CiberSecurity CERT Cert-USA Cert-Microsoft)
;; ("https://www.kaspersky.com/blog/feed/" CiberSecurity Kaspersky)
;; ("https://securelist.com/feed/" CiberSecurity Kaspersky)
;; ("https://threatpost.com/feed/" CiberSecurity Kaspersky)
;; ("http://securityinfo.it/feed/?cat=251" CiberSecurity SecurityInfo)
;; ("https://protesilaos.com/news.xml" Emacs)
;; ("https://protesilaos.com/codelog.xml" Emacs)
;; ("http://www.virtuouscode.com/feed/" Emacs)
;; ("http://www.virtuouscode.com/comments/feed/" Emacs)
;; ("http://ergoemacs.org/emacs/blog.xml" Emacs)
;; ("http://xahlee.info/comp/blog.xml" Emacs)
;; ("http://xahlee.info/js/blog.xml" Emacs)
;; ("http://xahlee.info/math/blog.xml" Emacs)
;; ("https://alexschroeder.ch/wiki/feed/full/" Emacs)
;; ("http://emacshorrors.com/feed.atom" Emacs)
;; ("http://emacsredux.com/atom.xml" Emacs)
;; ("https://emacspeak.blogspot.com/feeds/posts/default" Emacs)
;; ("https://endlessparentheses.com/atom.xml" Emacs)
;; ("http://www.howardism.org/index.xml" Emacs)
;; ("http://irreal.org/blog/?feed=rss2" Emacs)
;; ("https://www.masteringemacs.org/feed" Emacs)
;; ("http://mbork.pl?action=rss" Emacs)
;; ("http://emacsblog.org/feed/" Emacs)
;; ("http://nullprogram.com/feed/" Emacs)
;; ("https://oremacs.com/atom.xml" Emacs)
;; ("http://planet.emacsen.org/atom.xml" Emacs)
;; ("https://planet.emacslife.com/atom.xml" Emacs)
;; ("http://pragmaticemacs.com/feed/" Emacs)
;; ("https://emacs.stackexchange.com/feeds" Emacs)
;; ("http://sachachua.com/blog/feed/" Emacs)
;; ("https://babbagefiles.xyz/index.xml" Emacs)
;; ("https://babbagefiles.blogspot.com/feeds/posts/default" Emacs)
;; ("http://whattheemacsd.com/atom.xml" Emacs)
;; ("https://www.wisdomandwonder.com/feed" Emacs)
;; ("https://cestlaz.github.io/rss.xml" Emacs)
;; ("https://bzg.fr/index.xml" Emacs)
;; ("http://kitchinresearchgroup.disqus.com/latest.rss" Emacs)
;; ("https://noonker.github.io/index.xml" Emacs)
;; ("https://codingquark.com/feed.xml" Emacs)
;; ("http://xenodium.com/rss.xml" Emacs)
;; ("https://karthinks.com/blog/index.xml" Emacs)
;; ("http://joshrollinswrites.com/index.xml" Emacs)
;; ("https://punchagan.muse-amuse.in/feed.xml" Emacs)
;; ("https://willschenk.com/feed.xml" Emacs)
;; ("https://emacs.cafe/feed.xml" Emacs)
;; ("https://groups.google.com/forum/feed/git-for-windows/msgs/rss.xml?num=50" Git)
;; ("https://groups.google.com/forum/feed/git-users/msgs/rss.xml?num=50" Git)
;; ("https://groups.google.com/forum/feed/git-packagers/topics/rss.xml?num=50" Git)
;; ("https://groups.google.com/group/idempiere/feed/rss_v2_0_msgs.xml" iDempiere)
;; ("https://groups.google.com/group/adempiere-colombia/feed/rss_v2_0_msgs.xml" iDempiere)
;; ("https://groups.google.com/group/idempiere-dev/feed/rss_v2_0_msgs.xml" iDempiere)
;; ("https://groups.google.com/group/idempiere-es/feed/rss_v2_0_msgs.xml" iDempiere)
;; ("https://groups.google.com/group/idempiere-italia/feed/rss_v2_0_msgs.xml" iDempiere)
;; ("https://www.liberliber.it/online/feed/" Ebooks Letteratura)
;; ("https://www.paginatre.it/online/feed/" Ebooks Letteratura)
;; ("http://it.feedbooks.com/books/recent.atom?lang=it" Ebooks Letteratura)
;; ("http://pennablu.it/feed/" Ebooks Letteratura)
;; ("https://www.reddit.com/r/bashonubuntuonwindows/.rss" Microsoft WSL)
;; ("https://blogs.msdn.microsoft.com/wsl/feed/" Microsoft WSL)
;; ("https://blogs.technet.microsoft.com/enterprisemobility/author/BradAnderson/feed/rss/" Microsoft)
;; ("https://blogs.msdn.microsoft.com/bharry/feed" Microsoft)
;; ("https://blogs.msdn.microsoft.com/powershell/feed/" Microsoft)
;; ("https://weblogs.asp.net/scottgu/rss?containerid=13" Microsoft)
;; ("https://blogs.msdn.microsoft.com/stevengu/feed/" Microsoft)
;; ("https://code.visualstudio.com/feed.xml" Microsoft)
;; ("http://blogs.msdn.microsoft.com/commandline/feed/" Microsoft)
;; "https://www.paulekman.com/feed/"
;; "https://github.blog/feed/"
;; "https://blog.bitbucket.org/feed/"
;; "https://www.blog.google/rss/"
;; "https://calebmadrigal.com/atom.xml"
;; )
;; )
(elfeed-org)
)
(use-package elfeed-goodies
;;
:disabled
;;
:ensure t
:defer t
:config
(elfeed-goodies/setup)
)
(use-package elfeed-org
;;
:disabled
;;
:ensure t
:defer t
;; :after (elfeed org)
:config
(elfeed-org)
(setq rmh-elfeed-org-files (list "~/Dropbox/Sync/emacs/elfeed/feeds.org"))
)
(use-package elfeed-protocol
;;
:disabled
;;
:ensure t
:defer t
)
Pretty symbols
Mostra come simboli alcune parole chiave. Ad esempio quando trova
lambda
ne mostra il simbolo grafico. Naturalmente solo quando
siamo in ambiente GUI.
Lo installo ma non lo attivo di default perche' ha un impatto grafico accattivante ma a cui non e' immediato abituarsi e potrebbe portare a condizioni di confusione nella scrittura/lettura del codice.
(use-package pretty-mode
:if (window-system)
:ensure t
:config
;; (global-pretty-mode t)
)
CSV mode
(use-package csv-mode
:ensure t
:defer t
)
PDF-Tools
;;--------------------------------------------------------
(use-package pdf-tools
:ensure t
:defer t
:after (pdf-annot)
:magic ("%PDF" . pdf-view-mode)
;; :bind (("h" . 'pdf-annot-add-highlight-markup-annotation)
;; ("t" . 'pdf-annot-add-text-annotation)
;; ("D" . 'pdf-annot-delete)
;; ("C-s" . 'isearch-forward)
;; ("m" . 'mrb/mailfile)
;; ("<return>" . 'pdf-annot-edit-contents-commit)
;; ("<S-return>" . 'newline)
;; ;; ("\\" . hydra-pdftools/body)
;; ;; ("<s-spc>" . pdf-view-scroll-down-or-next-page)
;; ;; ("g" . pdf-view-first-page)
;; ;; ("G" . pdf-view-last-page)
;; ;; ("l" . image-forward-hscroll)
;; ;; ("h" . image-backward-hscroll)
;; ;; ("j" . pdf-view-next-page)
;; ;; ("k" . pdf-view-previous-page)
;; ;; ("e" . pdf-view-goto-page)
;; ;; ("u" . pdf-view-revert-buffer)
;; ;; ("al" . pdf-annot-list-annotations)
;; ;; ("ad" . pdf-annot-delete)
;; ;; ("aa" . pdf-annot-attachment-dired)
;; ;; ("am" . pdf-annot-add-markup-annotation)
;; ;; ("at" . pdf-annot-add-text-annotation)
;; ;; ("y" . pdf-view-kill-ring-save)
;; ;; ("i" . pdf-misc-display-metadata)
;; ;; ("s" . pdf-occur)
;; ;; ("b" . pdf-view-set-slice-from-bounding-box)
;; ;; ("r" . pdf-view-reset-slice)
;; :map pdf-view-mode-map
;; :map pdf-annot-edit-contents-minor-mode-map
;; )
:config
;; Some settings from http://pragmaticemacs.com/emacs/even-more-pdf-tools-tweaks/
;; (fullframe pdf-view-mode quit-window)
(setq-default pdf-view-display-size 'fit-page) ;scale to fit page by default
;; (gsetq-default pdf-view-display-size 'fit-width)
(setq pdf-annot-activate-created-annotations t ; automatically annotate highlights
pdf-view-resize-factor 1.1 ; more fine-grained zooming
;;pdf-misc-print-program "/usr/bin/lpr"
pdf-view-midnight-colors '("#DCDCCC" . "#383838")) ; Not sure what this is
;; (add-hook 'pdf-view-mode-hook (lambda () (cua-mode 0))) ; turn off cua so copy works
;; (pdf-tools-install :no-query)) ; no-query auto builds epfinfo when needed
(pdf-tools-install)
;; (eval-after-load 'org '(require 'org-pdfview)
)
;; ;;--------------------------------------------------------
;; (use-package pdf-tools
;; :magic ("%PDF" . pdf-view-mode)
;; :config
;; (dolist
;; (pkg
;; '(pdf-annot pdf-cache pdf-dev pdf-history pdf-info pdf-isearch
;; pdf-links pdf-misc pdf-occur pdf-outline pdf-sync
;; pdf-util pdf-view pdf-virtual))
;; (require pkg))
;; (pdf-tools-install))
EMMS (The Emacs Multimedia System)
(use-package emms
:ensure t
:defer t
:config
(require 'emms-setup)
(require 'emms-player-mplayer)
(emms-all)
(setq emms-player-list '(emms-player-mpg321
emms-player-ogg123
emms-player-mplayer))
(defun emms-player-mplayer-volume(amount)
(process-send-string
emms-player-simple-process-name
(format "volume %d\n" amount)))
(setq emms-volume-change-function 'emms-player-mplayer-volume)
(setq emms-source-file-default-directory "~/music/")
(emms-add-directory-tree emms-source-file-default-directory)
(emms-add-directory-tree "C:\Temp\_cancellami\_cancellami")
)
Docker
(use-package docker
:ensure t
:defer t
)
(use-package dockerfile-mode
:ensure t
:defer t
:mode ("/\\Dockerfile\\'")
)
(use-package docker-compose-mode
:ensure t
:defer t
)
Simple httpd
(use-package simple-httpd
:ensure t
:defer t
:config
(setq httpd-port 7070)
(setq httpd-host (system-name))
)
Impatient mode
(use-package impatient-mode
:ensure t
:defer t
:after simple-httpd
:commands impatient-mode
)
Formati di documento
Markdown
(use-package markdown-mode
:ensure t
:defer t
:commands (markdown-mode gfm-mode)
:mode (("README\\.md\\'" . gfm-mode)
("\\.md\\'" . markdown-mode)
("\\.markdown\\'" . markdown-mode))
:init (setq markdown-command "multimarkdown")
:hook (markdown-mode-hook . gb/markdown-preview)
:config
(progn
(cond ((eq system-type 'windows-nt)
;; Windows
(setq markdown-command "pandoc.exe -t html5")
)
((eq system-type 'gnu/linux)
;; Linux
(setq markdown-command "pandoc -t html5")
))
(defun gb/markdown-filter (buffer)
(princ
(with-temp-buffer
(let ((tmp (buffer-name)))
(set-buffer buffer)
(set-buffer (markdown tmp))
(format "<!DOCTYPE html><html><title>Markdown preview</title><link rel=\"stylesheet\" href = \"https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/3.0.1/github-markdown.min.css\"/>
<body><article class=\"markdown-body\" style=\"box-sizing: border-box;min-width: 200px;max-width: 980px;margin: 0 auto;padding: 45px;\">%s</article></body></html>" (buffer-string))))
(current-buffer)))
(defun gb/markdown-preview ()
"Preview markdown."
(interactive)
(unless (process-status "httpd")
(httpd-start))
(impatient-mode)
(imp-set-user-filter 'gb/markdown-filter)
(imp-visit-buffer))
)
)
LaTex (Auctex)
(use-package auctex
:ensure t
:defer t
)
(use-package company-auctex
:ensure t
:after (company auctex)
:config
(company-auctex-init)
)
Programmazione
Regular Expressions: pcre2el
Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre il minor-mode.
(use-package pcre2el
:ensure t
:delight
:commands (rxt-mode rxt-global-mode)
:config
(pcre-mode)
)
Aggressive-indent
(use-package aggressive-indent
:ensure t
:defer t
:diminish
:hook (emacs-lisp-mode-hook . aggressive-indent-mode)
)
Highlight-indent-guides
Elimino il lighter dalla modeline: serve soltanto per attivare/disattivre il minor-mode.
(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"))
)
Flycheck
(use-package flycheck
:ensure t
;;:init (global-flycheck-mode)
:defer t
:hook (prog-mode-hook . flycheck-mode)
)
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
(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)
)
(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)
)
Smartparens
Elimino il lighter dalla modeline: serve soltanto per attivare/disattivare il minor-mode.
(use-package smartparens
:ensure t
:defer t
:delight
:hook (prog-mode-hook . smartparens-mode)
:config
(require 'smartparens-config)
;; (smartparens-global-mode)
)
Rainbow-delimiters
(use-package rainbow-delimiters
:ensure t
:defer t
:hook (prog-mode-hook . rainbow-delimiters-mode)
)
Snippets
(use-package yasnippet
:ensure t
:defer t
:hook (after-init-hook . yas-global-mode)
;; :init (yas-global-mode 1)
:config (yas-reload-all)
)
(use-package yasnippet-snippets
:ensure t
:defer t
:after yasnippet
)
Projectile
(use-package projectile
:ensure t
:defer 5
:config
(setq projectile-completion-system 'ivy)
;; (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map)
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)
(projectile-mode 1)
)
(use-package ibuffer-projectile
:ensure t
:defer t
:after (projectile)
)
Occorre accertarsi che venga caricato sia dopo counsel
che dopo projectile
(use-package counsel-projectile
:ensure t
:defer t
:after (counsel projectile)
:hook (projectile-mode-hook . counsel-projectile-mode)
)
Occorre accertarsi che venga caricato sia dopo treemacs
che dopo projectile
(use-package treemacs-projectile
:ensure t
:defer t
:after treemacs projectile
:hook (treemacs-mode-hook . treemacs-project-mode)
)
Powershell
(use-package powershell
:ensure t
:defer t
)
C#
(use-package csharp-mode
:ensure t
:defer t
)
SQL
(use-package sql-indent
:ensure t
:defer t
)
Go lang
(use-package go-mode
:ensure t
:defer t
)
(use-package go-errcheck
:ensure t
:defer t
:after go-mode
)
(use-package company-go
:ensure t
:after (company go-mode)
)
Rust
(defun gb/rust/rustic-mode-hook ()
;; so that run C-c C-c C-r works without having to confirm
;; (setq-local buffer-save-without-query t)
(cargo-minor-mode t)
(company-mode t)
)
(use-package rustic
:ensure t
:defer t
;; :bind (:map rustic-mode-map
;; ("M-j" . lsp-ui-imenu)
;; ("M-?" . lsp-find-references)
;; ("C-c C-c l" . flycheck-list-errors)
;; ("C-c C-c a" . lsp-execute-code-action)
;; ("C-c C-c r" . lsp-rename)
;; ("C-c C-c q" . lsp-workspace-restart)
;; ("C-c C-c Q" . lsp-workspace-shutdown)
;; ("C-c C-c s" . lsp-rust-analyzer-status))
:hook ((rustic-mode-hook . gb/rust/rustic-mode-hook))
:config
;; uncomment for less flashiness
;; (setq lsp-eldoc-hook nil)
;; (setq lsp-enable-symbol-highlighting nil)
;; (setq lsp-signature-auto-activate nil)
;; comment to disable rustfmt on save
;; (setq rustic-format-on-save t)
;; (setq rustic-lsp-server 'rls)
;; attenzione, il .exe va bene solo su windows
(setq lsp-rust-analyzer-server-command '("~/.cargo/bin/rust-analyzer.exe"))
(setq rustic-lsp-client 'eglot)
(push 'rustic-clippy flycheck-checkers)
(setq rustic-flycheck-clippy-params "--message-format=json")
)
(use-package flycheck-rust
:ensure t
:defer t
:after (flycheck)
:hook (flyckeck-mode-hook . flycheck-rust-setup)
;; :hook ((rust-mode-hook . flycheck-rust-setup)
;; (flycheck-mode . flycheck-rust-setup)
;; )
;; :after (flycheck rust-mode)
;; :config (flycheck-rust-setup)
)
(use-package rust-mode
;; ---------------------
:disabled
;; ---------------------
:ensure t
:defer t
:after (company flycheck-rust cargo)
:hook ((rust-mode-hook . company-mode)
;; (rust-mode-hook . flycheck-rust-setup)
(rust-mode-hook . cargo-minor-mode)
)
:config
(setq indent-tabs-mode nil)
;; (setq rust-format-on-save t)
(setq company-tooltip-align-annotations t)
)
(use-package cargo
:ensure t
:defer t
;; :after rust-mode
;; :after rustic-mode
;; :hook ((rust-mode-hook . cargo-minor-mode)
;; ;; (conf-toml-mode-hook . cargo-minor-mode)
;; )
)
LSP (Language Server Protocol) - temporaneamente disaiblitato -
Vedi la documentazione sul sito del produttore. https://emacs-lsp.github.io/lsp-mode/
Per adesso disabilito tutti i moduli, voglio provare eglot che pare piu' semplice, oltre ad essere inserito in gnu-elpa.
(use-package lsp-mode
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
:commands (lsp)
:after (yasnippet)
;; Ricordarsi di leggere la documentazione
;; sul sito del produttore.
:custom
(lsp-keymap-prefix "C-c l")
:hook (;; Avvio normale (XXX-mode . lsp)
;; Avvio differito (XXX-mode . lsp-deferred)
(c++-mode-hook . lsp-deferred)
(c-mode-hook . lsp-deferred)
(csharp-mode-hook . lsp-deferred)
(css-mode-hook . lsp-deferred)
(dart-mode-hook . lsp-deferred)
(go-mode-hook . lsp-deferred)
(groovy-mode-hook . lsp-deferred)
(haxe-mode-hook . lsp-deferred)
(html-mode-hook . lsp-deferred)
(java-mode-hook . lsp-deferred)
(js-mode-hook . lsp-deferred)
(json-mode-hook . lsp-deferred)
(kotlin-mode-hook . lsp-deferred)
(latex-mode-hook . lsp-deferred)
(less-css-mode-hook . lsp-deferred)
(nxml-mode-hook . lsp-deferred)
(powershell-mode-hook . lsp-deferred)
(python-mode-hook . lsp-deferred)
(rust-mode-hook . lsp-deferred)
(scss-mode-hook . lsp-deferred)
(sh-mode-hook . lsp-deferred)
;; (sql-mode-hook . lsp-deferred)
(typescript-mode-hook . lsp-deferred)
(xml-mode-hook . lsp-deferred)
(yaml-mode-hook . lsp-deferred)
(clojure-mode-hook . lsp-deferred)
(lsp-mode-hook . lsp-enable-which-key-integration)
)
:commands (lsp lsp-deferred lsp-doctor)
:config
;; (setq lsp-completion-enable-additional-text-edit nil)
;; Come riportato qui: https://emacs-lsp.github.io/lsp-mode/page/performance/
(setq lsp-completion-provider :capf)
;; (setq lsp-log-io t
;; lsp-server-trace "verbose")
)
(use-package company-lsp
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
:disabled
:after (lsp-mode company)
:config
(setq company-lsp-enable-snippet t)
(push 'company-lsp company-backends)
)
(use-package lsp-ui
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
;; :defer t
:after (lsp-mode markdown-mode)
:commands lsp-ui-mode
:custom
(lsp-ui-peek-always-show t)
(lsp-ui-sideline-show-hover t)
(lsp-ui-doc-enable nil)
)
(use-package lsp-ivy
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
;; :defer t
:after (lsp-mode ivy)
:commands lsp-ivy-workspace-symbol
)
(use-package dap-mode
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
:defer t
:after (lsp-mode lsp-treemacs)
)
;; (use-package dap-csharp
;; :ensure t
;; :defer t
;; )
(use-package lsp-treemacs
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
:after (lsp-mode treemacs)
:commands (lsp-treemacs-errors-list)
:custom
(lsp-treemacs-sync-mode 1)
)
(use-package lsp-origami
;; ------------------------------
:disabled
;; ------------------------------
:ensure t
:defer t
:after (lsp-mode origami)
:hook (lsp-after-open-hook . lsp-origami-try-enable)
)
;; (use-package lsp-mssql
;; :ensure t
;; :defer t
;; :after (lsp-mode lsp-treemacs)
;; :hook (sql-mode-hook . lsp)
;; )
- lsp-java
- lsp-latex
- lsp-mssql
- lsp-origami
- lsp-python-ms ??
EGlot (lsp)
Uso EGlot come interfaccia verso i vari lsp server. Lo provo in alternativa a lsp-mode perche' le recensioni lo danno come piu' semplice da configurare ed utilizzare anche se, sulla carta, con meno funzionalita'.
Con Rust e' consigliato l'uso di lsp-mode per questo disattivo eglot e riattivo lsp-mode
(use-package eglot
:ensure t
:defer t
;; :custom
;; (eglot-autoreconnect nil)
;; (eglot-autoshutdown t)
:hook ((c++-mode-hook . eglot-ensure)
(c-mode-hook . eglot-ensure)
(csharp-mode-hook . eglot-ensure)
(css-mode-hook . eglot-ensure)
(dart-mode-hook . eglot-ensure)
(go-mode-hook . eglot-ensure)
(groovy-mode-hook . eglot-ensure)
(haxe-mode-hook . eglot-ensure)
(html-mode-hook . eglot-ensure)
(java-mode-hook . eglot-ensure)
(js-mode-hook . eglot-ensure)
(json-mode-hook . eglot-ensure)
(kotlin-mode-hook . eglot-ensure)
(latex-mode-hook . eglot-ensure)
(less-css-mode-hook . eglot-ensure)
(nxml-mode-hook . eglot-ensure)
(powershell-mode-hook . eglot-ensure)
(python-mode-hook . eglot-ensure)
(rust-mode-hook . eglot-ensure)
(scss-mode-hook . eglot-ensure)
(sh-mode-hook . eglot-ensure)
(sql-mode-hook . eglot-ensure)
(typescript-mode-hook . eglot-ensure)
(xml-mode-hook . eglot-ensure)
(yaml-mode-hook . eglot-ensure)
(clojure-mode-hook . eglot-ensure))
)
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.
;; ===========================================================================
;; Local Variables:
;; coding: utf-8-unix
;; indent-tabs-mode: nil
;; tab-width: 4
;; End:
;; ===========================================================================
;;; gb-init ends here