commit 878696aad9488fc923e33172c5b5d3d87355a961 Author: mirko.aletto Date: Sun May 31 09:33:29 2026 +0200 Commit iniziale per tracciare la ocnfigurazione di emacs-config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1949060 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ + +# File di auto-salvataggio e backup di Emacs +*~ +.#* + +# File di blocco (lockfiles) creati da Emacs quando un file è aperto +\#*\# + +# File esportati comunemente generati da Org-mode +*.el +*.html +*.ics +*.md +*.pdf +*.tex +*.txt +*.vcf + +# Cache e file di stato di Org-mode +.org-id-location +*.org_archive \ No newline at end of file diff --git a/Old - My-emacs-config.org b/Old - My-emacs-config.org new file mode 100644 index 0000000..9cccc29 --- /dev/null +++ b/Old - My-emacs-config.org @@ -0,0 +1,1112 @@ +#+title: GNU Emacs configuration +#+author: Mrk +#+email: mirko.aletto@csico.it +#+language: it +#+options: ':t toc:nil num:t author:t email:t +#+startup: content indent +#+macro: latest-export-date (eval (format-time-string "%F %T %z")) +#+macro: word-count (eval (count-words (point-min) (point-max))) +# #+property: header-args :results none +#+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org + +[ Ultima revisione ed esportazione il *{{{latest-export-date}}}* con un +conteggio di parole *{{{word-count}}}*. ] + +* Note generali + +Rifacimento della configurazione partendo essenzialmente da: +- [[https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/][protesilaos.com]] +- [[https://doc.norang.ca/org-mode.html][doc.norang.ca]] +- https://www.gnu.org/software/emacs/ +- https://orgmode.org/ + +Questo è il mio file di configurazione di Emacs in forma letterale. È una +combinazione di prosa e codice. + +Quello che state leggendo non è una configurazione standard di Emacs. Nella +maggior parte dei casi, si ha un file generico =init.el= con una chiamata alla +funzione ~org-babel-load-file~ che riceve come valore un documento Org. Questo +metodo funziona, ma è molto lento, perché dobbiamo caricare Org prima di avviare +Emacs (e Org carica anche un sacco di altre cose di cui non abbiamo bisogno in +una fase così iniziale). + +Questo documento Org, invece, funge da (i) punto di accesso unico alla mia +configurazione di Emacs e (ii) origine di tutte le mie configurazioni di Emacs. + +Anche se definisco tutto in un singolo file Org, in realtà non avvio Emacs +leggendo questo file. Piuttosto, sto istruendo Org a inserire i blocchi di +codice qui definiti in file separati, organizzati per ambito. Il risultato +finale è qualcosa per cui non si può capire se è stato eseguito un programma +letterale o meno. + +Questa è la bellezza di tutto ciò. Posso continuare a modificare un singolo file +come "fonte di verità", pur potendo gestire ogni file singolarmente (ad esempio, +se qualcuno vuole vedere come eseguo una determinata operazione, condivido solo +quel file come allegato e-mail, senza bisogno di inviare l'intero documento). + +Quando voglio modificare la mia configurazione di Emacs, modifico questo file e +poi valuto il blocco di codice seguente oppure eseguo =C-c C-v C-t=. Tutti i +file verranno aggiornati di conseguenza. + +#+begin_src emacs-lisp :tangle no :results none +(org-babel-tangle) +#+end_src + + +* Anatomia della mia configurazione di Emacs + +Quello che stai leggendo ora è il file =prot-emacs.org=. È il documento che +genera - e quindi controlla - tutti gli altri file che sono alla base della mia +configurazione di Emacs. + +Questo file Org non viene caricato direttamente. Il suo unico scopo è quello di +produrre i file che svolgono il lavoro effettivo. Questi file sono organizzati +in base al loro scopo e alla loro funzione: ++ =early-init.el= :: Il file caricato prima di lanciare emacs, include + ottimizzazioni per l'avvio di Emacs e imposta alcune funzionalità di base, + come ad esempio evitare il lampeggio della luce all'avvio di Emacs in un + ambiente scuro. ++ =init.el= :: Il file standard di configurazione, caricato dopo il lancio di + emacs; contiene i blocchi fondamentali del mio sistema, ovvero le macro Lisp + che definisco, e carica i singoli moduli di configurazione. ++ =emacs-modules= :: Directory che include tutti i miei moduli di + configurazione. Ogni modulo riguarda un tipo specifico di funzionalità, come + ad esempio =emacs-theme.el= per i temi e =emacs-essentials.el= per gli + strumenti di base. Questi moduli di configurazione modificano i pacchetti e + non sono pensati per definire funzionalità aggiuntive. ++ =my-lisp= :: La directory in cui si trovano le librerie personalizzate che + gestisco come parte della mia configurazione di Emacs. Sono scritte in + conformità con le migliori pratiche per il packaging di Emacs Lisp, ma sono + destinate esclusivamente all'uso all'interno della mia + configurazione. Pertanto, non sono necessariamente allo stesso livello dei + pacchetti pubblici che gestisco per Emacs: . ++ Il file =emacs-pre-custom= :: Viene valutato /prima/ del caricamento dei + moduli. È destinato agli utenti della mia configurazione che desiderano + utilizzare le opzioni che fornisco ([[#h:5a41861f-4c38-45ac-8da2-51d77c0b4a73][Le opzioni utente di init.el]]). ++ Il file =emacs-post-custom= :: Come il precedente, questo file è destinato + agli utenti della mia configurazione. Viene valutato /dopo/ che il resto della + mia configurazione è stato caricato. Gli utenti possono includere qualsiasi + codice desiderino in questo file per sovrascrivere funzionalità esistenti o + definirne di nuove. ++ Il file =My-emacs-config.org= :: Il codice sorgente di ciò che stai leggendo. + +Ecco una rappresentazione schematica di questa struttura di directory (i file +mostrati qui potrebbero non riflettere lo stato più recente del progetto): + +#+begin_example +~/.emacs.d $ tree -aF +./ +├── early-init.el +├── init.el +├── emacs-modules/ +│   ├── emacs-dired.el +│   ├── emacs-essentials.el +│   ├── emacs-icons.el +│   ├── emacs-org.el +│   ├── emacs-vertico.el +├── emacs-post-custom.el +├── emacs-pre-custom.el +├── My-emacs-config.org +└── my-lisp/ + ├── dired.el + ├── embark.el + ├── marginalia.el + ├── orderless.el + ├── org.el + +#+end_example + +Il motivo per cui utilizzo questa configurazione modulare è che mi permette di +eseguire il debug più facilmente, ma anche di condividere singoli frammenti di +codice con altri. Il file =My-emacs-config.org= non rappresenta un ostacolo in +questo senso: fornisce un ulteriore modo per condividere il mio lavoro, sotto +forma di questa visualizzazione consolidata che vedete ora. + +Quando voglio apportare una modifica alla mia configurazione di Emacs, effettuo +le modifiche in =My-emacs-config.org= e poi digito =C-c C-v C-t= (=M-x +org-babel-tangle=) per propagare le modifiche ai file pertinenti. + +Ho creato la mia configurazione da zero e seguo le migliori pratiche per quanto +riguarda il funzionamento previsto da Emacs. Non utilizzo il demone di Emacs, +poiché ho riscontrato problemi di instabilità. Invece, eseguo una singola +istanza di Emacs e la configuro in modo che funga da server. + +Questo significa che posso comunque connettermi alla sessione in esecuzione +tramite ~emacsclient~, il che è utile quando voglio valutare il codice Elisp +dall'esterno di Emacs (ad esempio, con il mio script shell ~delight.sh~ che +cambia l'intero tema dell'"ambiente" del mio window manager a riquadri o +dell'ambiente desktop - vedi i miei dotfiles per i dettagli tecnici). + + +* The early initialisation of Emacs (=early-init.el=) +:PROPERTIES: +:CUSTOM_ID: h:7b7b5898-09f7-4128-8af0-4041f67cb729 +:END: + +Questo è il primo file che Emacs legge all'avvio. + +Dovrebbe contenere codice che non dipenda da alcun pacchetto o dalle proporzioni +del frame di Emacs. In generale, questo file di inizializzazione iniziale ha lo +scopo di impostare alcune cose di base prima che Emacs produca il frame +iniziale, delegando a =init.el= il resto della configurazione. + +** Le impostazioni di base del frame =early-init.el= +:PROPERTIES: +:CUSTOM_ID: h:a1288a07-93f6-4e14-894e-707d5ad8b6dc +:END: + +Queste sono alcune impostazioni generali per i frame e le basi del toolkit. In +breve, voglio mantenere le cose al minimo. Notate ~frame-resize-pixelwise~ e +~frame-inhibit-implied-resize~: per impostazione predefinita Emacs ridimensiona +il frame se si modifica la dimensione del carattere, cosa che non voglio mai +fare. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" +(setq frame-resize-pixelwise t + frame-inhibit-implied-resize 'force + frame-title-format '("%b") + ring-bell-function 'ignore + use-dialog-box t ; only for mouse events, which I seldom use + use-file-dialog nil + use-short-answers t + inhibit-splash-screen t + inhibit-startup-screen t + inhibit-x-resources t + inhibit-startup-echo-area-message user-login-name ; read the docstring + inhibit-startup-buffer-menu t) +#+end_src + +** Il codice =early-init.el= per impostare i parametri del frame per desktop +:PROPERTIES: +:CUSTOM_ID: h:0403b581-142b-4613-bc81-51c5dccd831d +:END: + +Qui imposto i parametri per le dimensioni della finestra di Emacs: la prima e +tutte quelle successive. In un window manager a riquadri, i parametri di +larghezza e altezza non sono importanti, poiché tutte le finestre vengono +forzatamente adattate a rettangoli (riquadri). Gli altri parametri, invece, sono +rilevanti. In un window manager a sovrapposizione, tutte le impostazioni sono +importanti. + +Il parametro ~initial-frame-alist~ si riferisce alla prima finestra che viene +generata all'avvio di Emacs. Per questo motivo deve essere definito nel file +=early-init.el=: il codice qui presente viene eseguito prima che venga disegnata +la prima finestra. + +Il parametro ~default-frame-alist~ si riferisce a tutte le finestre +successive. In linea di principio, potremmo definirlo al di fuori del file +=early-init.el=, ma è più logico averlo qui. + +Qui si imposta se utilizzare la barra dei menu, la barra delle icone e le +scrollbar: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + (menu-bar-mode 1) + (tool-bar-mode -1) + (scroll-bar-mode 1) + + (setq initial-frame-alist `((scroll-bar-width . 6) + (width . (text-pixels . 800)) + (height . (text-pixels . 900)) + (border-width . 0) + )) + + ;; - ;; Ripeti l'operazione dopo l'inizializzazione in modo che eventuali + ;; - ;; modifiche intermedie non vengano mantenute. Nota che non possiamo fare + ;; - ;; affidamento sull'impostazione di questo valore su + ;; - ;; `initial-frame-alist' poiché potrebbe cambiare nel + ;; - ;; frattempo. Impostiamo esplicitamente il valore per essere certi del + ;; - ;; risultato. Ciò non impedisce ad altri programmi di modificare + ;; - ;; l'elenco, anche se lo considererei indesiderabile se modificassero + ;; - ;; queste impostazioni specifiche. + ;; - (add-hook 'after-init-hook (lambda () + ;; - (add-hook 'after-init-hook (lambda () + ;; - (setq default-frame-alist `((scroll-bar-width . 6) + ;; - (width . (text-pixels . 800)) + ;; - (height . (text-pixels . 900)) + ;; - (border-width . 0) + ;; - ) + ;; - ))) + +#+end_src + +** Le modifiche di =early-init.el= al tempo di avvio e alla garbage collection +:PROPERTIES: +:CUSTOM_ID: h:50d28f3c-3ada-4db5-b830-bbbbee7fec4e +:END: + +Non ho una conoscenza approfondita della "garbage collection", ma ho imparato +per tentativi ed errori che posso massimizzare la soglia durante l'avvio per +rendere Emacs un po' più veloce. + +Quello che sto facendo qui è impostare i valori rilevanti su valori molto alti +durante l'avvio e poi riportarli a qualcosa di più pratico una volta che Emacs +ha finito di caricarsi. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Temporarily increase the garbage collection threshold. These + ;; changes help shave off about half a second of startup time. The + ;; `most-positive-fixnum' is DANGEROUS AS A PERMANENT VALUE. See the + ;; `emacs-startup-hook' a few lines below for what I actually use. + (setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 0.5) + + ;; Same idea as above for the `file-name-handler-alist' and the + ;; `vc-handled-backends' with regard to startup speed optimisation. + ;; Here I am storing the default value with the intent of restoring it + ;; via the `emacs-startup-hook'. + (defvar prot-emacs--file-name-handler-alist file-name-handler-alist) + (defvar prot-emacs--vc-handled-backends vc-handled-backends) + + (setq file-name-handler-alist nil + vc-handled-backends nil) + + (add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold (* 100 100 8) + gc-cons-percentage 0.1 + file-name-handler-alist prot-emacs--file-name-handler-alist + vc-handled-backends prot-emacs--vc-handled-backends))) + +#+end_src + +** Il file =early-init.el= inizializza la cache dei pacchetti +:PROPERTIES: +:CUSTOM_ID: h:7a037504-8a2f-4df0-8482-ce6476354440 +:END: + +Utilizzo il file =package.el= standard per gestire i miei pacchetti Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Initialise installed packages at this early stage, by using the + ;; available cache. I had tried a setup with this set to nil in the + ;; early-init.el, but (i) it ended up being slower and (ii) various + ;; package commands, like `describe-package', did not have an index of + ;; packages to work with, requiring a `package-refresh-contents'. + (setq package-enable-at-startup t) + +#+end_src + + +* Inizializzazione principale di Emacs (=init.el=) +:PROPERTIES: +:CUSTOM_ID: h:dae63bd9-93a8-41c4-af1b-d0f39ba50974 +:END: + +Qui definisco le macro Lisp utilizzate nella mia configurazione e carico tutti i +singoli moduli. + +** Opzioni utente di =init.el= +:PROPERTIES: +:CUSTOM_ID: h:5a41861f-4c38-45ac-8da2-51d77c0b4a73 +:END: + +Definisco diverse opzioni utente per il mio Emacs. Queste mi sono utili se ho +bisogno di testare rapidamente qualche aspetto della mia configurazione, anche +se le fornisco principalmente a coloro che utilizzano i miei file come base per +la propria configurazione. + +Tutte le opzioni utente devono essere impostate in un file +=prot-emacs-pre-custom.el= nella stessa directory del file =init.el= + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; For those who use my dotfiles and need an easy way to write their + ;; own extras on top of what I already load: search below for the files + ;; emacs-pre-custom.el and emacs-post-custom.el + (defgroup mrk-emacs nil + "User options for my dotemacs. + These produce the expected results only when set in a file called + emacs-pre-custom.el. This file must be in the same + directory as the init.el." + :group 'file) +#+end_src + +** Le configurazioni di base di =init.el= per disabilitare backup e file di blocco +:PROPERTIES: +:CUSTOM_ID: h:63d74507-0318-4c02-ad30-484abcb8f78e +:END: + +Per impostazione predefinita, Emacs tenta di bloccare i file in modo che non +vengano modificati da altri programmi. Mantiene anche dei backup. Queste sono +funzionalità di cui non ho bisogno perché (i) se mai dovessi modificare i miei +file esternamente, so cosa sto facendo e (ii) tutti i file che mi interessano +sono sotto controllo di versione o di cui è stato eseguito il backup su una +chiavetta USB. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq make-backup-files nil) + (setq backup-inhibited nil) ; Not sure if needed, given `make-backup-files' + (setq create-lockfiles nil) + +#+end_src + +** Le configurazioni di base di =init.el= per impostare il numero di caratteri +:PROPERTIES: +:ID: 99b9d611-c75e-4e69-bc1c-2401958ab879 +:END: + +Per impostare la larghezza massima in caratteri (default 70) in modo iterattivo, +si può utilizzare il comando =C-x f= (=fill-colum=). Altrimenti per impostare +permanentemente la larghezza massima a 80 caratteri all'avvio di Emacs, aggiungi +questa riga al tuo file di configurazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq-default fill-column 80) +#+end_src + +** Le modifiche di =init.el= per rendere silenziosa la compilazione nativa +:PROPERTIES: +:CUSTOM_ID: h:3563ceb5-b70c-4191-9c81-f2f5a202c4da +:END: + +L'opzione di compilazione =--with-native-compilation=yes= di Emacs è molto +utile: abilita la "compilazione nativa" di Emacs Lisp, traducendolo in codice +macchina. Tuttavia, l'impostazione predefinita per la segnalazione degli errori +è impostata su un valore verboso che, nella mia esperienza di coaching, confonde +gli utenti: produce avvisi per problemi di compilazione che solo lo sviluppatore +del pacchetto in questione deve gestire. Questi includono fatti innocui come le +docstring che superano un certo numero di caratteri. A peggiorare ulteriormente +le cose, il buffer che mostra questi avvisi utilizza il carattere di stop, +risultando in un lungo elenco di righe con punti rossi ovunque, come se avessimo +completamente rotto Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Make native compilation silent. + (when (native-comp-available-p) + (setq native-comp-async-report-warnings-errors 'silent)) + +#+end_src + +** Impostazione =init.el= per mandare ~custom-file~ nell'oblio: +:PROPERTIES: +:CUSTOM_ID: h:f2ffe0e9-a58d-4bba-9831-cc35940ea83f +:END: +Per impostazione predefinita, Emacs scrive le personalizzazioni persistenti alla +fine del file di inizializzazione dell'utente. Questi elementi sono incapsulati +in un blocco "personalizzato". Emacs li scrive ogni volta che l'utente esegue +un'azione con =M-x customize= o comandi simili. + +Personalmente, preferisco scrivere direttamente il codice Elisp piuttosto che +utilizzare l'interfaccia di =M-x customize=. Voglio anche che il mio file di +inizializzazione contenga solo ciò che ho scritto io e che non esegua mai, in +nessun caso, codice che non ho chiamato personalmente. + +Pertanto, voglio impostare la variabile ~custom-file~ per indicare a Emacs di +scrivere le sue variabili persistenti in quel file anziché nel mio =init.el=. +Tuttavia, poiché non ho intenzione di utilizzare questo file, ho scelto di +renderlo temporaneo posizionandolo nella directory =/tmp= (questo è ciò che fa +la funzione ~make-temp-file~). Quindi, quando chiudo il computer, il file +scompare. Infine, non richiamo la funzione ~load~ perché non farò mai +affidamento sul ~custom-file~. Preferirei avere un'opzione per evitare +completamente l'infrastruttura Custom, ma non è possibile. Quindi eccoci qui... + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Disable the damn thing by making it disposable. + ;; - (setq custom-file (make-temp-file "emacs-custom-")) + ;; Rendo il file persistente: + (setq custom-file (locate-user-emacs-file "custom.el")) + (load custom-file :no-error-if-file-is-missing) + +#+end_src + +** Impostazione =init.el= per eliminare il testo selezionato all'inserimento + +Praticamente tutti i programmi eliminano il testo selezionato/evidenziato non +appena l'utente digita qualcosa. Emacs non lo fa di default, pur avendo la +funzionalità disponibile. Abilitiamola quindi (Configurazione completa): + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package delsel + :ensure nil ; no need to install it as it is built-in + :hook (after-init . delete-selection-mode)) +#+end_src + +** Rendere =C-g= un po' più utile + +Avendo notato che i principianti hanno difficoltà con =C-g= perché non chiude il +minibuffer aperto, so che il seguente miglioramento semplifica l'esperienza +utente: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (defun mrk/keyboard-quit-dwim () + "Do-What-I-Mean behaviour for a general `keyboard-quit'. + + The generic `keyboard-quit' does not do the expected thing when + the minibuffer is open. Whereas we want it to close the + minibuffer, even without explicitly focusing it. + + The DWIM behaviour of this command is as follows: + + - When the region is active, disable it. + - When a minibuffer is open, but not focused, close the minibuffer. + - When the Completions buffer is selected, close it. + - In every other case use the regular `keyboard-quit'." + (interactive) + (cond + ((region-active-p) + (keyboard-quit)) + ((derived-mode-p 'completion-list-mode) + (delete-completion-window)) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (t + (keyboard-quit)))) + + (define-key global-map (kbd "C-g") #'mrk/keyboard-quit-dwim) +#+end_src + +** Impostazione =init.el= per gestire i package: + +Emacs ha un gestore di pacchetti basilare, ma comunque sufficientemente +efficiente. Lo utilizziamo per estendere Emacs con funzionalità fornite dalla +community. Emacs include molte funzioni utili, ma senza i pacchetti esterni +saremmo in una situazione peggiore. Inoltre, tenete presente che il fatto che un +pacchetto sia integrato in Emacs non lo rende necessariamente migliore delle +alternative di terze parti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Set the packet manager: + (setq package-archives + '(("gnu-elpa" . "https://elpa.gnu.org/packages/") + ("gnu-elpa-devel" . "https://elpa.gnu.org/devel/") + ("nongnu" . "https://elpa.nongnu.org/nongnu/") + ("melpa" . "https://melpa.org/packages/"))) + ;; Set the repository priority: + ;; Highest number gets priority (what is not mentioned has priority 0) + (setq package-archive-priorities + '(("gnu-elpa" . 3) + ("melpa" . 2) + ("nongnu" . 1))) +#+end_src + +*** Non visualizzare i warning durante il load dei pacchetti: + +Quando si installa un nuovo pacchetto, Emacs mostra un buffer contenente tutti +gli avvisi generati dal compilatore bytecode (Configura il gestore di +pacchetti). Sebbene queste informazioni siano utili per gli sviluppatori, +risultano molto confuse per gli utenti. Molte volte ho ricevuto messaggi del +tipo "Emacs si è bloccato", quando in realtà gli avvisi riguardano problemi che +non interessano l'utente. + +Il seguente frammento di codice impedisce la visualizzazione di questi buffer +(Configurazione completa). Rimangono comunque disponibili nell'elenco dei +buffer, qualora fossero necessari. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (add-to-list 'display-buffer-alist + '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'" + (display-buffer-no-window) + (allow-no-window . t))) + +#+end_src + +*** Impostazione =init.el= per selezionare il tema utilizzato: + +La scelta del tema è soggettiva, quindi vi prego di non considerare quanto segue +come un'opinione definitiva. Ho semplicemente scelto il tema che mi piace di +più. Usatelo come modello per configurare eventualmente un altro tema. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Esempio per utilizzare un pacchetto thema esterno + ;; - (use-package modus-themes + ;; - :ensure t + ;; - :config + ;; - (load-theme 'modus-vivendi-tinted :no-confirm-loading)) + ;; Esempio di utilizzo di un thema interno + (load-theme 'dichromacy :no-confirm-loading) + +#+end_src + +*** Impostazione =init.el= per i nerd icon + +Proseguendo con i perfezionamenti stilistici di Emacs, il seguente frammento di +codice mostrerà icone complementari nel minibuffer e in Dired. + +Per far funzionare questa configurazione, l'utente deve digitare =M-x= e quindi +richiamare il comando =nerd-icons-install-fonts=. Questo salverà i file dei font +delle icone in una directory locale (su Linux è ~/.local/share/fonts). Per +assicurarsi che tutto funzioni correttamente, riavviare Emacs garantirà che i +nuovi file dei font vengano letti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package nerd-icons + :ensure t) + + (use-package nerd-icons-completion + :ensure t + :after marginalia + :config + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + + (use-package nerd-icons-corfu + :ensure t + :after corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + + (use-package nerd-icons-dired + :ensure t + :hook + (dired-mode . nerd-icons-dired-mode)) +#+end_src + +*** Configurazione del minibuffer e delle relative opzioni + +[Guarda anche il video sui pacchetti minibuffer moderni, alcuni dei quali non ho +incluso qui perché sono un po' più avanzati: +https://protesilaos.com/codelog/2024-02-17-emacs-modern-minibuffer-packages/.] + +Il minibuffer è una componente fondamentale dell'esperienza Emacs. È il punto in +cui l'utente interagisce con Emacs per rispondere ai prompt, passare a un altro +buffer, aprire un nuovo file, eseguire un comando per nome completo e così +via. Il minibuffer predefinito è minimale, il che potrebbe essere utile per gli +utenti esperti, ma non facilita la scoperta delle opzioni. + +Per questo motivo, utilizziamo il pacchetto =vertico= per creare un layout +verticale. Ciò semplifica la visualizzazione delle opzioni disponibili. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load vertigo package + (use-package vertico + :ensure t + :config + (setq vertico-cycle t) + (setq vertico-resize nil) + (vertico-mode 1)) + ;; Configure directory extension. + (use-package vertico-directory + :after vertico + :ensure nil + ;; More convenient directory navigation commands + :bind (:map vertico-map + ("RET" . vertico-directory-enter) + ("DEL" . vertico-directory-delete-char) + ("M-DEL" . vertico-directory-delete-word)) + ;; Tidy shadowed file names + :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) +#+end_src + +Il pacchetto =Marginalia= è un ottimo complemento al layout verticale, poiché +utilizza lo spazio libero per mostrare informazioni utili sulle opzioni +visualizzate. Ad esempio, quando l'utente digita =M-x= per visualizzare un +elenco di nomi di comandi, Marginalia aggiungerà una breve descrizione di +ciascun comando. A seconda delle specifiche dell'interazione con il minibuffer +(apertura di un file, selezione di un buffer, ecc.), verranno visualizzate le +informazioni pertinenti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load marginalia package + (use-package marginalia + :ensure t + :config + (marginalia-mode 1)) +#+end_src + +Il pacchetto =Orderless= è una soluzione ideale per tutti quei casi in cui non +ricordiamo l'ordine esatto delle parole. Ad esempio, per attivare/disattivare la +visualizzazione dei numeri di riga nel buffer corrente, utilizziamo il comando +=M-x display-line-numbers-mode=. Con Orderless configurato, possiamo digitare +qualcosa come =li num dis= al prompt =M-x= e ottenere comunque il risultato +desiderato. Questo perché Orderless interpreta i caratteri separati da spazi in +qualsiasi ordine. Emacs include altri stili di corrispondenza di pattern, ma +"orderless" è un buon punto di partenza. Pertanto, ci assicuriamo che le altre +variabili rilevanti siano impostate su un valore nullo, in modo da ottenere +"orderless" ovunque. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load ordeless package + (use-package orderless + :ensure t + :config + (setq completion-styles '(orderless basic)) + (setq completion-category-defaults nil) + (setq completion-category-overrides nil)) +#+end_src + +Il pacchetto =consult= fornisce numerosi comandi che sono varianti avanzate +delle funzionalità di base integrate. Una delle caratteristiche principali di +consult è la funzione di anteprima, che mostra in un'altra finestra di Emacs il +contesto di ciò che è attualmente corrispondente nel minibuffer. + +Qui definisco le scorciatoie da tastiera per alcuni comandi che potrebbero +esservi utili. Il prefisso mnemonico è "alternative search" (in contrapposizione +alle scorciatoie da tastiera di base =C-s= o =C-r=). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load consult package + (use-package consult + :ensure t + :bind (;; Search for files names recursively + ("M-s M-f" . consult-find) + ;; Search through the outline (headings) of the file + ("M-s M-o" . consult-outline) + ;; Search the current buffer + ("M-s M-l" . consult-line) + ;; Switch to another buffer, or bookmarked file, or recently opened file. + ("M-s M-b" . consult-buffer) + ;; Search through history + ("M-s M-h" . consult-history) + ;; Search through mark + ("M-s M-m" . consult-mark) + ;; Search through yank + ("M-s M-y" . consult-yank-pop) + )) +#+end_src + +Il comando =consult-find= non funziona su windows, infatti utilizza il programma +=find.exe= che però non è quello unix. In particolare con il comando + +#+begin_src emacs-lisp :tangle no :results none + (executable-find "find") +#+end_src + +ritorna il valore + +#+begin_src emacs-lisp :tangle no :results none + "c:/WINDOWS/system32/find.exe" +#+end_src + +indicando che utilizza il find.exe di windows. Come find di unix, voglio +utilizzare quello dato già assieme a git. Serve quindi impostare il path +corretto, da internet ho trovato il comando + +#+begin_src emacs-lisp :tangle no :results none + (setq find-program "C:/Program Files/Git/usr/bin/find.exe") +#+end_src + +ma non funziona, emacs continua a puntare al find di windows. Procedo quindi a +inserire il path del find di unix sul PATH complessivo che utilizza emacs. In +questo modo non altero il PATH di windows e quindi sono più sicuro. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; imposto la directory del find unix: + (setq find-program-path "C:/Program Files/Git/usr/bin") + ;; la inserisco nel PATH di emacs: + (push find-program-path exec-path) + ;; impostiamo la cartella di default: + (setq default-directory "~/Doc/Org/") +#+end_src + +Il pacchetto integrato savehist tiene traccia degli input dell'utente e li +memorizza tra una sessione e l'altra. In questo modo, l'utente vedrà sempre le +sue ultime scelte in cima all'elenco (come con =M-x=). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load savelist package + (use-package savehist + :ensure nil ; it is built-in + :hook (after-init . savehist-mode)) + +#+end_src + +Il pacchetto =corfu= fornisce un'interfaccia popup per il completamento +automatico all'interno del buffer. Concettualmente, è simile a quanto +avviene con il minibuffer, sebbene sia pensato per l'espansione del +testo all'interno di un file normale. Viene tipicamente utilizzato +nella programmazione. Ci sono ulteriori funzionalità che potrebbero +renderlo utile per le modalità di programmazione (in particolare, la +configurazione del Language Server Protocol), ma poiché queste +dipendono molto dalle esigenze specifiche di ciascun utente, qui +fornisco solo le funzionalità principali. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package corfu + :ensure t + :hook (after-init . global-corfu-mode) + :bind (:map corfu-map ("" . corfu-complete)) + :config + (setq tab-always-indent 'complete) + (setq corfu-preview-current nil) + (setq corfu-min-width 20) + + (setq corfu-popupinfo-delay '(1.25 . 0.5)) + (corfu-popupinfo-mode 1) ; shows documentation after `corfu-popupinfo-delay' + + ;; Sort by input history (no need to modify `corfu-sort-function'). + (with-eval-after-load 'savehist + (corfu-history-mode 1) + (add-to-list 'savehist-additional-variables 'corfu-history))) +#+end_src + +*** Personalizzare il file manager =dired= per Emacs + +Emacs include un potente file manager integrato. Se ne parla a lungo in questo +video: [[https://protesilaos.com/codelog/2023-06-26-emacs-file-dired-basics/][Emacs: file and Dired basics]]. + +Le seguenti impostazioni definiscono alcune modifiche di base al comportamento +delle operazioni comuni di copia, ridenominazione ed eliminazione dei file. + +La visualizzazione predefinita di =Dired= contiene molti dettagli (la +configurazione completa). Utilizziamo =dired-hide-details-mode= per +nasconderli. È possibile attivarli/disattivarli in qualsiasi momento con =M-x +dired-hide-details-mode=, che è associato al tasto =(= nei buffer di Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load dired package + (use-package dired + :ensure nil + :commands (dired) + :hook + ((dired-mode . dired-hide-details-mode) + (dired-mode . hl-line-mode)) + :config + (setq dired-recursive-copies 'always) + (setq dired-recursive-deletes 'always) + (setq delete-by-moving-to-trash t) + (setq dired-dwim-target t)) +#+end_src + +Il pacchetto =dired-subtree= fornisce comandi per visualizzare rapidamente il +contenuto di una cartella utilizzando il tasto =TAB=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package dired-subtree + :ensure t + :after dired + :bind + ( :map dired-mode-map + ("" . dired-subtree-toggle) + ("TAB" . dired-subtree-toggle) + ("" . dired-subtree-remove) + ("S-TAB" . dired-subtree-remove)) + :config + (setq dired-subtree-use-backgrounds nil)) +#+end_src + +In precedenza abbiamo configurato Dired per spostare i file eliminati nel +cestino di sistema. Il pacchetto =trashed= è quindi utile per fornire +un'interfaccia simile a Dired per quella cartella (funziona allo stesso modo di +Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package trashed + :ensure t + :commands (trashed) + :config + (setq trashed-action-confirmer 'y-or-n-p) + (setq trashed-use-header-line t) + (setq trashed-sort-key '("Date deleted" . t)) + (setq trashed-date-format "%Y-%m-%d %H:%M:%S")) +#+end_src + +** Impostazione =init.el= per la data e l'ora ( display-time-mode) + +Mi piace visualizzare la data e l'ora correnti sulla barra di +navigazione. Ecco cosa =display-time-mode= fa. Nota che la mia barra +di navigazione personalizzata mostra l'ora solo nella finestra +attiva/selezionata. Altrimenti, l'impostazione predefinita è quella di +mostrare l'ora su tutte le barre di navigazione, il che è fastidioso. + +La =time.el= libreria che fornisce =display-time-mode= definisce anche +funzioni per ottenere il carico medio e controllare una directory per +nuove email. Non ho bisogno di questo e quindi lo disattivo. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq display-time-format " %a %e %b, %H:%M ") + ;;;; Covered by `display-time-format' + ;; (setq display-time-24hr-format t) + ;; (setq display-time-day-and-date t) + (setq display-time-interval 60) + (setq display-time-default-load-average nil) + ;; NOTE 2022-09-21: For all those, I have implemented my own solution + ;; that also shows the number of new items, although it depends on + ;; notmuch: the `notmuch-indicator' package. + (setq display-time-mail-directory nil) + (setq display-time-mail-function nil) + (setq display-time-use-mail-icon nil) + (setq display-time-mail-string nil) + (setq display-time-mail-face nil) + + ;; I don't need the load average and the mail indicator, so let this + ;; be simple: + (setq display-time-string-forms + '((propertize + (format-time-string display-time-format now) + 'face 'display-time-date-and-time + 'help-echo (format-time-string "%a %b %e, %Y" now)) + " ")) + + ;; Enable function + (display-time-mode 1) +#+end_src + +** Impostazione =init.el= per i fusi orari (world-clock) + +Comunico con persone di tutto il mondo. Conoscere il loro orario locale è di +fondamentale importanza. Con =M-x world-clock= otteniamo un buffer con tutte le +città e i relativi fusi orari specificati in zone =world-clock-list=. Il +contenuto viene visualizzato in base a =world-clock-time-format=. Nota che +si può controllare il posizionamento di questo e molti altri buffer configurando +=display-buffer-alist=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq world-clock-list + '(("America/Los_Angeles" "🇺🇸 Los Angeles") + ("America/Vancouver" "🇨🇦 Vancouver") + ("America/Denver" "🇺🇸 Denver") + ("America/Chicago" "🇺🇸 Chicago") + ("America/New_York" "🇺🇸 New York") + ("America/Toronto" "🇨🇦 Toronto") + ("America/Montreal" "🇨🇦 Montreal") + ("UTC" "🌐 UTC") + ("Europe/Lisbon" "🇵🇹 Lisbon") + ("Europe/London" "🇬🇧 London") + ("Europe/Paris" "🇫🇷 Paris") + ("Europe/Brussels" "🇧🇪 Brussels") + ("Europe/Berlin" "🇩🇪 Berlin") + ("Europe/Athens" "🇬🇷 Athens") + ("Asia/Nicosia" "🇨🇾 Lefkosia") + ("Asia/Istanbul" "🇹🇷 Istanbul") + ("Asia/Baghdad" "🇸🇾 Baghdad") + ("Asia/Riyadh" "🇸🇦 Riyadh") + ("Asia/Tehran" "🇮🇷 Tehran") + ("Asia/Tbilisi" "🇬🇪 Tbilisi") + ("Asia/Tashkent" "🇺🇿 Tashkent") + ("Asia/Karachi" "🇵🇰 Karachi") + ("Asia/Kolkata" "🇮🇳 Kolkata") + ("Asia/Dhaka" "🇧🇩 Dhaka") + ("Asia/Ho_Chi_Minh" "🇻🇳 Ho Chi Minh") + ("Asia/Singapore" "🇸🇬 Singapore") + ("Asia/Shanghai" "🇨🇳 Shanghai") + ("Asia/Seoul" "🇰🇷 Seoul") + ("Asia/Tokyo" "🇯🇵 Tokyo") + ("Australia/Brisbane" "🇦🇺 Brisbane") + ("Australia/Sydney" "🇦🇺 Sydney") + ("Pacific/Auckland" "🇳🇿 Auckland") + )) + ;; Formattazione dell'orario mostrato + (setq world-clock-time-format "%a %d %b %R %Z") +#+end_src + +** Impostazione =init.el= per eseguire Emacs come server + +Il "server" è funzionalmente simile al demone, tranne per il fatto che viene +eseguito dal primo frame di Emacs che avviamo. Con un server in esecuzione, +possiamo connetterci ad esso tramite una nuova chiamata =emacsclient=. Questo è +utile se vogliamo avviare nuovi frame che condividono risorse con il processo in +esecuzione. Tuttavia, =emacsclient= può essere utilizzato anche semplicemente +per eseguire codice al di fuori di un frame di Emacs (ad esempio per caricare un +nuovo tema, come faccio io con il mio delight.shscript di shell all'interno dei +miei dotfiles). + +Quando chiudiamo l'ultimo frame, il server viene terminato. Il demone, invece, +rimane attivo anche se tutti i frame di Emacs vengono chiusi. Per me, il server +è più facile da usare, perché so con certezza quando inizia e finisce il suo +ciclo di vita. Detto questo, ho provato seriamente anche il demone. Emacs si +bloccava ogni volta che incontravo un errore in qualche valutazione Lisp. Il +server, invece, funziona perfettamente. + +Nota che ciò avviene solo =server-start= se non è in esecuzione alcun +server. Uno è sufficiente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Emacs server (allow emacsclient to connect to running session) + (setq server-client-instructions nil) + (require 'server) + (unless (or (server-running-p) (daemonp)) + (server-start)) +#+end_src + +** Impostazione =init.el= per il salvataggio della cronologia ( savehist-mode) + +I prompt del minibuffer possono avere una propria cronologia. In caso contrario, +condividono una cronologia comune degli input dell'utente. Emacs tiene traccia +di questa cronologia nella sessione corrente, ma la perde non appena la +chiudiamo. Con =savehist-mode= abilitata, tutte le cronologie del minibuffer +vengono scritte in un file e ripristinate al successivo avvio di Emacs. + +Le storie sono utili in due modi: +- Le scelte più recenti compaiono in cima alla lista, così possiamo trovarle più + facilmente. +- I comandi =M-p= (=previous-history-element=) e =M-n= (=next-history-element=) + nel minibuffer saranno utili subito dopo il ripristino di Emacs (tutti i miei + pacchetti sfruttano al meglio le cronologie del minibuffer per ogni prompt, + quindi =M-p= e =M-n= mostrano solo i valori rilevanti). + +Poiché stiamo già registrando la cronologia del minibuffer, possiamo istruirlo +=savehist-mode= a tenere traccia anche di variabili aggiuntive e a ripristinarle la +prossima volta che utilizziamo Emacs. Quindi =savehist-additional-variables=. + +Si noti che l'opzione utente =history-length= si applica a ciascuna variabile della +cronologia singolarmente: non riguarda tutte le cronologie nel loro complesso. + +Nel complesso, sono soddisfatto di questa funzionalità e ne traggo vantaggio +quotidianamente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;;;; `savehist' (minibuffer and related histories) + (setq savehist-file (locate-user-emacs-file "savehist")) + (setq history-length 100) + (setq history-delete-duplicates t) + (setq savehist-save-minibuffer-history t) + (with-eval-after-load 'savehist + (add-to-list 'savehist-additional-variables 'kill-ring)) + (savehist-mode 1) +#+end_src + +** Impostazione =init.el= per le dynamic abbreviations +:PROPERTIES: +:ID: 2ab14cc5-b6fa-4d4b-9fa1-898fe5103ff3 +:END: + +Il pacchetto integrato =dabbrev= fornisce un metodo di completamento del testo +che legge il contenuto di un buffer ed espande il testo davanti al cursore per +trovare possibili candidati. Questo viene fatto con =M-/= (=dabbrev-expand=) che +è ciò che uso più spesso per eseguire i completamenti in buffer. + +Mi piace =dabbrev= perché è minimalista. Non genera popup né influisce sul +layout della finestra, permettendomi di concentrarmi su ciò che sto +facendo. Vorrei che avesse una funzione che consentisse di avviarlo e, in +qualsiasi momento, richiedere una presentazione completa in minibuffer di ciò +che sta cercando di trovare, invece di scorrere i candidati ripetutamente +=M-/=. Certo, di solito non scorro in questo modo, dato che in genere digito +abbastanza da trovare una corrispondenza esatta o essere a un =M-/= passo da +essa. + +Oltre al =dabbrev-expand= comando, abbiamo =dabbrev-completion=. Non lo uso +perché non mi sembra naturale, mentre scrivo, fermarmi, controllare il +minibuffer per vedere se c'è del testo, selezionarlo e tornare a scrivere. Forse +questo dipende dal fatto che ho uno stile di scrittura senza interruzioni e +senza tornare immediatamente indietro a modificare ciò che ho scritto (a meno +che non stia facendo una dimostrazione, in cui lo spettatore deve seguire). + +Il termine =dabbrev= sta per “dynamic abbreviations”. Emacs ha anche +abbreviazioni statiche definite dall’utente le [[id:6831ce3a-1e83-4838-bc59-8e31b6dc6109][prot-emacs-completion]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;;;; `dabbrev' (dynamic word completion (dynamic abbreviations)) + (setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_") + (setq dabbrev-abbrev-skip-leading-regexp "[$*/=~']") + (setq dabbrev-backward-only nil) + (setq dabbrev-case-distinction 'case-replace) + (setq dabbrev-case-fold-search nil) + (setq dabbrev-case-replace 'case-replace) + (setq dabbrev-check-other-buffers t) + (setq dabbrev-eliminate-newlines t) + (setq dabbrev-upcase-means-case-search t) + (setq dabbrev-ignored-buffer-modes '(archive-mode image-mode docview-mode pdf-view-mode)) +#+end_src + +** Impostazione =init.el= per le static abbreviations :ToReview: +:PROPERTIES: +:ID: 6831ce3a-1e83-4838-bc59-8e31b6dc6109 +:END: + +[Vedi articolo/video relativo: [[https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/][Emacs: abbreviations with abbrev-mode]]] + +A differenza delle [[id:2ab14cc5-b6fa-4d4b-9fa1-898fe5103ff3][abbreviazioni dinamiche]] che dipendono dal testo già +disponibile in un buffer, possiamo definire abbreviazioni che si espandono +sempre in base a quanto specificato. + +Le abbreviazioni, o il =abbrev= meccanismo, sono stringhe di caratteri che, una +volta digitate, vengono sostituite da un'altra stringa. Ad esempio, se voglio +digitare l'URL del mio sito web, inserisco mewebe continuo a digitare. Emacs +espanderà quella parola in https://protesilaos.com. + +A meno che tu non stia documentando la funzione della tua abbreviazione o che tu +abbia abbreviazioni facili da digitare in modo errato, non avrai mai bisogno di +dire a Emacs di non espandere l'input fornito. Tieni presente che il comando +=unexpand-abbrev= è disponibile se ne hai bisogno. Ho dovuto usarlo nel paragrafo +precedente per digitare prima l'abbreviazione che ho usato come esempio. + +Allo stesso modo, possiamo espandere un'abbreviazione ovunque con il comando +=expand-abbrev=, anche se normalmente non è necessario farlo perché avviene +automaticamente mentre digitiamo. + +Emacs gestisce in modo intelligente la definizione e l'utilizzo delle +abbreviazioni. Ogni modalità principale ha la sua tabella di abbreviazioni, alla +quale aggiungiamo le nostre definizioni. Quando ci troviamo in un buffer che +utilizza quella modalità principale, otteniamo l'accesso alle abbreviazioni +corrispondenti. In =global-abbrev-table= è disponibile anche un'opzione per le +abbreviazioni. In caso di conflitto tra una tabella specifica per la modalità +principale e quella globale, la prima ha la precedenza. Inoltre, le tabelle di +abbreviazioni seguono lo stesso principio di ereditarietà delle modalità +principali in generale, il che significa che una modalità come Org erediterà +l'opzione =text-mode-abbrev-table= perché =org-mode= deriva da =text-mode=. Le +tabelle di abbreviazioni sono quindi coerenti con il funzionamento di hook e +mappature di tasti in termini di precedenza ed ereditarietà. + +Come noterai più avanti, utilizzo la =prot-emacs-abbrev= macro per semplificare la +definizione di queste abbreviazioni. La maggior parte delle mie abbreviazioni +sono semplici modifiche alla maiuscola/minuscola. Tieni presente, tuttavia, che +il meccanismo sottostante è potente e può valutare codice Elisp arbitrario (ci +ho giocato un po', anche se non uso template e quindi non ne ho un reale +bisogno, ma funziona). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;;;; `abbrev' (Abbreviations, else Abbrevs) + ;; - ;; message-mode derives from text-mode, so we don't need a separate + ;; - ;; hook for it. + ;; - (prot-emacs-hook + ;; - (text-mode-hook prog-mode-hook git-commit-mode-hook) + ;; - abbrev-mode) + ;; - + ;; - (setq only-global-abbrevs nil) + ;; - + ;; - (prot-emacs-abbrev global-abbrev-table + ;; - "csico" "CSiCo" + ;; - ";home" "~" + ;; - ";tilde" "~") + ;; - + ;; - (prot-emacs-abbrev text-mode-abbrev-table + ;; - "asciidoc" "AsciiDoc" + ;; - "auctex" "AUCTeX" + ;; - "cafe" "café" + ;; - "cliche" "cliché" + ;; - "clojurescript" "ClojureScript" + ;; - "emacsconf" "EmacsConf" + ;; - "github" "GitHub" + ;; - "gitlab" "GitLab" + ;; - "javascript" "JavaScript" + ;; - "latex" "LaTeX" + ;; - "libreplanet" "LibrePlanet" + ;; - "linkedin" "LinkedIn" + ;; - "paypal" "PayPal" + ;; - "sourcehut" "SourceHut" + ;; - "texmacs" "TeXmacs" + ;; - "typescript" "TypeScript" + ;; - "visavis" "vis-à-vis" + ;; - "deja" "déjà" + ;; - "voila" "voilà" + ;; - "youtube" "YouTube" + ;; - ";up" "🙃" + ;; - ";uni" "🦄" + ;; - ";laugh" "🤣" + ;; - ";smile" "😀" + ;; - ";sun" "☀️") + ;; - + ;; - ;; Allow abbrevs with a prefix colon, semicolon, or underscore. I demonstrated + ;; - ;; this here: . + ;; - (abbrev-table-put global-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)") + ;; - + ;; - (with-eval-after-load 'text-mode + ;; - (abbrev-table-put text-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - (with-eval-after-load 'org + ;; - (prot-emacs-abbrev org-mode-abbrev-table + ;; - ";dev" "}" + ;; - ";key" #'prot-abbrev-org-macro-key + ;; - ";cmd" #'prot-abbrev-org-macro-key-command) + ;; - (abbrev-table-put org-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - ;; Because the *scratch* buffer is produced before we load this, we + ;; - ;; have to explicitly activate the mode there. + ;; - (when-let* ((scratch (get-buffer "*scratch*"))) + ;; - (with-current-buffer scratch + ;; - (abbrev-mode 1))) + ;; - + ;; - ;; By default, abbrev asks for confirmation on whether to use + ;; - ;; `abbrev-file-name' to save abbrevations. I do not need that, nor + ;; - ;; do I want it. + ;; - (remove-hook 'save-some-buffers-functions #'abbrev--possibly-save) +#+end_src + +* Altro da rivedere + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + +#+end_src diff --git a/Old - MyInit.org b/Old - MyInit.org new file mode 100644 index 0000000..d1f6863 --- /dev/null +++ b/Old - MyInit.org @@ -0,0 +1,1766 @@ +-*- coding: utf-8 -*- +#+TITLE: la mia configurazione di emacs Vrs 0.9 +#+AUTHOR: CSiCoAlm +#+DESCRIPTION: File in formato org con la configurazione di emacs +#+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org + +* Intro: + Fino ad ora (2020/04) utilizzavo direttamente il file ~/.emacs da cui caricavo i veri e + propi file di configurazione dal reposity GIT "~/.dotemacs" su cui avevo tutti i singoli + file con le varie personalizzazioni. Vedendo in internet vari esempi, voglio cambiare + per portare il tutto su un file org che mi permetta non solo di configurare emacs + secondo i miei desideri, ma anche che mi permetta di inserire ulteriori informazioni in + modo che posso esplicitare le varie scelte fatte per poterle ricordare in futuro senza + perdere tempo e sopratutto per potermi ricordare cosa intendevo ottenere. In questo + file racchiuderò tutta la configurazione e la personalizzazione di emacs, descrivendo il + più possibile tutti i vari passaggi per renderlo il più utile ed interessante possibile. + + Cercherò quindi di espicitare il più possibile le scelte fatte, non solo descrivendo le + singole funzionalità, ma cercando anche di esplicitare cosa si voleva ottenere e come si + è fatto, in modo che in futuro rileggendo posso ricordare tutto senza perdere tempo. + + I punti che non sono chiari o che devo rivedere li evidenzio tramite l'abbreviazione + {???} oppure tramite il tag ToReview. + + Vedere di utilizzare anche tag o altre cose di org per chiarire meglio il tutto. Magari + utilizzare i link per connettere la parte in cui ad esempio setto il gestore dei + packages con le parti in cui utilizzo un package. + + +* References: + La configurazione partirà da quanto fatto finora (Configurazione Vrs. 3.3 del + 04/10/2018) ripartendo da zero con le considerazioni ricavate dalle varie sorgenti + analizzate: + - [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] :: Bel esempio di come utilizzare in + particolar modo org-mode nella produttività. + - [[https://cestlaz.github.io/stories/emacs/][Using Emacs Series]] :: serie di video su emacs di Mike Zamansky che hanno anche il + relativo [[https://github.com/zamansky/using-emacs][GitHub repo]] + - [[https://www.youtube.com/watch?v=9pkuBijrMD4&list=PLNJWazvift25KnHDwYlhwrrgr60wtpQOB][Lukewh]] :: Playlist di video su emacs. Ne parla anche su [[https://lbry.tv/@lukewh:3][LBRY]] + - [[http://pages.sachachua.com/.emacs.d/Sacha.html][http://pages.sachachua.com/.emacs.d/Sacha.html]] + - [[https://sachachua.com/blog/][Sacha Blog]] + - [[http://ergoemacs.org/emacs/emacs_encoding_decoding_faq.html][Emacs File Encoding FAQ]] + - [[https://egli.dev/posts/using-org-mode-for-meeting-minutes/][Using org-mode for meeting minutes]] + - [[https://www.youtube.com/watch?v=2-0OwGTt0dI][Emacs: introduction to MAGIT]] + - Blog molto carino: [[https://irreal.org/blog/][irreal]] + + +* Esigenze: :ToReview: + - mettere comandi semplici per esportare tutto su html + - mettere a punto esportazione su pdf + - mettere a punto espansione dei testi abbreviati soprattutto per: + - i blocchi codice + - form di introduzione di dati ripetitivi tipo un resum di un lavoro. + - mettere comandi veloci per: + - evidenziare un capitolo nascondendo gli altri e viceversa. + - far partire timer e fermarli + - registrare ed eseguire delle macro + Per le macro vi sono questi reference: + - [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html#Keyboard-Macros][Manual]] + - [[https://www.emacswiki.org/emacs/KeyboardMacros][Wiki]] + - Using emacs series [[https://cestlaz.github.io/posts/using-emacs-15-macros/][video 15]] + - sfruttare nuova struttura: + - file unico (Inbox) con i lavori attuali e indici a file di riferimento per ciascun + cliente. + - file di reference dei vari clienti magari vedendo se può essere uno solo e sfruttare + aggenda per estrarre i dati tramite tag o altro + - file con le nozioni e i CFG dell'ufficio e della casa + - file con i riferimenti money report per capire come investo e quanto ho nei vari + investimenti + - sistemare con le nuove caratteristiche i capture in modo che fuzionino bene per: + - link utili da rivedere o per bibbliografia + - telefonate + - ToDo + - Note + - appuntamenti + - Idee future + - sistemare i tag per: + - classificare i vari reference per il TGD + - classificare le cose per future ricerche + - Pensare come legarsi con keep per sincronizarsi con cellulare + - Esempi di emacs: + - come configurare emacs: https://github.com/abrochard/emacs-config (dal video + https://meet.jit.si/FAR_HJ9Bzjs0tmF0DlA9qHIE) + - Tutorial molto bello in vari video: https://cestlaz.github.io/stories/emacs/ + - Indagare sui bookmark di emacs per capire come sfruttarli (vedi [[https://www.youtube.com/watch?v=ajiEBK2swKo][Lukewh video 12]]) [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html][emacs manual]] + - Informarsi su 'Company mode' package che crea una specie di intellisense per suggerire come + completare le parole in base a quanto editato prima (come in notepad++). Per + riferimenti: [[https://www.youtube.com/watch?v=q-9Z2eR7cTE][Lukewh video 16]] o [[http://company-mode.github.io/][Company mode on GitHub]] + - vedere per la correzione ortografica (Flycheck, flymake o altro) + - [[https://www.flycheck.org/en/latest/][flycheck]] anche da [[https://www.youtube.com/watch?v=EGR9CwM1ksQ][Lukewh video 17]] + - ORG PUBBLISH: Sul sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] c'è un tutorial sulla pubblicazione tramite org che è + molto bello, inoltre mostra anche come cambiare il file autogenerato mapindex in un + generico index.html con css e tutto per renderlo più bello. + - Impostare l'utilizzo di org anche dal cellulare. Per farlo vedere come utilizzare + orgmobile o [[https://f-droid.org/en/packages/com.orgzly/][orgzly]] o l'interfaccia web ecc.... Un esempio molto interessante che + utilizza anche GIT per mettere sul clud i file è quello in dal portale opensource.com: + [[https://opensource.com/article/19/4/calendar-git][Manage your daily schedule with Git]] + - rivedere il gestore di calendari in modo testuale [[https://lostpackets.de/khal/index.html][khal]] perchè sempbra molto carino. + +** TODO [[https://katherine.cox-buday.com/blog/2015/03/14/writing-specs-with-org-mode/][Writing Specs with Org-mode]] :ToReview: + esempio di come produrre documentazione tecnica con + org-mode, LaTeX, PlantUML per ottenere pdf. Mostra anche il relativo file di + configurazione. + +** TODO Created a new HTML export back-end that uses Tailwind.css classes :ToReview: + - Link [[https://www.reddit.com/r/emacs/comments/fw6onf/created_a_new_html_export_backend_that_uses/][articolo]] + - Link [[https://github.com/vascoferreira25/ox-tailwind][GitHub]] + : (load "~/.MyTools/private-packages/ox-tailwind/ox-tailwind.el") + +** TODO Socially isolating my Emacs with Docker! :ToReview: + - Link [[https://www.youtube.com/watch?v=D2E1Eh9Hxdg&feature=youtu.be][video]] + +** TODO riconfigurare l'esportazione in html: + - tenere conto delle info dal sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] per personalizzare il file mapindex + - rivedere l'esportazione partendo tutto in ~/Pub e in esso mantenere anche i reference + e styli. + + +* Set home path + Essendo nato in linux, emacs utilizza molto la directory home e perciò ho trovato utile + crearne un riferimento in windows. In particolare imposto la cartella C:\_Home come + cartella home. + + Per inserire _Home come path predefinito, non serve definirlo sulla variabile di sistema + PATH, ma basta definire una variabile utente home: + - in windows aprire il form delle variabili utente: 'Edit enviroment variables for + account' + - inserire una nuova variabile con i seguenti valori: + - Variable name: home + - Variable value: C:\_Home + + Come emacs, utilizzo direttamente quello scaricabile dal progetto [[https://www.gnu.org/software/emacs/][GNU Emacs]] + (Emacs 28.2 al 2022/12) disarchiviando lo zip, sulla cartella: + : C:/MyTools/emacs + e lo eseguo lanciando: + : C:/MyTools/emacs/bin/runemacs.exe + + +* init.el o .emacs + Questa parte, descrive cosa inserire nel file iniziale che viene automaticamente letto + all'avvio di emacs (~/.emacs o ~/.emacs.d/init.el). In esso occorre impostare le + funzioni base che sono "obbligatorie", mentre tutto il resto viene delegato ad un file + ottenuto compilando questo file org. + + Preferisco evitare che il file org venga compilato ad ogni avvio di + emacs perchè perdo tempo, ed inoltre cambierei sempre il file sul + reposity e quindi non è utile per la gestione con GIT. + + Quindi sul file di inizializzazione non metterò il codice di + compilazione, ma caricherò direttamente il file compilato. + + Per compilare il file a mano, basta eseguire lo stesso codice: + : (org-babel-load-file (expand-file-name "~/.MyCfg/emacs/dotEmacs/MyInit.org")) + copiandolo sul buffer scrach ed eseguendolo, oppure più + semplicemente, basta dare il comando: + : M-x org-babel-load-file "~/.MyCfg/emacs/dotEmacs/MyInit.org RET + + #+BEGIN_SRC emacs-lisp + ;; Emacs is unable to open this file properly: -*- coding: utf-8 -*- + ;; ;; + ;; ;; + ;; ;; + ;; ;; Imposto la gestione dei Packages + ;; ;; + ;; (require 'package) + ;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) + ;; ;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) + ;; (package-initialize) + ;; ;; + ;; ;; + ;; ;; ;; Carico come configurazione direttamente il file compilato a mano (tramite ...) + ;; ;; (load "~/.MyCfg/emacs/dotEmacs/MyInit.el") + ;; ;; + ;; ;; Compilo il file in formato org e lo carico: + ;; (org-babel-load-file (expand-file-name "~/.MyCfg/emacs/dotEmacs/MyInit.org")) + ;; ;; + ;; ;; + ;; ;; + ;; ;; + ;; ;; + ;; ;; + ;; ;; Altre configurazioni gestite in automatico da emacs + ;; ;; + #+END_SRC + + +* Impostazioni generali +** Imposto modalità server + Per evitare di aprire più istanze di emacs, abilito la modalità server. + #+BEGIN_SRC emacs-lisp + ;; ---> ;; Abilito il server emacs + ;; ---> (server-start) + #+END_SRC + Dal sito [[https://qastack.it/emacs/146/set-up-emacs-on-windows-to-start-a-single-instance-and-open-files-in-the-existin][Configura Emacs su Windows per avviare una singola istanza]] ricavo che per + avviare il server di emacs in automatico si utilizza: + #+BEGIN_SRC emacs-lisp + ;; Abilito il server emacs e lo avvio se non già in run + (require 'server) + (unless (server-running-p) (server-start)) + #+END_SRC + Quindi avvia emacs semplicemente eseguendo l' runemacs.exe eseguibile fornito con la + build. + + La build di Windows di Emacs include un emacsclientw.exe eseguibile nella + bin/directory. Usa il percorso completo di tale eseguibile come editor di tua scelta su + tutti gli strumenti di terze parti che devi configurare per editare il file utilizzando + il server già aperto. + +** Imposto formato UTF-8 + Imposto come formato di default dei file: UTF8 + #+BEGIN_SRC emacs-lisp + ;; Imposto come formato di default l'UTF8 + (set-language-environment "UTF-8") + (set-default-coding-systems 'utf-8-unix) + ;; (set-terminal-coding-system 'utf-8) + ;; (prefer-coding-system 'utf-8) + ;; (set-charset-priority 'unicode) + #+END_SRC + +** Carico i file lisp aggiuntivi +:PROPERTIES: +:CUSTOM_ID: Add-AddOn +:END: + Per abilitare delle funzionalità particolari, si deve caricare dei file lisp + particolari che nella mia configurazione metterò nel path: + : ~/.MyCfg/emacs/AddOn + e li caricherò sempre tutti: + #+BEGIN_SRC emacs-lisp + ;; Carico il path dei file lisp che aggiungo: + (add-to-list 'load-path (expand-file-name "~/.MyCfg/emacs/AddOn/elisp")) + #+END_SRC + +** Nascondo la schermata di benvenuto + #+BEGIN_SRC emacs-lisp + ;; Don't show startup message + (setq inhibit-startup-message t) + #+END_SRC + +** Blinking del cursore + #+BEGIN_SRC emacs-lisp + ;; Stop al blinking del cursore + (blink-cursor-mode -1) ;; (setq blink-cursor-delay 2 blink-cursor-interval 0.5) + #+END_SRC + +** menu bar + #+BEGIN_SRC emacs-lisp + ;; menu bar (1=enable, -1=disable) + (menu-bar-mode 1) + #+END_SRC + +** scroll bar + #+BEGIN_SRC emacs-lisp + ;; scroll bar (1=enable, -1=disable) + (toggle-scroll-bar 1) + #+END_SRC + +** tools bar + #+BEGIN_SRC emacs-lisp + ;; tool bar (1=enable, -1=disable) + (tool-bar-mode -1) + #+END_SRC + +** Highlight line + #+BEGIN_SRC emacs-lisp + ;; Higlight line (1=enable, -1=disable) + (global-hl-line-mode 1) + #+END_SRC + +** Edit selected text + Se si edita del testo selezionato, emacs di default non lo sostituisce, ma si limita ad + inserire il nuovo testo prima di quello selezionato. Per fare in modo che si comporti + come sono abituato in windows, occorre abilitare la cancellazione del testo + selezionato. + #+BEGIN_SRC emacs-lisp + ;; delete selection when edited (1=enable, -1=disable) + (delete-selection-mode 1) + #+END_SRC + +** Gestione Autosave e Autobackup dei file + Gestione dei file di salvataggio automatico (quelli con # all'inizio e alla fine). Il + file di salvataggio automatico di un determinato buffer viene cancellato quando si + salva esplicitamente il file. Per impedire ciò è necessario impostare a nil la + variabile delete-auto-save-files. + + Se si modifica il nome del file aperto tramite C-x C-w o set-visited-file-name, il nome + del file di salvataggio automatico viene modificato di conseguenza. + + Alla modifica di un file, emacs fa un backup automatico del file (stesso nome con la + tilde finale). Per abilitare o no il backup automatico, si deve agire sull'apposita + variabile. + + #+BEGIN_SRC emacs-lisp + ;; disable autosave + (setq delete-auto-save-files t) + ;; disable autobackup + (setq make-backup-files nil) + #+END_SRC + +** Calendario in Italiano :ToCheck: + Personalizzazione del calendario per visualizzarlo in Italiano ed inserire le + festività italiane: + #+BEGIN_SRC emacs-lisp + ;; Calendario in italiano + (setq calendar-christian-all-holidays-flag t) + (setq calendar-date-style (quote iso)) + (setq calendar-day-name-array ["Domenica" "Lunedi'" "Martedi'" "Mercoledi'" "Giovedi'" "Venerdi'" "Sabato"]) + (setq calendar-latitude [45 40 north]) + (setq calendar-longitude [12 22 east]) + (setq calendar-mark-holidays-flag t) + (setq calendar-month-name-array ["Gennaio" "Febbraio" "Marzo" "Aprile" "Maggio" "Giugno" "Luglio" "Agosto" "Settembre" "Ottobre" "Novembre" "Dicembre"]) + (setq calendar-time-display-form (quote (24-hours ":" minutes (if time-zone " (") time-zone (if time-zone ")")))) + (setq calendar-view-holidays-initially-flag t) + (setq calendar-week-start-day 1) + (setq column-number-mode t) + (setq display-time-mode t) + (setq show-paren-mode t) + #+END_SRC + +** Mostro il numero delle righe durante la programmazione + #+BEGIN_SRC emacs-lisp + ;; Show line numbers on programming mode + (add-hook 'prog-mode-hook 'display-line-numbers-mode) + #+END_SRC + +** Colum number + #+BEGIN_SRC emacs-lisp + ;; Show the column number + (column-number-mode 1) + #+END_SRC + +** Abbrevio Yes or No + #+BEGIN_SRC emacs-lisp + ;; Make all "yes or no" prompts be "y or n" instead + (fset 'yes-or-no-p 'y-or-n-p) + #+END_SRC + +** Matching delle parentesi + Abilito l'evidenziazione delle coppie di parentesi e riduco al minimo il tempo di + attesa + #+BEGIN_SRC emacs-lisp + ;; Show the matching parenthesis and do it immediately, we are in a hurry + (show-paren-mode t) + (setq show-paren-delay 0) + #+END_SRC + +** Mostro Ora nella modeline + Visualizzo l'ora attuale nella barra di sistema nel formato 24 ore. + #+BEGIN_SRC emacs-lisp + ;; Time in the modeline + (display-time) + (setq display-time-24hr-format t) + #+END_SRC + +** Completamento dinamico sul minibuffer: + Facilita l'inserimento sul minibuffer. Un esempio è quando + introduco un tag su un file org, con questo abilitato, emcas mi + sugerisce tutti i tag già inseriti. + #+BEGIN_SRC emacs-lisp + ;; Activate the dynamic completion in the mini-buffer + (icomplete-mode 1) + ;; This should actually turn on auto-fill-mode by default in all major + ;; modes. The other way to do this is to turn on the fill for specific modes + ;; via hooks. + (setq auto-fill-mode 1) + #+END_SRC + +** Directory iniziale + Imposto la directory iniziale che è quella da cui partire per ricercare o inserire file + #+BEGIN_SRC emacs-lisp + ;; Directory iniziale + (setq default-directory "~/Doc/Org/") + #+END_SRC + +** Kill buffer automatico :Disable:KeyBinding: + Per default il comando di chiusura di un buffer (C-x k) chiede il nome del buffer da + chiudere suggerendo inizialmente quello in cui si è. Tramite il comando + kill-this-buffer si può chiudere direttamente il buffer in cui si è senza avere la + richiesta di conferma. Se si vuole accelerare, si può quindi bindare il comando + generale a quello veloce: + #+BEGIN_SRC emacs-lisp + ;; ---> (global-set-key (kbd "C-x k") 'kill-this-buffer) + #+END_SRC + +** Correttore ortografico: :ToReview:Disable: + Dal sito [[https://github.com/nobiot/Zero-to-Emacs-and-Org-roam][nobiot/Zero-to-Emacs-and-Org-roam]] ho preso spunto per installare il correttore + ortografico Hunspell e in particolare ho scaricato la versione 1.7.0 e messa sulla + cartella "~/.MyCfg/emacs/AddOn/hunspell-1.7.0". Qui ho inoltre messo anche i dizionari + presi da quelli di libreoffice. Infine ho impostato emacs in questo modo: + #+BEGIN_SRC emacs-lisp + ;; Imposto l'italiano come lingua predefinita + (setenv "LANG" "it_IT") + ;; Indico dove trovare Hunspell + (setq ispell-program-name "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Bin/hunspell.exe") + ;; Indico che dizionario utilizzare. + ;; Se voglio cambiarlo devo ridare il comando con il dizionario che voglio utilizzare. + (setq ispell-local-dictionary "it_IT") + ;; Imposto il path dei dizionari + (setq ispell-hunspell-dict-paths-alist + '(("it_IT" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ("en_US" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_US.aff") + ("en_GB" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_GB.aff") + ("default" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ) + ) + #+END_SRC + Ora posso avviare il correttore sul file aperto tramite il comando: + : M-x ispell + + Come reference ho utilizzato anche i seguenti siti: + - [[http://blog.binchen.org/posts/what-s-the-best-spell-check-set-up-in-emacs/][What's the best spell check setup in emacs]] + - [[https://www.reddit.com/r/emacs/comments/dgj0ae/tutorial_spellchecking_with_hunspell_170_for/][Tutorial: spellchecking with hunspell (1.7.0) for emacs (26.2) on Windows (10)]] + + +* UI +** emacs Custom Themes: + Per ora disativo i temi e quindi scelgo uno fra quelli di default di emacs. + + Come reference per i theme ci sono i seguenti siti: + - [[https://pawelbx.github.io/emacs-theme-gallery/][emacs theme gallery]] + - [[https://emacsthemes.com/][emacs Themes]] + + #+BEGIN_SRC emacs-lisp + ;; dichromacy -- Face colors suitable for red/green color-blind users. + (load-theme 'dichromacy t) + ;; ---> ;; tsdh-dark -- A dark theme used and created by Tassilo Horn. + ;; ---> (load-theme 'tsdh-dark t) + ;; ---> ;; tsdh-light -- A light Emacs theme. + ;; ---> (load-theme 'tsdh-light t) + ;; ---> ;; whiteboard -- Face colors similar to markers on a whiteboard. + ;; ---> (load-theme 'whiteboard t) + ;; ---> ;; wombat -- Med + ;; ---> (load-theme 'wombat t) + #+END_SRC + +** Dimensioni font + Per ridimensionare il testo, c'è il comando: + : C-x C-0 + Dopo il quale si hanno i seguenti comandi: + : + incrementa il size + : - decrementa il size + : 0 ritorna al default + I comandi si possono ripetere a piacere fino a quando si è raggiunta + la dimensione desiderata e poi chiude con + : ESC + + Imposto la dimensione di default del testo per facilitare la lettura: + #+BEGIN_SRC emacs-lisp + ;; Imposto la dimensione del testo: + (set-face-attribute 'default nil :height 110) + #+END_SRC + +** Dimensione finestra + Ridimensiono la finestra di emacs in base a quanto visto nella pagina della + [[https://www.emacswiki.org/emacs/FrameSize][wiki]]. + #+BEGIN_SRC emacs-lisp + ;; Imposto dimensioni finestra + ;; (when window-system (set-frame-size (selected-frame) 92 46)) + (add-to-list 'default-frame-alist '(width . 100)) + (add-to-list 'default-frame-alist '(height . 48)) + #+END_SRC + +** Wordwrap + Inoltre imposto il wordwrap a 90 caratteri in modo da sfruttare opportunamente le + righe. + #+BEGIN_SRC emacs-lisp + ;; Imposto wordwrap + (setq-default fill-column 90) + #+END_SRC + +** Colorization :ToReview:Disable: + #+BEGIN_SRC emacs-lisp + ;; ---> ;; use colorization for all modes + ;; ---> (global-font-lock-mode t) + #+END_SRC + +** Reload file nel buffer :Disable:ToReview:KeyBinding: + Per ricaricare il file sul buffer ed anullare tutte le modifiche fatte, si usa il + comando + : revert-buffer + Per comodità è utile bindarlo ad un tasto: + #+BEGIN_SRC emacs-lisp + ;; ---> (global-set-key (kbd "") 'revert-buffer) + #+END_SRC + +** Buzzer visibile + Dal sito [[http://pragmaticemacs.com/emacs/using-a-visible-bell-in-emacs/][Pragmatic emacs]] ho trovato come visualizzare un lampeggio in emacs al posto + del beep (per errori o allarmi) di emacs. + #+BEGIN_SRC emacs-lisp + ;; Buzzer visibile + (setq visible-bell t) + #+END_SRC + + +* Modes :Minor_Mode: +** IDO :ToReview:Disable: + Mode per avere i suggerimenti e l'autocompletazione nei menu e dei comandi. + + Diverso materiale ed informazioni si possono trovare in: + - [[https://www.emacswiki.org/emacs/InteractivelyDoThings][Ido from emacs wiki]] + - [[https://www.gnu.org/software/emacs/manual/html_mono/ido.html][Ido from gnu.org]] + + #+BEGIN_SRC emacs-lisp + ;; ---> ;; Set ido (https://www.gnu.org/software/emacs/manual/html_mono/ido.html) + ;; ---> (setq ido-everywhere t) + ;; ---> (setq ido-enable-flex-matching t) + ;; ---> (ido-mode 1) + #+END_SRC + +** Visual Basic Mode + Dal sito [[http://www.emacswiki.org/emacs/visual-basic-mode.el][Wiki]], si ricava come installare il "visual-basic-mode" che permette di editare + il visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/visu][visual-basic-mode.el]] e per farlo lo metto sul path + che carico di default all'avvio (vedi relativo [[#Add-AddOn][paragrafo]]); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file (in automatico i file + li associo a "visual basic .net" e non a "visual basic 6"). + #+BEGIN_SRC emacs-lisp + ;; Carico il modo Visual Basic + ;(autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t) + (require 'visual-basic-mode) + ;; + ;; Associo il modo VB automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . visual-basic-mode)) auto-mode-alist)) + (require 'vbnet-mode) + #+END_SRC + +** Visual Basic .NET mode + Dal sito [[http://www.emacswiki.org/emacs/VbDotNetMode][Wiki]], si ricava come installare il "vbnet-mode" che permette di editare il + visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/vbnet-mode.el][vbnet-mode.cs]] e per farlo lo metto sul path che + carico di default all'avvio (vedi relativo [[#Add-AddOn][paragrafo]]); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file. + #+BEGIN_SRC emacs-lisp + ;; Carico il modo Visual Basic .Net + (autoload 'vbnet-mode "vbnet-mode" "Mode for editing VB.NET code." t) + ;; + ;; Associo il modo VBNet automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . vbnet-mode)) auto-mode-alist)) + #+END_SRC + +** C#: csharp-mode +Da Stack Overflow: [[https://stackoverflow.com/questions/3954607/c-sharp-emacs-mode-questions-indentation-and-build][C# Emacs mode questions - indentation and build]] e successivamente dal +sito [[https://github.com/emacs-csharp/csharp-mode][GitHub csharp-mode]] ricavato i file [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-mode.el][csharp-mode.el]] e [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-compilation.el][csharp-compilation.el]] che +permettono di definire il csharp-mode utilizzabile direttamente nei blocchi org per avere +il codice con la colorazione sintattica. + +Da quanto visto, non serve linkare il linguaggio con babel, ma basta inserire i file negli +AddOn e caricare i rispettivi modi: + +#+begin_src emacs-lisp + ;; ---> ;; ---> ;; Carico il path dei file lisp che definiscono il modo C#: + ;; ---> ;; ---> (add-to-list 'load-path (expand-file-name "~/.MyCfg/emacs/AddOn/elisp")) + ;; ---> ;; Attivo il modo per C# + ;; ---> (require 'csharp-mode) + ;; ---> ;; Vi assicio, di default, i file *.cs + ;; ---> (setq auto-mode-alist + ;; ---> (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + ;; ---> ;; Volendo posso definire la funzione di hook per impostarci una + ;; ---> ;; tabulazione predefinita valida in tutti i modi derivanti dal C: + ;; ---> (defun my-c-mode-common-hook () + ;; ---> (setq c-basic-offset 4) + ;; ---> (c-set-offset 'substatement-open 0) + ;; ---> ) + ;; ---> ;; Infine assegnare la funzione appena definita, all'hook: + ;; ---> (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) +#+end_src + +*** Obsoleto: + Dal sito [[https://code.google.com/p/csharpmode/][code.google]] e successivamente dal sito [[https://github.com/josteink/csharp-mode][GitHub]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/csharp-mode.el][csharp-mode.el]] + che permette di avere il csharp-mode per visualizzare il codice C# correttamente + colorato. + + Il file lo ho copiato nella directory che carico allo startup (vedi relativo + [[#Add-AddOn][paragrafo]]); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+BEGIN_SRC emacs-lisp + ;; ---> ;; Carico il modo C# + ;; ---> (autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t) + ;; ---> ;; + ;; ---> ;; Associo il modo C# automaticamente ai file *.cs + ;; ---> (setq auto-mode-alist (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + #+END_SRC + +** Power Shell mode :Disable:Obsolete: + Ricercando info per il vbnet-mode ho trovato il sito [[https://www.emacswiki.org/emacs/PowerShell][Wiki]] da cui si ricava il file + [[file:~/.MyTools/_MyUp/Lisp/PowerShell-Mode.el][PowerShell-Mode.el]] per gestire il vpowershell-mode + + Il file lo ho messo sulla cartella da cui carico, all'avvio, i file lisp esterni, + + Configuro quindi il load del modo e gli associo i relativi file: + #+BEGIN_SRC emacs-lisp + ;; ---> ;; Carico il modo PowerShell + ;; ---> (autoload 'powershell-mode "vpowershell-mode" "PowerShell Mode" t) + ;; ---> ;; Associo il modo automaticamente ai file *.?1?, *.?2? + ;; ---> ;(setq auto-mode-alist (append '(("\\.\\(?1?\\|?2?\\)$" . vpowershell-mode)) auto-mode-alist)) + #+END_SRC + + [2022-12-08 Thu] Nella revisione, si è visto che ora la modalità è compresa nel package + di emacs e quindi si può installare direttamente con i comandi: + : M-x package-install RET powershell RET + + +* Packages :Package: + + Emacs ha una gestione dei packages che mi permette di installare ed utilizzare + differenti pacchetti o funzionalità in modo semplice. + + Qui inserisco tutte le configurazioni sui package inserendo le + descrizioni varie ed eventuali esempi di utilizzo, in modo che anche + fra qualche tempo se vado a vedere, ritrovo tutte le informazioni + base ed importanti. + + Vi sono diversi reposity, ma i principali, non chè ufficiali, sono: + - [[https://melpa.org/][MELPA]] o [[https://github.com/melpa/melpa][MELPA GitHub]] + - [[https://github.com/melpa/melpa][MELPA Stable]] + - gnu + - org + - ???? + + Di seguito inserisco la configurazione del gestore dei package ed a seguire tutte le + configurazioni sui package che installo inserendo le descrizioni varie ed eventuali + esempi di utilizzo, in modo che anche fra qualche tempo se vado a vedere, ritrovo tutte + le informazioni base ed importanti. + + Spunti inizialmente presi da https://orgmode.org/elpa.html e + http://pages.sachachua.com/.emacs.d/Sacha.html. Nel 2020/04 rivisto il tutto + in base alla serie [[https://cestlaz.github.io/stories/emacs/][Using emacs]] + +** Note sull'utilizzo e sui comandi: + Per vedere la lista dei package: + : M-x list-packages + Per aggiornare la lista dei package si usa: + : M-x package-refresh-contents + Per installare l'ultimo package di org: + : M-x package-install RET org RET + Per avere informazioni su un package si può usare il comando + : M-x describe-package + che visualizza una finestra con le informazioni del pacchetto. + + Per aggiornare l'installazione di un package, occorre che non sia in uso, poi si + richiama l'elenco dei packages con + : M-x list-packages + Ora si seleziona i pacchetti da aggiornare con + : U + (mark Upgradable packages) e si avvia l'aggiornamento con + : x + (eXecute the installs and deletions). Alla fine dell'aggiornamento chiede eventualmente + se si vuole cancellare i pacchetti obsoleti e basta rispondere con Yes. + + If you run into a problem installing or upgrading, you may need to go into your + ~/.emacs.d/elpa/ directory and delete packages that are installed multiple times. This + can happen when the install times out. + +** Setup generale: + Per utilizzare i reposity, occorre inizializzarli. Il relativo codice è già stato + inserito nel file init.el perchè deve essere una delle prime cose da fare. + #+BEGIN_SRC emacs-lisp + ;; Codice già resente in init.el: + ;; (require 'package) + ;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) + ;; ;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) + ;; (package-initialize) + ;; + ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + (unless package-archive-contents (package-refresh-contents)) ;; Refresh the packages descriptions + (setq package-load-list '(all)) ;; List of packages to load + ;; + ;; Carico Org se non già caricato: + (unless (package-installed-p 'org) (package-install 'org)) ;; Make sure the Org package is installed, install it if not + ;; + ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + (unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + #+END_SRC + +** Package: Try + Permette di provare i vari pacchetti senza installarli. Quindi riavviando emacs si + ritorna alla situazione iniziale. + + Quando installato, si può provare un pacchetto direttamente installandolo + temporaneamente con try. Per esempio e voglio installare il pacchetto del gioco 2048: + : M-x try RET 2048-game + e quindi lanciare il gioco temporaneamente installato: + : M-X 2048-game RET + + Si può utilizzare anche per provare un file dal web. Per esempio per caricare il file, + file.el, in modo temporaneo: + : M-x try RET https://url.com/to/some/file.el + + Dai siti di rifererimento [[https://melpa.org/#/tryhttps://melpa.org/#/try][Melpa]], [[https://github.com/larstvei/Try][GitHub]] + #+BEGIN_SRC emacs-lisp + (use-package try + :ensure t) + #+END_SRC + +** Package: Which-key + Visualizza sul minibuffer tutti i comandi possibili per completare quello iniziato. + Quindi permette di iniziare un comando, per esempio C-x, attendere qualche secondo, e + mostra sul minibuffer tutti i possibili suggerimenti + + E' simile ad IDO, ma è riferito esclusivamente ai comandi. + + Sui siti di riferimento [[https://melpa.org/#/which-key][Melpa]], [[https://github.com/justbur/emacs-which-key][GitHub]], ci sono molte opzioni (visualizzare i + suggerimenti sotto, a destra, tempo di attesa prima di visualizzarli, ecc..) ma per ora + utilizzo la configurazione base e poi sperimentando vedo se variarla. + #+BEGIN_SRC emacs-lisp + (use-package which-key + :ensure t + :config + (which-key-mode)) + #+END_SRC + +** Package: Org-bullet :Disable:Obsolete: + Questo pacchetto permette di sostituire gli asterichi nelle header con dei bullet più + carini. Dai siti di riferimento [[https://melpa.org/#/org-bullets][Melpa]], [[https://github.com/sabof/org-bullets][GitHub]] si indica che non sarà più aggiornato e + che viene sostituito da org-superstart, quindi anchio lo disattivo ed utilizzo + superstar. Il codice di configurazione era: + #+BEGIN_SRC emacs-lisp + ;;(use-package org-bullets + ;; :ensure t + ;; :config + ;; (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) + #+END_SRC + +** Package: Org-superstar + Questo pacchetto permette di sostituire gli asterichi nelle header con dei bullet più + carini. Dai siti di riferimento [[https://melpa.org/#/org-superstar][Melpa]] [[https://github.com/integral-dw/org-superstar-mode][GitHub]] viene indicato come il successore di + org-bullet. + #+BEGIN_SRC emacs-lisp + (use-package org-superstar + :ensure t + :config + (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1)))) + ;; Per velocizzare la gestione del font + (setq inhibit-compacting-font-caches t) + #+END_SRC + +** Package: Swiper / Ivy / Counsel :ToReview:Disable: + Questo serve per estendere la funzione di search ed inoltre estende IDO, ma è da usare + in modo esclusivo (occorre disattivare IDO). Per ora non lo uso, ma merita di darci + un'occhiata. Si combina bene con HEM + + Permette di editare in contemporanea su più punti, autocompleta i comandi. ecc... + + Visto in Using Emacs Series [[https://www.youtube.com/watch?v=0mwwN0S1dnQ][Video 6]] e i siti di riferimento sono: [[https://melpa.org/#/swiper][Melpa]], [[https://github.com/abo-abo/swiper][GitHub]] + #+BEGIN_SRC emacs-lisp + ;; ---> ;; it looks like counsel is a requirement for swiper + ;; ---> (use-package counsel + ;; ---> :ensure t + ;; ---> ) + ;; ---> ;; + ;; ---> (use-package swiper + ;; ---> :ensure try + ;; ---> :config + ;; ---> (progn + ;; ---> (ivy-mode 1) + ;; ---> (setq ivy-use-virtual-buffers t) + ;; ---> (global-set-key "\C-s" 'swiper) + ;; ---> (global-set-key (kbd "C-c C-r") 'ivy-resume) + ;; ---> (global-set-key (kbd "") 'ivy-resume) + ;; ---> (global-set-key (kbd "M-x") 'counsel-M-x) + ;; ---> (global-set-key (kbd "C-x C-f") 'counsel-find-file) + ;; ---> (global-set-key (kbd " f") 'counsel-describe-function) + ;; ---> (global-set-key (kbd " v") 'counsel-describe-variable) + ;; ---> (global-set-key (kbd " l") 'counsel-load-library) + ;; ---> (global-set-key (kbd " i") 'counsel-info-lookup-symbol) + ;; ---> (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) + ;; ---> )) + #+END_SRC + +** Package: Auto-complete + Simile alla funzione di autocompletamento nativa di emacs (M-/) questa visualizza i + suggerimenti tipo intellisense e quindi è carina da vedere. per ora provo ad usarla e + poi vedo se tenerla o no. + + I siti di riferimento sono: [[https://melpa.org/#/auto-complete][Melpa]], [[https://github.com/auto-complete/auto-complete][GitHub]] + #+BEGIN_SRC emacs-lisp + (use-package auto-complete + :ensure t + :init + (progn + (ac-config-default) + (global-auto-complete-mode t) + )) + #+END_SRC + +** Package: Htmlize + Per convertire il testo ed i blocchi in testo html con associati i vari colori. + + Siti di riferimento: [[https://melpa.org/#/htmlize][Melpa]], [[https://github.com/hniksic/emacs-htmlize][GitHub]] da cui si vede che è possibile personalizzare lo + stile dell'esportazione in tre modi in base ai valori assegnato alla variabile: + : htmlize-output-type + : css + : inline-css + : font + #+BEGIN_SRC emacs-lisp + (use-package htmlize + :ensure t) + #+END_SRC + +** Package: Theme Zenburn :Disable: + Permette di gestire comodamente il thema ZenBurn + + I siti di riferimento sono: [[https://melpa.org/#/zenburn-theme][Melpa]], [[https://github.com/bbatsov/zenburn-emacs][GitHub]] da cui ricavo anche che il thema gestisce + dimensioni diverse per le headline. + + Si possono ridefinire i colori andando a ridefinire la variabile + zenburn-override-colors-alist come in questo esempio. + #+BEGIN_SRC emacs-lisp + ;; ---> ;; ;; Sample redefine colors: + ;; ---> ;; (setq zenburn-override-colors-alist + ;; ---> ;; '(("zenburn-bg+05" . "#282828") + ;; ---> ;; ("zenburn-bg+1" . "#2F2F2F") + ;; ---> ;; ("zenburn-bg+2" . "#3F3F3F") + ;; ---> ;; ("zenburn-bg+3" . "#4F4F4F"))) + ;; ---> ;; (load-theme 'zenburn t) + ;; ---> ;; + ;; ---> ;; use variable-pitch fonts for some headings and titles + ;; ---> (setq zenburn-use-variable-pitch t) + ;; ---> ;; + ;; ---> ;; scale headings in org-mode + ;; ---> (setq zenburn-scale-org-headlines t) + ;; ---> ;; + ;; ---> ;; scale headings in outline-mode + ;; ---> (setq zenburn-scale-outline-headlines t) + ;; ---> ;; + ;; ---> ;; Load theme + ;; ---> (use-package zenburn-theme + ;; ---> :ensure t + ;; ---> :config + ;; ---> (load-theme 'zenburn t)) + #+END_SRC + +** Package: Theme Spacemacs :Disable: + Permette di gestire comodamente il thema Spacemacs. Spacemacs è + una configurazione particolare di emacs completa di configuratore e + altro. Per informazioni il sito di riferimento è: [[https://www.spacemacs.org/][Spacemacs]] o [[https://www.youtube.com/watch?v=hCNOB5jjtmc][Video]] + + I siti di riferimento sono: [[https://melpa.org/#/spacemacs-theme][Melpa]], [[https://github.com/nashamri/spacemacs-theme][GitHub]] da cui ricavo anche che il thema gestisce + dimensioni diverse per le headline e anche il grassetto. + + Si possono ridefinire i colori andando a ridefinire la variabile + zenburn-override-colors-alist come in questo esempio. + #+BEGIN_SRC emacs-lisp + ;; ---> ;; + ;; ---> ;; Load theme + ;; ---> (use-package spacemacs-theme + ;; ---> :ensure t + ;; ---> :config (load-theme 'spacemacs-light t)) + #+END_SRC + +** Package: ox-Reveal :ToReview:Disable: + Permette di generare da org delle presentazioni web tramite lo script [[https://github.com/hakimel/reveal.js/][reveal.js]] + + Siti di riferimento: [[https://melpa.org/#/ox-reveal][Melpa]], [[https://github.com/yjwen/org-reveal][GitHub]] si capisce che: + - tramite la variabile org-reveal-root si indica quale [[https://github.com/hakimel/reveal.js/][reveal.js]] utilizzare (locale o + web) + - org-reveal-mathjax permette di abilitare equazioni LaTex + + Per il tutto ho preso spunto da Using emacs series [[https://www.youtube.com/watch?v=psDpCpcIVYs][Video 11]] + #+BEGIN_SRC emacs-lisp + ;; ---> (use-package ox-reveal + ;; ---> :ensure ox-reveal) + ;; ---> (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/") + ;; ---> (setq org-reveal-mathjax t) + #+END_SRC + + Il tutto sembra non funzionare, se confronto la pagina html generata da me con quella + dell'esempio dal [[https://www.youtube.com/watch?v=psDpCpcIVYs][sito]] si vede che io inserisco la linea: + : + mentre nell'esempio si ha: + : + : + Quindi sulla mia esportazione manca il codice: + : + + Alcune informazioni utili su come utilizzarlo anche in locale sono presenti + sull'articolo sul portale opensource: + [[https://opensource.com/article/18/2/how-create-slides-emacs-org-mode-and-revealjs][How to create slides with Emacs Org mode and Reveal.js]] + +** Package: Yasnippet + Permette di inserire testi tramite abbreviazioni e poi tab, estende quindi le + funzionalità base di emacs. I vari sniptes si possono personalizzare a piacere. + + Siti di riferimento: [[https://melpa.org/#/yasnippet][Melpa]], [[https://github.com/joaotavora/yasnippet][GitHub]], [[http://joaotavora.github.io/yasnippet/][Manual]] + #+BEGIN_SRC emacs-lisp + (use-package yasnippet + :ensure t + :init + (yas-global-mode 1)) + #+END_SRC + +** Package: Magit :ToReview:Disable: + I siti di riferimento sono: [[https://magit.vc/][magit.vc]], [[https://github.com/magit/magit][GitHub]], [[https://www.emacswiki.org/emacs/Magit][emacswiki]] + +** Package: Org-mode :MISSING: +*** Installazione e attivazione: + Dal sito di riferimento di org: [[https://orgmode.org/][orgmode.org]] ricavo l'installazione del pacchetto (per + averlo aggiornato): + #+BEGIN_SRC emacs-lisp + ;; Installazione + (use-package org + :ensure t) + ;; + ;; Imposto OrgMode come default per i file '*.org' e '*.org_archive' + (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\)$" . org-mode)) + + ;; Attivazione pacchetto + (require 'org) + #+END_SRC + +*** Visibilità iniziale: + Imposto la visibilità iniziale a tutto ragruppato per velocizzare la vista dall'alto. + #+BEGIN_SRC emacs-lisp + ;; Visibilità iniziale: tutto ragruppato + (setq org-startup-folded t) + #+END_SRC + +*** Use utf-8 as the default coding system for all of my org files. + #+BEGIN_SRC emacs-lisp + ;; default coding system UTF-8 + (setq org-export-coding-system 'utf-8) + (setq default-process-coding-system '(utf-8-unix . utf-8-unix)) + #+END_SRC + +*** Key Binding :ToReview:MISSING: + Impostiamo alcuni dei key binding di default: + #+BEGIN_SRC emacs-lisp + ;;(global-set-key (kbd "C-c l") 'org-store-link) + (global-set-key (kbd "C-c a") 'org-agenda) + (global-set-key (kbd "C-c c") 'org-capture) + #+END_SRC + + Analisi dei tasti funzioni disponibili: + | Key | Binding originale | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Passa il focus al menu | + | S- | Passa il focus al menu | + | C- | Passa il focus al sottomenu | + | M- | Passa la visualizzazione a schermo Intero/Finestra | + |---------+----------------------------------------------------| + | | Passa la visualizzazione a schermo Intero/Finestra | + | S- | Passa la visualizzazione a schermo Intero/Finestra | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + | | Non Definito | + | S- | Non Definito | + | C- | Non Definito | + | M- | Non Definito | + |---------+----------------------------------------------------| + + Quindi assegnerò con questi principi i tasti: + - *F9* - /Visibilità/ - per la visibilità sul file + | Key | Origin | My Bingind | + |--------+--------------+------------------------------| + | | Non Definito | Visualizza tutto | + | S- | Non Definito | Visualizza solo ramo attuale | + | C- | Non Definito | nascondi ramo attuale | + | M- | Non Definito | ... | + #+BEGIN_SRC emacs-lisp + (global-set-key (kbd "") 'widen) + (global-set-key (kbd "C-") 'MRK/hide-other) + (global-set-key (kbd "S-") 'narrow-to-region) + ;(global-set-key (kbd "M-") ) + #+END_SRC + */ToReview:/* + + Verificare come posso sfruttare i segnalibri per navigare fra i file: + : C-x r m bookmark-set Imposta un segnalibro. Utile nelle ricerche + : C-x r b bookmark-jump Salta ad un segnalibro. + + Come riepilogato nella [[https://www.emacswiki.org/emacs/BasicNarrowing][wiki]] i comandi base per narrowing/widen (narrow=stringere + widen=allargare) in emacs sono: + - C-x n n /narrow-to-region/ :: Visualizza solo il testo selezionato, e nasconde + tutto il resto. + - C-x n w /widen/ :: Visualizza tutto il testo del buffer + - C-x n p /narrow-to-page/ :: Visualizza solo il testo dal cursore a fine pagina. + - C-x n d /narrow-to-defun/ :: Visualizza solo il testo tramite le [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Defuns.html#Defuns][Defun]]. + Naturalmente il testo nascosto non è più accessibile per le modifiche dal buffer + fino a che non si rivisualizza (widen) però rimane gestito, quindi salvando il file + lo mantiene ecc... + + Org-mode ha i seguenti modi per cambiare la visibilità del testo nel buffer: + - C-c / /org-sparse-tree/ :: This prompts for an extra key to select a sparse-tree + creating command. + + + - *F11* - /Loggin Work/ - per la gestione del log dei tempi + | Key | Origin | My Binding | + |---------+-------------------------------------+------------| + | | Visualizza dove c'è il clock attivo | Clock Goto | + | S- | Fa partire il clock di timing | Clock In | + | C- | Termina il clock di timng | Clock Out | + | M- | Org manage per navigare fra i file | Org-Manage | + #+BEGIN_SRC emacs-lisp + (global-set-key (kbd "") 'org-clock-goto) + (global-set-key (kbd "C-") 'org-clock-in) + (global-set-key (kbd "S-") 'org-clock-out) + (global-set-key (kbd "M-") 'org-manage ) + #+END_SRC + */ToReview:/* + + Impostiamo il tasto F11 per iteragire con i timer ed il log delle ore e quindi devo + pensare a come fare le seguenti cose: + - avviare il log del task: Clock in + - fermare un log del task: Clock out + - fare il report dei log: ? + - stimare il tempo di un task + - modificare la stima di un task + - mostrare stima e log di un task in forma colonne + - navigare fra i task loggati (la ring relativa) + + - *F12* - /Navigazione/ - per la navigazione fra i file (e la pubblicazione per compatibilità) + | | Apre aggenda (C-c a) | + | S- | Aprire subito Trash.org | + | C- | Aprire subito InBox.org | + | M- | Aprire subito Mrk.org | + | C-S- | Pubblicazione file org | + #+BEGIN_SRC emacs-lisp + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd "S-") (lambda() (interactive)(find-file "~/Doc/Trash/Trash.org"))) + (global-set-key (kbd "C-") (lambda() (interactive)(find-file "~/Doc/Org/InBox.org"))) + (global-set-key (kbd "M-") (lambda() (interactive)(find-file "~/Doc/Org/Private/MRK.org"))) + (global-set-key (kbd "C-S-") 'MRK/save-then-publish) + #+END_SRC + + + + + + + + + + + Mentre imposto anche questi miei key binding custom: + #+BEGIN_SRC emacs-lisp + ;; Vecchio binding solo per reference: + ;;(global-set-key (kbd "") 'org-agenda) + ;;(global-set-key (kbd "") 'bh/org-todo) + ;;(global-set-key (kbd "") 'bh/widen) + ;;(global-set-key (kbd "") 'bh/set-truncate-lines) + ;;(global-set-key (kbd "") 'org-cycle-agenda-files) + ;;(global-set-key (kbd " ") 'bh/show-org-agenda) + ;;(global-set-key (kbd " b") 'bbdb) + ;;(global-set-key (kbd " c") 'calendar) + ;;(global-set-key (kbd " f") 'boxquote-insert-file) + ;;(global-set-key (kbd " g") 'gnus) + ;;(global-set-key (kbd " h") 'bh/hide-other) + ;;(global-set-key (kbd " n") 'bh/toggle-next-task-display) + ;;(global-set-key (kbd " I") 'bh/punch-in) + ;;(global-set-key (kbd " O") 'bh/punch-out) + ;;(global-set-key (kbd " o") 'bh/make-org-scratch) + ;;(global-set-key (kbd " r") 'boxquote-region) + ;;(global-set-key (kbd " s") 'bh/switch-to-scratch) + ;;(global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + ;;(global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + ;;(global-set-key (kbd " v") 'visible-mode) + ;;(global-set-key (kbd " l") 'org-toggle-link-display) + ;;(global-set-key (kbd " SPC") 'bh/clock-in-last-task) + ;;(global-set-key (kbd "C-") 'previous-buffer) + ;;(global-set-key (kbd "M-") 'org-toggle-inline-images) + ;;(global-set-key (kbd "C-x n r") 'narrow-to-region) + ;;(global-set-key (kbd "C-") 'next-buffer) + ;;(global-set-key (kbd "") 'org-clock-goto) + ;;(global-set-key (kbd "C-") 'org-clock-in) + ;;(global-set-key (kbd "C-") 'MRK/save-then-publish) + #+END_SRC + +*** Tasks and States + Imposto come parole chiavi per i ToDo i seguenti codici: + | key | Descr | + |---------+--------------------------| + | TODO | Task da fare | + | NEXT | Task in esecuzione | + | DONE | Task terminato | + | WAITING | Task in attesa | + | HOLD | Task Bloccato | + | ABORT | Task Abortito(Cancellato | + | PHONE | Telefonata | + | MEETING | Meeting | + + e corrisponde al seguente schema: + + #+begin_src plantuml :file ~/Pub/.Tmp/Img/MyInit.org_task_states.png :cache yes :tangle no + title Task States + [*] -> TODO + TODO -> NEXT + TODO -> DONE + NEXT -> DONE + DONE -> [*] + TODO --> WAITING + WAITING --> TODO + NEXT --> WAITING + WAITING --> NEXT + HOLD --> CANCELLED + WAITING --> CANCELLED + CANCELLED --> [*] + TODO --> HOLD + HOLD --> TODO + TODO --> CANCELLED + TODO: t + NEXT: n + DONE: d + WAITING:w + note right of WAITING: Note records\nwhat it is waiting for + HOLD:h + note right of CANCELLED: Note records\nwhy it was cancelled + CANCELLED:c + WAITING --> DONE + #+end_src + + per le chiamate: + #+begin_src plantuml :file ~/Pub/.Tmp/Img/MyInit.org_phone_states.png :cache yes :tangle no + title Phone Call Task State + [*] -> PHONE + PHONE -> [*] + #+end_src + + per i meeting: + #+begin_src plantuml :file ~/Pub/.Tmp/Img/MyInit.org_meeting_states.png :cache yes :tangle no + title Meeting Task State + [*] -> MEETING + MEETING -> [*] + #+end_src + + Per ciacuno di essi, definisco anche la lettera di abbreviazione per l'inserimento + veloce + #+BEGIN_SRC emacs-lisp + ;; Task keywords definitions: + (setq org-todo-keywords + (quote ( + (sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "ABORT(a@/!)" "PHONE" "MEETING") + ) + ) + ) + #+END_SRC + Per ciascuna keyword posso personalizzare il faceplate, ma per ora non lo faccio. + #+BEGIN_SRC emacs-lisp + ;; ---> ;; Task keywords colour settings: + ;; ---> (setq org-todo-keyword-faces (quote ( + ;; ---> ("TODO" :foreground "red" :weight bold) + ;; ---> ("NEXT" :foreground "blue" :weight bold) + ;; ---> ("DONE" :foreground "forest green" :weight bold) + ;; ---> ("WAITING" :foreground "orange" :weight bold) + ;; ---> ("HOLD" :foreground "magenta" :weight bold) + ;; ---> ("ABORT" :foreground "forest green" :weight bold) + ;; ---> ("MEETING" :foreground "forest green" :weight bold) + ;; ---> ("PHONE" :foreground "forest green" :weight bold) + ;; ---> ))) + #+END_SRC + Ai tipi di ToDo, associo anche in modo automatico dei tag per facilitare filtri o + ricerche: + #+BEGIN_SRC emacs-lisp + ;; Triggers that automatically assign tags to tasks based on state changes: + (setq org-todo-state-tags-triggers (quote ( + ("ABORT" ("ABORT" . t)) + ("WAITING" ("WAITING" . t)) + ("HOLD" ("WAITING") ("HOLD" . t)) + (done ("WAITING") ("HOLD")) + ("TODO" ("WAITING") ("ABORT") ("HOLD")) + ("NEXT" ("WAITING") ("ABORT") ("HOLD")) + ("DONE" ("WAITING") ("ABORT") ("HOLD")) + ))) + #+END_SRC + + Abilito la selezione veloce delle keyword tramite il comando + : C-c C-t Keyword + Inoltre abilito lo switch fra le keyword tramite i comandi + : S-left + : S-right + senza però che si attivino le annotazioni automatiche. + #+BEGIN_SRC emacs-lisp + ;; Fast todo selection allows changing from any task todo state to any other state directly by selecting the appropriate key from the fast todo selection key menu. + ;; The relative command is: C-c C-t KEY where KEY is the appropriate fast todo state selection key as defined in org-todo-keywords. + (setq org-use-fast-todo-selection t) + ;; + ;; Cycles through the todo states with S-left and S-right, but skips setting timestamps and entering notes + (setq org-treat-S-cursor-todo-selection-as-state-change nil) + #+END_SRC + +*** Tags :ToReview:MISSING: + imposto i tag generali in uso + +*** Capture Setup :ToReview:MISSING: + imposto i form di cattura veloce + +*** Refiling Tasks: :ToReview:MISSING: + imposto il refill + +*** org-protocol Setup: :ToReview:MISSING: + imposto org protocol + +*** Agenda Setup :ToReview:MISSING: + Per l'aggenda in primo acchitto utilizzo i file in cui lavoro, quindi utilizzerò i file: + - Inbox.org: Per tutti i task su cui sto lavorando e che quindi avranno sicuramente + ToDo o lavori schedulati. + - Diary.org: Per tutti i task ripetitivi o prevedibili tipo compleanni o altro o + scadenze future (assicurazione, dividendi degli investimenti ecc...) + - KnowHow: Per tutti i file con le mie note, sopratutto per le ricerche in base ai tag + - Private: Per i miei lavori privati, in particolare prevedo vi saranno soprattutto + task ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. + - Work: Per i miei lavori, in particolare prevedo vi saranno soprattutto task + ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. + #+BEGIN_SRC emacs-lisp + ;; File gestiti dall'agenda: + (if (boundp 'org-user-agenda-files) + (setq org-agenda-files org-user-agenda-files) + (setq org-agenda-files ( quote ( + "~/Doc/Org/Diary.org" + "~/Doc/Org/InBox.org" + "~/Doc/Org/KnowHow" + "~/Doc/Org/Private" + "~/Doc/Org/Work" + ))) + ) + #+END_SRC + +*** Time Clocking, Reporting, Tracking, Estimate :ToReview:MISSING: +Dal manuale, si ricavano i seguenti comandi per la retentività dei clock: +#+begin_src emacs-lisp + (setq org-clock-persist 'history) + (org-clock-persistence-insinuate) +#+end_src + +Voglio che il pulsante F9 sia dedicato al clock e quindi le varie comandi: +- org-clock-goto va al clock in corso (F9) + +*** GTD stuff (Project & Archiving) :ToReview:MISSING: + imposto i set per usare GTD ed eventualmente projetile e treemacs + +*** Publishing and Exporting :ToReview:MISSING: +Impostazioni generali utili per l'esportazione (anche del singolo file): +#+begin_src emacs-lisp + ;; Alphabetical listing options need to be set before the exporters are loaded for filling to work correctly + (setq org-alphabetical-lists t) + ;; + ;; Explicitly load required exporters + (require 'ox-html) + (require 'ox-latex) + (require 'ox-ascii) + (require 'ox-md) + (require 'ox-texinfo) + ;; + ;; Imposto dove trovare Ditaa (Corretto il setup di Ditaa in base alla discussione del forum: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864) + (setq org-ditaa-jar-path "~/.MyCfg/emacs/AddOn/app/ditaa0_9.jar") + ;; + ;; Imposto dove trovare PlantUML (http://plantuml.sourceforge.net/faq.html) + (setq org-plantuml-jar-path "~/.MyCfg/emacs/AddOn/app/plantuml-1.2023.1.jar") +#+end_src +Imposto Babel: +#+begin_src emacs-lisp + ;; Org-babel Setup: + ;; + ;; Imposto di mostrare l'immagine: + (add-hook 'org-babel-after-execute-hook 'org-display-inline-images) + ;(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append) + ;; + ;; Make babel results blocks lowercase + (setq org-babel-results-keyword "results") + ;; + ;; Imposto quali linguaggi caricare: Per Problema a Ditaa sto studianto: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864 + (org-babel-do-load-languages + (quote org-babel-load-languages) + (quote ( + ; (asymptote . t) + ; (awk . t) + ; (C . t) + ; (calc . t) + ; (clojure . t) + ; (comint . t) + ; (core . t) + ; (csharp . t) + ; (css . t) + (ditaa . t) + (dot . t) + (emacs-lisp . t) + ; (eval . t) + ; (exp . t) + ; (fortran . t) + ; (gnuplot . t) + ; (haskell . t) + ; (io . t) + ; (java . t) + ; (js . t) + ; (keys . t) + ; (latex . t) + ; (ledger . t) + ; (lilypond . t) + ; (lisp . t) + ; (lob . t) + ; (makefile . t) + ; (matlab . t) + ; (maxima . t) + ; (mscgen . t) + ; (ocaml . t) + ; (octave . t) + (org . t) + ; (perl . t) + ; (picolisp . t) + (plantuml . t) + ; (python . t) + ; (R . t) + ; (ref . t) + ; (ruby . t) + ; (sass . t) + ; (scala . t) + ; (scheme . t) + ; (screen . t) + ; (sh . t) + ; (shell . t) + ; (shen . t) + ; (sql . t) + ; (sqlite . t) + ; (table . t) + ; (tangle . t) + ))) + ;; + ;; Do not prompt to confirm evaluation + ;; This may be dangerous - make sure you understand the consequences + ;; of setting this -- see the docstring for details + (setq org-confirm-babel-evaluate nil) + ;; + ;; Use fundamental mode when editing plantuml blocks with C-c ' + (add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental))) + ;; +#+end_src +Altro sull'esportazione: +#+begin_src emacs-lisp + ;; Inline images in HTML instead of producting links to the image + (setq org-export-html-inline-images t) + ;;; Disabilita la visualizzazione delle immagini per evitare errori nelle sessioni ssh + ;(setq org-startup-with-inline-images nil) + ;; + ;; Inline images in HTML instead of producting links to the image + (setq org-html-inline-images t) + ;; + ;; Do not use sub or superscripts - I currently don't need this functionality in my documents + ;(setq org-export-with-sub-superscripts nil) + ;; + ; ;; Usa foglio di stile locale: Preferisco caricarlo dal file template + ; (setq org-html-head-extra "") + ; (setq org-html-head-include-default-style nil) + ; ;; + ; ;; Do not generate internal css formatting for HTML exports + ; (setq org-export-htmlize-output-type (quote css)) + ;; + ;; Disabilita lo stile di default: + (setq org-export-html-style-include-default nil) + ;; + ;; Export with LaTeX fragments + (setq org-export-with-LaTeX-fragments t) + ;; + ;; For export to latex I use the following setting to get fontified listings from source blocks: + (setq org-export-latex-listings t) + ;; + ;; Fontify Latex listings for source blocks + (setq org-latex-listings t) + ;; + ;; Rimuovo l'header XML per problemi di compatibilità con open office + (setq org-html-xml-declaration (quote ( + ("html" . "") + ("was-html" . "") + ("php" . "\"; ?>") + ))) + ;; + ;; Permetto in automatico l'override delle variabili di personalizzazione dell'esportazione + (setq org-export-allow-BIND t) + ;; + ;; +#+end_src +Infine definisco il progetto di esportazione: +#+begin_src emacs-lisp + ;; Progetti per l'esportazione automatica: + ;; OrgData - Esportazione di tutti i file in OrgData + (setq org-publish-project-alist (quote ( + ;; Progetti nell'esportazione dei file Org: + ;; - orgFile are the org-files that generate the content + ;; - imgFile are images and css files that need to be included + ;; - OrgData is the top-level project that gets published + ("orgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :recursive t + :section_numbers nil + :table-of-contents nil + :base-extension "org" + :publishing-function org-html-publish-to-html + :auto-index t + :index-filename "Index.org" + :index-title "Indice del materiale Org-Mode" + :index-function org-publish-org-index + :author-info t + :creator-info t + :auto-sitemap t + :sitemap-filename "MySiteMap.org" + :html-head-extra "\n\n\n" + :sitemap-title "Indice del materiale esportato in html") + ("imgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt" + :publishing-function org-publish-attachment + :recursive t + :author nil) + ("OrgData" + :components ("orgFile" "imgFile")) + ))) +#+end_src + + +;; Export org-mode theme +;; * Export org-mode theme +;; In ~/.MyCfg/emacs/templates inserisco le definizioni dei themi da utilizzare con +;; l'esportazione da org; mentre in ~/Pub/.Styles inserisco le relative risorse (css, js, +;; ecc...) che sono necessarie per caricare localmente il tema. Quando possibile mantengo +;; nelle definizioni sia il setup per i riferimenti locali (per mio utilizzo locale), sia +;; il setup con i riferimenti remoti in modo che il file sia visibile da tutti (per +;; utilizzo di altri). +;; +;; In particolare al 2020/04 ho impostato due themi principali, mentre al 2020/06 ho +;; introdotto altri themi, per arrivare ai seguenti che riassumo brevemente nella forma +;; locale: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; +;; ** Norang +;; Tema che ho ricavato dal sito [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/norang, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/norang. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang.org +;; +;; ** Org-HTML (Bigblow, ReadTheOrg) +;; +;; ** gongzhitaao.org +;; Stile semplice preso dal sito: https://gongzhitaao.org/orgcss/ tramite il link diretto: +;; [[https://gongzhitaao.org/orgcss/org.css][org.css]] e che dispone del repository: [[https://github.com/gongzhitaao/orgcss][GitHub]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/gongzhitaao.org, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/gongzhitaao.org. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao.org +;; +;; ** solarized-css +;; Dal sito [[http://thomasf.github.io/solarized-css/][solarized-css]] ([[https://github.com/thomasf/solarized-css][GitHub]]) ricavo un thema chiaro ed uno scuro che sembrano +;; promettenti: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/solarized-css, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/solarized-css. +;; +;; Per applicare, il thema chiaro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light.org +;; +;; Per applicare, il thema scuro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark.org +;; +;; ** thi.ng/org-spec +;; Dal sito https://github.com/thi-ng/org-spec ricavo un thema semplice ma con la TOC a +;; sinistra: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/thi.ng, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/thi.ng. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng.org +;; +;; ** org-html-themes (Bigblow e ReadTheOrg) +;; Vi sono più versioni, il reposity di [[https://github.com/fniessen/org-html-themes][fniessen]] è stato forkato da [[https://github.com/paulzql/org-html-themes][paulzql]] che io avevo +;; inizialmente preso a riferimento. Però questo è fermo al 2015, mentre fniessen è più +;; attivo e quindi faccio l'upgrade sperando che così risolva i piccoli errori riscontrati +;; nella toc laterale quando ho molte headline. +;; +;; *** Repository fniessen/org-html-themes +;; Sito di riferimento: [[https://github.com/fniessen/org-html-themes][GitHub]] +;; +;; *** Repository paulzql/org-html-themes +;; Sito di riferimento: [[https://github.com/paulzql/org-html-themes][GitHub]] +;; +;; Da questo sito, ho ricavato il reposity del 2020/04, ho copiato i file di setup in +;; ~/.MyCfg/emacs/templates/org-html-themes dopo aver corretto i riferimenti locali; le +;; risorse le ho copiate nella cartella C:\_Home\Pub\.Styles\org-html-themes-master. +;; +;; **** Bigblow +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow.setup +;; +;; Questo tema permette di utilizzare le seguenti abbreviazioni per navigare: +;; | Shortcut | What it does | +;; |----------+-----------------------------------| +;; | ? or h | Access the dashboard | +;; | n | Move to the next main heading | +;; | p | Move to the previous main heading | +;; | b | Scroll up | +;; | < | Scroll to top | +;; | > | Scroll to bottom | +;; | - | Collapse all | +;; | + | Expand all | +;; | r | Go to next task in list | +;; | R | Go to previous task in list | +;; | q | Stop reviewing the list of tasks | +;; | g | Reload the page | +;; |----------+-----------------------------------| +;; +;; **** ReadTheOrg +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg.setup + +*** Reminders :ToReview:MISSING: + Imposto i remainder e come utilizzarli. + +*** Funzioni in uso: +**** MRK/save-then-publish + Funzione ricavata dall'esempio in [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] per: + - salvare tutti i buffer + - inserire per ciascun file la validazione dell'html + - richiamare per ciascuno l'esportazione in html + - infine richiamare la pubblicazione dell'intero progetto + #+BEGIN_SRC emacs-lisp + (defun MRK/save-then-publish (&optional force) + (interactive "P") + (save-buffer) + (org-save-all-org-buffers) + (let ((org-html-head-extra) + (org-html-validation-link "Validate XHTML 1.0")) + (org-publish-current-project force))) + #+END_SRC + +**** MRK/hide-other + Funzione per aprire completamente il ramo in cui sono e ragruppare tutti gli altri. + #+BEGIN_SRC emacs-lisp + (defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (hide-other) + (org-cycle) + (org-cycle) + ) + ) + #+END_SRC + +** - : org-manage: :ToReview: + Dal sito [[https://github.com/dmgerman/org-manage][github]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/org-manage.el][org-manage.el]] che permette di avere un riepilogo dei + file org. Il file lo ho copiato nella directory che carico allo startup (vedi relativo + [[#Add-AddOn][paragrafo]]); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+BEGIN_SRC emacs-lisp + ;; Installo il pacchetto necessario: + (require 'ctable) + ;; Installo il pacchetto vero e propio: + (require 'org-manage) + ;; Inizializzo org-manage indicando la cartella da scansionare per i file org: + (setq org-manage-directory-org "~/Doc/Org") + ;; Ora basta richiamare la funzione: + ;; M-x org-manage + ;; o usare il bind 'Alt+F11' + #+END_SRC + Con la versione 28 di emacs, questo non funziona più, in particolare dà errore + #+begin_comment + ... remove-duplicates ... + #+end_comment + per risolverlo, ho dovuto cambiare il comando lisp 'remove-duplicates' che non è più + supportato, con il comando 'seq-uniq' + + Inoltre si ha un problema con la funzione org-manage che non definisce bene il Hook al + click e quindi quando clicco non mi porta al file corretto. Se invece copio la funzione + sul buffer scratch e la valuto con C-j o C-M-q, poi funziona correttamente. + +*** TODO Trovare come bypassare/risolvere il problema al Click +Servirebbe fare un eval automatico della funzione dopo l'avvio di emacs. Guardando in +internet ho vvisto un simil hook sull'avvio di emacs che richiama del codice e quindi +sarebbe da usare per richiamare il codice che compila la funzione. + +** ???? Hem ???? :ToReview:Disable: + Package per gestire autocompletamenti e abbreviazioni. Simile ma più potente di IDO, + devo approfondire. [[https://github.com/emacs-helm/helm][helm from GitHub]] + +** ???? Projectile ???? :ToReview:Disable: + Package per gestire i progetti in base alle directory (tipo i project di notepad++ o di + sublimetext). Merita approfondimenti. + +** ???? Dashboard ???? :ToReview:Disable: + Package per visualizzare un albero a sinistra con link ai file di una directory. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/emacs-dashboard/emacs-dashboard][dashboard]] + +** ???? Treemacs ???? :ToReview:Disable: + Package per mostrare l'albero del progetto a sinistra come faccio con + notepad++. Gestisce più progetti e più cose, da approfondire. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/Alexander-Miller/treemacs][treemacs]]. + + +* KeyBinding + Qui imposto dei key binding generali. + + Per riepilogare tutti i keybinding, riporto anche quelli fatti in altri punti della + configurazione commentandoli e lincandoli al punto in cui sono definiti. + +** Assegnami i caratteri non presenti: + Per facilitare l'editazione rimappo alcuni caratteri non presenti: + #+BEGIN_SRC emacs-lisp + ;; Tilde + (global-set-key (kbd "C-ù") (kbd "~")) + ;; + ;; Riassegnamento del set mark al posto di C-SPC + (global-set-key (kbd "C-ò") 'set-mark-command) + #+END_SRC + +** Org-mode + Riepilogo qui i keybinding fatti per org-mode. In realtà sono stati fatti nella + relativa sezione in package. Qui li riepilogo solo per facilitare una revisione e la + creazione di un resume. + #+BEGIN_SRC emacs-lisp + ;(global-set-key "\C-cl" 'org-store-link) ;; Link all'editor dei links + ;(global-set-key "\C-ca" 'org-agenda) ;; Link normale per aprire l'aggenda. + ;(global-set-key "\C-cb" 'org-iswitchb) ;; Link a iswitch + ;(global-set-key (kbd "C-M-r") 'org-capture) ;; Link a Capture + + ;; ;;(global-set-key (kbd "C-c l") 'org-store-link) + ;; (global-set-key (kbd "C-c a") 'org-agenda) + ;; (global-set-key (kbd "C-c c") 'org-capture) + ;; (global-set-key (kbd "") 'org-agenda) + ;; ;;(global-set-key (kbd "") 'bh/org-todo) + ;; ;;(global-set-key (kbd "") 'bh/widen) + ;; ;;(global-set-key (kbd "") 'bh/set-truncate-lines) + ;; ;;(global-set-key (kbd "") 'org-cycle-agenda-files) + ;; ;;(global-set-key (kbd " ") 'bh/show-org-agenda) + ;; ;;(global-set-key (kbd " b") 'bbdb) + ;; ;;(global-set-key (kbd " c") 'calendar) + ;; ;;(global-set-key (kbd " f") 'boxquote-insert-file) + ;; ;;(global-set-key (kbd " g") 'gnus) + ;; ;;(global-set-key (kbd " h") 'bh/hide-other) + ;; ;;(global-set-key (kbd " n") 'bh/toggle-next-task-display) + ;; ;;(global-set-key (kbd " I") 'bh/punch-in) + ;; ;;(global-set-key (kbd " O") 'bh/punch-out) + ;; ;;(global-set-key (kbd " o") 'bh/make-org-scratch) + ;; ;;(global-set-key (kbd " r") 'boxquote-region) + ;; ;;(global-set-key (kbd " s") 'bh/switch-to-scratch) + ;; ;;(global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + ;; ;;(global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + ;; ;;(global-set-key (kbd " v") 'visible-mode) + ;; ;;(global-set-key (kbd " l") 'org-toggle-link-display) + ;; ;;(global-set-key (kbd " SPC") 'bh/clock-in-last-task) + ;; ;;(global-set-key (kbd "C-") 'previous-buffer) + ;; ;;(global-set-key (kbd "M-") 'org-toggle-inline-images) + ;; ;;(global-set-key (kbd "C-x n r") 'narrow-to-region) + ;; ;;(global-set-key (kbd "C-") 'next-buffer) + ;; (global-set-key (kbd "") 'org-clock-goto) + ;; (global-set-key (kbd "C-") 'org-clock-in) + ;; ;;(global-set-key (kbd "C-") 'bh/save-then-publish) + #+END_SRC + + + +* Upgrade +;; * Upgrade +;; +;; ** Correzione Refil: +;; Il refil non funziona più, non mi permette di cambiare file, per ovviare, ho visto il +;; sito [[https://blog.aaronbieber.com/2017/03/19/organizing-notes-with-refile.html][Organizing Notes With Refile]] che mi dà questa ocnfigurazione: +;; #+begin_src emacs-lisp +;; ;; I want to be able to move a node to any of my agenda files, +;; ;; and I also want to consider nodes up to three levels deep. +;; (setq org-refile-targets '((org-agenda-files :maxlevel . 3))) +;; ;; Refile to the Top Level +;; (setq org-refile-use-outline-path 'file) +;; ;; But, if you use Helm, which you really should, you will notice that as soon +;; ;; as you set this option, your target list contains only one filename. Typing +;; ;; to complete may allow you to find another filename within your agenda files, +;; ;; but you will only ever see a filename; no other headings ever appear! +;; ;; Why is that?! +;; ;; It took a bit of searching to find this solution. This is because the +;; ;; default behavior for Refile is to allow you to do a step-by-step completion +;; ;; of this path, but if you’re using Helm, Helm is overriding the completing +;; ;; read to make it into a narrowing list (that we have all come to love). +;; ;; So what you need to do is tell Org that you don’t want to complete in steps; +;; ;; you want Org to generate all of the possible completions and present them at +;; ;; once. Helm then lets you narrow to the one you want. +;; (setq org-outline-path-complete-in-steps nil) +;; ;; Creating New Parents +;; (setq org-refile-allow-creating-parent-nodes 'confirm) +;; #+end_src +;; Altro sito interessante, che ho trovato dopo: [[https://yiming.dev/blog/2018/03/02/my-org-refile-workflow/][My org-refile workflow]] +;; +;; ** Inserito ox-twbs: exporting to HTML with a Twitter Bootstrap theme +;; Da [[https://github.com/marsmining/ox-twbs][GITHub]] ricavato l'esporter per esportare i file org, come documenti HTML compatibili +;; con il [[http://getbootstrap.com/][Twitter Bootstrap]]. +;; #+BEGIN_SRC emacs-lisp +;; (use-package ox-twbs +;; :ensure t) +;; #+END_SRC diff --git a/Working - My-emacs-config.org b/Working - My-emacs-config.org new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/Working - My-emacs-config.org @@ -0,0 +1 @@ + diff --git a/Working - MyInit.org b/Working - MyInit.org new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Working - MyInit.org @@ -0,0 +1 @@ + diff --git a/my-emacs-config - 2026-05-31.org b/my-emacs-config - 2026-05-31.org new file mode 100644 index 0000000..942c033 --- /dev/null +++ b/my-emacs-config - 2026-05-31.org @@ -0,0 +1,3617 @@ + +#+setupfile: ~/.MyCfg/emacs/templates/default/ToPrint.setup + +#+title: \laquo\alpha & \omega\raquo della configurazione di emacs Vrs 1.0\copy\reg +#+description: File in formato org con la configurazione di emacs +#+author: Mrk +#+email: mirko.aletto@csico.it +#+language: IT +#+options: ':t toc:nil num:t author:t email:t +#+macro: latest-export-date (eval (format-time-string "%F %T %z")) +#+macro: word-count (eval (count-words (point-min) (point-max))) +#+property: header-args :results none +#+startup: content indent + +#+TAGS: @Disable @Obsolete @ToReview @Usato @Done @Missing + +[ Ultima revisione ed esportazione il *{{{latest-export-date}}}* con un +conteggio di parole *{{{word-count}}}*. ] + + +#+BEGIN_COMMENT +- coding: utf-8 +- Utilizzato un fill-colum a 80 caratteri +#+END_COMMENT + +#+TOC: headlines 3 +#+html:
+#+odt: +#+latex: \newpage +#+latex: \clearpage + + + +* \to Esigenze: :@ToReview: +:PROPERTIES: +:ID: a27e1c98-29d0-4f72-b0b6-2a5b6548ce79 +:END: + +Funzionalità che voglio ottenere in emacs. Per ora la lista è verbosa, ma voglio +rivederla e sfoltirla in base all'esperienza d'uso con la prima versione. + +Punti da analizzare: +- org: vedere come gestire le immagini, soprattutto che siano visibili + sull'esportazione. +- Emacs: gestione delle immagini o altri file di riferimento tramite la cartella + =~/Pub/.Res/= +- Emacs: navigazione fra i buffer +- Emacs: come fare trova/sostituisci (almeno al livello di notepad++) +- Emacs: come gestire macro (almeno al livello di notepad++) +- Emacs: come gestire l'editazione multi cursore. (almeno al livello di notepad++) +- Emacs: come avere il correttore ortografico +- org: gestire aggenda settimanale +- org: gestire la cattura di eventi (note, link dal web, appunti estemporanei, ecc..) +- org: gestire creazione degli ID univoci delle intestazioni, sia + quelli standard (=ID=), sia quelli testuali (=CUSTOM_ID=). Nel farlo + rivedere il comando =M-x org-id-get-create= che l'[[https://writequit.org/articles/emacs-org-mode-generate-ids.html][articolo]]. +- org: gestire la pubblicazione dei miei file, sia come knoweldge base, sia come + esportazione di un singolo file da inviare ad un collega (per esempio una + stima per un'offerta). + - https://opensource.com/article/20/3/blog-emacs articolo di un blog che parla + della pbblicazione +- +- mettere comandi semplici per esportare tutto su html +- mettere a punto esportazione su pdf +- mettere a punto espansione dei testi abbreviati soprattutto per: + - i blocchi codice + - form di introduzione di dati ripetitivi tipo un resum di un lavoro. +- mettere comandi veloci per: + - evidenziare un capitolo nascondendo gli altri e viceversa. + - far partire timer e fermarli + - registrare ed eseguire delle macro + Per le macro vi sono questi reference: + - [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html#Keyboard-Macros][Manual]] + - [[https://www.emacswiki.org/emacs/KeyboardMacros][Wiki]] + - Using emacs series [[https://cestlaz.github.io/posts/using-emacs-15-macros/][video 15]] +- sfruttare nuova struttura: + - file unico (Inbox) con i lavori attuali e indici a file di riferimento per + ciascun cliente. + - file di reference dei vari clienti magari vedendo se può essere uno solo e + sfruttare aggenda per estrarre i dati tramite tag o altro + - file con le nozioni e i CFG dell'ufficio e della casa + - file con i riferimenti money report per capire come investo e quanto ho nei + vari investimenti +- sistemare con le nuove caratteristiche i capture in modo che fuzionino bene per: + - link utili da rivedere o per bibbliografia + - telefonate + - ToDo + - Note + - appuntamenti + - Idee future +- sistemare i tag per: + - classificare i vari reference per il TGD + - classificare le cose per future ricerche +- Pensare come legarsi con keep per sincronizarsi con cellulare +- Esempi di emacs: + - come configurare emacs: https://github.com/abrochard/emacs-config (dal video + https://meet.jit.si/FAR_HJ9Bzjs0tmF0DlA9qHIE) + - Tutorial molto bello in vari video: https://cestlaz.github.io/stories/emacs/ +- Indagare sui bookmark di emacs per capire come sfruttarli (vedi [[https://www.youtube.com/watch?v=ajiEBK2swKo][Lukewh video + 12]]) [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html][emacs manual]] +- Informarsi su 'Company mode' package che crea una specie di intellisense per + suggerire come completare le parole in base a quanto editato prima (come in + notepad++). Per riferimenti: [[https://www.youtube.com/watch?v=q-9Z2eR7cTE][Lukewh video 16]] o [[http://company-mode.github.io/][Company mode on GitHub]] +- vedere per la correzione ortografica (Flycheck, flymake o altro) + - [[https://www.flycheck.org/en/latest/][flycheck]] anche da [[https://www.youtube.com/watch?v=EGR9CwM1ksQ][Lukewh video 17]] +- ORG PUBBLISH: Sul sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] c'è un tutorial sulla pubblicazione tramite + org che è molto bello, inoltre mostra anche come cambiare il file autogenerato + mapindex in un generico index.html con css e tutto per renderlo più bello. +- Impostare l'utilizzo di org anche dal cellulare. Per farlo vedere come + utilizzare orgmobile o [[https://f-droid.org/en/packages/com.orgzly/][orgzly]] o l'interfaccia web ecc.... Un esempio molto + interessante che utilizza anche GIT per mettere sul clud i file è quello in + dal portale opensource.com: [[https://opensource.com/article/19/4/calendar-git][Manage your daily schedule with Git]] +- rivedere il gestore di calendari in modo testuale [[https://lostpackets.de/khal/index.html][khal]] perchè sempbra molto + carino. + + +* \checkmark Intro +:PROPERTIES: +:ID: 13b2138b-213d-4ec7-ad57-b55e023688ac +:END: + +Questo è il mio file di configurazione di Emacs in forma letterale. È una +combinazione di prosa e codice. + +Quello che stai leggendo ora è il file =prot-emacs.org=. Che è il documento che +genera (e quindi controlla) tutti gli altri file che sono alla base della mia +configurazione di Emacs. Questo file Org non viene caricato direttamente. Il suo +unico scopo è quello di produrre i file =*.el= che sono la configurazione +effettiva di emacs. + +Questo non è una configurazione standard di Emacs. Nella maggior parte dei casi, +si ha un file generico =.emacs= o un =init.el= con una chiamata alla funzione +~org-babel-load-file~ che riceve come valore il documento Org che descrive la +configurazione (questo =my-emacs-config.org=). + +Questo documento Org, invece, funge da + +Questo metodo funziona, ma è molto lento, perché dobbiamo caricare Org prima di +avviare Emacs (e Org carica anche un sacco di altre cose di cui non abbiamo +bisogno in una fase così iniziale). +- punto di accesso unico alla mia configurazione di Emacs +- origine dei file =*.el= delle mie configurazioni + +Anche se definisco tutto in un singolo file Org, in realtà non avvio Emacs +leggendo questo file. Piuttosto, sto istruendo Org a inserire i blocchi di +codice qui definiti in file separati, organizzati per ambito. Il risultato +finale è qualcosa per cui non si può capire se è stato eseguito un programma +letterale o meno. + +Questa è la bellezza di tutto ciò. Posso continuare a modificare un singolo file +come "fonte di verità", pur potendo gestire ogni file singolarmente (ad esempio, +se qualcuno vuole vedere come eseguo una determinata operazione, condivido solo +quel file come allegato e-mail, senza bisogno di inviare l'intero documento). + +Quando voglio modificare la mia configurazione di Emacs, modifico questo file e +poi valuto il blocco con il comando =M-x org-babel-tangle= (=C-c C-v C-t=), che +rigenera tutti i file di configurazione. + +I punti/funzionalità non ancora chiariti o che voglio rivedere, cerco di +riassumerli all'inizio del file, in modo che appena ho tempo da dedicarci, posso +prendere un argomenti di essi ed esplicitarlo. + +Definiamo questi file =*.el= di configurazione: +- =early-init.el= :: Il file caricato prima di lanciare emacs, include + ottimizzazioni per l'avvio di Emacs e imposta alcune funzionalità di base, + come ad esempio evitare il lampeggio della luce all'avvio di Emacs in un + ambiente scuro. +- =init.el= :: Il file standard di configurazione, caricato dopo il lancio di + emacs; contiene i blocchi fondamentali del mio sistema, ovvero le macro Lisp + che definisco, e carica i singoli moduli di configurazione. +- =init_fnc.el= :: Il file in cui riporto le mie funzioni elisp personali che + poi posso utilizzare ovunque in emacs. +- =init_{modulo}.el= :: Eventuali file che esplicitano la configurazione di un + particolare modulo. In questo modo posso fare una configurazione modulare, in + cui specifico i dettagli di un argomento su moduli dedicati. Questi file + saranno richiamati dal =init.el= in modo opportuno. + +** Elenco dei tag e delle parole chiave: +:PROPERTIES: +:ID: 90b6e478-424c-4663-aedf-3d4fdc93473c +:END: + +Nel testo, utilizzerò le =label= (tag o semplici etichette) seguenti: +- @Disable :: per impostazioni che attualmente sono disattivate o commentate +- @Obsolete :: per impostazioni eliminate perchè sostituite da altre +- @ToReview :: per impostazioni che devo rivedere, aggiornare, correggere o + ampliare. +- @Usato :: per indicare una risorsa utilizzata per la configurazione. +- @Done :: per indicare un punto chiuso e che non prevedo più di rivedere (a + meno di bug o malfunzionamenti nelle nuove versioni di emacs). +- @Missing :: per indicare una parte solo accennata, ma ancora da fare (il prima + possibile). + +Inoltre sfruttando i [[https://orgmode.org/worg/org-symbols.html][simboli]] grafici gestiti da org, utilizzo questi caratteri +all'inizio delle headline per enfatizarle. Questo è comodo perchè poi si +ritroveranno anche sulla TOC. +- \checkmark :: per indicare le headline che sono a posto e non prevedo di ritoccare fino alla prossima versione +- \Xi :: per indicare le headline che devo ancora rivedere o terminare +- \to :: per le headline che necessitano di revisione urgente + +** Applicativo emacs: +:PROPERTIES: +:ID: f6fd8942-dfff-41bb-94eb-041e74a78cfb +:END: + +Come emacs, utilizzo direttamente quello scaricabile dal progetto [[https://www.gnu.org/software/emacs/][GNU Emacs]] +(Emacs 30.2 al [2026-05-25 lun]) disarchiviando lo zip, sulla cartella: +: C:/MyTools/emacs +e lo eseguo lanciando il file +: C:/MyTools/emacs/bin/runemacs.exe + +** Path Home: +:PROPERTIES: +:ID: 743a6355-921b-4abe-8392-65ce90de1d9d +:END: + +Per inserire =C:\_Home\= come path predefinito, non serve definirlo sulla +variabile di sistema PATH, ma basta definire una variabile utente =home=: +- in windows aprire il form delle variabili utente: 'Edit enviroment variables + for account' +- inserire una nuova variabile con i seguenti valori: + - Variable name: home + - Variable value: C:\_Home + +In emacs, il PATH viene gestito dalla variabile interna =exec-path= e quindi +basterebbe inserire il path =C:\_Home\= in questa variabile, però è più comodo +definire la variabile di sistema (per esempio è utilizzata anche da git ed in +genere da tutti i tool unix-like). + +In ogni momento, per visualizzare il contenuto della variabile =exec-path=, +basta andare nel buffer =scratch=, scrivere il nome della variabile su una nuova +riga e dare il comando =C-c j= per valutare il codice della riga. + +** Eseguibile find.exe +:PROPERTIES: +:ID: 38abb527-08e3-43d2-83fa-e2165d98b0fc +:END: + +Il pacchetto =consult= ed in genere altri pacchetti, utilizzano il programma +find.exe di unix per ricercare file o altro sul sitema; in windows però questo +programma è diverso e siccome non voglio installare il pacchetto di utiliti per +evitare problemi con altri programmi, indico a emacs quale find utilizzare. + +Per verifica, se utilizzo il comando + +#+begin_src emacs-lisp :tangle no :results none + (executable-find "find") +#+end_src + +ritorna il valore + +#+begin_src emacs-lisp :tangle no :results none + "c:/WINDOWS/system32/find.exe" +#+end_src + +confermando che emacs sta utilizzando il find.exe di windows. + +Come find di unix, voglio utilizzare quello dato già assieme a git. Serve quindi +impostare il path corretto, da internet ho trovato il comando + +#+begin_src emacs-lisp :tangle no :results none + (setq find-program "C:/Program Files/Git/usr/bin/find.exe") +#+end_src + +ma sembra non funzionare, emacs continua a puntare al find di windows. Procedo +quindi a inserire il path del find di unix sul PATH complessivo che utilizza +emacs. In questo modo non altero il PATH di windows e quindi sono più sicuro. + +#+begin_src emacs-lisp :tangle no :results none + ;; imposto la directory del find unix: + (setq find-program-path "C:/Program Files/Git/usr/bin") + ;; la inserisco nel PATH di emacs: + (push find-program-path exec-path) + ;; impostiamo la cartella di default: + (setq default-directory "~/Doc/Org/") +#+end_src + + +* \checkmark Reference: :@ToReview: +:PROPERTIES: +:ID: c0fb602d-e4ef-4892-97c3-c60f32a93638 +:END: + +- [[https://www.gnu.org/software/emacs/][Editor emacs]] :: Sito web da cui scaricare emacs +- [[https://orgmode.org/][org-mode web site]] :: Sito originale del pacchetto org-mode, con i manuali + ufficiali ([[https://orgmode.org/orgguide.pdf][orgguide.pdf]] e [[https://orgmode.org/org.pdf][org.pdf]]) e la sezione =worg= per tutorial e molte + info utili. +- [[https://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] :: Sito che ha dato il via a + tutto. Datato ma sempre ottimo. +- [[https://github.com/james-stoup/emacs-org-mode-tutorial][emacs org-mode tutorial]] :: bel tutorial/introduzione alla configurazione di + org-mode. Buoni spunti su come strutturare i TODO, l'aggenda e + l'esportazione. Da rivedere assolutamente durant elo sviluppo della + configurazione specifica di org-mode. +- [[https://github.com/howardabrams/dot-files/blob/master/emacs.org#Journaling][Journal dot-files]] configurazione molto particolareggiata sia di org, sia di + come usarlo nel journal, sia di altri pacchetti (PlantUML and Graphviz). Vi + sono arrivato dall'articolo [[https://www.howardism.org/Technical/Emacs/journaling-org.html][journaling-org.html]]. +- [[https://bzg.fr/en/notes/the-zen-of-task-management-with-org/][The Zen of Task Management with Org]] :: configurazione minimale di org per la + funzionalità di task manager di progetti. Anche questa da rivedere in ottica + della configurazione specifica di org-mode. +- [[https://adamkovic.org/emacs.html][Rudolf Adamkovič Blog]] :: Blog dell'autore di [[https://bzg.fr/en/notes/the-zen-of-task-management-with-org/][The Zen of Task Management with + Org]] che ha molti articoli interessanti. +- [[https://protesilaos.com/codelog/][protesilaos.com]] :: Blog di uno sviluppatore di pacchetti emacs, che risulta + molto utile. Ha dato lo slancio per la revisione attuale della + configurazione. La sua configurazione completa è disponibile in: [[https://github.com/protesilaos/dotfiles][GitHub Repo]] o + [[https://gitlab.com/protesilaos/dotfiles][GitLab Repo]]. Alcuni articoli del blog che ritengo particolarmente + interessanti: + - [[https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/][Emacs: a basic and capable configuration]] per una confugurazione base,ma già + molto utile per migliorare la UI. =@Usato= + - [[https://protesilaos.com/emacs/dotemacs][Emacs: GNU Emacs configuration]] per la sua configurazione completa + disponibile nei repository indicati sopra. Vi è anche il relativo [[https://www.youtube.com/watch?v=ycyxytk1NAQ][video]]. + =@Usato= + - [[https://protesilaos.com/codelog/2026-04-30-emacs-decent-default-sacha-chua/][Emacs: decent defaults I shared with Sacha Chua]] configurazione minima + definita in live nel [[https://www.youtube.com/watch?v=z7pcLdwuyxE][video]]. =@Usato= + - [[https://protesilaos.com/codelog/2025-01-26-emacs-organise-init/][Emacs: organise your init file]] in cui descrive il metodo attualmente usato + per fare questo file org. Vi è anche il relativo [[https://www.youtube.com/watch?v=Dkoy3NrLN9g][Video]]. =@Usato= + - [[https://protesilaos.com/codelog/2024-02-17-emacs-modern-minibuffer-packages/][Emacs: modern minibuffer packages (Vertico, Consult, etc.)]] in cui descrive + come migliorare la UI del minibuffer. Vi è anche il relativo [[https://www.youtube.com/watch?v=d3aaxOqwHhI][video]]. + =@Usato= + - [[https://protesilaos.com/codelog/2024-02-08-emacs-window-rules-display-buffer-alist/][Emacs: control where buffers are displayed (the 'display-buffer-alist')]] in + cui descrive come gestire la visualizzazione dei buffer e la relativa + navigazione. Vi è anche il relativo [[https://www.youtube.com/watch?v=1-UIzYPn38s][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-07-23-emacs-use-package-essentials/][Emacs: use-package essentials]] in cui descrive come utilizzare i package di + emacs per nuove funzionalità, soprattutto dal punto di vista della + configuraione. Vi è anche il relativo [[https://www.youtube.com/watch?v=RaqtzemHFDU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-10-emacs-search-replace-basics/][Emacs: basics of search and replace]] in cui descrive le basi del + trova/sostituisci con emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=f2mQXNnChwc][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-11-17-emacs-ediff-basics/][Emacs: ediff basics]] in cui descrive come fare un diff (stile winmerge) di + due file su emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=pSvsAutseO0][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2025-01-16-emacs-org-todo-agenda-basics/][Emacs: Org todo and agenda basics]] in cui descrive le basi dell'aggenda e + come filtrare gli eventi. Vi è anche il relativo [[https://www.youtube.com/watch?v=L0EJeN1fCYw][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-12-15-emacs-org-coaching-clock/][Emacs: custom Org clock report for my coaching]] in cui descrive come utilizza + i timer e i relativi report per misurare il tempo di lavoro. Vi è anche il + relativo [[https://www.youtube.com/watch?v=FMutOCOoFSQ][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-09-19-emacs-command-popup-frame-emacsclient/][Emacs: commands in popup frames with 'emacsclient']] in cui descrive come + visualizzare dei comandi iterattivi in finestre popup. Vi è anche il + relativo [[https://www.youtube.com/watch?v=vbWxT8tht9A][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/][Emacs: abbreviations with abbrev-mode (quick text expansion)]] in cui descrive + come sfruttare le abbreviazioni per inserire velocemente testo. Vi è anche + il relativo [[https://www.youtube.com/watch?v=ruPpRlh2re4][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-22-emacs-dired-basics/][Emacs: Basics of the powerful Emacs file manager (Dired) 1]] in cui descrive + il pacchetto dired e come usarlo. Vi è anche il relativo [[https://www.youtube.com/watch?v=5dlydii7tAU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-23-emacs-dired-pt2/][Emacs: Basics of the powerful Emacs file manager (Dired) 2]] in cui descrive + il pacchetto dired e come usarlo. Vi è anche il relativo [[https://www.youtube.com/watch?v=2lF3z7H8oaI][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-29-emacs-kbd-macros/][Emacs: Introduction to keyboard macros in Emacs]] in cui descrive le macro in + emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=-5yH_8nl9LU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-08-01-emacs-macros-golf/][Emacs: Practical macros in Emacs]] in cui descrive l'uso pratico delle macro + in emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=oLY-X5BMjc8][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-08-15-emacs-isearch-tweaks/][Emacs: ISEARCH features and tweaks]] in cui descrive come trova/sostituisci + usando isearch. Vi è anche il relativo [[https://www.youtube.com/watch?v=y6_bmcd3nis][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-05-23-emacs-org-basics/][Emacs: basics of Org mode]] in cui descrive le basi di org-mode e relativa + aggenda. Vi è anche il relativo [[https://www.youtube.com/watch?v=e9Ucb1JHUfQ][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-26-emacs-file-dired-basics/][Emacs: file and Dired basics]] in cui descrive il pacchetto =dired=. Vi è + anche il relativo [[https://www.youtube.com/watch?v=L_4pLN0gXGI][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-28-emacs-mark-register-basics/][Emacs: mark and register basics]] in cui descrive come sfruttare la tastiera + per editare (selezionare testi, navigare ecc...). Vi è anche il relativo + [[https://www.youtube.com/watch?v=TJrAkCyH6Dk][video]]. =@ToReview= +- [[https://codeberg.org/ashton314/emacs-bedrock][Emacs Bedrock]] configurazione minima ma bella, creata dal blog da rivedere per + prendere spunti. =@ToReview= +- [[https://github.com/SystemCrafters/crafted-emacs][SystemCrafters/crafted-emacs]] configurazione creata nella video serie di system + crafter. =@ToReview= +- [[https://sachachua.com/blog/][sachachua blog]] blog pieno di informazioni e di configurazioni. =@ToReview= + - [[https://sachachua.com/dotemacs/index.html][Sacha Chua's Emacs configuration]] disponibile sui repository [[https://codeberg.org/sachac/.emacs][codeberg]] o + [[https://github.com/sachac/.emacs.d/][GitHub]] + - [[https://www.youtube.com/watch?v=kvBS8wz8ZRw][Yay Emacs 10: Talking to Prot about Emacs workflows]] con relativi [[https://www.youtube.com/watch?v=kvBS8wz8ZRw][video]] e + [[https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/][articolo]] +- Come personalizzare l'esportazione: =@ToReview= + - https://www.reddit.com/r/emacs/comments/3pvbag/is_there_a_collection_of_css_styles_for_org/ + - https://www.reddit.com/r/emacs/comments/eozyyv/exporting_orgmode_to_beautiful_websites/ + - https://github.com/jessekelly881/Rethink + - https://github.com/jessekelly881/Imagine + - https://github.com/grc/jujutsu-website/tree/master + - https://github.com/alphapapa/org-html-theme-darksun + - https://github.com/Zilong-Li/org-tufte + - https://juanjose.garciaripoll.com/blog/css-style-org-mode/ + +** Old References from previous version to review: +:PROPERTIES: +:ID: abef4fbb-80ee-4a68-8b82-baebcff068a7 +:END: + +La configurazione partirà da quanto fatto finora (Configurazione Vrs. 3.3 del +04/10/2018) ripartendo da zero con le considerazioni ricavate dalle varie sorgenti +analizzate: +- [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] :: Bel esempio di come utilizzare in + particolar modo org-mode nella produttività. +- [[https://cestlaz.github.io/stories/emacs/][Using Emacs Series]] :: serie di video su emacs di Mike Zamansky che hanno anche il + relativo [[https://github.com/zamansky/using-emacs][GitHub repo]] +- [[https://www.youtube.com/watch?v=9pkuBijrMD4&list=PLNJWazvift25KnHDwYlhwrrgr60wtpQOB][Lukewh]] :: Playlist di video su emacs. Ne parla anche su [[https://lbry.tv/@lukewh:3][LBRY]] +- [[http://pages.sachachua.com/.emacs.d/Sacha.html][http://pages.sachachua.com/.emacs.d/Sacha.html]] +- [[https://sachachua.com/blog/][Sacha Blog]] +- [[http://ergoemacs.org/emacs/emacs_encoding_decoding_faq.html][Emacs File Encoding FAQ]] +- [[https://egli.dev/posts/using-org-mode-for-meeting-minutes/][Using org-mode for meeting minutes]] +- [[https://www.youtube.com/watch?v=2-0OwGTt0dI][Emacs: introduction to MAGIT]] +- Blog molto carino: [[https://irreal.org/blog/][irreal]] +- [[https://katherine.cox-buday.com/blog/2015/03/14/writing-specs-with-org-mode/][Writing Specs with Org-mode]] esempio di come produrre documentazione tecnica + con org-mode, LaTeX, PlantUML per ottenere pdf. Mostra anche il relativo + file di configurazione. +- Created a new HTML export back-end that uses Tailwind.css classes + - Link [[https://www.reddit.com/r/emacs/comments/fw6onf/created_a_new_html_export_backend_that_uses/][articolo]] + - Link [[https://github.com/vascoferreira25/ox-tailwind][GitHub]] +- Socially isolating my Emacs with Docker! + - Link [[https://www.youtube.com/watch?v=D2E1Eh9Hxdg&feature=youtu.be][video]] +- riconfigurare l'esportazione in html: + - tenere conto delle info dal sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] per personalizzare il file mapindex + - rivedere l'esportazione partendo tutto in ~/Pub e in esso mantenere anche i reference + e styli. + + +* \checkmark File di preconfigurazione: *early-init.el* +:PROPERTIES: +:ID: 97dd741c-97aa-4d2f-bd95-707815b781e7 +:END: + +Questo è il primo file che Emacs legge all'avvio. E' precaricato prima di +eseguire emacs e quindi deve contenere codice che non dipenda da alcun pacchetto +o dalle proporzioni del frame di Emacs. In generale, questo file di +inizializzazione iniziale ha lo scopo di impostare alcune cose di base prima che +Emacs produca il frame iniziale, delegando a =init.el= il resto della +configurazione. + +** Le impostazioni di base del frame +:PROPERTIES: +:ID: 4cfcc493-965f-4b4a-88d3-19088e4d7e97 +:END: + +Queste sono alcune impostazioni generali per i frame e le basi del toolkit. In +breve, voglio mantenere le cose al minimo. Notate ~frame-resize-pixelwise~ e +~frame-inhibit-implied-resize~: per impostazione predefinita Emacs ridimensiona +il frame se si modifica la dimensione del carattere, cosa che non voglio mai +fare. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" +(setq frame-resize-pixelwise t + frame-inhibit-implied-resize 'force + frame-title-format '("%b") + ring-bell-function 'ignore + use-dialog-box t ; only for mouse events, which I seldom use + use-file-dialog nil + use-short-answers t + inhibit-splash-screen t + inhibit-startup-screen t + inhibit-x-resources t + inhibit-startup-echo-area-message user-login-name ; read the docstring + inhibit-startup-buffer-menu t) +#+end_src + +** Impostiamo i parametri del frame per desktop +:PROPERTIES: +:ID: 25163662-be4f-4ee1-96df-9fe7473c25e7 +:END: + +Qui imposto i parametri per le dimensioni della finestra di Emacs: la prima e +tutte quelle successive. In un window manager a riquadri, i parametri di +larghezza e altezza non sono importanti, poiché tutte le finestre vengono +forzatamente adattate a rettangoli (riquadri). Gli altri parametri, invece, sono +rilevanti. In un window manager a sovrapposizione, tutte le impostazioni sono +importanti. + +Il parametro ~initial-frame-alist~ si riferisce alla prima finestra che viene +generata all'avvio di Emacs. Per questo motivo deve essere definito nel file +=early-init.el=: il codice qui presente viene eseguito prima che venga disegnata +la prima finestra. + +Il parametro ~default-frame-alist~ si riferisce a tutte le finestre +successive. In linea di principio, potremmo definirlo al di fuori del file +=early-init.el=, ma è più logico averlo qui. + +Qui si imposta se utilizzare la barra dei menu, la barra delle icone e le +scrollbar: + +Ho scelto di provare ad usare Emacs senza barra degli strumenti e barre di +scorrimento. Occupano spazio prezioso sullo schermo e, inoltre, mi distraggono. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Imposto barre e menu: + ;; - menu bar (1=enable, -1=disable) + (menu-bar-mode 1) + ;; - tool bar (1=enable, -1=disable) + (tool-bar-mode -1) + ;; - scroll bar (1=enable, -1=disable) + (scroll-bar-mode -1) + ;; - Don't show startup message + (setq inhibit-startup-message t) + ;; - Stop al blinking del cursore + (blink-cursor-mode -1) ;; (setq blink-cursor-delay 2 blink-cursor-interval 0.5) + ;; - Higlight line (1=enable, -1=disable) + (global-hl-line-mode 1) + + ;; se non ho la riga seguente, perdo la barra di trasinamento della finestra dell'editor e non posso più muoverla in windows. + (add-hook 'window-size-change-functions #'frame-hide-title-bar-when-maximized) + + ;; Inizializzazione del frame + (setq initial-frame-alist `((horizontal-scroll-bars . nil) + (menu-bar-lines . 1) + (tool-bar-lines . 0) + (vertical-scroll-bars . nil) + (scroll-bar-width . 12) + (width . (text-pixels . 800)) + (height . (text-pixels . 900)) + (undecorated . nil) + )) + ;; Ripeti l'operazione dopo l'inizializzazione in modo che eventuali + ;; modifiche intermedie non vengano mantenute. Nota che non possiamo fare + ;; affidamento sull'impostazione di questo valore su + ;; `initial-frame-alist' poiché potrebbe cambiare nel + ;; frattempo. Impostiamo esplicitamente il valore per essere certi del + ;; risultato. Ciò non impedisce ad altri programmi di modificare + ;; l'elenco, anche se lo considererei indesiderabile se modificassero + ;; queste impostazioni specifiche. + (add-hook 'after-init-hook (lambda () + (setq default-frame-alist `((horizontal-scroll-bars . nil) + (menu-bar-lines . 1) + (tool-bar-lines . 0) + (vertical-scroll-bars . nil) + (scroll-bar-width . 12) + (width . (text-pixels . 800)) + (height . (text-pixels . 900)) + (undecorated . nil) + )))) + ;; Funzione generale per disattivare la barra di scorrimento di una finestra + (defun mrk-emacs-no-minibuffer-scroll-bar (frame) + "Remove the minibuffer scroll bars from FRAME." + (when scroll-bar-mode + (set-window-scroll-bars (minibuffer-window frame) nil nil nil nil :persistent))) + ;; Disattivo la barra di scorrimento sul minibuffer usando la funzione precedente: + (add-hook 'after-make-frame-functions #'mrk-emacs-no-minibuffer-scroll-bar) +#+end_src + +** Dimensioni font +:PROPERTIES: +:ID: da153ad9-fb4c-4e26-a1c6-04ab3de8153b +:END: + +Per ridimensionare il testo, c'è il comando: +: C-x C-0 +Dopo il quale si hanno i seguenti comandi: +: + incrementa il size +: - decrementa il size +: 0 ritorna al default +I comandi si possono ripetere a piacere fino a quando si è raggiunta +la dimensione desiderata e poi chiude con +: ESC + +Imposto la dimensione di default del testo per facilitare la lettura: +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Imposto la dimensione del testo: (punti*10) + (set-face-attribute 'default nil :height 110) +#+end_src + +** Impostazioni del garbage-collection per velocizzare avvio: +:PROPERTIES: +:ID: db056b6b-1592-467b-91b9-091979e204df +:END: + +Non ho una conoscenza approfondita del =garbage collection=, ma ho imparato per +tentativi ed errori che posso massimizzare la soglia all'avvio per velocizzare +un po' l'avvio di Emacs. Quello che sto facendo è impostare i valori rilevanti +su valori molto alti all'avvio e poi riportarli a valori più gestibili una volta +che Emacs ha terminato il caricamento. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Temporarily increase the garbage collection threshold. These + ;; changes help shave off about half a second of startup time. The + ;; `most-positive-fixnum' is DANGEROUS AS A PERMANENT VALUE. See the + ;; `emacs-startup-hook' a few lines below for what I actually use. + (setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 0.5) + + ;; Same idea as above for the `file-name-handler-alist' and the + ;; `vc-handled-backends' with regard to startup speed optimisation. + ;; Here I am storing the default value with the intent of restoring it + ;; via the `emacs-startup-hook'. + (defvar mrk-emacs--file-name-handler-alist file-name-handler-alist) + (defvar mrk-emacs--vc-handled-backends vc-handled-backends) + + (setq file-name-handler-alist nil + vc-handled-backends nil) + + (add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold (* 100 100 8) + gc-cons-percentage 0.1 + file-name-handler-alist mrk-emacs--file-name-handler-alist + vc-handled-backends mrk-emacs--vc-handled-backends))) +#+end_src + +** Impostazioni della cache dei pacchetti +:PROPERTIES: +:ID: 1ee6dbe6-4d0b-4e1d-8e09-7af33dc5a5b8 +:END: + +Utilizzo lo standard =package.el= per gestire i miei pacchetti Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Initialise installed packages at this early stage, by using the + ;; available cache. I had tried a setup with this set to nil in the + ;; early-init.el, but (i) it ended up being slower and (ii) various + ;; package commands, like `describe-package', did not have an index of + ;; packages to work with, requiring a `package-refresh-contents'. + (setq package-enable-at-startup t) +#+end_src + +** Imposto la directory per il codice lisp custom: +:PROPERTIES: +:ID: 3143f3f7-1263-420a-adf4-6c5c3407a2d5 +:END: + +Gli eventuali codici lisp custom, che voglio utilizzare, li metterò manualmente +nella cartella =~/.emacs.d/MyAddOn/= e devo fare in modo che emacs li carichi +automaticamente ad ogni avvio. + +Questa =user-lisp-directory= è un'opzione utente introdotta in +Emacs 31. Permette a Emacs di compilare in bytecode i file Emacs Lisp al suo +interno e di analizzarli alla ricerca di autoload. + +Per ora sono ancora in emacs 30 però la tengo per il futuro. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + (setq user-lisp-directory (locate-user-emacs-file "~/.emacs.d/MyAddOn/")) +#+end_src + +per ora i file custom li carico qui: [[id:89b37a37-0f9b-42f6-9afa-bbe3648a04df][lisp custom on init.el]] + +** Assegna un nome al frame predefinito +:PROPERTIES: +:ID: 3ff325ed-547a-4396-bafe-9b951a489a7a +:END: + +Infine, mi piace chiamare il mio frame predefinito =home=. Questo perché +utilizzo il mio pacchetto per raggruppare l'elenco dei buffer per ogni singolo +frame. La disposizione =multi-frame= è la cosa migliore che abbia mai fatto per +aumentare la mia produttività: punti bonus se utilizzata in combinazione con un +window manager a finestre affiancate. + +Assegnare un nome alle finestre consente di selezionarle tramite il +completamento automatico. Emacs può farlo (=M-x select-frame-by-name=), anche se +non è sempre affidabile in quanto dipende dal window manager (funziona bene su +GNOME, per quanto ne so). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; rinomino il buffer in Home: + (add-hook 'after-init-hook (lambda () (set-frame-name "home"))) +#+end_src + + +* File di configurazione principale: *init.el* +:PROPERTIES: +:ID: b463ab54-8b41-4c04-b070-d811b162a1bb +:END: + +Qui definisco le macro Lisp utilizzate nella mia configurazione e carico tutti i +singoli moduli. + +Questa parte, descrive cosa inserire nel file iniziale che viene automaticamente +letto all'avvio di emacs (=~/.emacs.d/init.el=). In esso voglio impostare le +funzioni base che sono "obbligatorie", mentre tutto il resto viene delegato ai +vari moduli. + +** Impostazioni per rendere silenziosa la compilazione nativa +:PROPERTIES: +:ID: 5ab3ec8a-1718-42f5-8a78-a338291d3383 +:END: + +L'opzione di compilazione =--with-native-compilation=yes= di Emacs è molto +utile: abilita la "compilazione nativa" di Emacs Lisp, traducendolo in codice +macchina. Tuttavia, l'impostazione predefinita per la segnalazione degli errori +è impostata su un valore verboso che, nella mia esperienza di coaching, confonde +gli utenti: produce avvisi per problemi di compilazione che solo lo sviluppatore +del pacchetto in questione deve gestire. Questi includono fatti innocui come le +docstring che superano un certo numero di caratteri. A peggiorare ulteriormente +le cose, il buffer che mostra questi avvisi utilizza il carattere di stop, +risultando in un lungo elenco di righe con punti rossi ovunque, come se avessimo +completamente rotto Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Make native compilation silent. + (when (native-comp-available-p) + (setq native-comp-async-report-warnings-errors 'silent)) +#+end_src + +** Impostazione per mandare ~custom-file~ nell'oblio: +:PROPERTIES: +:ID: 8f4ba6e8-b50c-49c3-aa88-5451986e0fdc +:END: + +Per impostazione predefinita, Emacs scrive le personalizzazioni persistenti alla +fine del file di inizializzazione dell'utente. Questi elementi sono incapsulati +in un blocco "personalizzato". Emacs li scrive ogni volta che l'utente esegue +un'azione con =M-x customize= o comandi simili. + +Personalmente, preferisco scrivere direttamente il codice Elisp piuttosto che +utilizzare l'interfaccia di =M-x customize=. Voglio anche che il mio file di +inizializzazione contenga solo ciò che ho scritto io e che non esegua mai, in +nessun caso, codice che non ho chiamato personalmente. + +Pertanto, voglio impostare la variabile ~custom-file~ per indicare a Emacs di +scrivere le sue variabili persistenti in quel file anziché nel mio =init.el=. +Tuttavia, poiché non ho intenzione di utilizzare questo file, ho scelto di +renderlo temporaneo posizionandolo nella directory =/tmp= (questo è ciò che fa +la funzione ~make-temp-file~). Quindi, quando chiudo il computer, il file +scompare. Infine, non richiamo la funzione ~load~ perché non farò mai +affidamento sul ~custom-file~. Preferirei avere un'opzione per evitare +completamente l'infrastruttura Custom, ma non è possibile. Quindi eccoci qui... + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Disable the damn thing by making it disposable. + ;; - (setq custom-file (make-temp-file "emacs-custom-")) + ;; Rendo il file persistente: + (setq custom-file (locate-user-emacs-file "custom.el")) + (load custom-file :no-error-if-file-is-missing) +#+end_src + +** Impostazione per rendere =C-g= un po' più utile +:PROPERTIES: +:ID: fe0a404d-fa48-4522-b5d2-f8c18802b65c +:END: + +Avendo notato che i principianti hanno difficoltà con =C-g= perché non chiude il +minibuffer aperto, so che il seguente miglioramento semplifica l'esperienza +utente: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (defun mrk/keyboard-quit-dwim () + "Do-What-I-Mean behaviour for a general `keyboard-quit'. + + The generic `keyboard-quit' does not do the expected thing when + the minibuffer is open. Whereas we want it to close the + minibuffer, even without explicitly focusing it. + + The DWIM behaviour of this command is as follows: + + - When the region is active, disable it. + - When a minibuffer is open, but not focused, close the minibuffer. + - When the Completions buffer is selected, close it. + - In every other case use the regular `keyboard-quit'." + (interactive) + (cond + ((region-active-p) + (keyboard-quit)) + ((derived-mode-p 'completion-list-mode) + (delete-completion-window)) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (t + (keyboard-quit)))) + + (define-key global-map (kbd "C-g") #'mrk/keyboard-quit-dwim) +#+end_src +** Impostazione per eseguire Emacs come server +:PROPERTIES: +:ID: 8f620d66-1a75-4b52-aa3b-5a86edcbab7c +:END: + +Il "server" è funzionalmente simile al demone, tranne per il fatto che viene +eseguito dal primo frame di Emacs che avviamo. Con un server in esecuzione, +possiamo connetterci ad esso tramite una nuova chiamata =emacsclient=. Questo è +utile se vogliamo avviare nuovi frame che condividono risorse con il processo in +esecuzione. Tuttavia, =emacsclient= può essere utilizzato anche semplicemente +per eseguire codice al di fuori di un frame di Emacs (ad esempio per caricare un +nuovo tema, come faccio io con il mio delight.shscript di shell all'interno dei +miei dotfiles). + +Quando chiudiamo l'ultimo frame, il server viene terminato. Il demone, invece, +rimane attivo anche se tutti i frame di Emacs vengono chiusi. Per me, il server +è più facile da usare, perché so con certezza quando inizia e finisce il suo +ciclo di vita. Detto questo, ho provato seriamente anche il demone. Emacs si +bloccava ogni volta che incontravo un errore in qualche valutazione Lisp. Il +server, invece, funziona perfettamente. + +Nota che ciò avviene solo =server-start= se non è in esecuzione alcun +server. Uno è sufficiente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Emacs server (allow emacsclient to connect to running session) + (setq server-client-instructions nil) + (require 'server) + (unless (or (server-running-p) (daemonp)) + (server-start)) +#+end_src + +In questo modo si avrà una singola istanza di emacs e se faccio doppio click su +un file =*.org= questo verrà automaticamente aperto sull'istanza già in +esecuzione di emacs. Se però non vi è un'istanza attiva, si avrà errore, perchè +il server emacs rimane attivo solo fino a che non chiudo tutte le istanze di +emacs (non sto utilizzando il demone, cioè servizio in windows). + +Quindi si avvia emacs semplicemente eseguendo l'eseguibile +=C:\MyTools\emacs\bin\runemacs.exe=. Questo fa partir eil server emacs. Con il +doppio click su un file =*.org= faccio partire l'evento che è registrato (al +primo click lo si salva) al comando: +: C:\MyTools\emacs\bin\emacsclientw.exe -c -n "C:\Path\To\Your\File.org" + +** Impostazione per formato di default dei file: UTF-8 +:PROPERTIES: +:ID: d61b5760-4393-403d-a169-0d9da94db50a +:END: + +Imposto come formato di default dei file: UTF8 + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Imposto come formato di default l'UTF8 + (set-language-environment "UTF-8") + (set-default-coding-systems 'utf-8-unix) + (set-terminal-coding-system 'utf-8) + (prefer-coding-system 'utf-8) + (set-charset-priority 'unicode) +#+end_src + +** Impostazione per directory con il codice lisp custom: +:PROPERTIES: +:ID: 89b37a37-0f9b-42f6-9afa-bbe3648a04df +:END: + +Gli eventuali codici lisp custom, che voglio utilizzare, li metterò manualmente +nella cartella =~/.emacs.d/MyAddOn/= e devo fare in modo che emacs li carichi +automaticamente ad ogni avvio. + +Non potendo usare l'opzione specifica impostata nel file [[id:3143f3f7-1263-420a-adf4-6c5c3407a2d5][early-init.el]], lo comando +in modo esplicito: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Carico il path dei file lisp che aggiungo: + (add-to-list 'load-path (expand-file-name "~/.emacs.d/MyAddOn/")) +#+end_src + +** Impostazioni grafiche base: :@Obsolete: +:PROPERTIES: +:ID: dd2b1aa7-07a3-4b36-9134-02ac02b23315 +:END: + +Le impostazioni grafiche base delle finestre, sono ora gestite direttamente nel +file [[id:4cfcc493-965f-4b4a-88d3-19088e4d7e97][early-init.el]] e quindi i seguenti comandi non sono più utilizzati. + +#+begin_src emacs-lisp :tangle no :results none + ;; Don't show startup message + (setq inhibit-startup-message t) + ;; Stop al blinking del cursore + (blink-cursor-mode -1) ;; (setq blink-cursor-delay 2 blink-cursor-interval 0.5) + ;; menu bar (1=enable, -1=disable) + (menu-bar-mode 1) + ;; scroll bar (1=enable, -1=disable) + (toggle-scroll-bar 1) + ;; tool bar (1=enable, -1=disable) + (tool-bar-mode -1) + ;; Higlight line (1=enable, -1=disable) + (global-hl-line-mode 1) +#+end_src + +** Impostazioni per disabilitare backup e file di blocco +:PROPERTIES: +:ID: 7423109a-35e6-4da0-be45-67f87a59f57a +:END: + +Gestione dei file di salvataggio automatico (quelli con # all'inizio e alla +fine). Il file di salvataggio automatico di un determinato buffer viene +cancellato quando si salva esplicitamente il file. Per impedire ciò è necessario +impostare a nil la variabile =delete-auto-save-files=. + +Se si modifica il nome del file aperto tramite =C-x C-w= o +=set-visited-file-name=, il nome del file di salvataggio automatico viene +modificato di conseguenza. + +Alla modifica di un file, emacs fa un backup automatico del file (stesso nome +con la tilde finale). Per abilitare o no il backup automatico, si deve agire +sull'apposita variabile. + +Per impostazione predefinita, Emacs tenta di bloccare i file in modo che non +vengano modificati da altri programmi. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Disabilita il backup automatico dei file + (setq make-backup-files nil) + (setq backup-inhibited nil) ; Not sure if needed, given `make-backup-files' + ;; Disabilita il lock dei file + (setq create-lockfiles nil) + ;; Elimina i file di backup + (setq delete-auto-save-files t) +#+end_src + +** Impostazione per eliminare il testo selezionato all'inserimento :@ToReview: +:PROPERTIES: +:ID: de4aa706-e761-4d50-8983-70a1524080a2 +:END: + +Praticamente tutti i programmi eliminano il testo selezionato/evidenziato non +appena l'utente digita qualcosa. Emacs non lo fa di default, pur avendo la +funzionalità disponibile. Abilitiamola: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; delete selection when edited (1=enable, -1=disable) + (delete-selection-mode 1) + ;; - ;; Nuovo metodo visto nella configurazione di prot, per ora non in uso, da rivedere + ;; - (use-package delsel + ;; - :ensure nil ; no need to install it as it is built-in + ;; - :hook (after-init . delete-selection-mode)) +#+end_src + +** Impostazione per il calendario in Italiano :@ToReview:@Disable: +:PROPERTIES: +:ID: 13af1037-e191-443c-a7c0-ed933603dcb1 +:END: + +Personalizzazione del calendario per visualizzarlo in Italiano ed inserire le +festività italiane: + +[opzione da rivedere perchè l'ultima versione di emacs mi sembra mi dia direttamente i nomi in italiano] + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Calendario in italiano + ;; - (setq calendar-christian-all-holidays-flag t) + ;; - (setq calendar-date-style (quote iso)) + ;; - (setq calendar-day-name-array ["Domenica" "Lunedi'" "Martedi'" "Mercoledi'" "Giovedi'" "Venerdi'" "Sabato"]) + ;; - (setq calendar-latitude [45 40 north]) + ;; - (setq calendar-longitude [12 22 east]) + ;; - (setq calendar-mark-holidays-flag t) + ;; - (setq calendar-month-name-array ["Gennaio" "Febbraio" "Marzo" "Aprile" "Maggio" "Giugno" "Luglio" "Agosto" "Settembre" "Ottobre" "Novembre" "Dicembre"]) + ;; - (setq calendar-time-display-form (quote (24-hours ":" minutes (if time-zone " (") time-zone (if time-zone ")")))) + ;; - (setq calendar-view-holidays-initially-flag t) + ;; - (setq calendar-week-start-day 1) + ;; - (setq column-number-mode t) + ;; - (setq display-time-mode t) + ;; - (setq show-paren-mode t) +#+end_src + +** Impostazione per la data e l'ora nella modeline +:PROPERTIES: +:ID: 96ab804d-06e0-4531-a9ec-88dbce62df68 +:END: + +Mi piace visualizzare la data e l'ora correnti sulla barra di +navigazione. Ecco cosa =display-time-mode= fa. Nota che la mia barra +di navigazione personalizzata mostra l'ora solo nella finestra +attiva/selezionata. Altrimenti, l'impostazione predefinita è quella di +mostrare l'ora su tutte le barre di navigazione, il che è fastidioso. + +La =time.el= libreria che fornisce =display-time-mode= definisce anche +funzioni per ottenere il carico medio e controllare una directory per +nuove email. Non ho bisogno di questo e quindi lo disattivo. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq display-time-format " %a %e %b, %H:%M ") + ;;;; Covered by `display-time-format' + ;; (setq display-time-24hr-format t) + ;; (setq display-time-day-and-date t) + (setq display-time-interval 60) + (setq display-time-default-load-average nil) + ;; NOTE 2022-09-21: For all those, I have implemented my own solution + ;; that also shows the number of new items, although it depends on + ;; notmuch: the `notmuch-indicator' package. + (setq display-time-mail-directory nil) + (setq display-time-mail-function nil) + (setq display-time-use-mail-icon nil) + (setq display-time-mail-string nil) + (setq display-time-mail-face nil) + + ;; I don't need the load average and the mail indicator, so let this + ;; be simple: + (setq display-time-string-forms + '((propertize + (format-time-string display-time-format now) + 'face 'display-time-date-and-time + 'help-echo (format-time-string "%a %b %e, %Y" now)) + " ")) + + ;; Enable function + (display-time-mode 1) + ;; Visualizzo nel formato 24 ore. + (setq display-time-24hr-format t) ;; ricavato dalla configurazione precedente +#+end_src + +** Impostazione per i fusi orari (world-clock) :@ToReview:@Disable: +:PROPERTIES: +:ID: 6529bc2f-431a-4dfc-ab52-cfbb35dd4f15 +:END: + +Comunico con persone di tutto il mondo. Conoscere il loro orario locale è di +fondamentale importanza. Con =M-x world-clock= otteniamo un buffer con tutte le +città e i relativi fusi orari specificati in zone =world-clock-list=. Il +contenuto viene visualizzato in base a =world-clock-time-format=. Nota che +si può controllare il posizionamento di questo e molti altri buffer configurando +=display-buffer-alist=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - (setq world-clock-list + ;; - '(("America/Los_Angeles" "🇺🇸 Los Angeles") + ;; - ("America/Vancouver" "🇨🇦 Vancouver") + ;; - ("America/Denver" "🇺🇸 Denver") + ;; - ("America/Chicago" "🇺🇸 Chicago") + ;; - ("America/New_York" "🇺🇸 New York") + ;; - ("America/Toronto" "🇨🇦 Toronto") + ;; - ("America/Montreal" "🇨🇦 Montreal") + ;; - ("UTC" "🌐 UTC") + ;; - ("Europe/Lisbon" "🇵🇹 Lisbon") + ;; - ("Europe/London" "🇬🇧 London") + ;; - ("Europe/Paris" "🇫🇷 Paris") + ;; - ("Europe/Brussels" "🇧🇪 Brussels") + ;; - ("Europe/Berlin" "🇩🇪 Berlin") + ;; - ("Europe/Athens" "🇬🇷 Athens") + ;; - ("Asia/Nicosia" "🇨🇾 Lefkosia") + ;; - ("Asia/Istanbul" "🇹🇷 Istanbul") + ;; - ("Asia/Baghdad" "🇸🇾 Baghdad") + ;; - ("Asia/Riyadh" "🇸🇦 Riyadh") + ;; - ("Asia/Tehran" "🇮🇷 Tehran") + ;; - ("Asia/Tbilisi" "🇬🇪 Tbilisi") + ;; - ("Asia/Tashkent" "🇺🇿 Tashkent") + ;; - ("Asia/Karachi" "🇵🇰 Karachi") + ;; - ("Asia/Kolkata" "🇮🇳 Kolkata") + ;; - ("Asia/Dhaka" "🇧🇩 Dhaka") + ;; - ("Asia/Ho_Chi_Minh" "🇻🇳 Ho Chi Minh") + ;; - ("Asia/Singapore" "🇸🇬 Singapore") + ;; - ("Asia/Shanghai" "🇨🇳 Shanghai") + ;; - ("Asia/Seoul" "🇰🇷 Seoul") + ;; - ("Asia/Tokyo" "🇯🇵 Tokyo") + ;; - ("Australia/Brisbane" "🇦🇺 Brisbane") + ;; - ("Australia/Sydney" "🇦🇺 Sydney") + ;; - ("Pacific/Auckland" "🇳🇿 Auckland") + ;; - )) + ;; - ;; Formattazione dell'orario mostrato + ;; - (setq world-clock-time-format "%a %d %b %R %Z") +#+end_src + +** Impostazioni per impostare il numero di caratteri +:PROPERTIES: +:ID: 97a52819-b008-48f5-b9a2-16d81f6559b4 +:END: + +Per impostare la larghezza massima in caratteri (default 70) in modo iterattivo, +si può utilizzare il comando =C-x f= (=fill-colum=). Altrimenti per impostare +permanentemente la larghezza massima a 80 caratteri all'avvio di Emacs, aggiungi +questa riga al tuo file di configurazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; fill-colum 80 caratteri: + (setq-default fill-column 80) +#+end_src + +** Impostazione per mostrare il numero delle righe durante la programmazione +:PROPERTIES: +:ID: eb029077-2d97-4164-be14-95df45f6f5ff +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show line numbers on programming mode + (add-hook 'prog-mode-hook 'display-line-numbers-mode) +#+end_src + +** Impostazione per mostrare il numero delle colonne +:PROPERTIES: +:ID: a63531b5-339b-4857-ae79-c67d22e4ed7c +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show the column number + (column-number-mode 1) +#+end_src + +** Impostazione per abbreviare le risposte Yes or No +:PROPERTIES: +:ID: b0b149e0-845e-40b1-9fd2-50508b50ea06 +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Make all "yes or no" prompts be "y or n" instead + (fset 'yes-or-no-p 'y-or-n-p) +#+end_src + +** Impostazione per il matching delle parentesi +:PROPERTIES: +:ID: f46e9b26-3ccd-41fe-96fe-2f6c0ad00b82 +:END: + +Abilito l'evidenziazione delle coppie di parentesi e riduco al minimo il tempo +di attesa + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show the matching parenthesis and do it immediately, we are in a hurry + (show-paren-mode t) + (setq show-paren-delay 0) +#+end_src + +** Impostazione per la directory iniziale o cartella di default +:PROPERTIES: +:ID: 913b56e4-9966-4678-904d-01f0f084ba30 +:END: + +Imposto la directory iniziale che è quella da cui partire per ricercare o +inserire file + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Directory iniziale o cartella di default + (setq default-directory "~/Doc/Org/") +#+end_src + +** Impostazione per il completamento dinamico sul minibuffer: :@Disable: +:PROPERTIES: +:ID: 3b21f653-8a0f-4c20-9d9a-a2367913febc +:END: + +[Per ora lo disabilito per l'uso di vertigo] + +Facilita l'inserimento sul minibuffer. Un esempio è quando introduco un tag su +un file org, con questo abilitato, emcas mi sugerisce tutti i tag già inseriti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Activate the dynamic completion in the mini-buffer + ;; - (icomplete-mode 1) + ;; - ;; This should actually turn on auto-fill-mode by default in all major + ;; - ;; modes. The other way to do this is to turn on the fill for specific modes + ;; - ;; via hooks. + ;; - (setq auto-fill-mode 1) +#+end_src + +** Impostazione per il Kill buffer automatico :@Disable: +:PROPERTIES: +:ID: 00d85e5f-c9b7-4637-98d4-f6629afabb90 +:END: + +Per default il comando di chiusura di un buffer (=C-x k=) chiede il nome del +buffer da chiudere suggerendo inizialmente quello in cui si è. Tramite il +comando kill-this-buffer si può chiudere direttamente il buffer in cui si è +senza avere la richiesta di conferma. Se si vuole accelerare, si può quindi +bindare il comando generale a quello veloce: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - (global-set-key (kbd "C-x k") 'kill-this-buffer) +#+end_src + +** Impostazione per la dimensione della finestra :@Obsolete: +:PROPERTIES: +:ID: 8ae8d0a4-bd54-4cec-8aa4-7d25c7769626 +:END: + +[ Questo è integrato in [[id:25163662-be4f-4ee1-96df-9fe7473c25e7][parametri frame in early-init.el]] ] + +Ridimensiono la finestra di emacs in base a quanto visto nella pagina della +[[https://www.emacswiki.org/emacs/FrameSize][wiki]]. + +#+begin_src emacs-lisp :tangle no :results none + ;; Imposto dimensioni finestra + ;; (when window-system (set-frame-size (selected-frame) 92 46)) + (add-to-list 'default-frame-alist '(width . 100)) + (add-to-list 'default-frame-alist '(height . 48)) +#+end_src + +** Impostazione per fare il Buzzer visibile +:PROPERTIES: +:ID: 0f819bf1-cc9a-434e-b0da-5a0d586e203c +:END: + +Dal sito [[https://pragmaticemacs.wordpress.com/2017/10/15/using-a-visible-bell-in-emacs/][Pragmatic emacs]] ho trovato come visualizzare un lampeggio in emacs al +posto del beep (per errori o allarmi) di emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Buzzer visibile + (setq visible-bell t) +#+end_src + +** Impostazione per gestire i package: + +Emacs ha un gestore di pacchetti basilare, ma comunque sufficientemente +efficiente. Lo utilizziamo per estendere Emacs con funzionalità fornite dalla +community. Emacs include molte funzioni utili, ma senza i pacchetti esterni +saremmo in una situazione peggiore. Inoltre, tenete presente che il fatto che un +pacchetto sia integrato in Emacs non lo rende necessariamente migliore delle +alternative di terze parti. + +Vi sono diversi reposity, ma i principali, non chè ufficiali, sono: +- [[https://elpa.gnu.org/packages/][gnu-elpa]] Repository ufficiale con le versioni stabili +- [[https://elpa.gnu.org/devel/][gnu-elpa-devel]] Repository ufficiale con le versioni in sviluppo +- [[https://elpa.nongnu.org/nongnu/][nongnu]] Repository NonGNU +- [[https://melpa.org/packages/][melpa]] Repository ufficiale non GNU + +Li inserisco tutti nella mia configurazione, però li ordino in modo che si +utilizzi il primo pacchetto trovato guardando i repository con l'ordine che +voglio. + +*** Note sull'utilizzo e sui comandi: +:PROPERTIES: +:ID: 788b4534-ad1b-4919-88aa-873e0da4344d +:END: + +Per vedere la lista dei package: +: M-x list-packages +Per aggiornare la lista dei package si usa: +: M-x package-refresh-contents +Per installare l'ultimo package di org: +: M-x package-install RET org RET +Per avere informazioni su un package si può usare il comando +: M-x describe-package +che visualizza una finestra con le informazioni del pacchetto. + +Per aggiornare l'installazione di un package, occorre che non sia in uso, poi si +richiama l'elenco dei packages con +: M-x list-packages +Ora si seleziona i pacchetti da aggiornare con +: U +(mark Upgradable packages) e si avvia l'aggiornamento con +: x +(eXecute the installs and deletions). Alla fine dell'aggiornamento chiede +eventualmente se si vuole cancellare i pacchetti obsoleti e basta rispondere con +Yes. + +If you run into a problem installing or upgrading, you may need to go into your +=~/.emacs.d/elpa/= directory and delete packages that are installed multiple +times. This can happen when the install times out. + +*** Impostazione generale dei package repository +:PROPERTIES: +:ID: fbac4656-a2b3-436a-abb4-b4c2acc255e6 +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Set the packet manager: + (setq package-archives + '(("gnu-elpa" . "https://elpa.gnu.org/packages/") + ("gnu-elpa-devel" . "https://elpa.gnu.org/devel/") + ("nongnu" . "https://elpa.nongnu.org/nongnu/") + ("melpa" . "https://melpa.org/packages/"))) + ;; Set the repository priority: + ;; Highest number gets priority (what is not mentioned has priority 0) + (setq package-archive-priorities + '(("gnu-elpa" . 3) + ("melpa" . 2) + ("nongnu" . 1))) +#+end_src + +*** Impostazioni per l'aggiornamento dei pacchetti :@ToReview:@Disable: +:PROPERTIES: +:ID: e89bfa83-c993-45fe-98fd-bbacf51c68a6 +:END: + +Queste configurazioni vengono dalla vecchia versione, per ora le disabilito, ma +dovrò capire come usarle nella nuova configuraione. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Codice dalla vecchia versione, per ora disattivato: + ;; - ;; Codice già resente in init.el: + ;; - ;; (require 'package) + ;; - ;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) + ;; - ;; ;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) + ;; - ;; (package-initialize) + ;; - ;; + ;; - ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + ;; - (unless package-archive-contents (package-refresh-contents)) ;; Refresh the packages descriptions + ;; - (setq package-load-list '(all)) ;; List of packages to load + ;; - ;; + ;; - ;; Carico Org se non già caricato: + ;; - (unless (package-installed-p 'org) (package-install 'org)) ;; Make sure the Org package is installed, install it if not + ;; - ;; + ;; - ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + ;; - (unless (package-installed-p 'use-package) + ;; - (package-refresh-contents) + ;; - (package-install 'use-package)) +#+end_src + +*** Impostazione per non visualizzare i warning durante il load dei pacchetti: +:PROPERTIES: +:ID: 23b9362f-a8cb-4c3b-9c38-0762ef26f79a +:END: + +Quando si installa un nuovo pacchetto, Emacs mostra un buffer contenente tutti +gli avvisi generati dal compilatore bytecode (Configura il gestore di +pacchetti). Sebbene queste informazioni siano utili per gli sviluppatori, +risultano molto confuse per gli utenti. Molte volte ho ricevuto messaggi del +tipo "Emacs si è bloccato", quando in realtà gli avvisi riguardano problemi che +non interessano l'utente. + +Il seguente frammento di codice impedisce la visualizzazione di questi buffer +(Configurazione completa). Rimangono comunque disponibili nell'elenco dei +buffer, qualora fossero necessari. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (add-to-list 'display-buffer-alist + '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'" + (display-buffer-no-window) + (allow-no-window . t))) +#+end_src + +** Impostazione per l'uso del Package: Try +:PROPERTIES: +:ID: bb851ab2-d68a-425d-a9fe-0314dd6de287 +:END: + +Permette di provare i vari pacchetti senza installarli. Quindi riavviando emacs +si ritorna alla situazione iniziale. + +Quando installato, si può provare un pacchetto direttamente installandolo +temporaneamente con try. Per esempio e voglio installare il pacchetto del gioco +2048: +: M-x try RET 2048-game +e quindi lanciare il gioco temporaneamente installato: +: M-X 2048-game RET + +Si può utilizzare anche per provare un file dal web. Per esempio per caricare il +file, file.el, in modo temporaneo: +: M-x try RET https://url.com/to/some/file.el + +Dai siti di rifererimento [[https://melpa.org/#/tryhttps://melpa.org/#/try][Melpa]], [[https://github.com/larstvei/Try][GitHub]] +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package try + :ensure t) +#+end_src + +** Impostazione per l'uso del Package: Which-key :@Obsolete: +:PROPERTIES: +:ID: 631ba5a0-99aa-44bc-8577-78a6494f3abd +:END: + +[ Pacchetto reso obsoleto da =vertigo= che preferisco. ] + +Visualizza sul minibuffer tutti i comandi possibili per completare quello +iniziato. Quindi permette di iniziare un comando, per esempio =C-x=, attendere +qualche secondo, e mostra sul minibuffer tutti i possibili suggerimenti + +E' simile ad IDO, ma è riferito esclusivamente ai comandi. + +Sui siti di riferimento [[https://melpa.org/#/which-key][Melpa]], [[https://github.com/justbur/emacs-which-key][GitHub]], ci sono molte opzioni (visualizzare i +suggerimenti sotto, a destra, tempo di attesa prima di visualizzarli, ecc..) ma +per ora utilizzo la configurazione base e poi sperimentando vedo se variarla. + +#+begin_src emacs-lisp :tangle no :results none + (use-package which-key + :ensure t + :config + (which-key-mode)) +#+end_src + +** Impostazione per l'uso del Package: auto-complete :@ToReview:@Disable: +:PROPERTIES: +:ID: e4a7b079-6a5f-4dd4-95ea-1a2955c08679 +:END: + +[ PEr ora disabilitata perchè preferisco approfondire quello che usavo prima del +cambio versione con i template ] + +Simile alla funzione di autocompletamento nativa di emacs (vedi [[id:d66bda07-4362-43fb-bfb0-45279cb3dab4][dynamic +abbreviations]] =M-/=) questa visualizza i suggerimenti tipo intellisense e quindi +è carina da vedere. + +I siti di riferimento sono: [[https://melpa.org/#/auto-complete][Melpa]], [[https://github.com/auto-complete/auto-complete][GitHub]] + +#+begin_src emacs-lisp :tangle no :results none + (use-package auto-complete + :ensure t + :init + (progn + (ac-config-default) + (global-auto-complete-mode t) + )) +#+end_src + +** Impostazione per l'uso del Package: htmlize +:PROPERTIES: +:ID: 139aad2b-8b71-4969-860f-85fc0dbe8b92 +:END: + +Per convertire il testo ed i blocchi in testo html con associati i vari colori. + +Siti di riferimento: [[https://melpa.org/#/htmlize][Melpa]], [[https://github.com/hniksic/emacs-htmlize][GitHub]] da cui si vede che è possibile personalizzare +lo stile dell'esportazione in tre modi in base ai valori assegnato alla +variabile: +: htmlize-output-type +: css +: inline-css +: font + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package htmlize + :ensure t) +#+end_src + +** Impostazione per i caratteri non presenti sulla tastiera: +:PROPERTIES: +:ID: d41b2219-3c26-4c6d-b377-26a718a32a88 +:END: + +Vi sono alcuni caratteri usati spesso che non sono presenti nella tastiera: +| Key | New Binding | +|-------+-------------| +| ~ | C-ù | +| C-SPC | C-ò | + +Cioè il carattere Tilde usato come Home e il set del mark, cioè il set del punto +di inizio di una selezione, utile per fare le selezioni con solo la tastiera. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Tilde + (global-set-key (kbd "C-ù") (kbd "~")) + ;; + ;; Riassegnamento del set mark al posto di C-SPC + (global-set-key (kbd "C-ò") 'set-mark-command) +#+end_src + +** Carico file di configurazione della UI +:PROPERTIES: +:ID: 045e2874-6ab7-4bee-a557-a271fd805fbb +:END: + +Carico il file con la configurazione della UI, che descrivo [[id:3a1e2165-6733-460d-95bc-652380277b31][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/UI-init.el") +#+end_src + +** Carico file di configurazione del minibuffer +:PROPERTIES: +:ID: 459eecd9-bed2-4b6c-9556-11666d4a0c5b +:END: + +Carico il file con la configurazione del minibuffer, che descrivo [[id:e7cc0e5c-9cf2-4665-8c76-517efd69f38a][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/mnbfr-init.el") +#+end_src + +** Carico file di configurazione di org-mode +:PROPERTIES: +:ID: 0ab89109-24cb-445a-a913-e575bfb42a16 +:END: + +Carico il file con la configurazione della UI che descrivo [[id:3a5bad5e-b492-4459-b863-ee15421eb5d8][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/org-init.el") +#+end_src + + +* \checkmark File di configurazione della grafica *UI-init.el* +:PROPERTIES: +:ID: 3a1e2165-6733-460d-95bc-652380277b31 +:END: + +Questo è un file di configurazione ausiliario, che gestisce in particolare +l'aspetto grafico di emacs, cioè i temi e font. + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:045e2874-6ab7-4bee-a557-a271fd805fbb][qui]]. + +In questo file imposterò in particolare: +- font utili (nerd icons) +- thema utilizzato + +** Impostazione per i nerd icon +:PROPERTIES: +:ID: a0c69af1-f2d3-489e-9079-6fbd3cabab88 +:END: + +Il seguente frammento di codice mostrerà icone complementari nel minibuffer e in +Dired. + +La configurazione, richiede che sul sistema siano installati i relativi font, e +quindi per far funzionare questa configurazione serve farlo. Per installarli, +l'utente deve digitare =M-x= e quindi richiamare il comando +=nerd-icons-install-fonts=. Questo salverà i file dei font delle icone in una +directory locale e poi vanno installati sul sistema windows. Per assicurarsi che +tutto funzioni correttamente, riavviare Emacs e ciò garantirà che i nuovi file +dei font vengano letti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Install nerd-icons package for all mode that we use + (use-package nerd-icons + :ensure t) + (use-package nerd-icons-completion + :ensure t + :after marginalia + :config + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + (use-package nerd-icons-corfu + :ensure t + :after corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + (use-package nerd-icons-dired + :ensure t + :hook + (dired-mode . nerd-icons-dired-mode)) +#+end_src + +** Impostazione per l'uso del Package: Org-bullet :@Obsolete: +:PROPERTIES: +:ID: 818a7692-c614-4060-94a5-23b56f56ce6f +:END: + +Questo pacchetto permette di sostituire gli asterichi nelle header con dei +bullet più carini. Dai siti di riferimento [[https://melpa.org/#/org-bullets][Melpa]], [[https://github.com/sabof/org-bullets][GitHub]] si indica che non sarà +più aggiornato e che viene sostituito da org-superstart, quindi anchio lo +disattivo ed utilizzo superstar. Il codice di configurazione era: + +#+begin_src emacs-lisp :tangle no :results none + (use-package org-bullets + :ensure t + :config + (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) +#+end_src + +** Impostazione per l'uso del Package: Org-superstar :@Obsolete: +:PROPERTIES: +:ID: 6fa0a818-0b1e-4cf9-8ace-a6a92d6de0f3 +:END: + +[ Il thema è stato soppravanzato da org-modern, disattivo questo e provo l'altro ] + +Questo pacchetto permette di sostituire gli asterichi nelle header con dei +bullet più carini. Dai siti di riferimento [[https://melpa.org/#/org-superstar][Melpa]] [[https://github.com/integral-dw/org-superstar-mode][GitHub]] viene indicato come il +successore di org-bullet. + +Alcuni themi non li visualizzano correttamente, quindi nel caso devo +disattivarlo (:tangle no :results none) o +riattivarlo (:tangle "~/.emacs.d/UI-init.el"). + +#+begin_src emacs-lisp :tangle no :results none + ;; Carico il package + (use-package org-superstar + :ensure t + :config + ;; lo utilizzo in org + (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1)))) + ;; Per velocizzare la gestione del font + (setq inhibit-compacting-font-caches t) + ;; Customize bullets + ;; - ;; Resize bullets + ;; - (with-eval-after-load 'org-superstar + ;; - (set-face-attribute 'org-superstar-item nil :height 1.2) + ;; - (set-face-attribute 'org-superstar-header-bullet nil :height 1.2) + ;; - (set-face-attribute 'org-superstar-leading nil :height 1.3)) + ;; Set different bullets, with one getting a terminal fallback. + ;; - (setq org-superstar-headline-bullets-list + ;; - '("◉" ("🞛" ?◈) "○" "▷")) + ;; Stop cycling bullets to emphasize hierarchy of headlines. + (setq org-superstar-cycle-headline-bullets nil) + ;; Hide away leading stars on terminal. + (setq org-superstar-leading-fallback ?\s) +#+end_src +** Impostazione per l'uso del Package: Org-modern :@ToReview:@Disable: +:PROPERTIES: +:ID: c4062e8f-6f1e-4460-93d9-a1d4c5b12105 +:END: + +Dai siti di riferimento [[https://elpa.gnu.org/packages/doc/org-modern.html][ELPA]] e [[https://github.com/minad/org-modern][GitHub]] viene indicato come il successore di +org-bullet e org-superstar. + +Questo pacchetto implementa uno stile moderno per i buffer Org utilizzando il +blocco dei caratteri e le proprietà del testo. Il pacchetto applica uno stile a +titoli, parole chiave, tabelle e blocchi di codice sorgente. Lo stile è +configurabile: è possibile disabilitare o modificare lo stile di ciascun +elemento di sintassi singolarmente tramite la customizzazione del gruppo +org-modern. + +Poiché questo pacchetto regola lo stile del testo, dipende dalle impostazioni +del carattere. È necessario assicurarsi che le propietà del font +=variable-pitch= e =fixed-pitch= si combinino armoniosamente e abbiano +approssimativamente la stessa altezza. Come carattere predefinito, consiglio +varianti del carattere [[https://github.com/be5invis/Iosevka][Iosevka]] , ad esempio =Iosevka Term Curly=. +=org-modern-mode= cerca di regolare la visualizzazione dell'etichetta +del tag in base all'altezza del carattere. + +#+begin_src emacs-lisp :tangle no :results none + ;; Option 1: Per buffer + (add-hook 'org-mode-hook #'org-modern-mode) + (add-hook 'org-agenda-finalize-hook #'org-modern-agenda) + + ;; Option 2: Globally + (with-eval-after-load 'org (global-org-modern-mode)) +#+end_src + +Ecco una configurazione più estesa: + +#+begin_src emacs-lisp :tangle no :results none + ;; abilito delle visualizzazioni più avanzate: + (setq + ;; Edit settings + org-auto-align-tags nil + org-tags-column 0 + org-catch-invisible-edits 'show-and-error + org-special-ctrl-a/e t + org-insert-heading-respect-content t + ;; Org styling, hide markup etc. + org-hide-emphasis-markers t + org-pretty-entities t + org-agenda-tags-column 0 + org-ellipsis "…") + ;;; Abilito sempre org-modern + (global-org-modern-mode) +#+end_src + +Il font in uso ora è =Courier New=. Si può pensare di cambiarlo in questo modo: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Choose some fonts: "Iosevka" or "DejaVu" + ;; + ;; - Main typeface + ;;(set-face-attribute 'default nil :family "Iosevka" :height 140) + ;;(set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110) + ;; + ;; - Proportionately spaced typeface + ;;(set-face-attribute 'variable-pitch nil :family "Iosevka Aile") + ;;(set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0) + ;; + ;; - Monospaced typeface + ;;(set-face-attribute 'org-modern-symbol nil :family "Iosevka") + ;;(set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5) +#+end_src + +Nella mia review, ho installato il pacchetto manualmente: +- Per prima cosa aggiornato la lista dei pacchetti con il comando + : package-refresh-contents +- Poi installato il pacchetto con il comando + : package-install + e inserendo alla richiesta il nome: org-modern + +Ora il pacchetto è installato, ma non ancora richiamato dagli hook e +quindi per verificarlo va richiamato a mano con =M-x org-modern=. + +Dai primi utilizzi, la grafica è molto bella, ma mi distrae +l'editazione, quindi per ora voglio tenere solo il simbolo all'inizio +della headline che è carino soprattutto per distinguere quelle aperte +da quelle compresse. Per farlo attivo quindi sempre org-manage ma ne +disabilito alcune funzionalità. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Per cambiare cosa viene Prettify e cosa no, cambiare le opzioni + ;; usare t per abilitare l'opzionerelativa + ;; usare nil per disabilitare l'opzione + (use-package org-modern + :after org + :ensure t + :hook ((org-mode . org-modern-mode)) + :custom + (org-modern-timestamp t) ; Prettify time stamps + (org-modern-table nil) ; Prettify tables + (org-modern-priority t) ; Prettify priorities + (org-modern-todo t) ; Prettify todo keywords, see org-todo-keywords + (org-modern-tag t) ; Prettify tags in headlines + (org-modern-block-name nil) ; Prettify blocks names + (org-modern-block-fringe 2) ; Add a border to the blocks in the fringe (nil - 16) + (org-modern-keyword t) ; Prettify keywords like #+title + (org-modern-progress 10) ; Width in characters to draw progress bars. Set to nil to disable bars. + ) +#+end_src + +Infine per evitare l'errore di visalizzazione del terzo livello +(perchè il font non ha il relativo carattere), utilizzo la soluzione +ricavata da [[https://www.reddit.com/r/emacs/comments/1qx48wl/does_anyone_here_use_org_modern_or_other_packages/?tl=it][redit]] o [[https://github.com/minad/org-modern/commit/5393edbb5a078348d0eea5723868c35be3e73494][GitHub]]: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Sostituisco i caratteri standard con la mia preferenza: + (setq org-modern-fold-stars + '( + ("▶" . "▼") + ("▷" . "▽") + ("▸" . "▾") + ("▹" . "▿") + ) + ) +#+end_src + +** Impostazione per selezionare il tema utilizzato: +:PROPERTIES: +:ID: 7568ad10-8549-4282-b83d-fc3b7118c244 +:END: + +La scelta del tema è soggettiva, quindi vi prego di non considerare quanto segue +come un'opinione definitiva. Ho semplicemente scelto il tema che mi piace di +più. Usatelo come modello per configurare eventualmente un altro tema. + +Come reference per i theme ci sono i seguenti siti: +- [[https://pawelbx.github.io/emacs-theme-gallery/][emacs theme gallery]] +- [[https://emacsthemes.com/][emacs Themes]] + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Esempio per utilizzare un pacchetto thema esterno + ;; - (use-package modus-themes + ;; - :ensure t + ;; - :config + ;; - (load-theme 'modus-vivendi-tinted :no-confirm-loading)) + ;; Esempio di utilizzo di un thema interno + ;; - (load-theme 'dichromacy :no-confirm-loading) +#+end_src + +** Impostazione del tema interno: modus-operandi-deuteranopia :@Disable: +:PROPERTIES: +:ID: 9eb8612c-9200-410c-9eae-e1c4c456aef8 +:END: + +Dal [[https://protesilaos.com/codelog/2022-08-03-modus-themes-2-5-0/][sito]] del thema, impostiamo l'utilizzo del tema =modus-operandi-deuteranopia= +impostando anche l'evidenziazione dei titoli ingrandendo il font. + +#+begin_src emacs-lisp :tangle :tangle no :results none + ;; Ridimensioni i titoli in base al livello: + (setq modus-themes-headings + '((0 . (variable-pitch 1.3)) ; Titolo principale/Documento + (1 . (variable-pitch 1.1)) ; Livello 1 + (2 . (variable-pitch 1.1)) ; Livello 2 + (3 . (variable-pitch 1.0)) ; Livello 3 (non lo ridimensiono perchè con il colore, sembra già grande) + (t . (rainbow bold 1.0)))) ; Tutti gli altri livelli (default) + ;; Abilito il tema + (load-theme 'modus-operandi-deuteranopia :no-confirm-loading) +#+end_src + +** Impostazione per l'uso del Package: Theme Zenburn :@Disable: +:PROPERTIES: +:ID: e640d15f-3f32-4d3f-a1a7-289890574aa4 +:END: + +[ Il tema non mi piace più, quindi lo disabilito ] + +Permette di gestire comodamente il thema ZenBurn + +I siti di riferimento sono: [[https://melpa.org/#/zenburn-theme][Melpa]], [[https://github.com/bbatsov/zenburn-emacs][GitHub]] da cui ricavo anche che il thema +gestisce dimensioni diverse per le headline. + +Si possono ridefinire i colori andando a ridefinire la variabile +zenburn-override-colors-alist come in questo esempio. + +#+begin_src emacs-lisp :tangle :tangle no :results none + ;; ;; Sample redefine colors: + ;; (setq zenburn-override-colors-alist + ;; '(("zenburn-bg+05" . "#282828") + ;; ("zenburn-bg+1" . "#2F2F2F") + ;; ("zenburn-bg+2" . "#3F3F3F") + ;; ("zenburn-bg+3" . "#4F4F4F"))) + ;; (load-theme 'zenburn t) + ;; + ;; use variable-pitch fonts for some headings and titles + (setq zenburn-use-variable-pitch t) + ;; + ;; scale headings in org-mode + (setq zenburn-scale-org-headlines t) + ;; + ;; scale headings in outline-mode + (setq zenburn-scale-outline-headlines t) + ;; + ;; Load theme + (use-package zenburn-theme + :ensure t + :config + (load-theme 'zenburn t)) +#+end_src + +** Impostazione per l'uso del Package: Theme Spacemacs :@Disable: +:PROPERTIES: +:ID: 5e2ed87e-7835-43ed-833a-79335dcfb301 +:END: + +Permette di gestire comodamente il thema Spacemacs. Spacemacs è una +configurazione particolare di emacs completa di configuratore e altro. Per +informazioni il sito di riferimento è: [[https://www.spacemacs.org/][Spacemacs]] o [[https://www.youtube.com/watch?v=hCNOB5jjtmc][Video]] + +I siti di riferimento sono: [[https://melpa.org/#/spacemacs-theme][Melpa]], [[https://github.com/nashamri/spacemacs-theme][GitHub]] da cui ricavo anche che il thema +gestisce dimensioni diverse per le headline e anche il grassetto. + +#+begin_src emacs-lisp :tangle no :results none + ;; Load theme + (use-package spacemacs-theme + :ensure t + :config (load-theme 'spacemacs-light t)) +#+end_src + +** Impostazione del tema interno: dichromacy + +Utilizzo il tema interno dichromacy, però trovo i colori troppo vivaci. + +Tramite il comando =M-x customize-face= ricavo il colore di sfondo di ogni +singolo livello header. Per esempio si vede che =org-level-1= eredita il face da +=outline-1= che a sua volta eredita da =font-lock-function-name-face= che ha il +=Foreground: #d55e00=. + +Colori originali di dichromacy: +org-level-1 --> #d55e00 vermilion +org-level-2 --> #e69f00 orange +org-level-3 --> #56b4e9 skyblue +org-level-4 --> #009e73 bluegreen +org-level-5 --> #0072b2 blue +org-level-6 --> #d55e00 vermilion +org-level-7 --> #0072b2 blue +org-level-8 --> #848ea9 bluegray + +In un primo tentativo hgo provato a shiftare i colori ma ancora non era il top, +quindi ho scelto una palette da 5 colori sul verde e quindi dopo aver caricato +il thema, devo personalizzarlo: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Carico il theme: dichromacy + (load-theme 'dichromacy :no-confirm-loading) + ;; + ;; Personalizzo il colore e le dimensioni utilizzando la paletta: + ;; 'Velluto della foresta': #1b1f23 #0b3d2e #145a3a #2f7d5b #cbbfa6 + (custom-set-faces + '(org-level-1 ((t (:foreground "#56b4e9" :bold t :height 1.3)))) + '(org-level-2 ((t (:foreground "#2f7d5b" :bold t :height 1.1)))) + '(org-level-3 ((t (:foreground "#145a3a" :bold t :height 1.1)))) + '(org-level-4 ((t (:foreground "#0b3d2e" :bold t :height 1.1)))) + '(org-level-5 ((t (:foreground "#1b1f23" :bold t)))) + ) +#+end_src + + +* File di configurazione del minibuffer: *mnbfr-init.el* +:PROPERTIES: +:ID: e7cc0e5c-9cf2-4665-8c76-517efd69f38a +:END: + +[Guarda anche il video sui pacchetti minibuffer moderni, alcuni dei quali non ho +incluso qui perché sono un po' più avanzati: +https://protesilaos.com/codelog/2024-02-17-emacs-modern-minibuffer-packages/.] + +Il minibuffer è una componente fondamentale dell'esperienza Emacs. È il punto in +cui l'utente interagisce con Emacs per rispondere ai prompt, passare a un altro +buffer, aprire un nuovo file, eseguire un comando per nome completo e così +via. Il minibuffer predefinito è minimale, il che potrebbe essere utile per gli +utenti esperti, ma non facilita la scoperta delle opzioni. + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:459eecd9-bed2-4b6c-9556-11666d4a0c5b][qui]]. + +** Impostazione per l'uso del Package: vertigo +:PROPERTIES: +:ID: f7643b57-04fa-4e66-b3b6-0b84be9c149a +:END: + +Utilizziamo il pacchetto =vertico= per creare un layout verticale nel +minibuffer. Ciò semplifica la visualizzazione delle opzioni disponibili. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load vertigo package + (use-package vertico + :ensure t + :config + (setq vertico-cycle t) + (setq vertico-resize nil) + (vertico-mode 1)) + ;; Configure directory extension. + (use-package vertico-directory + :after vertico + :ensure nil + ;; More convenient directory navigation commands + :bind (:map vertico-map + ("RET" . vertico-directory-enter) + ("DEL" . vertico-directory-delete-char) + ("M-DEL" . vertico-directory-delete-word)) + ;; Tidy shadowed file names + :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) +#+end_src + +** Impostazione per l'uso del Package: marginalia +:PROPERTIES: +:ID: 95c8f5d2-c947-4c96-95c1-f6a743348a37 +:END: + +Il pacchetto =Marginalia= è un ottimo complemento al layout verticale, poiché +utilizza lo spazio libero per mostrare informazioni utili sulle opzioni +visualizzate. Ad esempio, quando l'utente digita =M-x= per visualizzare un +elenco di nomi di comandi, Marginalia aggiungerà una breve descrizione di +ciascun comando. A seconda delle specifiche dell'interazione con il minibuffer +(apertura di un file, selezione di un buffer, ecc.), verranno visualizzate le +informazioni pertinenti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load marginalia package + (use-package marginalia + :ensure t + :config + (marginalia-mode 1)) +#+end_src + +** Impostazione per l'uso del Package: orderless +:PROPERTIES: +:ID: 870c854a-489c-4868-9b2a-796dc4dce2c6 +:END: + +Il pacchetto =Orderless= è una soluzione ideale per tutti quei casi in cui non +ricordiamo l'ordine esatto delle parole. Ad esempio, per attivare/disattivare la +visualizzazione dei numeri di riga nel buffer corrente, utilizziamo il comando +=M-x display-line-numbers-mode=. Con Orderless configurato, possiamo digitare +qualcosa come =li num dis= al prompt =M-x= e ottenere comunque il risultato +desiderato. Questo perché Orderless interpreta i caratteri separati da spazi in +qualsiasi ordine. Emacs include altri stili di corrispondenza di pattern, ma +"orderless" è un buon punto di partenza. Pertanto, ci assicuriamo che le altre +variabili rilevanti siano impostate su un valore nullo, in modo da ottenere +"orderless" ovunque. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load ordeless package + (use-package orderless + :ensure t + :config + (setq completion-styles '(orderless basic)) + (setq completion-category-defaults nil) + (setq completion-category-overrides nil)) +#+end_src + +** Impostazione per l'uso del Package: consult :@Disable:@ToReview: +:PROPERTIES: +:ID: 5549b354-5d83-4a31-ad77-03d17d174ae5 +:END: + +[ Per ora il problema con il find.exe non sembra risolvibile e quindi disattivo il pacchetto ] + +Il pacchetto =consult= fornisce numerosi comandi che sono varianti avanzate +delle funzionalità di base integrate. Una delle caratteristiche principali di +consult è la funzione di anteprima, che mostra in un'altra finestra di Emacs il +contesto di ciò che è attualmente corrispondente nel minibuffer. + +Qui definisco le scorciatoie da tastiera per alcuni comandi che potrebbero +esservi utili. Il prefisso mnemonico è "alternative search" (in contrapposizione +alle scorciatoie da tastiera di base =C-s= o =C-r=). + +#+begin_src emacs-lisp :tangle no :results none + ;; Load consult package + (use-package consult + :ensure t + :bind (;; Search for files names recursively + ("M-s M-f" . consult-find) + ;; Search through the outline (headings) of the file + ("M-s M-o" . consult-outline) + ;; Search the current buffer + ("M-s M-l" . consult-line) + ;; Switch to another buffer, or bookmarked file, or recently opened file. + ("M-s M-b" . consult-buffer) + ;; Search through history + ("M-s M-h" . consult-history) + ;; Search through mark + ("M-s M-m" . consult-mark) + ;; Search through yank + ("M-s M-y" . consult-yank-pop) + )) +#+end_src + +Il comando =consult-find= non funziona su windows, infatti utilizza il programma +=find.exe= che però non è quello unix. In particolare con il comando + +#+begin_src emacs-lisp :tangle no :results none + (executable-find "find") +#+end_src + +ritorna il valore + +#+begin_src emacs-lisp :tangle no :results none + "c:/WINDOWS/system32/find.exe" +#+end_src + +indicando che utilizza il find.exe di windows. Come find di unix, voglio +utilizzare quello dato già assieme a git. Serve quindi impostare il path +corretto, da internet ho trovato il comando + +#+begin_src emacs-lisp :tangle no :results none + (setq find-program "C:/Program Files/Git/usr/bin/find.exe") +#+end_src + +ma non funziona, emacs continua a puntare al find di windows. Procedo quindi a +inserire il path del find di unix sul PATH complessivo che utilizza emacs. In +questo modo non altero il PATH di windows e quindi sono più sicuro. + +#+begin_src emacs-lisp :tangle no :results none + ;; imposto la directory del find unix: + (setq find-program-path "C:/Program Files/Git/usr/bin") + ;; la inserisco nel PATH di emacs: + (push find-program-path exec-path) +#+end_src + +** Impostazione per l'uso del Package: corfu :@ToReview:@Disable: +:PROPERTIES: +:ID: 36e5e474-8ddd-4e4b-b909-3ad94b270327 +:END: + +[ Devo approfondire, per ora lo disattivo ] + +Il pacchetto =corfu= fornisce un'interfaccia popup per il completamento +automatico all'interno del buffer. Concettualmente, è simile a quanto +avviene con il minibuffer, sebbene sia pensato per l'espansione del +testo all'interno di un file normale. Viene tipicamente utilizzato +nella programmazione. Ci sono ulteriori funzionalità che potrebbero +renderlo utile per le modalità di programmazione (in particolare, la +configurazione del Language Server Protocol), ma poiché queste +dipendono molto dalle esigenze specifiche di ciascun utente, qui +fornisco solo le funzionalità principali. + +#+begin_src emacs-lisp :tangle no :results none + (use-package corfu + :ensure t + :hook (after-init . global-corfu-mode) + :bind (:map corfu-map ("" . corfu-complete)) + :config + (setq tab-always-indent 'complete) + (setq corfu-preview-current nil) + (setq corfu-min-width 20) + + (setq corfu-popupinfo-delay '(1.25 . 0.5)) + (corfu-popupinfo-mode 1) ; shows documentation after `corfu-popupinfo-delay' + + ;; Sort by input history (no need to modify `corfu-sort-function'). + (with-eval-after-load 'savehist + (corfu-history-mode 1) + (add-to-list 'savehist-additional-variables 'corfu-history))) +#+end_src + +** Impostazione per l'uso del Package: dired +:PROPERTIES: +:ID: 030ddd93-aa42-4009-af1e-dc6e287de675 +:END: + +Emacs include un potente file manager integrato. Se ne parla a lungo in questo +video: [[https://protesilaos.com/codelog/2023-06-26-emacs-file-dired-basics/][Emacs: file and Dired basics]]. + +Le seguenti impostazioni definiscono alcune modifiche di base al comportamento +delle operazioni comuni di copia, ridenominazione ed eliminazione dei file. + +La visualizzazione predefinita di =Dired= contiene molti dettagli (la +configurazione completa). Utilizziamo =dired-hide-details-mode= per +nasconderli. È possibile attivarli/disattivarli in qualsiasi momento con =M-x +dired-hide-details-mode=, che è associato al tasto =(= nei buffer di Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load dired package + (use-package dired + :ensure nil + :commands (dired) + :hook + ((dired-mode . dired-hide-details-mode) + (dired-mode . hl-line-mode)) + :config + (setq dired-recursive-copies 'always) + (setq dired-recursive-deletes 'always) + (setq delete-by-moving-to-trash t) + (setq dired-dwim-target t)) +#+end_src + +Il pacchetto =dired-subtree= fornisce comandi per visualizzare rapidamente il +contenuto di una cartella utilizzando il tasto =TAB=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + (use-package dired-subtree + :ensure t + :after dired + :bind + ( :map dired-mode-map + ("" . dired-subtree-toggle) + ("TAB" . dired-subtree-toggle) + ("" . dired-subtree-remove) + ("S-TAB" . dired-subtree-remove)) + :config + (setq dired-subtree-use-backgrounds nil)) +#+end_src + +** Impostazione per l'uso del Package: trashed +:PROPERTIES: +:ID: 985ba7a1-8185-4b9a-b5c6-b98ee3b5f70a +:END: + +In precedenza abbiamo configurato Dired per spostare i file eliminati nel +cestino di sistema. Il pacchetto =trashed= è quindi utile per fornire +un'interfaccia simile a Dired per quella cartella (funziona allo stesso modo di +Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + (use-package trashed + :ensure t + :commands (trashed) + :config + (setq trashed-action-confirmer 'y-or-n-p) + (setq trashed-use-header-line t) + (setq trashed-sort-key '("Date deleted" . t)) + (setq trashed-date-format "%Y-%m-%d %H:%M:%S")) +#+end_src +** Impostazione per l'uso del Package: savehist +:PROPERTIES: +:ID: 0f7172ff-ef2d-40b8-84b7-f0e66457720b +:END: + +Il pacchetto integrato savehist tiene traccia degli input dell'utente e li +memorizza tra una sessione e l'altra. In questo modo, l'utente vedrà sempre le +sue ultime scelte in cima all'elenco (come con =M-x=). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load savelist package + (use-package savehist + :ensure nil ; it is built-in + :hook (after-init . savehist-mode)) +#+end_src + +I prompt del minibuffer possono avere una propria cronologia. In caso contrario, +condividono una cronologia comune degli input dell'utente. Emacs tiene traccia +di questa cronologia nella sessione corrente, ma la perde non appena la +chiudiamo. Con =savehist-mode= abilitata, tutte le cronologie del minibuffer +vengono scritte in un file e ripristinate al successivo avvio di Emacs. + +Le storie sono utili in due modi: +- Le scelte più recenti compaiono in cima alla lista, così possiamo trovarle più + facilmente. +- I comandi =M-p= (=previous-history-element=) e =M-n= (=next-history-element=) + nel minibuffer saranno utili subito dopo il ripristino di Emacs (tutti i miei + pacchetti sfruttano al meglio le cronologie del minibuffer per ogni prompt, + quindi =M-p= e =M-n= mostrano solo i valori rilevanti). + +Poiché stiamo già registrando la cronologia del minibuffer, possiamo istruirlo +=savehist-mode= a tenere traccia anche di variabili aggiuntive e a ripristinarle la +prossima volta che utilizziamo Emacs. Quindi =savehist-additional-variables=. + +Si noti che l'opzione utente =history-length= si applica a ciascuna variabile della +cronologia singolarmente: non riguarda tutte le cronologie nel loro complesso. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;;;; `savehist' (minibuffer and related histories) + (setq savehist-file (locate-user-emacs-file "savehist")) + (setq history-length 100) + (setq history-delete-duplicates t) + (setq savehist-save-minibuffer-history t) + (with-eval-after-load 'savehist + (add-to-list 'savehist-additional-variables 'kill-ring)) + (savehist-mode 1) +#+end_src + +** Impostazioni per l'uso delle dynamic abbreviations M-/ :@ToReview: +:PROPERTIES: +:ID: d66bda07-4362-43fb-bfb0-45279cb3dab4 +:END: + +Il pacchetto integrato =dabbrev= fornisce un metodo di completamento del testo +che legge il contenuto di un buffer ed espande il testo davanti al cursore per +trovare possibili candidati. Questo viene fatto con =M-/= (=dabbrev-expand=) che +è ciò che uso più spesso per eseguire i completamenti in buffer. + +Mi piace =dabbrev= perché è minimalista. Non genera popup né influisce sul +layout della finestra, permettendomi di concentrarmi su ciò che sto +facendo. Vorrei che avesse una funzione che consentisse di avviarlo e, in +qualsiasi momento, richiedere una presentazione completa in minibuffer di ciò +che sta cercando di trovare, invece di scorrere i candidati ripetutamente +=M-/=. Certo, di solito non scorro in questo modo, dato che in genere digito +abbastanza da trovare una corrispondenza esatta o essere a un =M-/= passo da +essa. + +Oltre al =dabbrev-expand= comando, abbiamo =dabbrev-completion=. Non lo uso +perché non mi sembra naturale, mentre scrivo, fermarmi, controllare il +minibuffer per vedere se c'è del testo, selezionarlo e tornare a scrivere. Forse +questo dipende dal fatto che ho uno stile di scrittura senza interruzioni e +senza tornare immediatamente indietro a modificare ciò che ho scritto (a meno +che non stia facendo una dimostrazione, in cui lo spettatore deve seguire). + +Il termine =dabbrev= sta per “dynamic abbreviations”. Emacs ha anche +[[id:3d430319-6637-4724-ab6b-d2960f279ce8][abbreviazioni statiche]] definite dall’utente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;;;; `dabbrev' (dynamic word completion (dynamic abbreviations)) + (setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_") + (setq dabbrev-abbrev-skip-leading-regexp "[$*/=~']") + (setq dabbrev-backward-only nil) + (setq dabbrev-case-distinction 'case-replace) + (setq dabbrev-case-fold-search nil) + (setq dabbrev-case-replace 'case-replace) + (setq dabbrev-check-other-buffers t) + (setq dabbrev-eliminate-newlines t) + (setq dabbrev-upcase-means-case-search t) + (setq dabbrev-ignored-buffer-modes '(archive-mode image-mode docview-mode pdf-view-mode)) +#+end_src + +** Impostazioni per l'uso delle static abbreviations :@ToReview: +:PROPERTIES: +:ID: 3d430319-6637-4724-ab6b-d2960f279ce8 +:END: + +[Vedi articolo/video relativo: [[https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/][Emacs: abbreviations with abbrev-mode]]] + +A differenza delle [[id:d66bda07-4362-43fb-bfb0-45279cb3dab4][abbreviazioni dinamiche]] che dipendono dal testo già +disponibile in un buffer, possiamo definire abbreviazioni che si espandono +sempre in base a quanto specificato. + +Le abbreviazioni, o il =abbrev= meccanismo, sono stringhe di caratteri che, una +volta digitate, vengono sostituite da un'altra stringa. Ad esempio, se voglio +digitare l'URL del mio sito web, inserisco mewebe continuo a digitare. Emacs +espanderà quella parola in https://protesilaos.com. + +A meno che tu non stia documentando la funzione della tua abbreviazione o che tu +abbia abbreviazioni facili da digitare in modo errato, non avrai mai bisogno di +dire a Emacs di non espandere l'input fornito. Tieni presente che il comando +=unexpand-abbrev= è disponibile se ne hai bisogno. Ho dovuto usarlo nel paragrafo +precedente per digitare prima l'abbreviazione che ho usato come esempio. + +Allo stesso modo, possiamo espandere un'abbreviazione ovunque con il comando +=expand-abbrev=, anche se normalmente non è necessario farlo perché avviene +automaticamente mentre digitiamo. + +Emacs gestisce in modo intelligente la definizione e l'utilizzo delle +abbreviazioni. Ogni modalità principale ha la sua tabella di abbreviazioni, alla +quale aggiungiamo le nostre definizioni. Quando ci troviamo in un buffer che +utilizza quella modalità principale, otteniamo l'accesso alle abbreviazioni +corrispondenti. In =global-abbrev-table= è disponibile anche un'opzione per le +abbreviazioni. In caso di conflitto tra una tabella specifica per la modalità +principale e quella globale, la prima ha la precedenza. Inoltre, le tabelle di +abbreviazioni seguono lo stesso principio di ereditarietà delle modalità +principali in generale, il che significa che una modalità come Org erediterà +l'opzione =text-mode-abbrev-table= perché =org-mode= deriva da =text-mode=. Le +tabelle di abbreviazioni sono quindi coerenti con il funzionamento di hook e +mappature di tasti in termini di precedenza ed ereditarietà. + +Come noterai più avanti, utilizzo la =prot-emacs-abbrev= macro per semplificare la +definizione di queste abbreviazioni. La maggior parte delle mie abbreviazioni +sono semplici modifiche alla maiuscola/minuscola. Tieni presente, tuttavia, che +il meccanismo sottostante è potente e può valutare codice Elisp arbitrario (ci +ho giocato un po', anche se non uso template e quindi non ne ho un reale +bisogno, ma funziona). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; - ;;;; `abbrev' (Abbreviations, else Abbrevs) + ;; - ;; message-mode derives from text-mode, so we don't need a separate + ;; - ;; hook for it. + ;; - (prot-emacs-hook + ;; - (text-mode-hook prog-mode-hook git-commit-mode-hook) + ;; - abbrev-mode) + ;; - + ;; - (setq only-global-abbrevs nil) + ;; - + ;; - (prot-emacs-abbrev global-abbrev-table + ;; - "csico" "CSiCo" + ;; - ";home" "~" + ;; - ";tilde" "~") + ;; - + ;; - (prot-emacs-abbrev text-mode-abbrev-table + ;; - "asciidoc" "AsciiDoc" + ;; - "auctex" "AUCTeX" + ;; - "cafe" "café" + ;; - "cliche" "cliché" + ;; - "clojurescript" "ClojureScript" + ;; - "emacsconf" "EmacsConf" + ;; - "github" "GitHub" + ;; - "gitlab" "GitLab" + ;; - "javascript" "JavaScript" + ;; - "latex" "LaTeX" + ;; - "libreplanet" "LibrePlanet" + ;; - "linkedin" "LinkedIn" + ;; - "paypal" "PayPal" + ;; - "sourcehut" "SourceHut" + ;; - "texmacs" "TeXmacs" + ;; - "typescript" "TypeScript" + ;; - "visavis" "vis-à-vis" + ;; - "deja" "déjà" + ;; - "voila" "voilà" + ;; - "youtube" "YouTube" + ;; - ";up" "🙃" + ;; - ";uni" "🦄" + ;; - ";laugh" "🤣" + ;; - ";smile" "😀" + ;; - ";sun" "☀️") + ;; - + ;; - ;; Allow abbrevs with a prefix colon, semicolon, or underscore. I demonstrated + ;; - ;; this here: . + ;; - (abbrev-table-put global-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)") + ;; - + ;; - (with-eval-after-load 'text-mode + ;; - (abbrev-table-put text-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - (with-eval-after-load 'org + ;; - (prot-emacs-abbrev org-mode-abbrev-table + ;; - ";dev" "}" + ;; - ";key" #'prot-abbrev-org-macro-key + ;; - ";cmd" #'prot-abbrev-org-macro-key-command) + ;; - (abbrev-table-put org-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - ;; Because the *scratch* buffer is produced before we load this, we + ;; - ;; have to explicitly activate the mode there. + ;; - (when-let* ((scratch (get-buffer "*scratch*"))) + ;; - (with-current-buffer scratch + ;; - (abbrev-mode 1))) + ;; - + ;; - ;; By default, abbrev asks for confirmation on whether to use + ;; - ;; `abbrev-file-name' to save abbrevations. I do not need that, nor + ;; - ;; do I want it. + ;; - (remove-hook 'save-some-buffers-functions #'abbrev--possibly-save) +#+end_src + + +* \to File di configurazione di org-mode: *org-init.el* :@ToReview: +:PROPERTIES: +:ID: 3a5bad5e-b492-4459-b863-ee15421eb5d8 +:END: + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:0ab89109-24cb-445a-a913-e575bfb42a16][qui]]. + +Nella [[https://orgmode.org/org.html#Installation][guida di installazione]] di org è indicato che aggiornarlo durante l'uso +potrebbe comprometterlo. Per evitarlo l'aggiornamento lo tengo manuale secondo +questa procedura: +- chiudere emacs +- avviare emacs (magari in debug) +- nel buffer (non aprire nessun altro buffer) scratch inserie il seguente codice + e valutarlo con il comando =C-j= o dal menu: + #+begin_src emacs-lisp :tangle no :results none + ;; aggiorno org: + ;; - prima aggiorna le definizioni dei pacchetti + ;; - infine aggiorna l'installazione di org + (progn (package-refresh-contents) (package-upgrade 'org)) + #+end_src +- riavviare emacs e verificare la versione di org + +** Attivazione di org +:PROPERTIES: +:ID: 71af7f69-5c51-4f36-85f9-d50d5b6bd2ad +:END: + +Dal sito di riferimento di org: [[https://orgmode.org/][orgmode.org]] ricavo l'abilitazione del pacchetto: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Installazione + (use-package org + :ensure t) + ;; + ;; Imposto OrgMode come default per i file '*.org' e '*.org_archive' + (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\)$" . org-mode)) + ;; + ;; Attivazione pacchetto + (require 'org) +#+end_src + +** Impostazione per formato di default dei file: UTF-8 +:PROPERTIES: +:ID: dc2254e1-3881-4e5d-a153-9b1a6738599a +:END: + +Oltre a quanto fatto [[id:d61b5760-4393-403d-a169-0d9da94db50a][prima]] imposto nello specifico il formato UTF8 per i file +org: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; default coding system UTF-8 + (setq org-export-coding-system 'utf-8) + (setq default-process-coding-system '(utf-8-unix . utf-8-unix)) +#+end_src + +** Imposto la visibilità iniziale di default: +:PROPERTIES: +:ID: e51a0604-d2d1-486e-ad56-20103e765ebd +:END: + +Imposto la visibilità iniziale a tutto ragruppato per velocizzare la vista +dall'alto. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Visibilità iniziale: tutto ragruppato + (setq org-startup-folded t) +#+end_src + +Questo comportamento generale, si può modificare per ciascun file e per ciascun +header come esplicitato nei seguenti paramgrafi: + +*** Opzione STARTUP +:PROPERTIES: +:ID: a7ee76d6-6600-48f2-80a4-b641d9b711ce +:END: + +Per cambiare il raggruppamento iniziale, di un intero file, utilizzare +sull'opzione *STARTUP* uno dei seguenti valori: +- overview :: Mostra solo i titoli di primo livello (tutto il resto è + raggruppato). +- content :: Mostra tutti i titoli di tutti i livelli, ma nasconde il testo. +- nofold o showall :: Mostra tutto il file completamente espanso (testo + incluso). +- show2levels fino a show5levels :: Espande i titoli fino al livello numerato + indicato. +- showeverything :: Mostra assolutamente tutto, inclusi i cassetti nascosti + (drawers). + +Mentre per la visibilità dei singoli headline, si utilizza il parametro +*VISIBILITY* + +*** Parametro VISIBILITY +:PROPERTIES: +:ID: df2a6f58-5a41-4a47-a0cf-70ff934db8d4 +:END: + +Per cambiare la visibilità iniziale di un headline si utilizza la propietà +*VISIBILITY*: +- folded :: Mantiene il titolo completamente raggruppato (utile se il resto del + file è impostato per aprirsi espanso). +- children :: Mostra solo i sotto-titoli diretti di quel livello, ma nasconde il + loro testo interno e i sotto-titoli ancora più profondi. +- content :: Mostra tutti i sotto-titoli di qualsiasi livello appartenenti a + quel ramo, ma nasconde tutto il testo. +- all :: Espande completamente l'intero ramo (mostra tutti i sotto-titoli e + tutto il testo). + +Questa va a sovrascrivere l'eventuale impostazione fatta a livello di file con +l'opzione *STARTUP* o quella generale. + +** KeyBinding :@Missing:@ToReview: +:PROPERTIES: +:ID: 25b3bfad-98e3-4f30-9ecb-89323e8e263b +:END: + +*** Funzioni generali: +:PROPERTIES: +:ID: 0c1d8fea-d006-41da-a185-5c4505298c54 +:END: + +Impostiamo alcuni dei key binding di default: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;;(global-set-key (kbd "C-c l") 'org-store-link) + (global-set-key (kbd "C-c a") 'org-agenda) + (global-set-key (kbd "C-c c") 'org-capture) +#+end_src + +*** Tasti funzione: :@ToReview: +:PROPERTIES: +:ID: 505d9c55-8ba2-45b0-964b-edc3f9e2e9e0 +:END: + +Analisi dei tasti funzioni disponibili: + +| Key | Binding originale | My Bingind | +|-----------+------------------------------+---------------------------------------| +| | Divide schermo verticalmente | | +| S- | Divide schermo verticalmente | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Show Help | | +| S- | Show Help | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Defining kbd macro... | | +| S- | Defining kbd macro... | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Excute macro | | +| S- | ??? | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | Visualizza tutto | +| S- | Non Definito | Visualizza solo ramo attuale | +| C- | Non Definito | Nascondi ramo attuale | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Passa il focus al menu | | +| S- | Passa il focus al menu | | +| C- | Passa il focus al sottomenu | | +| M- | Vista Intero/Finestra | | +|-----------+------------------------------+---------------------------------------| +| | Vista Intero/Finestra | Vis. dove c'è il clock attivo | +| S- | Vista Intero/Finestra | Fa partire il clock di timing | +| C- | Non Definito | Termina il clock di timing | +| M- | Non Definito | ex Org manage per navigare fra i file | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | Apre agenda (C-c a) | +| S- | Non Definito | Aprire subito Trash.org | +| C- | Non Definito | Aprire subito InBox.org | +| M- | Non Definito | Aprire subito Mrk.org | +| C-S- | Non Definito | Pubblicazione file org | +|-----------+------------------------------+---------------------------------------| + +Cioè voglio queste funzionalità: +- *F9* - /Visibilità/ - per la visibilità sul file +- *F11* - /Loggin Work/ - per la gestione del log dei tempi +- *F12* - /Navigazione/ - per la navigazione fra i file (e la pubblicazione per compatibilità) + +Questi binding vengono quindi così configurati: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Key F9 dedicato alle viste + (global-set-key (kbd "") 'widen) + (global-set-key (kbd "C-") 'MRK/hide-other) + (global-set-key (kbd "S-") 'narrow-to-region) + ;; Key F11 dedicato ai timer + (global-set-key (kbd "") 'org-clock-goto) + (global-set-key (kbd "C-") 'org-clock-in) + (global-set-key (kbd "S-") 'org-clock-out) + ;; (global-set-key (kbd "M-") 'org-manage ) + ;; Key F12 dedicato ai file + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd "S-") (lambda() (interactive)(find-file "~/Doc/Trash/Trash.org"))) + (global-set-key (kbd "C-") (lambda() (interactive)(find-file "~/Doc/Org/InBox.org"))) + (global-set-key (kbd "M-") (lambda() (interactive)(find-file "~/Doc/Org/Private/MRK.org"))) + (global-set-key (kbd "C-S-") 'MRK/save-then-publish) +#+end_src + +**** To Review: +:PROPERTIES: +:ID: c228fc57-6d02-4e38-9fff-42b8102958cb +:END: + + Verificare come posso sfruttare i segnalibri per navigare fra i file: + : C-x r m bookmark-set Imposta un segnalibro. Utile nelle ricerche + : C-x r b bookmark-jump Salta ad un segnalibro. + + Come riepilogato nella [[https://www.emacswiki.org/emacs/BasicNarrowing][wiki]] i comandi base per narrowing/widen (narrow=stringere + widen=allargare) in emacs sono: + - C-x n n /narrow-to-region/ :: Visualizza solo il testo selezionato, e nasconde + tutto il resto. + - C-x n w /widen/ :: Visualizza tutto il testo del buffer + - C-x n p /narrow-to-page/ :: Visualizza solo il testo dal cursore a fine pagina. + - C-x n d /narrow-to-defun/ :: Visualizza solo il testo tramite le [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Defuns.html#Defuns][Defun]]. + Naturalmente il testo nascosto non è più accessibile per le modifiche dal buffer + fino a che non si rivisualizza (widen) però rimane gestito, quindi salvando il file + lo mantiene ecc... + + Org-mode ha i seguenti modi per cambiare la visibilità del testo nel buffer: + - C-c / /org-sparse-tree/ :: This prompts for an extra key to select a sparse-tree + creating command. + + + + Impostiamo il tasto F11 per iteragire con i timer ed il log delle ore e quindi + devo pensare a come fare le seguenti cose: + - avviare il log del task: Clock in + - fermare un log del task: Clock out + - fare il report dei log: ? + - stimare il tempo di un task + - modificare la stima di un task + - mostrare stima e log di un task in forma colonne + - navigare fra i task loggati (la ring relativa) + + + + + Mentre imposto anche questi miei key binding custom: + #+begin_src emacs-lisp :tangle no + ;; Vecchio binding solo per reference: + ;;(global-set-key (kbd "") 'org-agenda) + ;;(global-set-key (kbd "") 'bh/org-todo) + ;;(global-set-key (kbd "") 'bh/widen) + ;;(global-set-key (kbd "") 'bh/set-truncate-lines) + ;;(global-set-key (kbd "") 'org-cycle-agenda-files) + ;;(global-set-key (kbd " ") 'bh/show-org-agenda) + ;;(global-set-key (kbd " b") 'bbdb) + ;;(global-set-key (kbd " c") 'calendar) + ;;(global-set-key (kbd " f") 'boxquote-insert-file) + ;;(global-set-key (kbd " g") 'gnus) + ;;(global-set-key (kbd " h") 'bh/hide-other) + ;;(global-set-key (kbd " n") 'bh/toggle-next-task-display) + ;;(global-set-key (kbd " I") 'bh/punch-in) + ;;(global-set-key (kbd " O") 'bh/punch-out) + ;;(global-set-key (kbd " o") 'bh/make-org-scratch) + ;;(global-set-key (kbd " r") 'boxquote-region) + ;;(global-set-key (kbd " s") 'bh/switch-to-scratch) + ;;(global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + ;;(global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + ;;(global-set-key (kbd " v") 'visible-mode) + ;;(global-set-key (kbd " l") 'org-toggle-link-display) + ;;(global-set-key (kbd " SPC") 'bh/clock-in-last-task) + ;;(global-set-key (kbd "C-") 'previous-buffer) + ;;(global-set-key (kbd "M-") 'org-toggle-inline-images) + ;;(global-set-key (kbd "C-x n r") 'narrow-to-region) + ;;(global-set-key (kbd "C-") 'next-buffer) + ;;(global-set-key (kbd "") 'org-clock-goto) + ;;(global-set-key (kbd "C-") 'org-clock-in) + ;;(global-set-key (kbd "C-") 'MRK/save-then-publish) + #+end_src + +** Tasks and States :@Missing:@ToReview: +:PROPERTIES: +:ID: 9d0866dc-6d43-416b-829e-3959e3f0eef7 +:END: + +Imposto come parole chiavi per i ToDo i seguenti codici: +| key | Descr | +|---------+--------------------------| +| TODO | Task da fare | +| NEXT | Task in esecuzione | +| DONE | Task terminato | +| WAITING | Task in attesa | +| HOLD | Task Bloccato | +| ABORT | Task Abortito(Cancellato | +| PHONE | Telefonata | +| MEETING | Meeting | + +e corrisponde al seguente schema: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_task_states.png :cache yes :tangle no + title Task States + [*] -> TODO + TODO -> NEXT + TODO -> DONE + NEXT -> DONE + DONE -> [*] + TODO --> WAITING + WAITING --> TODO + NEXT --> WAITING + WAITING --> NEXT + HOLD --> CANCELLED + WAITING --> CANCELLED + CANCELLED --> [*] + TODO --> HOLD + HOLD --> TODO + TODO --> CANCELLED + TODO: t + NEXT: n + DONE: d + WAITING:w + note right of WAITING: Note records\nwhat it is waiting for + HOLD:h + note right of CANCELLED: Note records\nwhy it was cancelled + CANCELLED:c + WAITING --> DONE +#+end_src + +per le chiamate: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_phone_states.png :cache yes :tangle no + title Phone Call Task State + [*] -> PHONE + PHONE -> [*] +#+end_src + +per i meeting: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_meeting_states.png :cache yes :tangle no + title Meeting Task State + [*] -> MEETING + MEETING -> [*] +#+end_src + +Per ciacuno di essi, definisco anche la lettera di abbreviazione per +l'inserimento veloce + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Task keywords definitions: + (setq org-todo-keywords + (quote ( + (sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "ABORT(a@/!)" "PHONE" "MEETING") + ) + ) + ) +#+end_src + +Per ciascuna keyword posso personalizzare il faceplate, ma per ora non lo +faccio. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; - ;; Task keywords colour settings: + ;; - (setq org-todo-keyword-faces (quote ( + ;; - ("TODO" :foreground "red" :weight bold) + ;; - ("NEXT" :foreground "blue" :weight bold) + ;; - ("DONE" :foreground "forest green" :weight bold) + ;; - ("WAITING" :foreground "orange" :weight bold) + ;; - ("HOLD" :foreground "magenta" :weight bold) + ;; - ("ABORT" :foreground "forest green" :weight bold) + ;; - ("MEETING" :foreground "forest green" :weight bold) + ;; - ("PHONE" :foreground "forest green" :weight bold) + ;; - ))) +#+end_src + +Ai tipi di ToDo, associo anche in modo automatico dei tag per facilitare filtri +o ricerche: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Triggers that automatically assign tags to tasks based on state changes: + (setq org-todo-state-tags-triggers (quote ( + ("ABORT" ("ABORT" . t)) + ("WAITING" ("WAITING" . t)) + ("HOLD" ("WAITING") ("HOLD" . t)) + (done ("WAITING") ("HOLD")) + ("TODO" ("WAITING") ("ABORT") ("HOLD")) + ("NEXT" ("WAITING") ("ABORT") ("HOLD")) + ("DONE" ("WAITING") ("ABORT") ("HOLD")) + ))) +#+end_src + +Abilito la selezione veloce delle keyword tramite il comando +: C-c C-t Keyword + +Inoltre abilito lo switch fra le keyword tramite i comandi +: S-left +: S-right + +senza però che si attivino le annotazioni automatiche. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Fast todo selection allows changing from any task todo state to any other state directly by selecting the appropriate key from the fast todo selection key menu. + ;; The relative command is: C-c C-t KEY where KEY is the appropriate fast todo state selection key as defined in org-todo-keywords. + (setq org-use-fast-todo-selection t) + ;; + ;; Cycles through the todo states with S-left and S-right, but skips setting timestamps and entering notes + (setq org-treat-S-cursor-todo-selection-as-state-change nil) +#+end_src + +** Tags :@Missing: +:PROPERTIES: +:ID: 85effced-97fd-4e2f-ac89-3e16a4931461 +:END: + +Imposto i tag generali in uso + +** Setup org-capture :@Missing: +:PROPERTIES: +:ID: ad8d08bc-66b4-4f16-b8c2-d5478a77ac4b +:END: + +Imposto i form di cattura veloce + +Per ora uso quelli di default. Da approfondire anche la modalità a promt in cui +chiede via via le info da riportare sul template. + +Per ora ho approfondito questi template: +- Journal :: per fare una nuova entry sul ramo =Journal= del file InBox.org. + + In particolare: + - Come struttura del ramo, utilizzo la divisione mensile + - Abilito il clocking in modo da tenere traccia di quanto ci metto + inserirla. =@ToReview= devo integrare la funzione che elimina i logbook con + tempi sotto al minuto per evitare dispersione. + - Nell'ultima riga inserisco fra parentesi quadre il timestamp di quando è + creata l'entry. Non mostro più i link da dove è stata fatta perchè no so se + li userò mai, e attualmente mi danno problemi nell'esportazione. Cioè + utilizzo =[ Entered on %U ]= invece che la completa =[ Entered on %U from + %i\n%a ]]=. + +La configurazione complessiva è quindi: +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (setq org-capture-templates + '( + ("n" "Note" + entry (file+headline "~/Doc/Org/InBox.org" "Notes") + "* %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :empty-lines-before 1 + :empty-lines-after 0 + ) + + ("t" "Todo" + entry (file+headline "~/Doc/Org/InBox.org" "Tasks") + "* TODO %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :empty-lines-before 1 + :empty-lines-after 0 + ) + + ("j" "Journal" + entry (file+datetree "~/Doc/Org/InBox.org" "Journal") + "* %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :tree-type month ; day week month list + :empty-lines 0 + ) + + ) + ) +#+end_src + +** Refil :@Missing: +:PROPERTIES: +:ID: 2ddc606d-7a12-488c-9237-462c76e115c7 +:END: + +Imposto il refill per ricollocare al volo gli header. + +;; ** Correzione Refil: +;; Il refil non funziona più, non mi permette di cambiare file, per ovviare, ho visto il +;; sito [[https://blog.aaronbieber.com/2017/03/19/organizing-notes-with-refile.html][Organizing Notes With Refile]] che mi dà questa ocnfigurazione: +;; #+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" +;; ;; I want to be able to move a node to any of my agenda files, +;; ;; and I also want to consider nodes up to three levels deep. +;; (setq org-refile-targets '((org-agenda-files :maxlevel . 3))) +;; ;; Refile to the Top Level +;; (setq org-refile-use-outline-path 'file) +;; ;; But, if you use Helm, which you really should, you will notice that as soon +;; ;; as you set this option, your target list contains only one filename. Typing +;; ;; to complete may allow you to find another filename within your agenda files, +;; ;; but you will only ever see a filename; no other headings ever appear! +;; ;; Why is that?! +;; ;; It took a bit of searching to find this solution. This is because the +;; ;; default behavior for Refile is to allow you to do a step-by-step completion +;; ;; of this path, but if you’re using Helm, Helm is overriding the completing +;; ;; read to make it into a narrowing list (that we have all come to love). +;; ;; So what you need to do is tell Org that you don’t want to complete in steps; +;; ;; you want Org to generate all of the possible completions and present them at +;; ;; once. Helm then lets you narrow to the one you want. +;; (setq org-outline-path-complete-in-steps nil) +;; ;; Creating New Parents +;; (setq org-refile-allow-creating-parent-nodes 'confirm) +;; #+end_src +;; Altro sito interessante, che ho trovato dopo: [[https://yiming.dev/blog/2018/03/02/my-org-refile-workflow/][My org-refile workflow]] + +** org-protocol :@Missing: +:PROPERTIES: +:ID: ce081403-fafc-4288-bcd5-0bdbb12b389b +:END: + +Imposto org protocol per interagire con altri programmi + +** Agenda :@Missing: +:PROPERTIES: +:ID: 7d3d32f2-8708-4d1e-bbe1-0b12223eec3b +:END: + +[ In realtà voglio cambiar emetodo ed usare Inbox per tutto fino a quando posso +archiviare un lavoro su apposito file clienti o personale. L'agenda avrà solo +file InBox ed eventualmente un file tipo diario o simile, mentre tutti i file +dedicati a lavori e personali non vanno in agenda, perchè hanno solo info +statiche. ] + +Per l'aggenda in primo acchitto utilizzo i file in cui lavoro, quindi utilizzerò +i file: +- Inbox.org: Per tutti i task su cui sto lavorando e che quindi avranno sicuramente + ToDo o lavori schedulati. +- Diary.org: Per tutti i task ripetitivi o prevedibili tipo compleanni o altro o + scadenze future (assicurazione, dividendi degli investimenti ecc...) +- KnowHow: Per tutti i file con le mie note, sopratutto per le ricerche in base ai tag +- Private: Per i miei lavori privati, in particolare prevedo vi saranno soprattutto + task ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. +- Work: Per i miei lavori, in particolare prevedo vi saranno soprattutto task + ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; File gestiti dall'agenda: + (if (boundp 'org-user-agenda-files) + (setq org-agenda-files org-user-agenda-files) + (setq org-agenda-files ( quote ( + "~/Doc/Org/Diary.org" + "~/Doc/Org/InBox.org" + "~/Doc/Org/KnowHow" + "~/Doc/Org/Private" + "~/Doc/Org/Work" + ) + ) + ) + ) +#+end_src + +** Time Clocking, Reporting, Tracking, Estimate :@Missing: +:PROPERTIES: +:ID: 0131267e-b953-4d6d-98a3-e537aae257d8 +:END: + +Dal manuale, si ricavano i seguenti comandi per la retentività dei clock: +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (setq org-clock-persist 'history) + (org-clock-persistence-insinuate) +#+end_src + +Voglio che il pulsante F9 sia dedicato al clock e quindi le varie comandi: +- org-clock-goto va al clock in corso (F9) + +** GTD stuff (Project & Archiving) :@Missing: +:PROPERTIES: +:ID: 28bc92a7-f8c7-4f63-86a9-784fb55c303a +:END: + +Imposto i set per usare GTD ed eventualmente projetile e treemacs + +** Reminders :@Missing: +:PROPERTIES: +:ID: 93a4b11c-616e-4bfd-bf48-963e33b1a4ae +:END: + +Imposto i remainder e come utilizzarli. + +** Publishing and Exporting :@ToReview: +:PROPERTIES: +:ID: 97c3d76c-138f-48e8-b698-fa3bbe74565c +:END: + +Impostazioni generali utili per l'esportazione (anche del singolo file): + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Alphabetical listing options need to be set before the exporters are loaded for filling to work correctly + (setq org-alphabetical-lists t) + ;; + ;; Explicitly load required exporters + (require 'ox-html) + (require 'ox-latex) + (require 'ox-ascii) + (require 'ox-md) + (require 'ox-texinfo) + ;; + ;; Imposto dove trovare Ditaa (Corretto il setup di Ditaa in base alla discussione del forum: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864) + (setq org-ditaa-jar-path "~/.MyCfg/emacs/AddOn/app/ditaa0_9.jar") + ;; + ;; Imposto dove trovare PlantUML (http://plantuml.sourceforge.net/faq.html) + (setq org-plantuml-jar-path "~/.MyCfg/emacs/AddOn/app/plantuml-1.2023.1.jar") +#+end_src + +Imposto Babel: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Org-babel Setup: + ;; + ;; Imposto di mostrare l'immagine: + (add-hook 'org-babel-after-execute-hook 'org-display-inline-images) + ;(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append) + ;; + ;; Make babel results blocks lowercase + (setq org-babel-results-keyword "results") + ;; + ;; Imposto quali linguaggi caricare: Per Problema a Ditaa sto studianto: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864 + (org-babel-do-load-languages + (quote org-babel-load-languages) + (quote ( + ; (asymptote . t) + ; (awk . t) + ; (C . t) + ; (calc . t) + ; (clojure . t) + ; (comint . t) + ; (core . t) + ; (csharp . t) + ; (css . t) + (ditaa . t) + (dot . t) + (emacs-lisp . t) + ; (eval . t) + ; (exp . t) + ; (fortran . t) + ; (gnuplot . t) + ; (haskell . t) + ; (io . t) + ; (java . t) + ; (js . t) + ; (keys . t) + ; (latex . t) + ; (ledger . t) + ; (lilypond . t) + ; (lisp . t) + ; (lob . t) + ; (makefile . t) + ; (matlab . t) + ; (maxima . t) + ; (mscgen . t) + ; (ocaml . t) + ; (octave . t) + (org . t) + ; (perl . t) + ; (picolisp . t) + (plantuml . t) + ; (python . t) + ; (R . t) + ; (ref . t) + ; (ruby . t) + ; (sass . t) + ; (scala . t) + ; (scheme . t) + ; (screen . t) + ; (sh . t) + ; (shell . t) + ; (shen . t) + ; (sql . t) + ; (sqlite . t) + ; (table . t) + ; (tangle . t) + ))) + ;; + ;; Do not prompt to confirm evaluation + ;; This may be dangerous - make sure you understand the consequences + ;; of setting this -- see the docstring for details + (setq org-confirm-babel-evaluate nil) + ;; + ;; Use fundamental mode when editing plantuml blocks with C-c ' + (add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental))) + ;; +#+end_src + +Altro sull'esportazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Inline images in HTML instead of producting links to the image + (setq org-export-html-inline-images t) + ;;; Disabilita la visualizzazione delle immagini per evitare errori nelle sessioni ssh + ;(setq org-startup-with-inline-images nil) + ;; + ;; Inline images in HTML instead of producting links to the image + (setq org-html-inline-images t) + ;; + ;; Do not use sub or superscripts - I currently don't need this functionality in my documents + ;(setq org-export-with-sub-superscripts nil) + ;; + ; ;; Usa foglio di stile locale: Preferisco caricarlo dal file template + ; (setq org-html-head-extra "") + ; (setq org-html-head-include-default-style nil) + ; ;; + ; ;; Do not generate internal css formatting for HTML exports + ; (setq org-export-htmlize-output-type (quote css)) + ;; + ;; Disabilita lo stile di default: + (setq org-export-html-style-include-default nil) + ;; + ;; Export with LaTeX fragments + (setq org-export-with-LaTeX-fragments t) + ;; + ;; For export to latex I use the following setting to get fontified listings from source blocks: + (setq org-export-latex-listings t) + ;; + ;; Fontify Latex listings for source blocks + (setq org-latex-listings t) + ;; + ;; Rimuovo l'header XML per problemi di compatibilità con open office + (setq org-html-xml-declaration (quote ( + ("html" . "") + ("was-html" . "") + ("php" . "\"; ?>") + ))) + ;; + ;; Permetto in automatico l'override delle variabili di personalizzazione dell'esportazione + (setq org-export-allow-BIND t) + ;; + ;; +#+end_src + +Infine definisco il progetto di esportazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Progetti per l'esportazione automatica: + ;; OrgData - Esportazione di tutti i file in OrgData + (setq org-publish-project-alist (quote ( + ;; Progetti nell'esportazione dei file Org: + ;; - orgFile are the org-files that generate the content + ;; - imgFile are images and css files that need to be included + ;; - OrgData is the top-level project that gets published + ("orgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :recursive t + :section_numbers nil + :table-of-contents nil + :base-extension "org" + :publishing-function org-html-publish-to-html + :auto-index t + :index-filename "Index.org" + :index-title "Indice del materiale Org-Mode" + :index-function org-publish-org-index + :author-info t + :creator-info t + :auto-sitemap t + :sitemap-filename "MySiteMap.org" + :html-head-extra "\n\n\n" + :sitemap-title "Indice del materiale esportato in html") + ("imgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt" + :publishing-function org-publish-attachment + :recursive t + :author nil) + ("OrgData" + :components ("orgFile" "imgFile")) + ))) +#+end_src + +*** Template per le esportazioni :@ToReview: +:PROPERTIES: +:ID: 06b5f61b-2c88-4a72-ad1b-124d1ba4db3c +:END: + +Oltre atutti gli altri template di esportazione, i più belli finora trovati sono: +- ToPrintStyle.css :: per esportare in html e poi stamparlo +- ox-twbs :: per esportare in un PDF elegante, sobrio e con il TOC laterale. + +;; ** Inserito ox-twbs: exporting to HTML with a Twitter Bootstrap theme +;; Da [[https://github.com/marsmining/ox-twbs][GITHub]] ricavato l'esporter per esportare i file org, come documenti HTML compatibili +;; con il [[http://getbootstrap.com/][Twitter Bootstrap]]. +;; #+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" +;; (use-package ox-twbs +;; :ensure t) +;; #+end_src + + + +;; Export org-mode theme +;; * Export org-mode theme +;; In ~/.MyCfg/emacs/templates inserisco le definizioni dei themi da utilizzare con +;; l'esportazione da org; mentre in ~/Pub/.Styles inserisco le relative risorse (css, js, +;; ecc...) che sono necessarie per caricare localmente il tema. Quando possibile mantengo +;; nelle definizioni sia il setup per i riferimenti locali (per mio utilizzo locale), sia +;; il setup con i riferimenti remoti in modo che il file sia visibile da tutti (per +;; utilizzo di altri). +;; +;; In particolare al 2020/04 ho impostato due themi principali, mentre al 2020/06 ho +;; introdotto altri themi, per arrivare ai seguenti che riassumo brevemente nella forma +;; locale: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; +;; ** Norang +;; Tema che ho ricavato dal sito [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/norang, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/norang. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang.org +;; +;; ** Org-HTML (Bigblow, ReadTheOrg) +;; +;; ** gongzhitaao.org +;; Stile semplice preso dal sito: https://gongzhitaao.org/orgcss/ tramite il link diretto: +;; [[https://gongzhitaao.org/orgcss/org.css][org.css]] e che dispone del repository: [[https://github.com/gongzhitaao/orgcss][GitHub]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/gongzhitaao.org, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/gongzhitaao.org. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao.org +;; +;; ** solarized-css +;; Dal sito [[http://thomasf.github.io/solarized-css/][solarized-css]] ([[https://github.com/thomasf/solarized-css][GitHub]]) ricavo un thema chiaro ed uno scuro che sembrano +;; promettenti: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/solarized-css, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/solarized-css. +;; +;; Per applicare, il thema chiaro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light.org +;; +;; Per applicare, il thema scuro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark.org +;; +;; ** thi.ng/org-spec +;; Dal sito https://github.com/thi-ng/org-spec ricavo un thema semplice ma con la TOC a +;; sinistra: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/thi.ng, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/thi.ng. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng.org +;; +;; ** org-html-themes (Bigblow e ReadTheOrg) +;; Vi sono più versioni, il reposity di [[https://github.com/fniessen/org-html-themes][fniessen]] è stato forkato da [[https://github.com/paulzql/org-html-themes][paulzql]] che io avevo +;; inizialmente preso a riferimento. Però questo è fermo al 2015, mentre fniessen è più +;; attivo e quindi faccio l'upgrade sperando che così risolva i piccoli errori riscontrati +;; nella toc laterale quando ho molte headline. +;; +;; *** Repository fniessen/org-html-themes +;; Sito di riferimento: [[https://github.com/fniessen/org-html-themes][GitHub]] +;; +;; *** Repository paulzql/org-html-themes +;; Sito di riferimento: [[https://github.com/paulzql/org-html-themes][GitHub]] +;; +;; Da questo sito, ho ricavato il reposity del 2020/04, ho copiato i file di setup in +;; ~/.MyCfg/emacs/templates/org-html-themes dopo aver corretto i riferimenti locali; le +;; risorse le ho copiate nella cartella C:\_Home\Pub\.Styles\org-html-themes-master. +;; +;; **** Bigblow +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow.setup +;; +;; Questo tema permette di utilizzare le seguenti abbreviazioni per navigare: +;; | Shortcut | What it does | +;; |----------+-----------------------------------| +;; | ? or h | Access the dashboard | +;; | n | Move to the next main heading | +;; | p | Move to the previous main heading | +;; | b | Scroll up | +;; | < | Scroll to top | +;; | > | Scroll to bottom | +;; | - | Collapse all | +;; | + | Expand all | +;; | r | Go to next task in list | +;; | R | Go to previous task in list | +;; | q | Stop reviewing the list of tasks | +;; | g | Reload the page | +;; |----------+-----------------------------------| +;; +;; **** ReadTheOrg +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg.setup + +** Custom function : +:PROPERTIES: +:ID: 8ec057af-778a-4a65-b5a7-4f68b2348386 +:END: + +*** MRK/save-then-publish +:PROPERTIES: +:ID: f1cacac0-0d4b-433f-8d81-992a5e0b72cf +:END: + +Funzione ricavata dall'esempio in [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] per: +- salvare tutti i buffer +- inserire per ciascun file la validazione dell'html +- richiamare per ciascuno l'esportazione in html +- infine richiamare la pubblicazione dell'intero progetto + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (defun MRK/save-then-publish (&optional force) + (interactive "P") + (save-buffer) + (org-save-all-org-buffers) + (let ( + (org-html-head-extra) + (org-html-validation-link "Validate XHTML 1.0") + ) + (org-publish-current-project force) + ) + ) +#+end_src + +*** MRK/hide-other +:PROPERTIES: +:ID: 77abf2b1-e72e-47cf-9efa-35b995a4a086 +:END: + +Funzione per aprire completamente il ramo in cui sono e ragruppare tutti gli altri. + +#+BEGIN_SRC emacs-lisp + (defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (hide-other) + (org-cycle) + (org-cycle) + ) + ) +#+end_src + +** Impostazione per l'uso del Package: buffer-to-pdf :@Disable: +:PROPERTIES: +:ID: a2394c39-24e4-4d3b-a33a-021577e17213 +:END: + +[ Nel test fatto, risponde come se avesse creato tutto senza errore, ma in +realtà non crea nulla. ] + +Dall'[[https://protesilaos.com/codelog/2026-05-02-emacs-buffer-to-pdf-new-package/][articolo]] di prot (vi è anche il relativo [[https://www.youtube.com/watch?v=JG4R-d0N-is][video]] e repository [[https://github.com/protesilaos/buffer-to-pdf][GitHub]]) mi +interessa esportare in pdf il buffer, rispettando ciò che si vede (il narrowin) +e quindi provo: + +#+begin_src emacs-lisp :tangle no + (use-package buffer-to-pdf + :ensure nil + :init + ;; Then upgrade it with the command `package-vc-upgrade' or `package-vc-upgrade-all'. + (unless (package-installed-p 'buffer-to-pdf) + (package-vc-install "https://github.com/protesilaos/buffer-to-pdf.git")) + :config + ;; Configure `buffer-to-pdf-directory' to specify where PDF files are stored. + ;; This is the default value: + (setq buffer-to-pdf-directory "~/Doc/Org/Pdf/")) +#+end_src + + +* \xi From Old version to review +** Esplicito fine esportazione + +Esplicito la fine delle esportazioni su ciascun file di configurazione per +essere sicuro che la seguent eparte da rivedere, non inserisca cose spurie. + + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + + + +** Correttore ortografico: :ToReview:Disable: + Dal sito [[https://github.com/nobiot/Zero-to-Emacs-and-Org-roam][nobiot/Zero-to-Emacs-and-Org-roam]] ho preso spunto per installare il correttore + ortografico Hunspell e in particolare ho scaricato la versione 1.7.0 e messa sulla + cartella "~/.MyCfg/emacs/AddOn/hunspell-1.7.0". Qui ho inoltre messo anche i dizionari + presi da quelli di libreoffice. Infine ho impostato emacs in questo modo: + #+begin_src emacs-lisp :tangle no + ;; Imposto l'italiano come lingua predefinita + (setenv "LANG" "it_IT") + ;; Indico dove trovare Hunspell + (setq ispell-program-name "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Bin/hunspell.exe") + ;; Indico che dizionario utilizzare. + ;; Se voglio cambiarlo devo ridare il comando con il dizionario che voglio utilizzare. + (setq ispell-local-dictionary "it_IT") + ;; Imposto il path dei dizionari + (setq ispell-hunspell-dict-paths-alist + '(("it_IT" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ("en_US" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_US.aff") + ("en_GB" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_GB.aff") + ("default" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ) + ) + #+end_src + Ora posso avviare il correttore sul file aperto tramite il comando: + : M-x ispell + + Come reference ho utilizzato anche i seguenti siti: + - [[http://blog.binchen.org/posts/what-s-the-best-spell-check-set-up-in-emacs/][What's the best spell check setup in emacs]] + - [[https://www.reddit.com/r/emacs/comments/dgj0ae/tutorial_spellchecking_with_hunspell_170_for/][Tutorial: spellchecking with hunspell (1.7.0) for emacs (26.2) on Windows (10)]] + +** Colorization :ToReview:Disable: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; use colorization for all modes + ;; ---> (global-font-lock-mode t) + #+end_src + +** Reload file nel buffer :Disable:ToReview:KeyBinding: + Per ricaricare il file sul buffer ed anullare tutte le modifiche fatte, si usa il + comando + : revert-buffer + Per comodità è utile bindarlo ad un tasto: + #+begin_src emacs-lisp :tangle no + ;; ---> (global-set-key (kbd "") 'revert-buffer) + #+end_src + +** Modes :Minor_Mode: + +*** IDO :ToReview:Disable: + Mode per avere i suggerimenti e l'autocompletazione nei menu e dei comandi. + + Diverso materiale ed informazioni si possono trovare in: + - [[https://www.emacswiki.org/emacs/InteractivelyDoThings][Ido from emacs wiki]] + - [[https://www.gnu.org/software/emacs/manual/html_mono/ido.html][Ido from gnu.org]] + + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Set ido (https://www.gnu.org/software/emacs/manual/html_mono/ido.html) + ;; ---> (setq ido-everywhere t) + ;; ---> (setq ido-enable-flex-matching t) + ;; ---> (ido-mode 1) + #+end_src + +*** Visual Basic Mode + Dal sito [[http://www.emacswiki.org/emacs/visual-basic-mode.el][Wiki]], si ricava come installare il "visual-basic-mode" che permette di editare + il visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/visu][visual-basic-mode.el]] e per farlo lo metto sul path + che carico di default all'avvio (vedi relativo #Add-AddOn paragrafo); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file (in automatico i file + li associo a "visual basic .net" e non a "visual basic 6"). + #+begin_src emacs-lisp :tangle no + ;; Carico il modo Visual Basic + ;(autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t) + (require 'visual-basic-mode) + ;; + ;; Associo il modo VB automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . visual-basic-mode)) auto-mode-alist)) + (require 'vbnet-mode) + #+end_src + +*** Visual Basic .NET mode + Dal sito [[http://www.emacswiki.org/emacs/VbDotNetMode][Wiki]], si ricava come installare il "vbnet-mode" che permette di editare il + visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/vbnet-mode.el][vbnet-mode.cs]] e per farlo lo metto sul path che + carico di default all'avvio (vedi relativo #Add-AddOn paragrafo); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file. + #+begin_src emacs-lisp :tangle no + ;; Carico il modo Visual Basic .Net + (autoload 'vbnet-mode "vbnet-mode" "Mode for editing VB.NET code." t) + ;; + ;; Associo il modo VBNet automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . vbnet-mode)) auto-mode-alist)) + #+end_src + +*** C#: csharp-mode +Da Stack Overflow: [[https://stackoverflow.com/questions/3954607/c-sharp-emacs-mode-questions-indentation-and-build][C# Emacs mode questions - indentation and build]] e successivamente dal +sito [[https://github.com/emacs-csharp/csharp-mode][GitHub csharp-mode]] ricavato i file [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-mode.el][csharp-mode.el]] e [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-compilation.el][csharp-compilation.el]] che +permettono di definire il csharp-mode utilizzabile direttamente nei blocchi org per avere +il codice con la colorazione sintattica. + +Da quanto visto, non serve linkare il linguaggio con babel, ma basta inserire i file negli +AddOn e caricare i rispettivi modi: + +#+begin_src emacs-lisp :tangle no + ;; ---> ;; ---> ;; Carico il path dei file lisp che definiscono il modo C#: + ;; ---> ;; ---> (add-to-list 'load-path (expand-file-name "~/.MyCfg/emacs/AddOn/elisp")) + ;; ---> ;; Attivo il modo per C# + ;; ---> (require 'csharp-mode) + ;; ---> ;; Vi assicio, di default, i file *.cs + ;; ---> (setq auto-mode-alist + ;; ---> (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + ;; ---> ;; Volendo posso definire la funzione di hook per impostarci una + ;; ---> ;; tabulazione predefinita valida in tutti i modi derivanti dal C: + ;; ---> (defun my-c-mode-common-hook () + ;; ---> (setq c-basic-offset 4) + ;; ---> (c-set-offset 'substatement-open 0) + ;; ---> ) + ;; ---> ;; Infine assegnare la funzione appena definita, all'hook: + ;; ---> (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) +#+end_src + +**** Obsoleto: + Dal sito [[https://code.google.com/p/csharpmode/][code.google]] e successivamente dal sito [[https://github.com/josteink/csharp-mode][GitHub]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/csharp-mode.el][csharp-mode.el]] + che permette di avere il csharp-mode per visualizzare il codice C# correttamente + colorato. + + Il file lo ho copiato nella directory che carico allo startup (vedi relativo + #Add-AddOn paragrafo); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Carico il modo C# + ;; ---> (autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t) + ;; ---> ;; + ;; ---> ;; Associo il modo C# automaticamente ai file *.cs + ;; ---> (setq auto-mode-alist (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + #+end_src + +** Power Shell mode :Disable:Obsolete: + Ricercando info per il vbnet-mode ho trovato il sito [[https://www.emacswiki.org/emacs/PowerShell][Wiki]] da cui si ricava il file + [[file:~/.MyTools/_MyUp/Lisp/PowerShell-Mode.el][PowerShell-Mode.el]] per gestire il vpowershell-mode + + Il file lo ho messo sulla cartella da cui carico, all'avvio, i file lisp esterni, + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Carico il modo PowerShell + ;; ---> (autoload 'powershell-mode "vpowershell-mode" "PowerShell Mode" t) + ;; ---> ;; Associo il modo automaticamente ai file *.?1?, *.?2? + ;; ---> ;(setq auto-mode-alist (append '(("\\.\\(?1?\\|?2?\\)$" . vpowershell-mode)) auto-mode-alist)) + #+end_src + + [2022-12-08 Thu] Nella revisione, si è visto che ora la modalità è compresa nel package + di emacs e quindi si può installare direttamente con i comandi: + : M-x package-install RET powershell RET + +** Packages :Package: + +*** Package: Swiper / Ivy / Counsel :ToReview:Disable: + Questo serve per estendere la funzione di search ed inoltre estende IDO, ma è da usare + in modo esclusivo (occorre disattivare IDO). Per ora non lo uso, ma merita di darci + un'occhiata. Si combina bene con HEM + + Permette di editare in contemporanea su più punti, autocompleta i comandi. ecc... + + Visto in Using Emacs Series [[https://www.youtube.com/watch?v=0mwwN0S1dnQ][Video 6]] e i siti di riferimento sono: [[https://melpa.org/#/swiper][Melpa]], [[https://github.com/abo-abo/swiper][GitHub]] + #+begin_src emacs-lisp :tangle no + ;; ---> ;; it looks like counsel is a requirement for swiper + ;; ---> (use-package counsel + ;; ---> :ensure t + ;; ---> ) + ;; ---> ;; + ;; ---> (use-package swiper + ;; ---> :ensure try + ;; ---> :config + ;; ---> (progn + ;; ---> (ivy-mode 1) + ;; ---> (setq ivy-use-virtual-buffers t) + ;; ---> (global-set-key "\C-s" 'swiper) + ;; ---> (global-set-key (kbd "C-c C-r") 'ivy-resume) + ;; ---> (global-set-key (kbd "") 'ivy-resume) + ;; ---> (global-set-key (kbd "M-x") 'counsel-M-x) + ;; ---> (global-set-key (kbd "C-x C-f") 'counsel-find-file) + ;; ---> (global-set-key (kbd " f") 'counsel-describe-function) + ;; ---> (global-set-key (kbd " v") 'counsel-describe-variable) + ;; ---> (global-set-key (kbd " l") 'counsel-load-library) + ;; ---> (global-set-key (kbd " i") 'counsel-info-lookup-symbol) + ;; ---> (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) + ;; ---> )) + #+end_src + +*** Package: ox-Reveal :ToReview:Disable: + Permette di generare da org delle presentazioni web tramite lo script [[https://github.com/hakimel/reveal.js/][reveal.js]] + + Siti di riferimento: [[https://melpa.org/#/ox-reveal][Melpa]], [[https://github.com/yjwen/org-reveal][GitHub]] si capisce che: + - tramite la variabile org-reveal-root si indica quale [[https://github.com/hakimel/reveal.js/][reveal.js]] utilizzare (locale o + web) + - org-reveal-mathjax permette di abilitare equazioni LaTex + + Per il tutto ho preso spunto da Using emacs series [[https://www.youtube.com/watch?v=psDpCpcIVYs][Video 11]] + #+begin_src emacs-lisp :tangle no + ;; ---> (use-package ox-reveal + ;; ---> :ensure ox-reveal) + ;; ---> (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/") + ;; ---> (setq org-reveal-mathjax t) + #+end_src + + Il tutto sembra non funzionare, se confronto la pagina html generata da me con quella + dell'esempio dal [[https://www.youtube.com/watch?v=psDpCpcIVYs][sito]] si vede che io inserisco la linea: + : + mentre nell'esempio si ha: + : + : + Quindi sulla mia esportazione manca il codice: + : + + Alcune informazioni utili su come utilizzarlo anche in locale sono presenti + sull'articolo sul portale opensource: + [[https://opensource.com/article/18/2/how-create-slides-emacs-org-mode-and-revealjs][How to create slides with Emacs Org mode and Reveal.js]] + +*** Package: Yasnippet + Permette di inserire testi tramite abbreviazioni e poi tab, estende quindi le + funzionalità base di emacs. I vari sniptes si possono personalizzare a piacere. + + Siti di riferimento: [[https://melpa.org/#/yasnippet][Melpa]], [[https://github.com/joaotavora/yasnippet][GitHub]], [[http://joaotavora.github.io/yasnippet/][Manual]] + #+begin_src emacs-lisp :tangle no + (use-package yasnippet + :ensure t + :init + (yas-global-mode 1)) + #+end_src + +*** Package: Magit :ToReview:Disable: + I siti di riferimento sono: [[https://magit.vc/][magit.vc]], [[https://github.com/magit/magit][GitHub]], [[https://www.emacswiki.org/emacs/Magit][emacswiki]] + +*** - : org-manage: :ToReview: + Dal sito [[https://github.com/dmgerman/org-manage][github]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/org-manage.el][org-manage.el]] che permette di avere un riepilogo dei + file org. Il file lo ho copiato nella directory che carico allo startup (vedi relativo + #Add-AddOn paragrafo); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; Installo il pacchetto necessario: + (require 'ctable) + ;; Installo il pacchetto vero e propio: + (require 'org-manage) + ;; Inizializzo org-manage indicando la cartella da scansionare per i file org: + (setq org-manage-directory-org "~/Doc/Org") + ;; Ora basta richiamare la funzione: + ;; M-x org-manage + ;; o usare il bind 'Alt+F11' + #+end_src + Con la versione 28 di emacs, questo non funziona più, in particolare dà errore + #+begin_comment + ... remove-duplicates ... + #+end_comment + per risolverlo, ho dovuto cambiare il comando lisp 'remove-duplicates' che non è più + supportato, con il comando 'seq-uniq' + + Inoltre si ha un problema con la funzione org-manage che non definisce bene il Hook al + click e quindi quando clicco non mi porta al file corretto. Se invece copio la funzione + sul buffer scratch e la valuto con C-j o C-M-q, poi funziona correttamente. + +*** TODO Trovare come bypassare/risolvere il problema al Click +Servirebbe fare un eval automatico della funzione dopo l'avvio di emacs. Guardando in +internet ho vvisto un simil hook sull'avvio di emacs che richiama del codice e quindi +sarebbe da usare per richiamare il codice che compila la funzione. + +*** ???? Hem ???? :ToReview:Disable: + Package per gestire autocompletamenti e abbreviazioni. Simile ma più potente di IDO, + devo approfondire. [[https://github.com/emacs-helm/helm][helm from GitHub]] + +*** ???? Projectile ???? :ToReview:Disable: + Package per gestire i progetti in base alle directory (tipo i project di notepad++ o di + sublimetext). Merita approfondimenti. + +*** ???? Dashboard ???? :ToReview:Disable: + Package per visualizzare un albero a sinistra con link ai file di una directory. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/emacs-dashboard/emacs-dashboard][dashboard]] + +*** ???? Treemacs ???? :ToReview:Disable: + Package per mostrare l'albero del progetto a sinistra come faccio con + notepad++. Gestisce più progetti e più cose, da approfondire. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/Alexander-Miller/treemacs][treemacs]]. + + diff --git a/my-emacs-config.org b/my-emacs-config.org new file mode 100644 index 0000000..942c033 --- /dev/null +++ b/my-emacs-config.org @@ -0,0 +1,3617 @@ + +#+setupfile: ~/.MyCfg/emacs/templates/default/ToPrint.setup + +#+title: \laquo\alpha & \omega\raquo della configurazione di emacs Vrs 1.0\copy\reg +#+description: File in formato org con la configurazione di emacs +#+author: Mrk +#+email: mirko.aletto@csico.it +#+language: IT +#+options: ':t toc:nil num:t author:t email:t +#+macro: latest-export-date (eval (format-time-string "%F %T %z")) +#+macro: word-count (eval (count-words (point-min) (point-max))) +#+property: header-args :results none +#+startup: content indent + +#+TAGS: @Disable @Obsolete @ToReview @Usato @Done @Missing + +[ Ultima revisione ed esportazione il *{{{latest-export-date}}}* con un +conteggio di parole *{{{word-count}}}*. ] + + +#+BEGIN_COMMENT +- coding: utf-8 +- Utilizzato un fill-colum a 80 caratteri +#+END_COMMENT + +#+TOC: headlines 3 +#+html:
+#+odt: +#+latex: \newpage +#+latex: \clearpage + + + +* \to Esigenze: :@ToReview: +:PROPERTIES: +:ID: a27e1c98-29d0-4f72-b0b6-2a5b6548ce79 +:END: + +Funzionalità che voglio ottenere in emacs. Per ora la lista è verbosa, ma voglio +rivederla e sfoltirla in base all'esperienza d'uso con la prima versione. + +Punti da analizzare: +- org: vedere come gestire le immagini, soprattutto che siano visibili + sull'esportazione. +- Emacs: gestione delle immagini o altri file di riferimento tramite la cartella + =~/Pub/.Res/= +- Emacs: navigazione fra i buffer +- Emacs: come fare trova/sostituisci (almeno al livello di notepad++) +- Emacs: come gestire macro (almeno al livello di notepad++) +- Emacs: come gestire l'editazione multi cursore. (almeno al livello di notepad++) +- Emacs: come avere il correttore ortografico +- org: gestire aggenda settimanale +- org: gestire la cattura di eventi (note, link dal web, appunti estemporanei, ecc..) +- org: gestire creazione degli ID univoci delle intestazioni, sia + quelli standard (=ID=), sia quelli testuali (=CUSTOM_ID=). Nel farlo + rivedere il comando =M-x org-id-get-create= che l'[[https://writequit.org/articles/emacs-org-mode-generate-ids.html][articolo]]. +- org: gestire la pubblicazione dei miei file, sia come knoweldge base, sia come + esportazione di un singolo file da inviare ad un collega (per esempio una + stima per un'offerta). + - https://opensource.com/article/20/3/blog-emacs articolo di un blog che parla + della pbblicazione +- +- mettere comandi semplici per esportare tutto su html +- mettere a punto esportazione su pdf +- mettere a punto espansione dei testi abbreviati soprattutto per: + - i blocchi codice + - form di introduzione di dati ripetitivi tipo un resum di un lavoro. +- mettere comandi veloci per: + - evidenziare un capitolo nascondendo gli altri e viceversa. + - far partire timer e fermarli + - registrare ed eseguire delle macro + Per le macro vi sono questi reference: + - [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html#Keyboard-Macros][Manual]] + - [[https://www.emacswiki.org/emacs/KeyboardMacros][Wiki]] + - Using emacs series [[https://cestlaz.github.io/posts/using-emacs-15-macros/][video 15]] +- sfruttare nuova struttura: + - file unico (Inbox) con i lavori attuali e indici a file di riferimento per + ciascun cliente. + - file di reference dei vari clienti magari vedendo se può essere uno solo e + sfruttare aggenda per estrarre i dati tramite tag o altro + - file con le nozioni e i CFG dell'ufficio e della casa + - file con i riferimenti money report per capire come investo e quanto ho nei + vari investimenti +- sistemare con le nuove caratteristiche i capture in modo che fuzionino bene per: + - link utili da rivedere o per bibbliografia + - telefonate + - ToDo + - Note + - appuntamenti + - Idee future +- sistemare i tag per: + - classificare i vari reference per il TGD + - classificare le cose per future ricerche +- Pensare come legarsi con keep per sincronizarsi con cellulare +- Esempi di emacs: + - come configurare emacs: https://github.com/abrochard/emacs-config (dal video + https://meet.jit.si/FAR_HJ9Bzjs0tmF0DlA9qHIE) + - Tutorial molto bello in vari video: https://cestlaz.github.io/stories/emacs/ +- Indagare sui bookmark di emacs per capire come sfruttarli (vedi [[https://www.youtube.com/watch?v=ajiEBK2swKo][Lukewh video + 12]]) [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html][emacs manual]] +- Informarsi su 'Company mode' package che crea una specie di intellisense per + suggerire come completare le parole in base a quanto editato prima (come in + notepad++). Per riferimenti: [[https://www.youtube.com/watch?v=q-9Z2eR7cTE][Lukewh video 16]] o [[http://company-mode.github.io/][Company mode on GitHub]] +- vedere per la correzione ortografica (Flycheck, flymake o altro) + - [[https://www.flycheck.org/en/latest/][flycheck]] anche da [[https://www.youtube.com/watch?v=EGR9CwM1ksQ][Lukewh video 17]] +- ORG PUBBLISH: Sul sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] c'è un tutorial sulla pubblicazione tramite + org che è molto bello, inoltre mostra anche come cambiare il file autogenerato + mapindex in un generico index.html con css e tutto per renderlo più bello. +- Impostare l'utilizzo di org anche dal cellulare. Per farlo vedere come + utilizzare orgmobile o [[https://f-droid.org/en/packages/com.orgzly/][orgzly]] o l'interfaccia web ecc.... Un esempio molto + interessante che utilizza anche GIT per mettere sul clud i file è quello in + dal portale opensource.com: [[https://opensource.com/article/19/4/calendar-git][Manage your daily schedule with Git]] +- rivedere il gestore di calendari in modo testuale [[https://lostpackets.de/khal/index.html][khal]] perchè sempbra molto + carino. + + +* \checkmark Intro +:PROPERTIES: +:ID: 13b2138b-213d-4ec7-ad57-b55e023688ac +:END: + +Questo è il mio file di configurazione di Emacs in forma letterale. È una +combinazione di prosa e codice. + +Quello che stai leggendo ora è il file =prot-emacs.org=. Che è il documento che +genera (e quindi controlla) tutti gli altri file che sono alla base della mia +configurazione di Emacs. Questo file Org non viene caricato direttamente. Il suo +unico scopo è quello di produrre i file =*.el= che sono la configurazione +effettiva di emacs. + +Questo non è una configurazione standard di Emacs. Nella maggior parte dei casi, +si ha un file generico =.emacs= o un =init.el= con una chiamata alla funzione +~org-babel-load-file~ che riceve come valore il documento Org che descrive la +configurazione (questo =my-emacs-config.org=). + +Questo documento Org, invece, funge da + +Questo metodo funziona, ma è molto lento, perché dobbiamo caricare Org prima di +avviare Emacs (e Org carica anche un sacco di altre cose di cui non abbiamo +bisogno in una fase così iniziale). +- punto di accesso unico alla mia configurazione di Emacs +- origine dei file =*.el= delle mie configurazioni + +Anche se definisco tutto in un singolo file Org, in realtà non avvio Emacs +leggendo questo file. Piuttosto, sto istruendo Org a inserire i blocchi di +codice qui definiti in file separati, organizzati per ambito. Il risultato +finale è qualcosa per cui non si può capire se è stato eseguito un programma +letterale o meno. + +Questa è la bellezza di tutto ciò. Posso continuare a modificare un singolo file +come "fonte di verità", pur potendo gestire ogni file singolarmente (ad esempio, +se qualcuno vuole vedere come eseguo una determinata operazione, condivido solo +quel file come allegato e-mail, senza bisogno di inviare l'intero documento). + +Quando voglio modificare la mia configurazione di Emacs, modifico questo file e +poi valuto il blocco con il comando =M-x org-babel-tangle= (=C-c C-v C-t=), che +rigenera tutti i file di configurazione. + +I punti/funzionalità non ancora chiariti o che voglio rivedere, cerco di +riassumerli all'inizio del file, in modo che appena ho tempo da dedicarci, posso +prendere un argomenti di essi ed esplicitarlo. + +Definiamo questi file =*.el= di configurazione: +- =early-init.el= :: Il file caricato prima di lanciare emacs, include + ottimizzazioni per l'avvio di Emacs e imposta alcune funzionalità di base, + come ad esempio evitare il lampeggio della luce all'avvio di Emacs in un + ambiente scuro. +- =init.el= :: Il file standard di configurazione, caricato dopo il lancio di + emacs; contiene i blocchi fondamentali del mio sistema, ovvero le macro Lisp + che definisco, e carica i singoli moduli di configurazione. +- =init_fnc.el= :: Il file in cui riporto le mie funzioni elisp personali che + poi posso utilizzare ovunque in emacs. +- =init_{modulo}.el= :: Eventuali file che esplicitano la configurazione di un + particolare modulo. In questo modo posso fare una configurazione modulare, in + cui specifico i dettagli di un argomento su moduli dedicati. Questi file + saranno richiamati dal =init.el= in modo opportuno. + +** Elenco dei tag e delle parole chiave: +:PROPERTIES: +:ID: 90b6e478-424c-4663-aedf-3d4fdc93473c +:END: + +Nel testo, utilizzerò le =label= (tag o semplici etichette) seguenti: +- @Disable :: per impostazioni che attualmente sono disattivate o commentate +- @Obsolete :: per impostazioni eliminate perchè sostituite da altre +- @ToReview :: per impostazioni che devo rivedere, aggiornare, correggere o + ampliare. +- @Usato :: per indicare una risorsa utilizzata per la configurazione. +- @Done :: per indicare un punto chiuso e che non prevedo più di rivedere (a + meno di bug o malfunzionamenti nelle nuove versioni di emacs). +- @Missing :: per indicare una parte solo accennata, ma ancora da fare (il prima + possibile). + +Inoltre sfruttando i [[https://orgmode.org/worg/org-symbols.html][simboli]] grafici gestiti da org, utilizzo questi caratteri +all'inizio delle headline per enfatizarle. Questo è comodo perchè poi si +ritroveranno anche sulla TOC. +- \checkmark :: per indicare le headline che sono a posto e non prevedo di ritoccare fino alla prossima versione +- \Xi :: per indicare le headline che devo ancora rivedere o terminare +- \to :: per le headline che necessitano di revisione urgente + +** Applicativo emacs: +:PROPERTIES: +:ID: f6fd8942-dfff-41bb-94eb-041e74a78cfb +:END: + +Come emacs, utilizzo direttamente quello scaricabile dal progetto [[https://www.gnu.org/software/emacs/][GNU Emacs]] +(Emacs 30.2 al [2026-05-25 lun]) disarchiviando lo zip, sulla cartella: +: C:/MyTools/emacs +e lo eseguo lanciando il file +: C:/MyTools/emacs/bin/runemacs.exe + +** Path Home: +:PROPERTIES: +:ID: 743a6355-921b-4abe-8392-65ce90de1d9d +:END: + +Per inserire =C:\_Home\= come path predefinito, non serve definirlo sulla +variabile di sistema PATH, ma basta definire una variabile utente =home=: +- in windows aprire il form delle variabili utente: 'Edit enviroment variables + for account' +- inserire una nuova variabile con i seguenti valori: + - Variable name: home + - Variable value: C:\_Home + +In emacs, il PATH viene gestito dalla variabile interna =exec-path= e quindi +basterebbe inserire il path =C:\_Home\= in questa variabile, però è più comodo +definire la variabile di sistema (per esempio è utilizzata anche da git ed in +genere da tutti i tool unix-like). + +In ogni momento, per visualizzare il contenuto della variabile =exec-path=, +basta andare nel buffer =scratch=, scrivere il nome della variabile su una nuova +riga e dare il comando =C-c j= per valutare il codice della riga. + +** Eseguibile find.exe +:PROPERTIES: +:ID: 38abb527-08e3-43d2-83fa-e2165d98b0fc +:END: + +Il pacchetto =consult= ed in genere altri pacchetti, utilizzano il programma +find.exe di unix per ricercare file o altro sul sitema; in windows però questo +programma è diverso e siccome non voglio installare il pacchetto di utiliti per +evitare problemi con altri programmi, indico a emacs quale find utilizzare. + +Per verifica, se utilizzo il comando + +#+begin_src emacs-lisp :tangle no :results none + (executable-find "find") +#+end_src + +ritorna il valore + +#+begin_src emacs-lisp :tangle no :results none + "c:/WINDOWS/system32/find.exe" +#+end_src + +confermando che emacs sta utilizzando il find.exe di windows. + +Come find di unix, voglio utilizzare quello dato già assieme a git. Serve quindi +impostare il path corretto, da internet ho trovato il comando + +#+begin_src emacs-lisp :tangle no :results none + (setq find-program "C:/Program Files/Git/usr/bin/find.exe") +#+end_src + +ma sembra non funzionare, emacs continua a puntare al find di windows. Procedo +quindi a inserire il path del find di unix sul PATH complessivo che utilizza +emacs. In questo modo non altero il PATH di windows e quindi sono più sicuro. + +#+begin_src emacs-lisp :tangle no :results none + ;; imposto la directory del find unix: + (setq find-program-path "C:/Program Files/Git/usr/bin") + ;; la inserisco nel PATH di emacs: + (push find-program-path exec-path) + ;; impostiamo la cartella di default: + (setq default-directory "~/Doc/Org/") +#+end_src + + +* \checkmark Reference: :@ToReview: +:PROPERTIES: +:ID: c0fb602d-e4ef-4892-97c3-c60f32a93638 +:END: + +- [[https://www.gnu.org/software/emacs/][Editor emacs]] :: Sito web da cui scaricare emacs +- [[https://orgmode.org/][org-mode web site]] :: Sito originale del pacchetto org-mode, con i manuali + ufficiali ([[https://orgmode.org/orgguide.pdf][orgguide.pdf]] e [[https://orgmode.org/org.pdf][org.pdf]]) e la sezione =worg= per tutorial e molte + info utili. +- [[https://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] :: Sito che ha dato il via a + tutto. Datato ma sempre ottimo. +- [[https://github.com/james-stoup/emacs-org-mode-tutorial][emacs org-mode tutorial]] :: bel tutorial/introduzione alla configurazione di + org-mode. Buoni spunti su come strutturare i TODO, l'aggenda e + l'esportazione. Da rivedere assolutamente durant elo sviluppo della + configurazione specifica di org-mode. +- [[https://github.com/howardabrams/dot-files/blob/master/emacs.org#Journaling][Journal dot-files]] configurazione molto particolareggiata sia di org, sia di + come usarlo nel journal, sia di altri pacchetti (PlantUML and Graphviz). Vi + sono arrivato dall'articolo [[https://www.howardism.org/Technical/Emacs/journaling-org.html][journaling-org.html]]. +- [[https://bzg.fr/en/notes/the-zen-of-task-management-with-org/][The Zen of Task Management with Org]] :: configurazione minimale di org per la + funzionalità di task manager di progetti. Anche questa da rivedere in ottica + della configurazione specifica di org-mode. +- [[https://adamkovic.org/emacs.html][Rudolf Adamkovič Blog]] :: Blog dell'autore di [[https://bzg.fr/en/notes/the-zen-of-task-management-with-org/][The Zen of Task Management with + Org]] che ha molti articoli interessanti. +- [[https://protesilaos.com/codelog/][protesilaos.com]] :: Blog di uno sviluppatore di pacchetti emacs, che risulta + molto utile. Ha dato lo slancio per la revisione attuale della + configurazione. La sua configurazione completa è disponibile in: [[https://github.com/protesilaos/dotfiles][GitHub Repo]] o + [[https://gitlab.com/protesilaos/dotfiles][GitLab Repo]]. Alcuni articoli del blog che ritengo particolarmente + interessanti: + - [[https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/][Emacs: a basic and capable configuration]] per una confugurazione base,ma già + molto utile per migliorare la UI. =@Usato= + - [[https://protesilaos.com/emacs/dotemacs][Emacs: GNU Emacs configuration]] per la sua configurazione completa + disponibile nei repository indicati sopra. Vi è anche il relativo [[https://www.youtube.com/watch?v=ycyxytk1NAQ][video]]. + =@Usato= + - [[https://protesilaos.com/codelog/2026-04-30-emacs-decent-default-sacha-chua/][Emacs: decent defaults I shared with Sacha Chua]] configurazione minima + definita in live nel [[https://www.youtube.com/watch?v=z7pcLdwuyxE][video]]. =@Usato= + - [[https://protesilaos.com/codelog/2025-01-26-emacs-organise-init/][Emacs: organise your init file]] in cui descrive il metodo attualmente usato + per fare questo file org. Vi è anche il relativo [[https://www.youtube.com/watch?v=Dkoy3NrLN9g][Video]]. =@Usato= + - [[https://protesilaos.com/codelog/2024-02-17-emacs-modern-minibuffer-packages/][Emacs: modern minibuffer packages (Vertico, Consult, etc.)]] in cui descrive + come migliorare la UI del minibuffer. Vi è anche il relativo [[https://www.youtube.com/watch?v=d3aaxOqwHhI][video]]. + =@Usato= + - [[https://protesilaos.com/codelog/2024-02-08-emacs-window-rules-display-buffer-alist/][Emacs: control where buffers are displayed (the 'display-buffer-alist')]] in + cui descrive come gestire la visualizzazione dei buffer e la relativa + navigazione. Vi è anche il relativo [[https://www.youtube.com/watch?v=1-UIzYPn38s][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-07-23-emacs-use-package-essentials/][Emacs: use-package essentials]] in cui descrive come utilizzare i package di + emacs per nuove funzionalità, soprattutto dal punto di vista della + configuraione. Vi è anche il relativo [[https://www.youtube.com/watch?v=RaqtzemHFDU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-10-emacs-search-replace-basics/][Emacs: basics of search and replace]] in cui descrive le basi del + trova/sostituisci con emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=f2mQXNnChwc][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-11-17-emacs-ediff-basics/][Emacs: ediff basics]] in cui descrive come fare un diff (stile winmerge) di + due file su emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=pSvsAutseO0][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2025-01-16-emacs-org-todo-agenda-basics/][Emacs: Org todo and agenda basics]] in cui descrive le basi dell'aggenda e + come filtrare gli eventi. Vi è anche il relativo [[https://www.youtube.com/watch?v=L0EJeN1fCYw][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-12-15-emacs-org-coaching-clock/][Emacs: custom Org clock report for my coaching]] in cui descrive come utilizza + i timer e i relativi report per misurare il tempo di lavoro. Vi è anche il + relativo [[https://www.youtube.com/watch?v=FMutOCOoFSQ][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-09-19-emacs-command-popup-frame-emacsclient/][Emacs: commands in popup frames with 'emacsclient']] in cui descrive come + visualizzare dei comandi iterattivi in finestre popup. Vi è anche il + relativo [[https://www.youtube.com/watch?v=vbWxT8tht9A][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/][Emacs: abbreviations with abbrev-mode (quick text expansion)]] in cui descrive + come sfruttare le abbreviazioni per inserire velocemente testo. Vi è anche + il relativo [[https://www.youtube.com/watch?v=ruPpRlh2re4][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-22-emacs-dired-basics/][Emacs: Basics of the powerful Emacs file manager (Dired) 1]] in cui descrive + il pacchetto dired e come usarlo. Vi è anche il relativo [[https://www.youtube.com/watch?v=5dlydii7tAU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-23-emacs-dired-pt2/][Emacs: Basics of the powerful Emacs file manager (Dired) 2]] in cui descrive + il pacchetto dired e come usarlo. Vi è anche il relativo [[https://www.youtube.com/watch?v=2lF3z7H8oaI][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-07-29-emacs-kbd-macros/][Emacs: Introduction to keyboard macros in Emacs]] in cui descrive le macro in + emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=-5yH_8nl9LU][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-08-01-emacs-macros-golf/][Emacs: Practical macros in Emacs]] in cui descrive l'uso pratico delle macro + in emacs. Vi è anche il relativo [[https://www.youtube.com/watch?v=oLY-X5BMjc8][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2019-08-15-emacs-isearch-tweaks/][Emacs: ISEARCH features and tweaks]] in cui descrive come trova/sostituisci + usando isearch. Vi è anche il relativo [[https://www.youtube.com/watch?v=y6_bmcd3nis][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-05-23-emacs-org-basics/][Emacs: basics of Org mode]] in cui descrive le basi di org-mode e relativa + aggenda. Vi è anche il relativo [[https://www.youtube.com/watch?v=e9Ucb1JHUfQ][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-26-emacs-file-dired-basics/][Emacs: file and Dired basics]] in cui descrive il pacchetto =dired=. Vi è + anche il relativo [[https://www.youtube.com/watch?v=L_4pLN0gXGI][video]]. =@ToReview= + - [[https://protesilaos.com/codelog/2023-06-28-emacs-mark-register-basics/][Emacs: mark and register basics]] in cui descrive come sfruttare la tastiera + per editare (selezionare testi, navigare ecc...). Vi è anche il relativo + [[https://www.youtube.com/watch?v=TJrAkCyH6Dk][video]]. =@ToReview= +- [[https://codeberg.org/ashton314/emacs-bedrock][Emacs Bedrock]] configurazione minima ma bella, creata dal blog da rivedere per + prendere spunti. =@ToReview= +- [[https://github.com/SystemCrafters/crafted-emacs][SystemCrafters/crafted-emacs]] configurazione creata nella video serie di system + crafter. =@ToReview= +- [[https://sachachua.com/blog/][sachachua blog]] blog pieno di informazioni e di configurazioni. =@ToReview= + - [[https://sachachua.com/dotemacs/index.html][Sacha Chua's Emacs configuration]] disponibile sui repository [[https://codeberg.org/sachac/.emacs][codeberg]] o + [[https://github.com/sachac/.emacs.d/][GitHub]] + - [[https://www.youtube.com/watch?v=kvBS8wz8ZRw][Yay Emacs 10: Talking to Prot about Emacs workflows]] con relativi [[https://www.youtube.com/watch?v=kvBS8wz8ZRw][video]] e + [[https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/][articolo]] +- Come personalizzare l'esportazione: =@ToReview= + - https://www.reddit.com/r/emacs/comments/3pvbag/is_there_a_collection_of_css_styles_for_org/ + - https://www.reddit.com/r/emacs/comments/eozyyv/exporting_orgmode_to_beautiful_websites/ + - https://github.com/jessekelly881/Rethink + - https://github.com/jessekelly881/Imagine + - https://github.com/grc/jujutsu-website/tree/master + - https://github.com/alphapapa/org-html-theme-darksun + - https://github.com/Zilong-Li/org-tufte + - https://juanjose.garciaripoll.com/blog/css-style-org-mode/ + +** Old References from previous version to review: +:PROPERTIES: +:ID: abef4fbb-80ee-4a68-8b82-baebcff068a7 +:END: + +La configurazione partirà da quanto fatto finora (Configurazione Vrs. 3.3 del +04/10/2018) ripartendo da zero con le considerazioni ricavate dalle varie sorgenti +analizzate: +- [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] :: Bel esempio di come utilizzare in + particolar modo org-mode nella produttività. +- [[https://cestlaz.github.io/stories/emacs/][Using Emacs Series]] :: serie di video su emacs di Mike Zamansky che hanno anche il + relativo [[https://github.com/zamansky/using-emacs][GitHub repo]] +- [[https://www.youtube.com/watch?v=9pkuBijrMD4&list=PLNJWazvift25KnHDwYlhwrrgr60wtpQOB][Lukewh]] :: Playlist di video su emacs. Ne parla anche su [[https://lbry.tv/@lukewh:3][LBRY]] +- [[http://pages.sachachua.com/.emacs.d/Sacha.html][http://pages.sachachua.com/.emacs.d/Sacha.html]] +- [[https://sachachua.com/blog/][Sacha Blog]] +- [[http://ergoemacs.org/emacs/emacs_encoding_decoding_faq.html][Emacs File Encoding FAQ]] +- [[https://egli.dev/posts/using-org-mode-for-meeting-minutes/][Using org-mode for meeting minutes]] +- [[https://www.youtube.com/watch?v=2-0OwGTt0dI][Emacs: introduction to MAGIT]] +- Blog molto carino: [[https://irreal.org/blog/][irreal]] +- [[https://katherine.cox-buday.com/blog/2015/03/14/writing-specs-with-org-mode/][Writing Specs with Org-mode]] esempio di come produrre documentazione tecnica + con org-mode, LaTeX, PlantUML per ottenere pdf. Mostra anche il relativo + file di configurazione. +- Created a new HTML export back-end that uses Tailwind.css classes + - Link [[https://www.reddit.com/r/emacs/comments/fw6onf/created_a_new_html_export_backend_that_uses/][articolo]] + - Link [[https://github.com/vascoferreira25/ox-tailwind][GitHub]] +- Socially isolating my Emacs with Docker! + - Link [[https://www.youtube.com/watch?v=D2E1Eh9Hxdg&feature=youtu.be][video]] +- riconfigurare l'esportazione in html: + - tenere conto delle info dal sito [[https://opensource.com/article/20/3/blog-emacs][blog-emacs]] per personalizzare il file mapindex + - rivedere l'esportazione partendo tutto in ~/Pub e in esso mantenere anche i reference + e styli. + + +* \checkmark File di preconfigurazione: *early-init.el* +:PROPERTIES: +:ID: 97dd741c-97aa-4d2f-bd95-707815b781e7 +:END: + +Questo è il primo file che Emacs legge all'avvio. E' precaricato prima di +eseguire emacs e quindi deve contenere codice che non dipenda da alcun pacchetto +o dalle proporzioni del frame di Emacs. In generale, questo file di +inizializzazione iniziale ha lo scopo di impostare alcune cose di base prima che +Emacs produca il frame iniziale, delegando a =init.el= il resto della +configurazione. + +** Le impostazioni di base del frame +:PROPERTIES: +:ID: 4cfcc493-965f-4b4a-88d3-19088e4d7e97 +:END: + +Queste sono alcune impostazioni generali per i frame e le basi del toolkit. In +breve, voglio mantenere le cose al minimo. Notate ~frame-resize-pixelwise~ e +~frame-inhibit-implied-resize~: per impostazione predefinita Emacs ridimensiona +il frame se si modifica la dimensione del carattere, cosa che non voglio mai +fare. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" +(setq frame-resize-pixelwise t + frame-inhibit-implied-resize 'force + frame-title-format '("%b") + ring-bell-function 'ignore + use-dialog-box t ; only for mouse events, which I seldom use + use-file-dialog nil + use-short-answers t + inhibit-splash-screen t + inhibit-startup-screen t + inhibit-x-resources t + inhibit-startup-echo-area-message user-login-name ; read the docstring + inhibit-startup-buffer-menu t) +#+end_src + +** Impostiamo i parametri del frame per desktop +:PROPERTIES: +:ID: 25163662-be4f-4ee1-96df-9fe7473c25e7 +:END: + +Qui imposto i parametri per le dimensioni della finestra di Emacs: la prima e +tutte quelle successive. In un window manager a riquadri, i parametri di +larghezza e altezza non sono importanti, poiché tutte le finestre vengono +forzatamente adattate a rettangoli (riquadri). Gli altri parametri, invece, sono +rilevanti. In un window manager a sovrapposizione, tutte le impostazioni sono +importanti. + +Il parametro ~initial-frame-alist~ si riferisce alla prima finestra che viene +generata all'avvio di Emacs. Per questo motivo deve essere definito nel file +=early-init.el=: il codice qui presente viene eseguito prima che venga disegnata +la prima finestra. + +Il parametro ~default-frame-alist~ si riferisce a tutte le finestre +successive. In linea di principio, potremmo definirlo al di fuori del file +=early-init.el=, ma è più logico averlo qui. + +Qui si imposta se utilizzare la barra dei menu, la barra delle icone e le +scrollbar: + +Ho scelto di provare ad usare Emacs senza barra degli strumenti e barre di +scorrimento. Occupano spazio prezioso sullo schermo e, inoltre, mi distraggono. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Imposto barre e menu: + ;; - menu bar (1=enable, -1=disable) + (menu-bar-mode 1) + ;; - tool bar (1=enable, -1=disable) + (tool-bar-mode -1) + ;; - scroll bar (1=enable, -1=disable) + (scroll-bar-mode -1) + ;; - Don't show startup message + (setq inhibit-startup-message t) + ;; - Stop al blinking del cursore + (blink-cursor-mode -1) ;; (setq blink-cursor-delay 2 blink-cursor-interval 0.5) + ;; - Higlight line (1=enable, -1=disable) + (global-hl-line-mode 1) + + ;; se non ho la riga seguente, perdo la barra di trasinamento della finestra dell'editor e non posso più muoverla in windows. + (add-hook 'window-size-change-functions #'frame-hide-title-bar-when-maximized) + + ;; Inizializzazione del frame + (setq initial-frame-alist `((horizontal-scroll-bars . nil) + (menu-bar-lines . 1) + (tool-bar-lines . 0) + (vertical-scroll-bars . nil) + (scroll-bar-width . 12) + (width . (text-pixels . 800)) + (height . (text-pixels . 900)) + (undecorated . nil) + )) + ;; Ripeti l'operazione dopo l'inizializzazione in modo che eventuali + ;; modifiche intermedie non vengano mantenute. Nota che non possiamo fare + ;; affidamento sull'impostazione di questo valore su + ;; `initial-frame-alist' poiché potrebbe cambiare nel + ;; frattempo. Impostiamo esplicitamente il valore per essere certi del + ;; risultato. Ciò non impedisce ad altri programmi di modificare + ;; l'elenco, anche se lo considererei indesiderabile se modificassero + ;; queste impostazioni specifiche. + (add-hook 'after-init-hook (lambda () + (setq default-frame-alist `((horizontal-scroll-bars . nil) + (menu-bar-lines . 1) + (tool-bar-lines . 0) + (vertical-scroll-bars . nil) + (scroll-bar-width . 12) + (width . (text-pixels . 800)) + (height . (text-pixels . 900)) + (undecorated . nil) + )))) + ;; Funzione generale per disattivare la barra di scorrimento di una finestra + (defun mrk-emacs-no-minibuffer-scroll-bar (frame) + "Remove the minibuffer scroll bars from FRAME." + (when scroll-bar-mode + (set-window-scroll-bars (minibuffer-window frame) nil nil nil nil :persistent))) + ;; Disattivo la barra di scorrimento sul minibuffer usando la funzione precedente: + (add-hook 'after-make-frame-functions #'mrk-emacs-no-minibuffer-scroll-bar) +#+end_src + +** Dimensioni font +:PROPERTIES: +:ID: da153ad9-fb4c-4e26-a1c6-04ab3de8153b +:END: + +Per ridimensionare il testo, c'è il comando: +: C-x C-0 +Dopo il quale si hanno i seguenti comandi: +: + incrementa il size +: - decrementa il size +: 0 ritorna al default +I comandi si possono ripetere a piacere fino a quando si è raggiunta +la dimensione desiderata e poi chiude con +: ESC + +Imposto la dimensione di default del testo per facilitare la lettura: +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Imposto la dimensione del testo: (punti*10) + (set-face-attribute 'default nil :height 110) +#+end_src + +** Impostazioni del garbage-collection per velocizzare avvio: +:PROPERTIES: +:ID: db056b6b-1592-467b-91b9-091979e204df +:END: + +Non ho una conoscenza approfondita del =garbage collection=, ma ho imparato per +tentativi ed errori che posso massimizzare la soglia all'avvio per velocizzare +un po' l'avvio di Emacs. Quello che sto facendo è impostare i valori rilevanti +su valori molto alti all'avvio e poi riportarli a valori più gestibili una volta +che Emacs ha terminato il caricamento. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Temporarily increase the garbage collection threshold. These + ;; changes help shave off about half a second of startup time. The + ;; `most-positive-fixnum' is DANGEROUS AS A PERMANENT VALUE. See the + ;; `emacs-startup-hook' a few lines below for what I actually use. + (setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 0.5) + + ;; Same idea as above for the `file-name-handler-alist' and the + ;; `vc-handled-backends' with regard to startup speed optimisation. + ;; Here I am storing the default value with the intent of restoring it + ;; via the `emacs-startup-hook'. + (defvar mrk-emacs--file-name-handler-alist file-name-handler-alist) + (defvar mrk-emacs--vc-handled-backends vc-handled-backends) + + (setq file-name-handler-alist nil + vc-handled-backends nil) + + (add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold (* 100 100 8) + gc-cons-percentage 0.1 + file-name-handler-alist mrk-emacs--file-name-handler-alist + vc-handled-backends mrk-emacs--vc-handled-backends))) +#+end_src + +** Impostazioni della cache dei pacchetti +:PROPERTIES: +:ID: 1ee6dbe6-4d0b-4e1d-8e09-7af33dc5a5b8 +:END: + +Utilizzo lo standard =package.el= per gestire i miei pacchetti Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; Initialise installed packages at this early stage, by using the + ;; available cache. I had tried a setup with this set to nil in the + ;; early-init.el, but (i) it ended up being slower and (ii) various + ;; package commands, like `describe-package', did not have an index of + ;; packages to work with, requiring a `package-refresh-contents'. + (setq package-enable-at-startup t) +#+end_src + +** Imposto la directory per il codice lisp custom: +:PROPERTIES: +:ID: 3143f3f7-1263-420a-adf4-6c5c3407a2d5 +:END: + +Gli eventuali codici lisp custom, che voglio utilizzare, li metterò manualmente +nella cartella =~/.emacs.d/MyAddOn/= e devo fare in modo che emacs li carichi +automaticamente ad ogni avvio. + +Questa =user-lisp-directory= è un'opzione utente introdotta in +Emacs 31. Permette a Emacs di compilare in bytecode i file Emacs Lisp al suo +interno e di analizzarli alla ricerca di autoload. + +Per ora sono ancora in emacs 30 però la tengo per il futuro. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + (setq user-lisp-directory (locate-user-emacs-file "~/.emacs.d/MyAddOn/")) +#+end_src + +per ora i file custom li carico qui: [[id:89b37a37-0f9b-42f6-9afa-bbe3648a04df][lisp custom on init.el]] + +** Assegna un nome al frame predefinito +:PROPERTIES: +:ID: 3ff325ed-547a-4396-bafe-9b951a489a7a +:END: + +Infine, mi piace chiamare il mio frame predefinito =home=. Questo perché +utilizzo il mio pacchetto per raggruppare l'elenco dei buffer per ogni singolo +frame. La disposizione =multi-frame= è la cosa migliore che abbia mai fatto per +aumentare la mia produttività: punti bonus se utilizzata in combinazione con un +window manager a finestre affiancate. + +Assegnare un nome alle finestre consente di selezionarle tramite il +completamento automatico. Emacs può farlo (=M-x select-frame-by-name=), anche se +non è sempre affidabile in quanto dipende dal window manager (funziona bene su +GNOME, per quanto ne so). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; rinomino il buffer in Home: + (add-hook 'after-init-hook (lambda () (set-frame-name "home"))) +#+end_src + + +* File di configurazione principale: *init.el* +:PROPERTIES: +:ID: b463ab54-8b41-4c04-b070-d811b162a1bb +:END: + +Qui definisco le macro Lisp utilizzate nella mia configurazione e carico tutti i +singoli moduli. + +Questa parte, descrive cosa inserire nel file iniziale che viene automaticamente +letto all'avvio di emacs (=~/.emacs.d/init.el=). In esso voglio impostare le +funzioni base che sono "obbligatorie", mentre tutto il resto viene delegato ai +vari moduli. + +** Impostazioni per rendere silenziosa la compilazione nativa +:PROPERTIES: +:ID: 5ab3ec8a-1718-42f5-8a78-a338291d3383 +:END: + +L'opzione di compilazione =--with-native-compilation=yes= di Emacs è molto +utile: abilita la "compilazione nativa" di Emacs Lisp, traducendolo in codice +macchina. Tuttavia, l'impostazione predefinita per la segnalazione degli errori +è impostata su un valore verboso che, nella mia esperienza di coaching, confonde +gli utenti: produce avvisi per problemi di compilazione che solo lo sviluppatore +del pacchetto in questione deve gestire. Questi includono fatti innocui come le +docstring che superano un certo numero di caratteri. A peggiorare ulteriormente +le cose, il buffer che mostra questi avvisi utilizza il carattere di stop, +risultando in un lungo elenco di righe con punti rossi ovunque, come se avessimo +completamente rotto Emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Make native compilation silent. + (when (native-comp-available-p) + (setq native-comp-async-report-warnings-errors 'silent)) +#+end_src + +** Impostazione per mandare ~custom-file~ nell'oblio: +:PROPERTIES: +:ID: 8f4ba6e8-b50c-49c3-aa88-5451986e0fdc +:END: + +Per impostazione predefinita, Emacs scrive le personalizzazioni persistenti alla +fine del file di inizializzazione dell'utente. Questi elementi sono incapsulati +in un blocco "personalizzato". Emacs li scrive ogni volta che l'utente esegue +un'azione con =M-x customize= o comandi simili. + +Personalmente, preferisco scrivere direttamente il codice Elisp piuttosto che +utilizzare l'interfaccia di =M-x customize=. Voglio anche che il mio file di +inizializzazione contenga solo ciò che ho scritto io e che non esegua mai, in +nessun caso, codice che non ho chiamato personalmente. + +Pertanto, voglio impostare la variabile ~custom-file~ per indicare a Emacs di +scrivere le sue variabili persistenti in quel file anziché nel mio =init.el=. +Tuttavia, poiché non ho intenzione di utilizzare questo file, ho scelto di +renderlo temporaneo posizionandolo nella directory =/tmp= (questo è ciò che fa +la funzione ~make-temp-file~). Quindi, quando chiudo il computer, il file +scompare. Infine, non richiamo la funzione ~load~ perché non farò mai +affidamento sul ~custom-file~. Preferirei avere un'opzione per evitare +completamente l'infrastruttura Custom, ma non è possibile. Quindi eccoci qui... + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Disable the damn thing by making it disposable. + ;; - (setq custom-file (make-temp-file "emacs-custom-")) + ;; Rendo il file persistente: + (setq custom-file (locate-user-emacs-file "custom.el")) + (load custom-file :no-error-if-file-is-missing) +#+end_src + +** Impostazione per rendere =C-g= un po' più utile +:PROPERTIES: +:ID: fe0a404d-fa48-4522-b5d2-f8c18802b65c +:END: + +Avendo notato che i principianti hanno difficoltà con =C-g= perché non chiude il +minibuffer aperto, so che il seguente miglioramento semplifica l'esperienza +utente: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (defun mrk/keyboard-quit-dwim () + "Do-What-I-Mean behaviour for a general `keyboard-quit'. + + The generic `keyboard-quit' does not do the expected thing when + the minibuffer is open. Whereas we want it to close the + minibuffer, even without explicitly focusing it. + + The DWIM behaviour of this command is as follows: + + - When the region is active, disable it. + - When a minibuffer is open, but not focused, close the minibuffer. + - When the Completions buffer is selected, close it. + - In every other case use the regular `keyboard-quit'." + (interactive) + (cond + ((region-active-p) + (keyboard-quit)) + ((derived-mode-p 'completion-list-mode) + (delete-completion-window)) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (t + (keyboard-quit)))) + + (define-key global-map (kbd "C-g") #'mrk/keyboard-quit-dwim) +#+end_src +** Impostazione per eseguire Emacs come server +:PROPERTIES: +:ID: 8f620d66-1a75-4b52-aa3b-5a86edcbab7c +:END: + +Il "server" è funzionalmente simile al demone, tranne per il fatto che viene +eseguito dal primo frame di Emacs che avviamo. Con un server in esecuzione, +possiamo connetterci ad esso tramite una nuova chiamata =emacsclient=. Questo è +utile se vogliamo avviare nuovi frame che condividono risorse con il processo in +esecuzione. Tuttavia, =emacsclient= può essere utilizzato anche semplicemente +per eseguire codice al di fuori di un frame di Emacs (ad esempio per caricare un +nuovo tema, come faccio io con il mio delight.shscript di shell all'interno dei +miei dotfiles). + +Quando chiudiamo l'ultimo frame, il server viene terminato. Il demone, invece, +rimane attivo anche se tutti i frame di Emacs vengono chiusi. Per me, il server +è più facile da usare, perché so con certezza quando inizia e finisce il suo +ciclo di vita. Detto questo, ho provato seriamente anche il demone. Emacs si +bloccava ogni volta che incontravo un errore in qualche valutazione Lisp. Il +server, invece, funziona perfettamente. + +Nota che ciò avviene solo =server-start= se non è in esecuzione alcun +server. Uno è sufficiente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Emacs server (allow emacsclient to connect to running session) + (setq server-client-instructions nil) + (require 'server) + (unless (or (server-running-p) (daemonp)) + (server-start)) +#+end_src + +In questo modo si avrà una singola istanza di emacs e se faccio doppio click su +un file =*.org= questo verrà automaticamente aperto sull'istanza già in +esecuzione di emacs. Se però non vi è un'istanza attiva, si avrà errore, perchè +il server emacs rimane attivo solo fino a che non chiudo tutte le istanze di +emacs (non sto utilizzando il demone, cioè servizio in windows). + +Quindi si avvia emacs semplicemente eseguendo l'eseguibile +=C:\MyTools\emacs\bin\runemacs.exe=. Questo fa partir eil server emacs. Con il +doppio click su un file =*.org= faccio partire l'evento che è registrato (al +primo click lo si salva) al comando: +: C:\MyTools\emacs\bin\emacsclientw.exe -c -n "C:\Path\To\Your\File.org" + +** Impostazione per formato di default dei file: UTF-8 +:PROPERTIES: +:ID: d61b5760-4393-403d-a169-0d9da94db50a +:END: + +Imposto come formato di default dei file: UTF8 + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Imposto come formato di default l'UTF8 + (set-language-environment "UTF-8") + (set-default-coding-systems 'utf-8-unix) + (set-terminal-coding-system 'utf-8) + (prefer-coding-system 'utf-8) + (set-charset-priority 'unicode) +#+end_src + +** Impostazione per directory con il codice lisp custom: +:PROPERTIES: +:ID: 89b37a37-0f9b-42f6-9afa-bbe3648a04df +:END: + +Gli eventuali codici lisp custom, che voglio utilizzare, li metterò manualmente +nella cartella =~/.emacs.d/MyAddOn/= e devo fare in modo che emacs li carichi +automaticamente ad ogni avvio. + +Non potendo usare l'opzione specifica impostata nel file [[id:3143f3f7-1263-420a-adf4-6c5c3407a2d5][early-init.el]], lo comando +in modo esplicito: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Carico il path dei file lisp che aggiungo: + (add-to-list 'load-path (expand-file-name "~/.emacs.d/MyAddOn/")) +#+end_src + +** Impostazioni grafiche base: :@Obsolete: +:PROPERTIES: +:ID: dd2b1aa7-07a3-4b36-9134-02ac02b23315 +:END: + +Le impostazioni grafiche base delle finestre, sono ora gestite direttamente nel +file [[id:4cfcc493-965f-4b4a-88d3-19088e4d7e97][early-init.el]] e quindi i seguenti comandi non sono più utilizzati. + +#+begin_src emacs-lisp :tangle no :results none + ;; Don't show startup message + (setq inhibit-startup-message t) + ;; Stop al blinking del cursore + (blink-cursor-mode -1) ;; (setq blink-cursor-delay 2 blink-cursor-interval 0.5) + ;; menu bar (1=enable, -1=disable) + (menu-bar-mode 1) + ;; scroll bar (1=enable, -1=disable) + (toggle-scroll-bar 1) + ;; tool bar (1=enable, -1=disable) + (tool-bar-mode -1) + ;; Higlight line (1=enable, -1=disable) + (global-hl-line-mode 1) +#+end_src + +** Impostazioni per disabilitare backup e file di blocco +:PROPERTIES: +:ID: 7423109a-35e6-4da0-be45-67f87a59f57a +:END: + +Gestione dei file di salvataggio automatico (quelli con # all'inizio e alla +fine). Il file di salvataggio automatico di un determinato buffer viene +cancellato quando si salva esplicitamente il file. Per impedire ciò è necessario +impostare a nil la variabile =delete-auto-save-files=. + +Se si modifica il nome del file aperto tramite =C-x C-w= o +=set-visited-file-name=, il nome del file di salvataggio automatico viene +modificato di conseguenza. + +Alla modifica di un file, emacs fa un backup automatico del file (stesso nome +con la tilde finale). Per abilitare o no il backup automatico, si deve agire +sull'apposita variabile. + +Per impostazione predefinita, Emacs tenta di bloccare i file in modo che non +vengano modificati da altri programmi. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Disabilita il backup automatico dei file + (setq make-backup-files nil) + (setq backup-inhibited nil) ; Not sure if needed, given `make-backup-files' + ;; Disabilita il lock dei file + (setq create-lockfiles nil) + ;; Elimina i file di backup + (setq delete-auto-save-files t) +#+end_src + +** Impostazione per eliminare il testo selezionato all'inserimento :@ToReview: +:PROPERTIES: +:ID: de4aa706-e761-4d50-8983-70a1524080a2 +:END: + +Praticamente tutti i programmi eliminano il testo selezionato/evidenziato non +appena l'utente digita qualcosa. Emacs non lo fa di default, pur avendo la +funzionalità disponibile. Abilitiamola: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; delete selection when edited (1=enable, -1=disable) + (delete-selection-mode 1) + ;; - ;; Nuovo metodo visto nella configurazione di prot, per ora non in uso, da rivedere + ;; - (use-package delsel + ;; - :ensure nil ; no need to install it as it is built-in + ;; - :hook (after-init . delete-selection-mode)) +#+end_src + +** Impostazione per il calendario in Italiano :@ToReview:@Disable: +:PROPERTIES: +:ID: 13af1037-e191-443c-a7c0-ed933603dcb1 +:END: + +Personalizzazione del calendario per visualizzarlo in Italiano ed inserire le +festività italiane: + +[opzione da rivedere perchè l'ultima versione di emacs mi sembra mi dia direttamente i nomi in italiano] + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Calendario in italiano + ;; - (setq calendar-christian-all-holidays-flag t) + ;; - (setq calendar-date-style (quote iso)) + ;; - (setq calendar-day-name-array ["Domenica" "Lunedi'" "Martedi'" "Mercoledi'" "Giovedi'" "Venerdi'" "Sabato"]) + ;; - (setq calendar-latitude [45 40 north]) + ;; - (setq calendar-longitude [12 22 east]) + ;; - (setq calendar-mark-holidays-flag t) + ;; - (setq calendar-month-name-array ["Gennaio" "Febbraio" "Marzo" "Aprile" "Maggio" "Giugno" "Luglio" "Agosto" "Settembre" "Ottobre" "Novembre" "Dicembre"]) + ;; - (setq calendar-time-display-form (quote (24-hours ":" minutes (if time-zone " (") time-zone (if time-zone ")")))) + ;; - (setq calendar-view-holidays-initially-flag t) + ;; - (setq calendar-week-start-day 1) + ;; - (setq column-number-mode t) + ;; - (setq display-time-mode t) + ;; - (setq show-paren-mode t) +#+end_src + +** Impostazione per la data e l'ora nella modeline +:PROPERTIES: +:ID: 96ab804d-06e0-4531-a9ec-88dbce62df68 +:END: + +Mi piace visualizzare la data e l'ora correnti sulla barra di +navigazione. Ecco cosa =display-time-mode= fa. Nota che la mia barra +di navigazione personalizzata mostra l'ora solo nella finestra +attiva/selezionata. Altrimenti, l'impostazione predefinita è quella di +mostrare l'ora su tutte le barre di navigazione, il che è fastidioso. + +La =time.el= libreria che fornisce =display-time-mode= definisce anche +funzioni per ottenere il carico medio e controllare una directory per +nuove email. Non ho bisogno di questo e quindi lo disattivo. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (setq display-time-format " %a %e %b, %H:%M ") + ;;;; Covered by `display-time-format' + ;; (setq display-time-24hr-format t) + ;; (setq display-time-day-and-date t) + (setq display-time-interval 60) + (setq display-time-default-load-average nil) + ;; NOTE 2022-09-21: For all those, I have implemented my own solution + ;; that also shows the number of new items, although it depends on + ;; notmuch: the `notmuch-indicator' package. + (setq display-time-mail-directory nil) + (setq display-time-mail-function nil) + (setq display-time-use-mail-icon nil) + (setq display-time-mail-string nil) + (setq display-time-mail-face nil) + + ;; I don't need the load average and the mail indicator, so let this + ;; be simple: + (setq display-time-string-forms + '((propertize + (format-time-string display-time-format now) + 'face 'display-time-date-and-time + 'help-echo (format-time-string "%a %b %e, %Y" now)) + " ")) + + ;; Enable function + (display-time-mode 1) + ;; Visualizzo nel formato 24 ore. + (setq display-time-24hr-format t) ;; ricavato dalla configurazione precedente +#+end_src + +** Impostazione per i fusi orari (world-clock) :@ToReview:@Disable: +:PROPERTIES: +:ID: 6529bc2f-431a-4dfc-ab52-cfbb35dd4f15 +:END: + +Comunico con persone di tutto il mondo. Conoscere il loro orario locale è di +fondamentale importanza. Con =M-x world-clock= otteniamo un buffer con tutte le +città e i relativi fusi orari specificati in zone =world-clock-list=. Il +contenuto viene visualizzato in base a =world-clock-time-format=. Nota che +si può controllare il posizionamento di questo e molti altri buffer configurando +=display-buffer-alist=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - (setq world-clock-list + ;; - '(("America/Los_Angeles" "🇺🇸 Los Angeles") + ;; - ("America/Vancouver" "🇨🇦 Vancouver") + ;; - ("America/Denver" "🇺🇸 Denver") + ;; - ("America/Chicago" "🇺🇸 Chicago") + ;; - ("America/New_York" "🇺🇸 New York") + ;; - ("America/Toronto" "🇨🇦 Toronto") + ;; - ("America/Montreal" "🇨🇦 Montreal") + ;; - ("UTC" "🌐 UTC") + ;; - ("Europe/Lisbon" "🇵🇹 Lisbon") + ;; - ("Europe/London" "🇬🇧 London") + ;; - ("Europe/Paris" "🇫🇷 Paris") + ;; - ("Europe/Brussels" "🇧🇪 Brussels") + ;; - ("Europe/Berlin" "🇩🇪 Berlin") + ;; - ("Europe/Athens" "🇬🇷 Athens") + ;; - ("Asia/Nicosia" "🇨🇾 Lefkosia") + ;; - ("Asia/Istanbul" "🇹🇷 Istanbul") + ;; - ("Asia/Baghdad" "🇸🇾 Baghdad") + ;; - ("Asia/Riyadh" "🇸🇦 Riyadh") + ;; - ("Asia/Tehran" "🇮🇷 Tehran") + ;; - ("Asia/Tbilisi" "🇬🇪 Tbilisi") + ;; - ("Asia/Tashkent" "🇺🇿 Tashkent") + ;; - ("Asia/Karachi" "🇵🇰 Karachi") + ;; - ("Asia/Kolkata" "🇮🇳 Kolkata") + ;; - ("Asia/Dhaka" "🇧🇩 Dhaka") + ;; - ("Asia/Ho_Chi_Minh" "🇻🇳 Ho Chi Minh") + ;; - ("Asia/Singapore" "🇸🇬 Singapore") + ;; - ("Asia/Shanghai" "🇨🇳 Shanghai") + ;; - ("Asia/Seoul" "🇰🇷 Seoul") + ;; - ("Asia/Tokyo" "🇯🇵 Tokyo") + ;; - ("Australia/Brisbane" "🇦🇺 Brisbane") + ;; - ("Australia/Sydney" "🇦🇺 Sydney") + ;; - ("Pacific/Auckland" "🇳🇿 Auckland") + ;; - )) + ;; - ;; Formattazione dell'orario mostrato + ;; - (setq world-clock-time-format "%a %d %b %R %Z") +#+end_src + +** Impostazioni per impostare il numero di caratteri +:PROPERTIES: +:ID: 97a52819-b008-48f5-b9a2-16d81f6559b4 +:END: + +Per impostare la larghezza massima in caratteri (default 70) in modo iterattivo, +si può utilizzare il comando =C-x f= (=fill-colum=). Altrimenti per impostare +permanentemente la larghezza massima a 80 caratteri all'avvio di Emacs, aggiungi +questa riga al tuo file di configurazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; fill-colum 80 caratteri: + (setq-default fill-column 80) +#+end_src + +** Impostazione per mostrare il numero delle righe durante la programmazione +:PROPERTIES: +:ID: eb029077-2d97-4164-be14-95df45f6f5ff +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show line numbers on programming mode + (add-hook 'prog-mode-hook 'display-line-numbers-mode) +#+end_src + +** Impostazione per mostrare il numero delle colonne +:PROPERTIES: +:ID: a63531b5-339b-4857-ae79-c67d22e4ed7c +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show the column number + (column-number-mode 1) +#+end_src + +** Impostazione per abbreviare le risposte Yes or No +:PROPERTIES: +:ID: b0b149e0-845e-40b1-9fd2-50508b50ea06 +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Make all "yes or no" prompts be "y or n" instead + (fset 'yes-or-no-p 'y-or-n-p) +#+end_src + +** Impostazione per il matching delle parentesi +:PROPERTIES: +:ID: f46e9b26-3ccd-41fe-96fe-2f6c0ad00b82 +:END: + +Abilito l'evidenziazione delle coppie di parentesi e riduco al minimo il tempo +di attesa + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Show the matching parenthesis and do it immediately, we are in a hurry + (show-paren-mode t) + (setq show-paren-delay 0) +#+end_src + +** Impostazione per la directory iniziale o cartella di default +:PROPERTIES: +:ID: 913b56e4-9966-4678-904d-01f0f084ba30 +:END: + +Imposto la directory iniziale che è quella da cui partire per ricercare o +inserire file + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Directory iniziale o cartella di default + (setq default-directory "~/Doc/Org/") +#+end_src + +** Impostazione per il completamento dinamico sul minibuffer: :@Disable: +:PROPERTIES: +:ID: 3b21f653-8a0f-4c20-9d9a-a2367913febc +:END: + +[Per ora lo disabilito per l'uso di vertigo] + +Facilita l'inserimento sul minibuffer. Un esempio è quando introduco un tag su +un file org, con questo abilitato, emcas mi sugerisce tutti i tag già inseriti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - ;; Activate the dynamic completion in the mini-buffer + ;; - (icomplete-mode 1) + ;; - ;; This should actually turn on auto-fill-mode by default in all major + ;; - ;; modes. The other way to do this is to turn on the fill for specific modes + ;; - ;; via hooks. + ;; - (setq auto-fill-mode 1) +#+end_src + +** Impostazione per il Kill buffer automatico :@Disable: +:PROPERTIES: +:ID: 00d85e5f-c9b7-4637-98d4-f6629afabb90 +:END: + +Per default il comando di chiusura di un buffer (=C-x k=) chiede il nome del +buffer da chiudere suggerendo inizialmente quello in cui si è. Tramite il +comando kill-this-buffer si può chiudere direttamente il buffer in cui si è +senza avere la richiesta di conferma. Se si vuole accelerare, si può quindi +bindare il comando generale a quello veloce: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; - (global-set-key (kbd "C-x k") 'kill-this-buffer) +#+end_src + +** Impostazione per la dimensione della finestra :@Obsolete: +:PROPERTIES: +:ID: 8ae8d0a4-bd54-4cec-8aa4-7d25c7769626 +:END: + +[ Questo è integrato in [[id:25163662-be4f-4ee1-96df-9fe7473c25e7][parametri frame in early-init.el]] ] + +Ridimensiono la finestra di emacs in base a quanto visto nella pagina della +[[https://www.emacswiki.org/emacs/FrameSize][wiki]]. + +#+begin_src emacs-lisp :tangle no :results none + ;; Imposto dimensioni finestra + ;; (when window-system (set-frame-size (selected-frame) 92 46)) + (add-to-list 'default-frame-alist '(width . 100)) + (add-to-list 'default-frame-alist '(height . 48)) +#+end_src + +** Impostazione per fare il Buzzer visibile +:PROPERTIES: +:ID: 0f819bf1-cc9a-434e-b0da-5a0d586e203c +:END: + +Dal sito [[https://pragmaticemacs.wordpress.com/2017/10/15/using-a-visible-bell-in-emacs/][Pragmatic emacs]] ho trovato come visualizzare un lampeggio in emacs al +posto del beep (per errori o allarmi) di emacs. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Buzzer visibile + (setq visible-bell t) +#+end_src + +** Impostazione per gestire i package: + +Emacs ha un gestore di pacchetti basilare, ma comunque sufficientemente +efficiente. Lo utilizziamo per estendere Emacs con funzionalità fornite dalla +community. Emacs include molte funzioni utili, ma senza i pacchetti esterni +saremmo in una situazione peggiore. Inoltre, tenete presente che il fatto che un +pacchetto sia integrato in Emacs non lo rende necessariamente migliore delle +alternative di terze parti. + +Vi sono diversi reposity, ma i principali, non chè ufficiali, sono: +- [[https://elpa.gnu.org/packages/][gnu-elpa]] Repository ufficiale con le versioni stabili +- [[https://elpa.gnu.org/devel/][gnu-elpa-devel]] Repository ufficiale con le versioni in sviluppo +- [[https://elpa.nongnu.org/nongnu/][nongnu]] Repository NonGNU +- [[https://melpa.org/packages/][melpa]] Repository ufficiale non GNU + +Li inserisco tutti nella mia configurazione, però li ordino in modo che si +utilizzi il primo pacchetto trovato guardando i repository con l'ordine che +voglio. + +*** Note sull'utilizzo e sui comandi: +:PROPERTIES: +:ID: 788b4534-ad1b-4919-88aa-873e0da4344d +:END: + +Per vedere la lista dei package: +: M-x list-packages +Per aggiornare la lista dei package si usa: +: M-x package-refresh-contents +Per installare l'ultimo package di org: +: M-x package-install RET org RET +Per avere informazioni su un package si può usare il comando +: M-x describe-package +che visualizza una finestra con le informazioni del pacchetto. + +Per aggiornare l'installazione di un package, occorre che non sia in uso, poi si +richiama l'elenco dei packages con +: M-x list-packages +Ora si seleziona i pacchetti da aggiornare con +: U +(mark Upgradable packages) e si avvia l'aggiornamento con +: x +(eXecute the installs and deletions). Alla fine dell'aggiornamento chiede +eventualmente se si vuole cancellare i pacchetti obsoleti e basta rispondere con +Yes. + +If you run into a problem installing or upgrading, you may need to go into your +=~/.emacs.d/elpa/= directory and delete packages that are installed multiple +times. This can happen when the install times out. + +*** Impostazione generale dei package repository +:PROPERTIES: +:ID: fbac4656-a2b3-436a-abb4-b4c2acc255e6 +:END: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Set the packet manager: + (setq package-archives + '(("gnu-elpa" . "https://elpa.gnu.org/packages/") + ("gnu-elpa-devel" . "https://elpa.gnu.org/devel/") + ("nongnu" . "https://elpa.nongnu.org/nongnu/") + ("melpa" . "https://melpa.org/packages/"))) + ;; Set the repository priority: + ;; Highest number gets priority (what is not mentioned has priority 0) + (setq package-archive-priorities + '(("gnu-elpa" . 3) + ("melpa" . 2) + ("nongnu" . 1))) +#+end_src + +*** Impostazioni per l'aggiornamento dei pacchetti :@ToReview:@Disable: +:PROPERTIES: +:ID: e89bfa83-c993-45fe-98fd-bbacf51c68a6 +:END: + +Queste configurazioni vengono dalla vecchia versione, per ora le disabilito, ma +dovrò capire come usarle nella nuova configuraione. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Codice dalla vecchia versione, per ora disattivato: + ;; - ;; Codice già resente in init.el: + ;; - ;; (require 'package) + ;; - ;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) + ;; - ;; ;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) + ;; - ;; (package-initialize) + ;; - ;; + ;; - ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + ;; - (unless package-archive-contents (package-refresh-contents)) ;; Refresh the packages descriptions + ;; - (setq package-load-list '(all)) ;; List of packages to load + ;; - ;; + ;; - ;; Carico Org se non già caricato: + ;; - (unless (package-installed-p 'org) (package-install 'org)) ;; Make sure the Org package is installed, install it if not + ;; - ;; + ;; - ;; Codice per rinfrescare i package solo quando serve prima di utilizzarli: + ;; - (unless (package-installed-p 'use-package) + ;; - (package-refresh-contents) + ;; - (package-install 'use-package)) +#+end_src + +*** Impostazione per non visualizzare i warning durante il load dei pacchetti: +:PROPERTIES: +:ID: 23b9362f-a8cb-4c3b-9c38-0762ef26f79a +:END: + +Quando si installa un nuovo pacchetto, Emacs mostra un buffer contenente tutti +gli avvisi generati dal compilatore bytecode (Configura il gestore di +pacchetti). Sebbene queste informazioni siano utili per gli sviluppatori, +risultano molto confuse per gli utenti. Molte volte ho ricevuto messaggi del +tipo "Emacs si è bloccato", quando in realtà gli avvisi riguardano problemi che +non interessano l'utente. + +Il seguente frammento di codice impedisce la visualizzazione di questi buffer +(Configurazione completa). Rimangono comunque disponibili nell'elenco dei +buffer, qualora fossero necessari. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (add-to-list 'display-buffer-alist + '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'" + (display-buffer-no-window) + (allow-no-window . t))) +#+end_src + +** Impostazione per l'uso del Package: Try +:PROPERTIES: +:ID: bb851ab2-d68a-425d-a9fe-0314dd6de287 +:END: + +Permette di provare i vari pacchetti senza installarli. Quindi riavviando emacs +si ritorna alla situazione iniziale. + +Quando installato, si può provare un pacchetto direttamente installandolo +temporaneamente con try. Per esempio e voglio installare il pacchetto del gioco +2048: +: M-x try RET 2048-game +e quindi lanciare il gioco temporaneamente installato: +: M-X 2048-game RET + +Si può utilizzare anche per provare un file dal web. Per esempio per caricare il +file, file.el, in modo temporaneo: +: M-x try RET https://url.com/to/some/file.el + +Dai siti di rifererimento [[https://melpa.org/#/tryhttps://melpa.org/#/try][Melpa]], [[https://github.com/larstvei/Try][GitHub]] +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package try + :ensure t) +#+end_src + +** Impostazione per l'uso del Package: Which-key :@Obsolete: +:PROPERTIES: +:ID: 631ba5a0-99aa-44bc-8577-78a6494f3abd +:END: + +[ Pacchetto reso obsoleto da =vertigo= che preferisco. ] + +Visualizza sul minibuffer tutti i comandi possibili per completare quello +iniziato. Quindi permette di iniziare un comando, per esempio =C-x=, attendere +qualche secondo, e mostra sul minibuffer tutti i possibili suggerimenti + +E' simile ad IDO, ma è riferito esclusivamente ai comandi. + +Sui siti di riferimento [[https://melpa.org/#/which-key][Melpa]], [[https://github.com/justbur/emacs-which-key][GitHub]], ci sono molte opzioni (visualizzare i +suggerimenti sotto, a destra, tempo di attesa prima di visualizzarli, ecc..) ma +per ora utilizzo la configurazione base e poi sperimentando vedo se variarla. + +#+begin_src emacs-lisp :tangle no :results none + (use-package which-key + :ensure t + :config + (which-key-mode)) +#+end_src + +** Impostazione per l'uso del Package: auto-complete :@ToReview:@Disable: +:PROPERTIES: +:ID: e4a7b079-6a5f-4dd4-95ea-1a2955c08679 +:END: + +[ PEr ora disabilitata perchè preferisco approfondire quello che usavo prima del +cambio versione con i template ] + +Simile alla funzione di autocompletamento nativa di emacs (vedi [[id:d66bda07-4362-43fb-bfb0-45279cb3dab4][dynamic +abbreviations]] =M-/=) questa visualizza i suggerimenti tipo intellisense e quindi +è carina da vedere. + +I siti di riferimento sono: [[https://melpa.org/#/auto-complete][Melpa]], [[https://github.com/auto-complete/auto-complete][GitHub]] + +#+begin_src emacs-lisp :tangle no :results none + (use-package auto-complete + :ensure t + :init + (progn + (ac-config-default) + (global-auto-complete-mode t) + )) +#+end_src + +** Impostazione per l'uso del Package: htmlize +:PROPERTIES: +:ID: 139aad2b-8b71-4969-860f-85fc0dbe8b92 +:END: + +Per convertire il testo ed i blocchi in testo html con associati i vari colori. + +Siti di riferimento: [[https://melpa.org/#/htmlize][Melpa]], [[https://github.com/hniksic/emacs-htmlize][GitHub]] da cui si vede che è possibile personalizzare +lo stile dell'esportazione in tre modi in base ai valori assegnato alla +variabile: +: htmlize-output-type +: css +: inline-css +: font + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + (use-package htmlize + :ensure t) +#+end_src + +** Impostazione per i caratteri non presenti sulla tastiera: +:PROPERTIES: +:ID: d41b2219-3c26-4c6d-b377-26a718a32a88 +:END: + +Vi sono alcuni caratteri usati spesso che non sono presenti nella tastiera: +| Key | New Binding | +|-------+-------------| +| ~ | C-ù | +| C-SPC | C-ò | + +Cioè il carattere Tilde usato come Home e il set del mark, cioè il set del punto +di inizio di una selezione, utile per fare le selezioni con solo la tastiera. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Tilde + (global-set-key (kbd "C-ù") (kbd "~")) + ;; + ;; Riassegnamento del set mark al posto di C-SPC + (global-set-key (kbd "C-ò") 'set-mark-command) +#+end_src + +** Carico file di configurazione della UI +:PROPERTIES: +:ID: 045e2874-6ab7-4bee-a557-a271fd805fbb +:END: + +Carico il file con la configurazione della UI, che descrivo [[id:3a1e2165-6733-460d-95bc-652380277b31][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/UI-init.el") +#+end_src + +** Carico file di configurazione del minibuffer +:PROPERTIES: +:ID: 459eecd9-bed2-4b6c-9556-11666d4a0c5b +:END: + +Carico il file con la configurazione del minibuffer, che descrivo [[id:e7cc0e5c-9cf2-4665-8c76-517efd69f38a][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/mnbfr-init.el") +#+end_src + +** Carico file di configurazione di org-mode +:PROPERTIES: +:ID: 0ab89109-24cb-445a-a913-e575bfb42a16 +:END: + +Carico il file con la configurazione della UI che descrivo [[id:3a5bad5e-b492-4459-b863-ee15421eb5d8][qui]]. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; Load Custon UI Preference File: + (load "~/.emacs.d/org-init.el") +#+end_src + + +* \checkmark File di configurazione della grafica *UI-init.el* +:PROPERTIES: +:ID: 3a1e2165-6733-460d-95bc-652380277b31 +:END: + +Questo è un file di configurazione ausiliario, che gestisce in particolare +l'aspetto grafico di emacs, cioè i temi e font. + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:045e2874-6ab7-4bee-a557-a271fd805fbb][qui]]. + +In questo file imposterò in particolare: +- font utili (nerd icons) +- thema utilizzato + +** Impostazione per i nerd icon +:PROPERTIES: +:ID: a0c69af1-f2d3-489e-9079-6fbd3cabab88 +:END: + +Il seguente frammento di codice mostrerà icone complementari nel minibuffer e in +Dired. + +La configurazione, richiede che sul sistema siano installati i relativi font, e +quindi per far funzionare questa configurazione serve farlo. Per installarli, +l'utente deve digitare =M-x= e quindi richiamare il comando +=nerd-icons-install-fonts=. Questo salverà i file dei font delle icone in una +directory locale e poi vanno installati sul sistema windows. Per assicurarsi che +tutto funzioni correttamente, riavviare Emacs e ciò garantirà che i nuovi file +dei font vengano letti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Install nerd-icons package for all mode that we use + (use-package nerd-icons + :ensure t) + (use-package nerd-icons-completion + :ensure t + :after marginalia + :config + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + (use-package nerd-icons-corfu + :ensure t + :after corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + (use-package nerd-icons-dired + :ensure t + :hook + (dired-mode . nerd-icons-dired-mode)) +#+end_src + +** Impostazione per l'uso del Package: Org-bullet :@Obsolete: +:PROPERTIES: +:ID: 818a7692-c614-4060-94a5-23b56f56ce6f +:END: + +Questo pacchetto permette di sostituire gli asterichi nelle header con dei +bullet più carini. Dai siti di riferimento [[https://melpa.org/#/org-bullets][Melpa]], [[https://github.com/sabof/org-bullets][GitHub]] si indica che non sarà +più aggiornato e che viene sostituito da org-superstart, quindi anchio lo +disattivo ed utilizzo superstar. Il codice di configurazione era: + +#+begin_src emacs-lisp :tangle no :results none + (use-package org-bullets + :ensure t + :config + (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) +#+end_src + +** Impostazione per l'uso del Package: Org-superstar :@Obsolete: +:PROPERTIES: +:ID: 6fa0a818-0b1e-4cf9-8ace-a6a92d6de0f3 +:END: + +[ Il thema è stato soppravanzato da org-modern, disattivo questo e provo l'altro ] + +Questo pacchetto permette di sostituire gli asterichi nelle header con dei +bullet più carini. Dai siti di riferimento [[https://melpa.org/#/org-superstar][Melpa]] [[https://github.com/integral-dw/org-superstar-mode][GitHub]] viene indicato come il +successore di org-bullet. + +Alcuni themi non li visualizzano correttamente, quindi nel caso devo +disattivarlo (:tangle no :results none) o +riattivarlo (:tangle "~/.emacs.d/UI-init.el"). + +#+begin_src emacs-lisp :tangle no :results none + ;; Carico il package + (use-package org-superstar + :ensure t + :config + ;; lo utilizzo in org + (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1)))) + ;; Per velocizzare la gestione del font + (setq inhibit-compacting-font-caches t) + ;; Customize bullets + ;; - ;; Resize bullets + ;; - (with-eval-after-load 'org-superstar + ;; - (set-face-attribute 'org-superstar-item nil :height 1.2) + ;; - (set-face-attribute 'org-superstar-header-bullet nil :height 1.2) + ;; - (set-face-attribute 'org-superstar-leading nil :height 1.3)) + ;; Set different bullets, with one getting a terminal fallback. + ;; - (setq org-superstar-headline-bullets-list + ;; - '("◉" ("🞛" ?◈) "○" "▷")) + ;; Stop cycling bullets to emphasize hierarchy of headlines. + (setq org-superstar-cycle-headline-bullets nil) + ;; Hide away leading stars on terminal. + (setq org-superstar-leading-fallback ?\s) +#+end_src +** Impostazione per l'uso del Package: Org-modern :@ToReview:@Disable: +:PROPERTIES: +:ID: c4062e8f-6f1e-4460-93d9-a1d4c5b12105 +:END: + +Dai siti di riferimento [[https://elpa.gnu.org/packages/doc/org-modern.html][ELPA]] e [[https://github.com/minad/org-modern][GitHub]] viene indicato come il successore di +org-bullet e org-superstar. + +Questo pacchetto implementa uno stile moderno per i buffer Org utilizzando il +blocco dei caratteri e le proprietà del testo. Il pacchetto applica uno stile a +titoli, parole chiave, tabelle e blocchi di codice sorgente. Lo stile è +configurabile: è possibile disabilitare o modificare lo stile di ciascun +elemento di sintassi singolarmente tramite la customizzazione del gruppo +org-modern. + +Poiché questo pacchetto regola lo stile del testo, dipende dalle impostazioni +del carattere. È necessario assicurarsi che le propietà del font +=variable-pitch= e =fixed-pitch= si combinino armoniosamente e abbiano +approssimativamente la stessa altezza. Come carattere predefinito, consiglio +varianti del carattere [[https://github.com/be5invis/Iosevka][Iosevka]] , ad esempio =Iosevka Term Curly=. +=org-modern-mode= cerca di regolare la visualizzazione dell'etichetta +del tag in base all'altezza del carattere. + +#+begin_src emacs-lisp :tangle no :results none + ;; Option 1: Per buffer + (add-hook 'org-mode-hook #'org-modern-mode) + (add-hook 'org-agenda-finalize-hook #'org-modern-agenda) + + ;; Option 2: Globally + (with-eval-after-load 'org (global-org-modern-mode)) +#+end_src + +Ecco una configurazione più estesa: + +#+begin_src emacs-lisp :tangle no :results none + ;; abilito delle visualizzazioni più avanzate: + (setq + ;; Edit settings + org-auto-align-tags nil + org-tags-column 0 + org-catch-invisible-edits 'show-and-error + org-special-ctrl-a/e t + org-insert-heading-respect-content t + ;; Org styling, hide markup etc. + org-hide-emphasis-markers t + org-pretty-entities t + org-agenda-tags-column 0 + org-ellipsis "…") + ;;; Abilito sempre org-modern + (global-org-modern-mode) +#+end_src + +Il font in uso ora è =Courier New=. Si può pensare di cambiarlo in questo modo: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Choose some fonts: "Iosevka" or "DejaVu" + ;; + ;; - Main typeface + ;;(set-face-attribute 'default nil :family "Iosevka" :height 140) + ;;(set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110) + ;; + ;; - Proportionately spaced typeface + ;;(set-face-attribute 'variable-pitch nil :family "Iosevka Aile") + ;;(set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0) + ;; + ;; - Monospaced typeface + ;;(set-face-attribute 'org-modern-symbol nil :family "Iosevka") + ;;(set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5) +#+end_src + +Nella mia review, ho installato il pacchetto manualmente: +- Per prima cosa aggiornato la lista dei pacchetti con il comando + : package-refresh-contents +- Poi installato il pacchetto con il comando + : package-install + e inserendo alla richiesta il nome: org-modern + +Ora il pacchetto è installato, ma non ancora richiamato dagli hook e +quindi per verificarlo va richiamato a mano con =M-x org-modern=. + +Dai primi utilizzi, la grafica è molto bella, ma mi distrae +l'editazione, quindi per ora voglio tenere solo il simbolo all'inizio +della headline che è carino soprattutto per distinguere quelle aperte +da quelle compresse. Per farlo attivo quindi sempre org-manage ma ne +disabilito alcune funzionalità. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Per cambiare cosa viene Prettify e cosa no, cambiare le opzioni + ;; usare t per abilitare l'opzionerelativa + ;; usare nil per disabilitare l'opzione + (use-package org-modern + :after org + :ensure t + :hook ((org-mode . org-modern-mode)) + :custom + (org-modern-timestamp t) ; Prettify time stamps + (org-modern-table nil) ; Prettify tables + (org-modern-priority t) ; Prettify priorities + (org-modern-todo t) ; Prettify todo keywords, see org-todo-keywords + (org-modern-tag t) ; Prettify tags in headlines + (org-modern-block-name nil) ; Prettify blocks names + (org-modern-block-fringe 2) ; Add a border to the blocks in the fringe (nil - 16) + (org-modern-keyword t) ; Prettify keywords like #+title + (org-modern-progress 10) ; Width in characters to draw progress bars. Set to nil to disable bars. + ) +#+end_src + +Infine per evitare l'errore di visalizzazione del terzo livello +(perchè il font non ha il relativo carattere), utilizzo la soluzione +ricavata da [[https://www.reddit.com/r/emacs/comments/1qx48wl/does_anyone_here_use_org_modern_or_other_packages/?tl=it][redit]] o [[https://github.com/minad/org-modern/commit/5393edbb5a078348d0eea5723868c35be3e73494][GitHub]]: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Sostituisco i caratteri standard con la mia preferenza: + (setq org-modern-fold-stars + '( + ("▶" . "▼") + ("▷" . "▽") + ("▸" . "▾") + ("▹" . "▿") + ) + ) +#+end_src + +** Impostazione per selezionare il tema utilizzato: +:PROPERTIES: +:ID: 7568ad10-8549-4282-b83d-fc3b7118c244 +:END: + +La scelta del tema è soggettiva, quindi vi prego di non considerare quanto segue +come un'opinione definitiva. Ho semplicemente scelto il tema che mi piace di +più. Usatelo come modello per configurare eventualmente un altro tema. + +Come reference per i theme ci sono i seguenti siti: +- [[https://pawelbx.github.io/emacs-theme-gallery/][emacs theme gallery]] +- [[https://emacsthemes.com/][emacs Themes]] + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Esempio per utilizzare un pacchetto thema esterno + ;; - (use-package modus-themes + ;; - :ensure t + ;; - :config + ;; - (load-theme 'modus-vivendi-tinted :no-confirm-loading)) + ;; Esempio di utilizzo di un thema interno + ;; - (load-theme 'dichromacy :no-confirm-loading) +#+end_src + +** Impostazione del tema interno: modus-operandi-deuteranopia :@Disable: +:PROPERTIES: +:ID: 9eb8612c-9200-410c-9eae-e1c4c456aef8 +:END: + +Dal [[https://protesilaos.com/codelog/2022-08-03-modus-themes-2-5-0/][sito]] del thema, impostiamo l'utilizzo del tema =modus-operandi-deuteranopia= +impostando anche l'evidenziazione dei titoli ingrandendo il font. + +#+begin_src emacs-lisp :tangle :tangle no :results none + ;; Ridimensioni i titoli in base al livello: + (setq modus-themes-headings + '((0 . (variable-pitch 1.3)) ; Titolo principale/Documento + (1 . (variable-pitch 1.1)) ; Livello 1 + (2 . (variable-pitch 1.1)) ; Livello 2 + (3 . (variable-pitch 1.0)) ; Livello 3 (non lo ridimensiono perchè con il colore, sembra già grande) + (t . (rainbow bold 1.0)))) ; Tutti gli altri livelli (default) + ;; Abilito il tema + (load-theme 'modus-operandi-deuteranopia :no-confirm-loading) +#+end_src + +** Impostazione per l'uso del Package: Theme Zenburn :@Disable: +:PROPERTIES: +:ID: e640d15f-3f32-4d3f-a1a7-289890574aa4 +:END: + +[ Il tema non mi piace più, quindi lo disabilito ] + +Permette di gestire comodamente il thema ZenBurn + +I siti di riferimento sono: [[https://melpa.org/#/zenburn-theme][Melpa]], [[https://github.com/bbatsov/zenburn-emacs][GitHub]] da cui ricavo anche che il thema +gestisce dimensioni diverse per le headline. + +Si possono ridefinire i colori andando a ridefinire la variabile +zenburn-override-colors-alist come in questo esempio. + +#+begin_src emacs-lisp :tangle :tangle no :results none + ;; ;; Sample redefine colors: + ;; (setq zenburn-override-colors-alist + ;; '(("zenburn-bg+05" . "#282828") + ;; ("zenburn-bg+1" . "#2F2F2F") + ;; ("zenburn-bg+2" . "#3F3F3F") + ;; ("zenburn-bg+3" . "#4F4F4F"))) + ;; (load-theme 'zenburn t) + ;; + ;; use variable-pitch fonts for some headings and titles + (setq zenburn-use-variable-pitch t) + ;; + ;; scale headings in org-mode + (setq zenburn-scale-org-headlines t) + ;; + ;; scale headings in outline-mode + (setq zenburn-scale-outline-headlines t) + ;; + ;; Load theme + (use-package zenburn-theme + :ensure t + :config + (load-theme 'zenburn t)) +#+end_src + +** Impostazione per l'uso del Package: Theme Spacemacs :@Disable: +:PROPERTIES: +:ID: 5e2ed87e-7835-43ed-833a-79335dcfb301 +:END: + +Permette di gestire comodamente il thema Spacemacs. Spacemacs è una +configurazione particolare di emacs completa di configuratore e altro. Per +informazioni il sito di riferimento è: [[https://www.spacemacs.org/][Spacemacs]] o [[https://www.youtube.com/watch?v=hCNOB5jjtmc][Video]] + +I siti di riferimento sono: [[https://melpa.org/#/spacemacs-theme][Melpa]], [[https://github.com/nashamri/spacemacs-theme][GitHub]] da cui ricavo anche che il thema +gestisce dimensioni diverse per le headline e anche il grassetto. + +#+begin_src emacs-lisp :tangle no :results none + ;; Load theme + (use-package spacemacs-theme + :ensure t + :config (load-theme 'spacemacs-light t)) +#+end_src + +** Impostazione del tema interno: dichromacy + +Utilizzo il tema interno dichromacy, però trovo i colori troppo vivaci. + +Tramite il comando =M-x customize-face= ricavo il colore di sfondo di ogni +singolo livello header. Per esempio si vede che =org-level-1= eredita il face da +=outline-1= che a sua volta eredita da =font-lock-function-name-face= che ha il +=Foreground: #d55e00=. + +Colori originali di dichromacy: +org-level-1 --> #d55e00 vermilion +org-level-2 --> #e69f00 orange +org-level-3 --> #56b4e9 skyblue +org-level-4 --> #009e73 bluegreen +org-level-5 --> #0072b2 blue +org-level-6 --> #d55e00 vermilion +org-level-7 --> #0072b2 blue +org-level-8 --> #848ea9 bluegray + +In un primo tentativo hgo provato a shiftare i colori ma ancora non era il top, +quindi ho scelto una palette da 5 colori sul verde e quindi dopo aver caricato +il thema, devo personalizzarlo: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; Carico il theme: dichromacy + (load-theme 'dichromacy :no-confirm-loading) + ;; + ;; Personalizzo il colore e le dimensioni utilizzando la paletta: + ;; 'Velluto della foresta': #1b1f23 #0b3d2e #145a3a #2f7d5b #cbbfa6 + (custom-set-faces + '(org-level-1 ((t (:foreground "#56b4e9" :bold t :height 1.3)))) + '(org-level-2 ((t (:foreground "#2f7d5b" :bold t :height 1.1)))) + '(org-level-3 ((t (:foreground "#145a3a" :bold t :height 1.1)))) + '(org-level-4 ((t (:foreground "#0b3d2e" :bold t :height 1.1)))) + '(org-level-5 ((t (:foreground "#1b1f23" :bold t)))) + ) +#+end_src + + +* File di configurazione del minibuffer: *mnbfr-init.el* +:PROPERTIES: +:ID: e7cc0e5c-9cf2-4665-8c76-517efd69f38a +:END: + +[Guarda anche il video sui pacchetti minibuffer moderni, alcuni dei quali non ho +incluso qui perché sono un po' più avanzati: +https://protesilaos.com/codelog/2024-02-17-emacs-modern-minibuffer-packages/.] + +Il minibuffer è una componente fondamentale dell'esperienza Emacs. È il punto in +cui l'utente interagisce con Emacs per rispondere ai prompt, passare a un altro +buffer, aprire un nuovo file, eseguire un comando per nome completo e così +via. Il minibuffer predefinito è minimale, il che potrebbe essere utile per gli +utenti esperti, ma non facilita la scoperta delle opzioni. + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:459eecd9-bed2-4b6c-9556-11666d4a0c5b][qui]]. + +** Impostazione per l'uso del Package: vertigo +:PROPERTIES: +:ID: f7643b57-04fa-4e66-b3b6-0b84be9c149a +:END: + +Utilizziamo il pacchetto =vertico= per creare un layout verticale nel +minibuffer. Ciò semplifica la visualizzazione delle opzioni disponibili. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load vertigo package + (use-package vertico + :ensure t + :config + (setq vertico-cycle t) + (setq vertico-resize nil) + (vertico-mode 1)) + ;; Configure directory extension. + (use-package vertico-directory + :after vertico + :ensure nil + ;; More convenient directory navigation commands + :bind (:map vertico-map + ("RET" . vertico-directory-enter) + ("DEL" . vertico-directory-delete-char) + ("M-DEL" . vertico-directory-delete-word)) + ;; Tidy shadowed file names + :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) +#+end_src + +** Impostazione per l'uso del Package: marginalia +:PROPERTIES: +:ID: 95c8f5d2-c947-4c96-95c1-f6a743348a37 +:END: + +Il pacchetto =Marginalia= è un ottimo complemento al layout verticale, poiché +utilizza lo spazio libero per mostrare informazioni utili sulle opzioni +visualizzate. Ad esempio, quando l'utente digita =M-x= per visualizzare un +elenco di nomi di comandi, Marginalia aggiungerà una breve descrizione di +ciascun comando. A seconda delle specifiche dell'interazione con il minibuffer +(apertura di un file, selezione di un buffer, ecc.), verranno visualizzate le +informazioni pertinenti. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load marginalia package + (use-package marginalia + :ensure t + :config + (marginalia-mode 1)) +#+end_src + +** Impostazione per l'uso del Package: orderless +:PROPERTIES: +:ID: 870c854a-489c-4868-9b2a-796dc4dce2c6 +:END: + +Il pacchetto =Orderless= è una soluzione ideale per tutti quei casi in cui non +ricordiamo l'ordine esatto delle parole. Ad esempio, per attivare/disattivare la +visualizzazione dei numeri di riga nel buffer corrente, utilizziamo il comando +=M-x display-line-numbers-mode=. Con Orderless configurato, possiamo digitare +qualcosa come =li num dis= al prompt =M-x= e ottenere comunque il risultato +desiderato. Questo perché Orderless interpreta i caratteri separati da spazi in +qualsiasi ordine. Emacs include altri stili di corrispondenza di pattern, ma +"orderless" è un buon punto di partenza. Pertanto, ci assicuriamo che le altre +variabili rilevanti siano impostate su un valore nullo, in modo da ottenere +"orderless" ovunque. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load ordeless package + (use-package orderless + :ensure t + :config + (setq completion-styles '(orderless basic)) + (setq completion-category-defaults nil) + (setq completion-category-overrides nil)) +#+end_src + +** Impostazione per l'uso del Package: consult :@Disable:@ToReview: +:PROPERTIES: +:ID: 5549b354-5d83-4a31-ad77-03d17d174ae5 +:END: + +[ Per ora il problema con il find.exe non sembra risolvibile e quindi disattivo il pacchetto ] + +Il pacchetto =consult= fornisce numerosi comandi che sono varianti avanzate +delle funzionalità di base integrate. Una delle caratteristiche principali di +consult è la funzione di anteprima, che mostra in un'altra finestra di Emacs il +contesto di ciò che è attualmente corrispondente nel minibuffer. + +Qui definisco le scorciatoie da tastiera per alcuni comandi che potrebbero +esservi utili. Il prefisso mnemonico è "alternative search" (in contrapposizione +alle scorciatoie da tastiera di base =C-s= o =C-r=). + +#+begin_src emacs-lisp :tangle no :results none + ;; Load consult package + (use-package consult + :ensure t + :bind (;; Search for files names recursively + ("M-s M-f" . consult-find) + ;; Search through the outline (headings) of the file + ("M-s M-o" . consult-outline) + ;; Search the current buffer + ("M-s M-l" . consult-line) + ;; Switch to another buffer, or bookmarked file, or recently opened file. + ("M-s M-b" . consult-buffer) + ;; Search through history + ("M-s M-h" . consult-history) + ;; Search through mark + ("M-s M-m" . consult-mark) + ;; Search through yank + ("M-s M-y" . consult-yank-pop) + )) +#+end_src + +Il comando =consult-find= non funziona su windows, infatti utilizza il programma +=find.exe= che però non è quello unix. In particolare con il comando + +#+begin_src emacs-lisp :tangle no :results none + (executable-find "find") +#+end_src + +ritorna il valore + +#+begin_src emacs-lisp :tangle no :results none + "c:/WINDOWS/system32/find.exe" +#+end_src + +indicando che utilizza il find.exe di windows. Come find di unix, voglio +utilizzare quello dato già assieme a git. Serve quindi impostare il path +corretto, da internet ho trovato il comando + +#+begin_src emacs-lisp :tangle no :results none + (setq find-program "C:/Program Files/Git/usr/bin/find.exe") +#+end_src + +ma non funziona, emacs continua a puntare al find di windows. Procedo quindi a +inserire il path del find di unix sul PATH complessivo che utilizza emacs. In +questo modo non altero il PATH di windows e quindi sono più sicuro. + +#+begin_src emacs-lisp :tangle no :results none + ;; imposto la directory del find unix: + (setq find-program-path "C:/Program Files/Git/usr/bin") + ;; la inserisco nel PATH di emacs: + (push find-program-path exec-path) +#+end_src + +** Impostazione per l'uso del Package: corfu :@ToReview:@Disable: +:PROPERTIES: +:ID: 36e5e474-8ddd-4e4b-b909-3ad94b270327 +:END: + +[ Devo approfondire, per ora lo disattivo ] + +Il pacchetto =corfu= fornisce un'interfaccia popup per il completamento +automatico all'interno del buffer. Concettualmente, è simile a quanto +avviene con il minibuffer, sebbene sia pensato per l'espansione del +testo all'interno di un file normale. Viene tipicamente utilizzato +nella programmazione. Ci sono ulteriori funzionalità che potrebbero +renderlo utile per le modalità di programmazione (in particolare, la +configurazione del Language Server Protocol), ma poiché queste +dipendono molto dalle esigenze specifiche di ciascun utente, qui +fornisco solo le funzionalità principali. + +#+begin_src emacs-lisp :tangle no :results none + (use-package corfu + :ensure t + :hook (after-init . global-corfu-mode) + :bind (:map corfu-map ("" . corfu-complete)) + :config + (setq tab-always-indent 'complete) + (setq corfu-preview-current nil) + (setq corfu-min-width 20) + + (setq corfu-popupinfo-delay '(1.25 . 0.5)) + (corfu-popupinfo-mode 1) ; shows documentation after `corfu-popupinfo-delay' + + ;; Sort by input history (no need to modify `corfu-sort-function'). + (with-eval-after-load 'savehist + (corfu-history-mode 1) + (add-to-list 'savehist-additional-variables 'corfu-history))) +#+end_src + +** Impostazione per l'uso del Package: dired +:PROPERTIES: +:ID: 030ddd93-aa42-4009-af1e-dc6e287de675 +:END: + +Emacs include un potente file manager integrato. Se ne parla a lungo in questo +video: [[https://protesilaos.com/codelog/2023-06-26-emacs-file-dired-basics/][Emacs: file and Dired basics]]. + +Le seguenti impostazioni definiscono alcune modifiche di base al comportamento +delle operazioni comuni di copia, ridenominazione ed eliminazione dei file. + +La visualizzazione predefinita di =Dired= contiene molti dettagli (la +configurazione completa). Utilizziamo =dired-hide-details-mode= per +nasconderli. È possibile attivarli/disattivarli in qualsiasi momento con =M-x +dired-hide-details-mode=, che è associato al tasto =(= nei buffer di Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load dired package + (use-package dired + :ensure nil + :commands (dired) + :hook + ((dired-mode . dired-hide-details-mode) + (dired-mode . hl-line-mode)) + :config + (setq dired-recursive-copies 'always) + (setq dired-recursive-deletes 'always) + (setq delete-by-moving-to-trash t) + (setq dired-dwim-target t)) +#+end_src + +Il pacchetto =dired-subtree= fornisce comandi per visualizzare rapidamente il +contenuto di una cartella utilizzando il tasto =TAB=. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + (use-package dired-subtree + :ensure t + :after dired + :bind + ( :map dired-mode-map + ("" . dired-subtree-toggle) + ("TAB" . dired-subtree-toggle) + ("" . dired-subtree-remove) + ("S-TAB" . dired-subtree-remove)) + :config + (setq dired-subtree-use-backgrounds nil)) +#+end_src + +** Impostazione per l'uso del Package: trashed +:PROPERTIES: +:ID: 985ba7a1-8185-4b9a-b5c6-b98ee3b5f70a +:END: + +In precedenza abbiamo configurato Dired per spostare i file eliminati nel +cestino di sistema. Il pacchetto =trashed= è quindi utile per fornire +un'interfaccia simile a Dired per quella cartella (funziona allo stesso modo di +Dired. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + (use-package trashed + :ensure t + :commands (trashed) + :config + (setq trashed-action-confirmer 'y-or-n-p) + (setq trashed-use-header-line t) + (setq trashed-sort-key '("Date deleted" . t)) + (setq trashed-date-format "%Y-%m-%d %H:%M:%S")) +#+end_src +** Impostazione per l'uso del Package: savehist +:PROPERTIES: +:ID: 0f7172ff-ef2d-40b8-84b7-f0e66457720b +:END: + +Il pacchetto integrato savehist tiene traccia degli input dell'utente e li +memorizza tra una sessione e l'altra. In questo modo, l'utente vedrà sempre le +sue ultime scelte in cima all'elenco (come con =M-x=). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; Load savelist package + (use-package savehist + :ensure nil ; it is built-in + :hook (after-init . savehist-mode)) +#+end_src + +I prompt del minibuffer possono avere una propria cronologia. In caso contrario, +condividono una cronologia comune degli input dell'utente. Emacs tiene traccia +di questa cronologia nella sessione corrente, ma la perde non appena la +chiudiamo. Con =savehist-mode= abilitata, tutte le cronologie del minibuffer +vengono scritte in un file e ripristinate al successivo avvio di Emacs. + +Le storie sono utili in due modi: +- Le scelte più recenti compaiono in cima alla lista, così possiamo trovarle più + facilmente. +- I comandi =M-p= (=previous-history-element=) e =M-n= (=next-history-element=) + nel minibuffer saranno utili subito dopo il ripristino di Emacs (tutti i miei + pacchetti sfruttano al meglio le cronologie del minibuffer per ogni prompt, + quindi =M-p= e =M-n= mostrano solo i valori rilevanti). + +Poiché stiamo già registrando la cronologia del minibuffer, possiamo istruirlo +=savehist-mode= a tenere traccia anche di variabili aggiuntive e a ripristinarle la +prossima volta che utilizziamo Emacs. Quindi =savehist-additional-variables=. + +Si noti che l'opzione utente =history-length= si applica a ciascuna variabile della +cronologia singolarmente: non riguarda tutte le cronologie nel loro complesso. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;;;; `savehist' (minibuffer and related histories) + (setq savehist-file (locate-user-emacs-file "savehist")) + (setq history-length 100) + (setq history-delete-duplicates t) + (setq savehist-save-minibuffer-history t) + (with-eval-after-load 'savehist + (add-to-list 'savehist-additional-variables 'kill-ring)) + (savehist-mode 1) +#+end_src + +** Impostazioni per l'uso delle dynamic abbreviations M-/ :@ToReview: +:PROPERTIES: +:ID: d66bda07-4362-43fb-bfb0-45279cb3dab4 +:END: + +Il pacchetto integrato =dabbrev= fornisce un metodo di completamento del testo +che legge il contenuto di un buffer ed espande il testo davanti al cursore per +trovare possibili candidati. Questo viene fatto con =M-/= (=dabbrev-expand=) che +è ciò che uso più spesso per eseguire i completamenti in buffer. + +Mi piace =dabbrev= perché è minimalista. Non genera popup né influisce sul +layout della finestra, permettendomi di concentrarmi su ciò che sto +facendo. Vorrei che avesse una funzione che consentisse di avviarlo e, in +qualsiasi momento, richiedere una presentazione completa in minibuffer di ciò +che sta cercando di trovare, invece di scorrere i candidati ripetutamente +=M-/=. Certo, di solito non scorro in questo modo, dato che in genere digito +abbastanza da trovare una corrispondenza esatta o essere a un =M-/= passo da +essa. + +Oltre al =dabbrev-expand= comando, abbiamo =dabbrev-completion=. Non lo uso +perché non mi sembra naturale, mentre scrivo, fermarmi, controllare il +minibuffer per vedere se c'è del testo, selezionarlo e tornare a scrivere. Forse +questo dipende dal fatto che ho uno stile di scrittura senza interruzioni e +senza tornare immediatamente indietro a modificare ciò che ho scritto (a meno +che non stia facendo una dimostrazione, in cui lo spettatore deve seguire). + +Il termine =dabbrev= sta per “dynamic abbreviations”. Emacs ha anche +[[id:3d430319-6637-4724-ab6b-d2960f279ce8][abbreviazioni statiche]] definite dall’utente. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;;;; `dabbrev' (dynamic word completion (dynamic abbreviations)) + (setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_") + (setq dabbrev-abbrev-skip-leading-regexp "[$*/=~']") + (setq dabbrev-backward-only nil) + (setq dabbrev-case-distinction 'case-replace) + (setq dabbrev-case-fold-search nil) + (setq dabbrev-case-replace 'case-replace) + (setq dabbrev-check-other-buffers t) + (setq dabbrev-eliminate-newlines t) + (setq dabbrev-upcase-means-case-search t) + (setq dabbrev-ignored-buffer-modes '(archive-mode image-mode docview-mode pdf-view-mode)) +#+end_src + +** Impostazioni per l'uso delle static abbreviations :@ToReview: +:PROPERTIES: +:ID: 3d430319-6637-4724-ab6b-d2960f279ce8 +:END: + +[Vedi articolo/video relativo: [[https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/][Emacs: abbreviations with abbrev-mode]]] + +A differenza delle [[id:d66bda07-4362-43fb-bfb0-45279cb3dab4][abbreviazioni dinamiche]] che dipendono dal testo già +disponibile in un buffer, possiamo definire abbreviazioni che si espandono +sempre in base a quanto specificato. + +Le abbreviazioni, o il =abbrev= meccanismo, sono stringhe di caratteri che, una +volta digitate, vengono sostituite da un'altra stringa. Ad esempio, se voglio +digitare l'URL del mio sito web, inserisco mewebe continuo a digitare. Emacs +espanderà quella parola in https://protesilaos.com. + +A meno che tu non stia documentando la funzione della tua abbreviazione o che tu +abbia abbreviazioni facili da digitare in modo errato, non avrai mai bisogno di +dire a Emacs di non espandere l'input fornito. Tieni presente che il comando +=unexpand-abbrev= è disponibile se ne hai bisogno. Ho dovuto usarlo nel paragrafo +precedente per digitare prima l'abbreviazione che ho usato come esempio. + +Allo stesso modo, possiamo espandere un'abbreviazione ovunque con il comando +=expand-abbrev=, anche se normalmente non è necessario farlo perché avviene +automaticamente mentre digitiamo. + +Emacs gestisce in modo intelligente la definizione e l'utilizzo delle +abbreviazioni. Ogni modalità principale ha la sua tabella di abbreviazioni, alla +quale aggiungiamo le nostre definizioni. Quando ci troviamo in un buffer che +utilizza quella modalità principale, otteniamo l'accesso alle abbreviazioni +corrispondenti. In =global-abbrev-table= è disponibile anche un'opzione per le +abbreviazioni. In caso di conflitto tra una tabella specifica per la modalità +principale e quella globale, la prima ha la precedenza. Inoltre, le tabelle di +abbreviazioni seguono lo stesso principio di ereditarietà delle modalità +principali in generale, il che significa che una modalità come Org erediterà +l'opzione =text-mode-abbrev-table= perché =org-mode= deriva da =text-mode=. Le +tabelle di abbreviazioni sono quindi coerenti con il funzionamento di hook e +mappature di tasti in termini di precedenza ed ereditarietà. + +Come noterai più avanti, utilizzo la =prot-emacs-abbrev= macro per semplificare la +definizione di queste abbreviazioni. La maggior parte delle mie abbreviazioni +sono semplici modifiche alla maiuscola/minuscola. Tieni presente, tuttavia, che +il meccanismo sottostante è potente e può valutare codice Elisp arbitrario (ci +ho giocato un po', anche se non uso template e quindi non ne ho un reale +bisogno, ma funziona). + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; - ;;;; `abbrev' (Abbreviations, else Abbrevs) + ;; - ;; message-mode derives from text-mode, so we don't need a separate + ;; - ;; hook for it. + ;; - (prot-emacs-hook + ;; - (text-mode-hook prog-mode-hook git-commit-mode-hook) + ;; - abbrev-mode) + ;; - + ;; - (setq only-global-abbrevs nil) + ;; - + ;; - (prot-emacs-abbrev global-abbrev-table + ;; - "csico" "CSiCo" + ;; - ";home" "~" + ;; - ";tilde" "~") + ;; - + ;; - (prot-emacs-abbrev text-mode-abbrev-table + ;; - "asciidoc" "AsciiDoc" + ;; - "auctex" "AUCTeX" + ;; - "cafe" "café" + ;; - "cliche" "cliché" + ;; - "clojurescript" "ClojureScript" + ;; - "emacsconf" "EmacsConf" + ;; - "github" "GitHub" + ;; - "gitlab" "GitLab" + ;; - "javascript" "JavaScript" + ;; - "latex" "LaTeX" + ;; - "libreplanet" "LibrePlanet" + ;; - "linkedin" "LinkedIn" + ;; - "paypal" "PayPal" + ;; - "sourcehut" "SourceHut" + ;; - "texmacs" "TeXmacs" + ;; - "typescript" "TypeScript" + ;; - "visavis" "vis-à-vis" + ;; - "deja" "déjà" + ;; - "voila" "voilà" + ;; - "youtube" "YouTube" + ;; - ";up" "🙃" + ;; - ";uni" "🦄" + ;; - ";laugh" "🤣" + ;; - ";smile" "😀" + ;; - ";sun" "☀️") + ;; - + ;; - ;; Allow abbrevs with a prefix colon, semicolon, or underscore. I demonstrated + ;; - ;; this here: . + ;; - (abbrev-table-put global-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)") + ;; - + ;; - (with-eval-after-load 'text-mode + ;; - (abbrev-table-put text-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - (with-eval-after-load 'org + ;; - (prot-emacs-abbrev org-mode-abbrev-table + ;; - ";dev" "}" + ;; - ";key" #'prot-abbrev-org-macro-key + ;; - ";cmd" #'prot-abbrev-org-macro-key-command) + ;; - (abbrev-table-put org-mode-abbrev-table :regexp "\\(?:^\\|[\t\s]+\\)\\(?1:[:;_].*\\|.*\\)")) + ;; - + ;; - ;; Because the *scratch* buffer is produced before we load this, we + ;; - ;; have to explicitly activate the mode there. + ;; - (when-let* ((scratch (get-buffer "*scratch*"))) + ;; - (with-current-buffer scratch + ;; - (abbrev-mode 1))) + ;; - + ;; - ;; By default, abbrev asks for confirmation on whether to use + ;; - ;; `abbrev-file-name' to save abbrevations. I do not need that, nor + ;; - ;; do I want it. + ;; - (remove-hook 'save-some-buffers-functions #'abbrev--possibly-save) +#+end_src + + +* \to File di configurazione di org-mode: *org-init.el* :@ToReview: +:PROPERTIES: +:ID: 3a5bad5e-b492-4459-b863-ee15421eb5d8 +:END: + +Essendo un file di configurazione ausiliario, va caricato nel file =init.el= +come fatto [[id:0ab89109-24cb-445a-a913-e575bfb42a16][qui]]. + +Nella [[https://orgmode.org/org.html#Installation][guida di installazione]] di org è indicato che aggiornarlo durante l'uso +potrebbe comprometterlo. Per evitarlo l'aggiornamento lo tengo manuale secondo +questa procedura: +- chiudere emacs +- avviare emacs (magari in debug) +- nel buffer (non aprire nessun altro buffer) scratch inserie il seguente codice + e valutarlo con il comando =C-j= o dal menu: + #+begin_src emacs-lisp :tangle no :results none + ;; aggiorno org: + ;; - prima aggiorna le definizioni dei pacchetti + ;; - infine aggiorna l'installazione di org + (progn (package-refresh-contents) (package-upgrade 'org)) + #+end_src +- riavviare emacs e verificare la versione di org + +** Attivazione di org +:PROPERTIES: +:ID: 71af7f69-5c51-4f36-85f9-d50d5b6bd2ad +:END: + +Dal sito di riferimento di org: [[https://orgmode.org/][orgmode.org]] ricavo l'abilitazione del pacchetto: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Installazione + (use-package org + :ensure t) + ;; + ;; Imposto OrgMode come default per i file '*.org' e '*.org_archive' + (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\)$" . org-mode)) + ;; + ;; Attivazione pacchetto + (require 'org) +#+end_src + +** Impostazione per formato di default dei file: UTF-8 +:PROPERTIES: +:ID: dc2254e1-3881-4e5d-a153-9b1a6738599a +:END: + +Oltre a quanto fatto [[id:d61b5760-4393-403d-a169-0d9da94db50a][prima]] imposto nello specifico il formato UTF8 per i file +org: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; default coding system UTF-8 + (setq org-export-coding-system 'utf-8) + (setq default-process-coding-system '(utf-8-unix . utf-8-unix)) +#+end_src + +** Imposto la visibilità iniziale di default: +:PROPERTIES: +:ID: e51a0604-d2d1-486e-ad56-20103e765ebd +:END: + +Imposto la visibilità iniziale a tutto ragruppato per velocizzare la vista +dall'alto. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Visibilità iniziale: tutto ragruppato + (setq org-startup-folded t) +#+end_src + +Questo comportamento generale, si può modificare per ciascun file e per ciascun +header come esplicitato nei seguenti paramgrafi: + +*** Opzione STARTUP +:PROPERTIES: +:ID: a7ee76d6-6600-48f2-80a4-b641d9b711ce +:END: + +Per cambiare il raggruppamento iniziale, di un intero file, utilizzare +sull'opzione *STARTUP* uno dei seguenti valori: +- overview :: Mostra solo i titoli di primo livello (tutto il resto è + raggruppato). +- content :: Mostra tutti i titoli di tutti i livelli, ma nasconde il testo. +- nofold o showall :: Mostra tutto il file completamente espanso (testo + incluso). +- show2levels fino a show5levels :: Espande i titoli fino al livello numerato + indicato. +- showeverything :: Mostra assolutamente tutto, inclusi i cassetti nascosti + (drawers). + +Mentre per la visibilità dei singoli headline, si utilizza il parametro +*VISIBILITY* + +*** Parametro VISIBILITY +:PROPERTIES: +:ID: df2a6f58-5a41-4a47-a0cf-70ff934db8d4 +:END: + +Per cambiare la visibilità iniziale di un headline si utilizza la propietà +*VISIBILITY*: +- folded :: Mantiene il titolo completamente raggruppato (utile se il resto del + file è impostato per aprirsi espanso). +- children :: Mostra solo i sotto-titoli diretti di quel livello, ma nasconde il + loro testo interno e i sotto-titoli ancora più profondi. +- content :: Mostra tutti i sotto-titoli di qualsiasi livello appartenenti a + quel ramo, ma nasconde tutto il testo. +- all :: Espande completamente l'intero ramo (mostra tutti i sotto-titoli e + tutto il testo). + +Questa va a sovrascrivere l'eventuale impostazione fatta a livello di file con +l'opzione *STARTUP* o quella generale. + +** KeyBinding :@Missing:@ToReview: +:PROPERTIES: +:ID: 25b3bfad-98e3-4f30-9ecb-89323e8e263b +:END: + +*** Funzioni generali: +:PROPERTIES: +:ID: 0c1d8fea-d006-41da-a185-5c4505298c54 +:END: + +Impostiamo alcuni dei key binding di default: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;;(global-set-key (kbd "C-c l") 'org-store-link) + (global-set-key (kbd "C-c a") 'org-agenda) + (global-set-key (kbd "C-c c") 'org-capture) +#+end_src + +*** Tasti funzione: :@ToReview: +:PROPERTIES: +:ID: 505d9c55-8ba2-45b0-964b-edc3f9e2e9e0 +:END: + +Analisi dei tasti funzioni disponibili: + +| Key | Binding originale | My Bingind | +|-----------+------------------------------+---------------------------------------| +| | Divide schermo verticalmente | | +| S- | Divide schermo verticalmente | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Show Help | | +| S- | Show Help | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Defining kbd macro... | | +| S- | Defining kbd macro... | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Excute macro | | +| S- | ??? | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | | +| S- | Non Definito | | +| C- | Non Definito | | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | Visualizza tutto | +| S- | Non Definito | Visualizza solo ramo attuale | +| C- | Non Definito | Nascondi ramo attuale | +| M- | Non Definito | | +|-----------+------------------------------+---------------------------------------| +| | Passa il focus al menu | | +| S- | Passa il focus al menu | | +| C- | Passa il focus al sottomenu | | +| M- | Vista Intero/Finestra | | +|-----------+------------------------------+---------------------------------------| +| | Vista Intero/Finestra | Vis. dove c'è il clock attivo | +| S- | Vista Intero/Finestra | Fa partire il clock di timing | +| C- | Non Definito | Termina il clock di timing | +| M- | Non Definito | ex Org manage per navigare fra i file | +|-----------+------------------------------+---------------------------------------| +| | Non Definito | Apre agenda (C-c a) | +| S- | Non Definito | Aprire subito Trash.org | +| C- | Non Definito | Aprire subito InBox.org | +| M- | Non Definito | Aprire subito Mrk.org | +| C-S- | Non Definito | Pubblicazione file org | +|-----------+------------------------------+---------------------------------------| + +Cioè voglio queste funzionalità: +- *F9* - /Visibilità/ - per la visibilità sul file +- *F11* - /Loggin Work/ - per la gestione del log dei tempi +- *F12* - /Navigazione/ - per la navigazione fra i file (e la pubblicazione per compatibilità) + +Questi binding vengono quindi così configurati: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Key F9 dedicato alle viste + (global-set-key (kbd "") 'widen) + (global-set-key (kbd "C-") 'MRK/hide-other) + (global-set-key (kbd "S-") 'narrow-to-region) + ;; Key F11 dedicato ai timer + (global-set-key (kbd "") 'org-clock-goto) + (global-set-key (kbd "C-") 'org-clock-in) + (global-set-key (kbd "S-") 'org-clock-out) + ;; (global-set-key (kbd "M-") 'org-manage ) + ;; Key F12 dedicato ai file + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd "S-") (lambda() (interactive)(find-file "~/Doc/Trash/Trash.org"))) + (global-set-key (kbd "C-") (lambda() (interactive)(find-file "~/Doc/Org/InBox.org"))) + (global-set-key (kbd "M-") (lambda() (interactive)(find-file "~/Doc/Org/Private/MRK.org"))) + (global-set-key (kbd "C-S-") 'MRK/save-then-publish) +#+end_src + +**** To Review: +:PROPERTIES: +:ID: c228fc57-6d02-4e38-9fff-42b8102958cb +:END: + + Verificare come posso sfruttare i segnalibri per navigare fra i file: + : C-x r m bookmark-set Imposta un segnalibro. Utile nelle ricerche + : C-x r b bookmark-jump Salta ad un segnalibro. + + Come riepilogato nella [[https://www.emacswiki.org/emacs/BasicNarrowing][wiki]] i comandi base per narrowing/widen (narrow=stringere + widen=allargare) in emacs sono: + - C-x n n /narrow-to-region/ :: Visualizza solo il testo selezionato, e nasconde + tutto il resto. + - C-x n w /widen/ :: Visualizza tutto il testo del buffer + - C-x n p /narrow-to-page/ :: Visualizza solo il testo dal cursore a fine pagina. + - C-x n d /narrow-to-defun/ :: Visualizza solo il testo tramite le [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Defuns.html#Defuns][Defun]]. + Naturalmente il testo nascosto non è più accessibile per le modifiche dal buffer + fino a che non si rivisualizza (widen) però rimane gestito, quindi salvando il file + lo mantiene ecc... + + Org-mode ha i seguenti modi per cambiare la visibilità del testo nel buffer: + - C-c / /org-sparse-tree/ :: This prompts for an extra key to select a sparse-tree + creating command. + + + + Impostiamo il tasto F11 per iteragire con i timer ed il log delle ore e quindi + devo pensare a come fare le seguenti cose: + - avviare il log del task: Clock in + - fermare un log del task: Clock out + - fare il report dei log: ? + - stimare il tempo di un task + - modificare la stima di un task + - mostrare stima e log di un task in forma colonne + - navigare fra i task loggati (la ring relativa) + + + + + Mentre imposto anche questi miei key binding custom: + #+begin_src emacs-lisp :tangle no + ;; Vecchio binding solo per reference: + ;;(global-set-key (kbd "") 'org-agenda) + ;;(global-set-key (kbd "") 'bh/org-todo) + ;;(global-set-key (kbd "") 'bh/widen) + ;;(global-set-key (kbd "") 'bh/set-truncate-lines) + ;;(global-set-key (kbd "") 'org-cycle-agenda-files) + ;;(global-set-key (kbd " ") 'bh/show-org-agenda) + ;;(global-set-key (kbd " b") 'bbdb) + ;;(global-set-key (kbd " c") 'calendar) + ;;(global-set-key (kbd " f") 'boxquote-insert-file) + ;;(global-set-key (kbd " g") 'gnus) + ;;(global-set-key (kbd " h") 'bh/hide-other) + ;;(global-set-key (kbd " n") 'bh/toggle-next-task-display) + ;;(global-set-key (kbd " I") 'bh/punch-in) + ;;(global-set-key (kbd " O") 'bh/punch-out) + ;;(global-set-key (kbd " o") 'bh/make-org-scratch) + ;;(global-set-key (kbd " r") 'boxquote-region) + ;;(global-set-key (kbd " s") 'bh/switch-to-scratch) + ;;(global-set-key (kbd " t") 'bh/insert-inactive-timestamp) + ;;(global-set-key (kbd " T") 'bh/toggle-insert-inactive-timestamp) + ;;(global-set-key (kbd " v") 'visible-mode) + ;;(global-set-key (kbd " l") 'org-toggle-link-display) + ;;(global-set-key (kbd " SPC") 'bh/clock-in-last-task) + ;;(global-set-key (kbd "C-") 'previous-buffer) + ;;(global-set-key (kbd "M-") 'org-toggle-inline-images) + ;;(global-set-key (kbd "C-x n r") 'narrow-to-region) + ;;(global-set-key (kbd "C-") 'next-buffer) + ;;(global-set-key (kbd "") 'org-clock-goto) + ;;(global-set-key (kbd "C-") 'org-clock-in) + ;;(global-set-key (kbd "C-") 'MRK/save-then-publish) + #+end_src + +** Tasks and States :@Missing:@ToReview: +:PROPERTIES: +:ID: 9d0866dc-6d43-416b-829e-3959e3f0eef7 +:END: + +Imposto come parole chiavi per i ToDo i seguenti codici: +| key | Descr | +|---------+--------------------------| +| TODO | Task da fare | +| NEXT | Task in esecuzione | +| DONE | Task terminato | +| WAITING | Task in attesa | +| HOLD | Task Bloccato | +| ABORT | Task Abortito(Cancellato | +| PHONE | Telefonata | +| MEETING | Meeting | + +e corrisponde al seguente schema: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_task_states.png :cache yes :tangle no + title Task States + [*] -> TODO + TODO -> NEXT + TODO -> DONE + NEXT -> DONE + DONE -> [*] + TODO --> WAITING + WAITING --> TODO + NEXT --> WAITING + WAITING --> NEXT + HOLD --> CANCELLED + WAITING --> CANCELLED + CANCELLED --> [*] + TODO --> HOLD + HOLD --> TODO + TODO --> CANCELLED + TODO: t + NEXT: n + DONE: d + WAITING:w + note right of WAITING: Note records\nwhat it is waiting for + HOLD:h + note right of CANCELLED: Note records\nwhy it was cancelled + CANCELLED:c + WAITING --> DONE +#+end_src + +per le chiamate: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_phone_states.png :cache yes :tangle no + title Phone Call Task State + [*] -> PHONE + PHONE -> [*] +#+end_src + +per i meeting: + +#+begin_src plantuml :file ~/Pub/.Tmp/Img/org-init.el_meeting_states.png :cache yes :tangle no + title Meeting Task State + [*] -> MEETING + MEETING -> [*] +#+end_src + +Per ciacuno di essi, definisco anche la lettera di abbreviazione per +l'inserimento veloce + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Task keywords definitions: + (setq org-todo-keywords + (quote ( + (sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "ABORT(a@/!)" "PHONE" "MEETING") + ) + ) + ) +#+end_src + +Per ciascuna keyword posso personalizzare il faceplate, ma per ora non lo +faccio. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; - ;; Task keywords colour settings: + ;; - (setq org-todo-keyword-faces (quote ( + ;; - ("TODO" :foreground "red" :weight bold) + ;; - ("NEXT" :foreground "blue" :weight bold) + ;; - ("DONE" :foreground "forest green" :weight bold) + ;; - ("WAITING" :foreground "orange" :weight bold) + ;; - ("HOLD" :foreground "magenta" :weight bold) + ;; - ("ABORT" :foreground "forest green" :weight bold) + ;; - ("MEETING" :foreground "forest green" :weight bold) + ;; - ("PHONE" :foreground "forest green" :weight bold) + ;; - ))) +#+end_src + +Ai tipi di ToDo, associo anche in modo automatico dei tag per facilitare filtri +o ricerche: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Triggers that automatically assign tags to tasks based on state changes: + (setq org-todo-state-tags-triggers (quote ( + ("ABORT" ("ABORT" . t)) + ("WAITING" ("WAITING" . t)) + ("HOLD" ("WAITING") ("HOLD" . t)) + (done ("WAITING") ("HOLD")) + ("TODO" ("WAITING") ("ABORT") ("HOLD")) + ("NEXT" ("WAITING") ("ABORT") ("HOLD")) + ("DONE" ("WAITING") ("ABORT") ("HOLD")) + ))) +#+end_src + +Abilito la selezione veloce delle keyword tramite il comando +: C-c C-t Keyword + +Inoltre abilito lo switch fra le keyword tramite i comandi +: S-left +: S-right + +senza però che si attivino le annotazioni automatiche. + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Fast todo selection allows changing from any task todo state to any other state directly by selecting the appropriate key from the fast todo selection key menu. + ;; The relative command is: C-c C-t KEY where KEY is the appropriate fast todo state selection key as defined in org-todo-keywords. + (setq org-use-fast-todo-selection t) + ;; + ;; Cycles through the todo states with S-left and S-right, but skips setting timestamps and entering notes + (setq org-treat-S-cursor-todo-selection-as-state-change nil) +#+end_src + +** Tags :@Missing: +:PROPERTIES: +:ID: 85effced-97fd-4e2f-ac89-3e16a4931461 +:END: + +Imposto i tag generali in uso + +** Setup org-capture :@Missing: +:PROPERTIES: +:ID: ad8d08bc-66b4-4f16-b8c2-d5478a77ac4b +:END: + +Imposto i form di cattura veloce + +Per ora uso quelli di default. Da approfondire anche la modalità a promt in cui +chiede via via le info da riportare sul template. + +Per ora ho approfondito questi template: +- Journal :: per fare una nuova entry sul ramo =Journal= del file InBox.org. + + In particolare: + - Come struttura del ramo, utilizzo la divisione mensile + - Abilito il clocking in modo da tenere traccia di quanto ci metto + inserirla. =@ToReview= devo integrare la funzione che elimina i logbook con + tempi sotto al minuto per evitare dispersione. + - Nell'ultima riga inserisco fra parentesi quadre il timestamp di quando è + creata l'entry. Non mostro più i link da dove è stata fatta perchè no so se + li userò mai, e attualmente mi danno problemi nell'esportazione. Cioè + utilizzo =[ Entered on %U ]= invece che la completa =[ Entered on %U from + %i\n%a ]]=. + +La configurazione complessiva è quindi: +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (setq org-capture-templates + '( + ("n" "Note" + entry (file+headline "~/Doc/Org/InBox.org" "Notes") + "* %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :empty-lines-before 1 + :empty-lines-after 0 + ) + + ("t" "Todo" + entry (file+headline "~/Doc/Org/InBox.org" "Tasks") + "* TODO %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :empty-lines-before 1 + :empty-lines-after 0 + ) + + ("j" "Journal" + entry (file+datetree "~/Doc/Org/InBox.org" "Journal") + "* %?\n[ Entered on %U ]" + :clock-in + :clock-keep + :tree-type month ; day week month list + :empty-lines 0 + ) + + ) + ) +#+end_src + +** Refil :@Missing: +:PROPERTIES: +:ID: 2ddc606d-7a12-488c-9237-462c76e115c7 +:END: + +Imposto il refill per ricollocare al volo gli header. + +;; ** Correzione Refil: +;; Il refil non funziona più, non mi permette di cambiare file, per ovviare, ho visto il +;; sito [[https://blog.aaronbieber.com/2017/03/19/organizing-notes-with-refile.html][Organizing Notes With Refile]] che mi dà questa ocnfigurazione: +;; #+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" +;; ;; I want to be able to move a node to any of my agenda files, +;; ;; and I also want to consider nodes up to three levels deep. +;; (setq org-refile-targets '((org-agenda-files :maxlevel . 3))) +;; ;; Refile to the Top Level +;; (setq org-refile-use-outline-path 'file) +;; ;; But, if you use Helm, which you really should, you will notice that as soon +;; ;; as you set this option, your target list contains only one filename. Typing +;; ;; to complete may allow you to find another filename within your agenda files, +;; ;; but you will only ever see a filename; no other headings ever appear! +;; ;; Why is that?! +;; ;; It took a bit of searching to find this solution. This is because the +;; ;; default behavior for Refile is to allow you to do a step-by-step completion +;; ;; of this path, but if you’re using Helm, Helm is overriding the completing +;; ;; read to make it into a narrowing list (that we have all come to love). +;; ;; So what you need to do is tell Org that you don’t want to complete in steps; +;; ;; you want Org to generate all of the possible completions and present them at +;; ;; once. Helm then lets you narrow to the one you want. +;; (setq org-outline-path-complete-in-steps nil) +;; ;; Creating New Parents +;; (setq org-refile-allow-creating-parent-nodes 'confirm) +;; #+end_src +;; Altro sito interessante, che ho trovato dopo: [[https://yiming.dev/blog/2018/03/02/my-org-refile-workflow/][My org-refile workflow]] + +** org-protocol :@Missing: +:PROPERTIES: +:ID: ce081403-fafc-4288-bcd5-0bdbb12b389b +:END: + +Imposto org protocol per interagire con altri programmi + +** Agenda :@Missing: +:PROPERTIES: +:ID: 7d3d32f2-8708-4d1e-bbe1-0b12223eec3b +:END: + +[ In realtà voglio cambiar emetodo ed usare Inbox per tutto fino a quando posso +archiviare un lavoro su apposito file clienti o personale. L'agenda avrà solo +file InBox ed eventualmente un file tipo diario o simile, mentre tutti i file +dedicati a lavori e personali non vanno in agenda, perchè hanno solo info +statiche. ] + +Per l'aggenda in primo acchitto utilizzo i file in cui lavoro, quindi utilizzerò +i file: +- Inbox.org: Per tutti i task su cui sto lavorando e che quindi avranno sicuramente + ToDo o lavori schedulati. +- Diary.org: Per tutti i task ripetitivi o prevedibili tipo compleanni o altro o + scadenze future (assicurazione, dividendi degli investimenti ecc...) +- KnowHow: Per tutti i file con le mie note, sopratutto per le ricerche in base ai tag +- Private: Per i miei lavori privati, in particolare prevedo vi saranno soprattutto + task ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. +- Work: Per i miei lavori, in particolare prevedo vi saranno soprattutto task + ripetitivi, perchè gestendo i lavori correnti con il Inbox.org, sulla cartella + resteranno pochi task Todo o schedulati. +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; File gestiti dall'agenda: + (if (boundp 'org-user-agenda-files) + (setq org-agenda-files org-user-agenda-files) + (setq org-agenda-files ( quote ( + "~/Doc/Org/Diary.org" + "~/Doc/Org/InBox.org" + "~/Doc/Org/KnowHow" + "~/Doc/Org/Private" + "~/Doc/Org/Work" + ) + ) + ) + ) +#+end_src + +** Time Clocking, Reporting, Tracking, Estimate :@Missing: +:PROPERTIES: +:ID: 0131267e-b953-4d6d-98a3-e537aae257d8 +:END: + +Dal manuale, si ricavano i seguenti comandi per la retentività dei clock: +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (setq org-clock-persist 'history) + (org-clock-persistence-insinuate) +#+end_src + +Voglio che il pulsante F9 sia dedicato al clock e quindi le varie comandi: +- org-clock-goto va al clock in corso (F9) + +** GTD stuff (Project & Archiving) :@Missing: +:PROPERTIES: +:ID: 28bc92a7-f8c7-4f63-86a9-784fb55c303a +:END: + +Imposto i set per usare GTD ed eventualmente projetile e treemacs + +** Reminders :@Missing: +:PROPERTIES: +:ID: 93a4b11c-616e-4bfd-bf48-963e33b1a4ae +:END: + +Imposto i remainder e come utilizzarli. + +** Publishing and Exporting :@ToReview: +:PROPERTIES: +:ID: 97c3d76c-138f-48e8-b698-fa3bbe74565c +:END: + +Impostazioni generali utili per l'esportazione (anche del singolo file): + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Alphabetical listing options need to be set before the exporters are loaded for filling to work correctly + (setq org-alphabetical-lists t) + ;; + ;; Explicitly load required exporters + (require 'ox-html) + (require 'ox-latex) + (require 'ox-ascii) + (require 'ox-md) + (require 'ox-texinfo) + ;; + ;; Imposto dove trovare Ditaa (Corretto il setup di Ditaa in base alla discussione del forum: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864) + (setq org-ditaa-jar-path "~/.MyCfg/emacs/AddOn/app/ditaa0_9.jar") + ;; + ;; Imposto dove trovare PlantUML (http://plantuml.sourceforge.net/faq.html) + (setq org-plantuml-jar-path "~/.MyCfg/emacs/AddOn/app/plantuml-1.2023.1.jar") +#+end_src + +Imposto Babel: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Org-babel Setup: + ;; + ;; Imposto di mostrare l'immagine: + (add-hook 'org-babel-after-execute-hook 'org-display-inline-images) + ;(add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append) + ;; + ;; Make babel results blocks lowercase + (setq org-babel-results-keyword "results") + ;; + ;; Imposto quali linguaggi caricare: Per Problema a Ditaa sto studianto: http://thread.gmane.org/gmane.emacs.orgmode/27859/focus=27864 + (org-babel-do-load-languages + (quote org-babel-load-languages) + (quote ( + ; (asymptote . t) + ; (awk . t) + ; (C . t) + ; (calc . t) + ; (clojure . t) + ; (comint . t) + ; (core . t) + ; (csharp . t) + ; (css . t) + (ditaa . t) + (dot . t) + (emacs-lisp . t) + ; (eval . t) + ; (exp . t) + ; (fortran . t) + ; (gnuplot . t) + ; (haskell . t) + ; (io . t) + ; (java . t) + ; (js . t) + ; (keys . t) + ; (latex . t) + ; (ledger . t) + ; (lilypond . t) + ; (lisp . t) + ; (lob . t) + ; (makefile . t) + ; (matlab . t) + ; (maxima . t) + ; (mscgen . t) + ; (ocaml . t) + ; (octave . t) + (org . t) + ; (perl . t) + ; (picolisp . t) + (plantuml . t) + ; (python . t) + ; (R . t) + ; (ref . t) + ; (ruby . t) + ; (sass . t) + ; (scala . t) + ; (scheme . t) + ; (screen . t) + ; (sh . t) + ; (shell . t) + ; (shen . t) + ; (sql . t) + ; (sqlite . t) + ; (table . t) + ; (tangle . t) + ))) + ;; + ;; Do not prompt to confirm evaluation + ;; This may be dangerous - make sure you understand the consequences + ;; of setting this -- see the docstring for details + (setq org-confirm-babel-evaluate nil) + ;; + ;; Use fundamental mode when editing plantuml blocks with C-c ' + (add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental))) + ;; +#+end_src + +Altro sull'esportazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Inline images in HTML instead of producting links to the image + (setq org-export-html-inline-images t) + ;;; Disabilita la visualizzazione delle immagini per evitare errori nelle sessioni ssh + ;(setq org-startup-with-inline-images nil) + ;; + ;; Inline images in HTML instead of producting links to the image + (setq org-html-inline-images t) + ;; + ;; Do not use sub or superscripts - I currently don't need this functionality in my documents + ;(setq org-export-with-sub-superscripts nil) + ;; + ; ;; Usa foglio di stile locale: Preferisco caricarlo dal file template + ; (setq org-html-head-extra "") + ; (setq org-html-head-include-default-style nil) + ; ;; + ; ;; Do not generate internal css formatting for HTML exports + ; (setq org-export-htmlize-output-type (quote css)) + ;; + ;; Disabilita lo stile di default: + (setq org-export-html-style-include-default nil) + ;; + ;; Export with LaTeX fragments + (setq org-export-with-LaTeX-fragments t) + ;; + ;; For export to latex I use the following setting to get fontified listings from source blocks: + (setq org-export-latex-listings t) + ;; + ;; Fontify Latex listings for source blocks + (setq org-latex-listings t) + ;; + ;; Rimuovo l'header XML per problemi di compatibilità con open office + (setq org-html-xml-declaration (quote ( + ("html" . "") + ("was-html" . "") + ("php" . "\"; ?>") + ))) + ;; + ;; Permetto in automatico l'override delle variabili di personalizzazione dell'esportazione + (setq org-export-allow-BIND t) + ;; + ;; +#+end_src + +Infine definisco il progetto di esportazione: + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; Progetti per l'esportazione automatica: + ;; OrgData - Esportazione di tutti i file in OrgData + (setq org-publish-project-alist (quote ( + ;; Progetti nell'esportazione dei file Org: + ;; - orgFile are the org-files that generate the content + ;; - imgFile are images and css files that need to be included + ;; - OrgData is the top-level project that gets published + ("orgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :recursive t + :section_numbers nil + :table-of-contents nil + :base-extension "org" + :publishing-function org-html-publish-to-html + :auto-index t + :index-filename "Index.org" + :index-title "Indice del materiale Org-Mode" + :index-function org-publish-org-index + :author-info t + :creator-info t + :auto-sitemap t + :sitemap-filename "MySiteMap.org" + :html-head-extra "\n\n\n" + :sitemap-title "Indice del materiale esportato in html") + ("imgFile" + :base-directory "~/Doc/Org" + :publishing-directory "~/Pub" + :base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt" + :publishing-function org-publish-attachment + :recursive t + :author nil) + ("OrgData" + :components ("orgFile" "imgFile")) + ))) +#+end_src + +*** Template per le esportazioni :@ToReview: +:PROPERTIES: +:ID: 06b5f61b-2c88-4a72-ad1b-124d1ba4db3c +:END: + +Oltre atutti gli altri template di esportazione, i più belli finora trovati sono: +- ToPrintStyle.css :: per esportare in html e poi stamparlo +- ox-twbs :: per esportare in un PDF elegante, sobrio e con il TOC laterale. + +;; ** Inserito ox-twbs: exporting to HTML with a Twitter Bootstrap theme +;; Da [[https://github.com/marsmining/ox-twbs][GITHub]] ricavato l'esporter per esportare i file org, come documenti HTML compatibili +;; con il [[http://getbootstrap.com/][Twitter Bootstrap]]. +;; #+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" +;; (use-package ox-twbs +;; :ensure t) +;; #+end_src + + + +;; Export org-mode theme +;; * Export org-mode theme +;; In ~/.MyCfg/emacs/templates inserisco le definizioni dei themi da utilizzare con +;; l'esportazione da org; mentre in ~/Pub/.Styles inserisco le relative risorse (css, js, +;; ecc...) che sono necessarie per caricare localmente il tema. Quando possibile mantengo +;; nelle definizioni sia il setup per i riferimenti locali (per mio utilizzo locale), sia +;; il setup con i riferimenti remoti in modo che il file sia visibile da tutti (per +;; utilizzo di altri). +;; +;; In particolare al 2020/04 ho impostato due themi principali, mentre al 2020/06 ho +;; introdotto altri themi, per arrivare ai seguenti che riassumo brevemente nella forma +;; locale: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; +;; ** Norang +;; Tema che ho ricavato dal sito [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/norang, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/norang. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/norang/norang.org +;; +;; ** Org-HTML (Bigblow, ReadTheOrg) +;; +;; ** gongzhitaao.org +;; Stile semplice preso dal sito: https://gongzhitaao.org/orgcss/ tramite il link diretto: +;; [[https://gongzhitaao.org/orgcss/org.css][org.css]] e che dispone del repository: [[https://github.com/gongzhitaao/orgcss][GitHub]] +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/gongzhitaao.org, mentre le relative +;; risorse le ho messe in ~/Pub/.Styles/gongzhitaao.org. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/gongzhitaao.org/gongzhitaao.org +;; +;; ** solarized-css +;; Dal sito [[http://thomasf.github.io/solarized-css/][solarized-css]] ([[https://github.com/thomasf/solarized-css][GitHub]]) ricavo un thema chiaro ed uno scuro che sembrano +;; promettenti: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/solarized-css, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/solarized-css. +;; +;; Per applicare, il thema chiaro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-light.org +;; +;; Per applicare, il thema scuro, utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/solarized-css/solarized-dark.org +;; +;; ** thi.ng/org-spec +;; Dal sito https://github.com/thi-ng/org-spec ricavo un thema semplice ma con la TOC a +;; sinistra: +;; +;; I file di configurazione sono in ~/.MyCfg/emacs/templates/thi.ng, mentre le +;; relative risorse le ho messe in ~/Pub/.Styles/thi.ng. +;; +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng_local.org +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/thi.ng/thi.ng.org +;; +;; ** org-html-themes (Bigblow e ReadTheOrg) +;; Vi sono più versioni, il reposity di [[https://github.com/fniessen/org-html-themes][fniessen]] è stato forkato da [[https://github.com/paulzql/org-html-themes][paulzql]] che io avevo +;; inizialmente preso a riferimento. Però questo è fermo al 2015, mentre fniessen è più +;; attivo e quindi faccio l'upgrade sperando che così risolva i piccoli errori riscontrati +;; nella toc laterale quando ho molte headline. +;; +;; *** Repository fniessen/org-html-themes +;; Sito di riferimento: [[https://github.com/fniessen/org-html-themes][GitHub]] +;; +;; *** Repository paulzql/org-html-themes +;; Sito di riferimento: [[https://github.com/paulzql/org-html-themes][GitHub]] +;; +;; Da questo sito, ho ricavato il reposity del 2020/04, ho copiato i file di setup in +;; ~/.MyCfg/emacs/templates/org-html-themes dopo aver corretto i riferimenti locali; le +;; risorse le ho copiate nella cartella C:\_Home\Pub\.Styles\org-html-themes-master. +;; +;; **** Bigblow +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-bigblow.setup +;; +;; Questo tema permette di utilizzare le seguenti abbreviazioni per navigare: +;; | Shortcut | What it does | +;; |----------+-----------------------------------| +;; | ? or h | Access the dashboard | +;; | n | Move to the next main heading | +;; | p | Move to the previous main heading | +;; | b | Scroll up | +;; | < | Scroll to top | +;; | > | Scroll to bottom | +;; | - | Collapse all | +;; | + | Expand all | +;; | r | Go to next task in list | +;; | R | Go to previous task in list | +;; | q | Stop reviewing the list of tasks | +;; | g | Reload the page | +;; |----------+-----------------------------------| +;; +;; **** ReadTheOrg +;; Per applicarlo utilizzare il seguente metadata sul file org: +;; - Versione con risorse locali: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg-local.setup +;; - Versione con risorse remote: +;; : #+SETUPFILE: ~/.MyCfg/emacs/templates/org-html-themes/theme-readtheorg.setup + +** Custom function : +:PROPERTIES: +:ID: 8ec057af-778a-4a65-b5a7-4f68b2348386 +:END: + +*** MRK/save-then-publish +:PROPERTIES: +:ID: f1cacac0-0d4b-433f-8d81-992a5e0b72cf +:END: + +Funzione ricavata dall'esempio in [[http://doc.norang.ca/org-mode.html][Org Mode - Organize Your Life In Plain Text!]] per: +- salvare tutti i buffer +- inserire per ciascun file la validazione dell'html +- richiamare per ciascuno l'esportazione in html +- infine richiamare la pubblicazione dell'intero progetto + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + (defun MRK/save-then-publish (&optional force) + (interactive "P") + (save-buffer) + (org-save-all-org-buffers) + (let ( + (org-html-head-extra) + (org-html-validation-link "Validate XHTML 1.0") + ) + (org-publish-current-project force) + ) + ) +#+end_src + +*** MRK/hide-other +:PROPERTIES: +:ID: 77abf2b1-e72e-47cf-9efa-35b995a4a086 +:END: + +Funzione per aprire completamente il ramo in cui sono e ragruppare tutti gli altri. + +#+BEGIN_SRC emacs-lisp + (defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (hide-other) + (org-cycle) + (org-cycle) + ) + ) +#+end_src + +** Impostazione per l'uso del Package: buffer-to-pdf :@Disable: +:PROPERTIES: +:ID: a2394c39-24e4-4d3b-a33a-021577e17213 +:END: + +[ Nel test fatto, risponde come se avesse creato tutto senza errore, ma in +realtà non crea nulla. ] + +Dall'[[https://protesilaos.com/codelog/2026-05-02-emacs-buffer-to-pdf-new-package/][articolo]] di prot (vi è anche il relativo [[https://www.youtube.com/watch?v=JG4R-d0N-is][video]] e repository [[https://github.com/protesilaos/buffer-to-pdf][GitHub]]) mi +interessa esportare in pdf il buffer, rispettando ciò che si vede (il narrowin) +e quindi provo: + +#+begin_src emacs-lisp :tangle no + (use-package buffer-to-pdf + :ensure nil + :init + ;; Then upgrade it with the command `package-vc-upgrade' or `package-vc-upgrade-all'. + (unless (package-installed-p 'buffer-to-pdf) + (package-vc-install "https://github.com/protesilaos/buffer-to-pdf.git")) + :config + ;; Configure `buffer-to-pdf-directory' to specify where PDF files are stored. + ;; This is the default value: + (setq buffer-to-pdf-directory "~/Doc/Org/Pdf/")) +#+end_src + + +* \xi From Old version to review +** Esplicito fine esportazione + +Esplicito la fine delle esportazioni su ciascun file di configurazione per +essere sicuro che la seguent eparte da rivedere, non inserisca cose spurie. + + +#+begin_src emacs-lisp :tangle "~/.emacs.d/early-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/UI-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/mnbfr-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + +#+begin_src emacs-lisp :tangle "~/.emacs.d/org-init.el" + ;; + ;; - - - - - - - - - - - - - End File - - - - - - - - - - - - - +#+end_src + + + +** Correttore ortografico: :ToReview:Disable: + Dal sito [[https://github.com/nobiot/Zero-to-Emacs-and-Org-roam][nobiot/Zero-to-Emacs-and-Org-roam]] ho preso spunto per installare il correttore + ortografico Hunspell e in particolare ho scaricato la versione 1.7.0 e messa sulla + cartella "~/.MyCfg/emacs/AddOn/hunspell-1.7.0". Qui ho inoltre messo anche i dizionari + presi da quelli di libreoffice. Infine ho impostato emacs in questo modo: + #+begin_src emacs-lisp :tangle no + ;; Imposto l'italiano come lingua predefinita + (setenv "LANG" "it_IT") + ;; Indico dove trovare Hunspell + (setq ispell-program-name "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Bin/hunspell.exe") + ;; Indico che dizionario utilizzare. + ;; Se voglio cambiarlo devo ridare il comando con il dizionario che voglio utilizzare. + (setq ispell-local-dictionary "it_IT") + ;; Imposto il path dei dizionari + (setq ispell-hunspell-dict-paths-alist + '(("it_IT" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ("en_US" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_US.aff") + ("en_GB" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/en_GB.aff") + ("default" "~/.MyCfg/emacs/AddOn/hunspell-1.7.0/Dictionaries/it_IT.aff") + ) + ) + #+end_src + Ora posso avviare il correttore sul file aperto tramite il comando: + : M-x ispell + + Come reference ho utilizzato anche i seguenti siti: + - [[http://blog.binchen.org/posts/what-s-the-best-spell-check-set-up-in-emacs/][What's the best spell check setup in emacs]] + - [[https://www.reddit.com/r/emacs/comments/dgj0ae/tutorial_spellchecking_with_hunspell_170_for/][Tutorial: spellchecking with hunspell (1.7.0) for emacs (26.2) on Windows (10)]] + +** Colorization :ToReview:Disable: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; use colorization for all modes + ;; ---> (global-font-lock-mode t) + #+end_src + +** Reload file nel buffer :Disable:ToReview:KeyBinding: + Per ricaricare il file sul buffer ed anullare tutte le modifiche fatte, si usa il + comando + : revert-buffer + Per comodità è utile bindarlo ad un tasto: + #+begin_src emacs-lisp :tangle no + ;; ---> (global-set-key (kbd "") 'revert-buffer) + #+end_src + +** Modes :Minor_Mode: + +*** IDO :ToReview:Disable: + Mode per avere i suggerimenti e l'autocompletazione nei menu e dei comandi. + + Diverso materiale ed informazioni si possono trovare in: + - [[https://www.emacswiki.org/emacs/InteractivelyDoThings][Ido from emacs wiki]] + - [[https://www.gnu.org/software/emacs/manual/html_mono/ido.html][Ido from gnu.org]] + + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Set ido (https://www.gnu.org/software/emacs/manual/html_mono/ido.html) + ;; ---> (setq ido-everywhere t) + ;; ---> (setq ido-enable-flex-matching t) + ;; ---> (ido-mode 1) + #+end_src + +*** Visual Basic Mode + Dal sito [[http://www.emacswiki.org/emacs/visual-basic-mode.el][Wiki]], si ricava come installare il "visual-basic-mode" che permette di editare + il visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/visu][visual-basic-mode.el]] e per farlo lo metto sul path + che carico di default all'avvio (vedi relativo #Add-AddOn paragrafo); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file (in automatico i file + li associo a "visual basic .net" e non a "visual basic 6"). + #+begin_src emacs-lisp :tangle no + ;; Carico il modo Visual Basic + ;(autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t) + (require 'visual-basic-mode) + ;; + ;; Associo il modo VB automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . visual-basic-mode)) auto-mode-alist)) + (require 'vbnet-mode) + #+end_src + +*** Visual Basic .NET mode + Dal sito [[http://www.emacswiki.org/emacs/VbDotNetMode][Wiki]], si ricava come installare il "vbnet-mode" che permette di editare il + visual basic in modo agevole e con l'evidenziazione sintattica. + + Per farlo occorre caricare il file [[file:~/.MyCfg/emacs/AddOn/vbnet-mode.el][vbnet-mode.cs]] e per farlo lo metto sul path che + carico di default all'avvio (vedi relativo #Add-AddOn paragrafo); per velocizzare si può anche + compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file. + #+begin_src emacs-lisp :tangle no + ;; Carico il modo Visual Basic .Net + (autoload 'vbnet-mode "vbnet-mode" "Mode for editing VB.NET code." t) + ;; + ;; Associo il modo VBNet automaticamente ai file *.frm, *.bas, *.cls, *.vb + ;(setq auto-mode-alist (append '(("\\.\\(frm\\|bas\\|cls\\|vb\\)$" . vbnet-mode)) auto-mode-alist)) + #+end_src + +*** C#: csharp-mode +Da Stack Overflow: [[https://stackoverflow.com/questions/3954607/c-sharp-emacs-mode-questions-indentation-and-build][C# Emacs mode questions - indentation and build]] e successivamente dal +sito [[https://github.com/emacs-csharp/csharp-mode][GitHub csharp-mode]] ricavato i file [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-mode.el][csharp-mode.el]] e [[file:~/.MyCfg/emacs/AddOn/elisp/csharp-compilation.el][csharp-compilation.el]] che +permettono di definire il csharp-mode utilizzabile direttamente nei blocchi org per avere +il codice con la colorazione sintattica. + +Da quanto visto, non serve linkare il linguaggio con babel, ma basta inserire i file negli +AddOn e caricare i rispettivi modi: + +#+begin_src emacs-lisp :tangle no + ;; ---> ;; ---> ;; Carico il path dei file lisp che definiscono il modo C#: + ;; ---> ;; ---> (add-to-list 'load-path (expand-file-name "~/.MyCfg/emacs/AddOn/elisp")) + ;; ---> ;; Attivo il modo per C# + ;; ---> (require 'csharp-mode) + ;; ---> ;; Vi assicio, di default, i file *.cs + ;; ---> (setq auto-mode-alist + ;; ---> (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + ;; ---> ;; Volendo posso definire la funzione di hook per impostarci una + ;; ---> ;; tabulazione predefinita valida in tutti i modi derivanti dal C: + ;; ---> (defun my-c-mode-common-hook () + ;; ---> (setq c-basic-offset 4) + ;; ---> (c-set-offset 'substatement-open 0) + ;; ---> ) + ;; ---> ;; Infine assegnare la funzione appena definita, all'hook: + ;; ---> (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) +#+end_src + +**** Obsoleto: + Dal sito [[https://code.google.com/p/csharpmode/][code.google]] e successivamente dal sito [[https://github.com/josteink/csharp-mode][GitHub]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/csharp-mode.el][csharp-mode.el]] + che permette di avere il csharp-mode per visualizzare il codice C# correttamente + colorato. + + Il file lo ho copiato nella directory che carico allo startup (vedi relativo + #Add-AddOn paragrafo); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Carico il modo C# + ;; ---> (autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t) + ;; ---> ;; + ;; ---> ;; Associo il modo C# automaticamente ai file *.cs + ;; ---> (setq auto-mode-alist (append '(("\\.cs$" . csharp-mode)) auto-mode-alist)) + #+end_src + +** Power Shell mode :Disable:Obsolete: + Ricercando info per il vbnet-mode ho trovato il sito [[https://www.emacswiki.org/emacs/PowerShell][Wiki]] da cui si ricava il file + [[file:~/.MyTools/_MyUp/Lisp/PowerShell-Mode.el][PowerShell-Mode.el]] per gestire il vpowershell-mode + + Il file lo ho messo sulla cartella da cui carico, all'avvio, i file lisp esterni, + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; ---> ;; Carico il modo PowerShell + ;; ---> (autoload 'powershell-mode "vpowershell-mode" "PowerShell Mode" t) + ;; ---> ;; Associo il modo automaticamente ai file *.?1?, *.?2? + ;; ---> ;(setq auto-mode-alist (append '(("\\.\\(?1?\\|?2?\\)$" . vpowershell-mode)) auto-mode-alist)) + #+end_src + + [2022-12-08 Thu] Nella revisione, si è visto che ora la modalità è compresa nel package + di emacs e quindi si può installare direttamente con i comandi: + : M-x package-install RET powershell RET + +** Packages :Package: + +*** Package: Swiper / Ivy / Counsel :ToReview:Disable: + Questo serve per estendere la funzione di search ed inoltre estende IDO, ma è da usare + in modo esclusivo (occorre disattivare IDO). Per ora non lo uso, ma merita di darci + un'occhiata. Si combina bene con HEM + + Permette di editare in contemporanea su più punti, autocompleta i comandi. ecc... + + Visto in Using Emacs Series [[https://www.youtube.com/watch?v=0mwwN0S1dnQ][Video 6]] e i siti di riferimento sono: [[https://melpa.org/#/swiper][Melpa]], [[https://github.com/abo-abo/swiper][GitHub]] + #+begin_src emacs-lisp :tangle no + ;; ---> ;; it looks like counsel is a requirement for swiper + ;; ---> (use-package counsel + ;; ---> :ensure t + ;; ---> ) + ;; ---> ;; + ;; ---> (use-package swiper + ;; ---> :ensure try + ;; ---> :config + ;; ---> (progn + ;; ---> (ivy-mode 1) + ;; ---> (setq ivy-use-virtual-buffers t) + ;; ---> (global-set-key "\C-s" 'swiper) + ;; ---> (global-set-key (kbd "C-c C-r") 'ivy-resume) + ;; ---> (global-set-key (kbd "") 'ivy-resume) + ;; ---> (global-set-key (kbd "M-x") 'counsel-M-x) + ;; ---> (global-set-key (kbd "C-x C-f") 'counsel-find-file) + ;; ---> (global-set-key (kbd " f") 'counsel-describe-function) + ;; ---> (global-set-key (kbd " v") 'counsel-describe-variable) + ;; ---> (global-set-key (kbd " l") 'counsel-load-library) + ;; ---> (global-set-key (kbd " i") 'counsel-info-lookup-symbol) + ;; ---> (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) + ;; ---> )) + #+end_src + +*** Package: ox-Reveal :ToReview:Disable: + Permette di generare da org delle presentazioni web tramite lo script [[https://github.com/hakimel/reveal.js/][reveal.js]] + + Siti di riferimento: [[https://melpa.org/#/ox-reveal][Melpa]], [[https://github.com/yjwen/org-reveal][GitHub]] si capisce che: + - tramite la variabile org-reveal-root si indica quale [[https://github.com/hakimel/reveal.js/][reveal.js]] utilizzare (locale o + web) + - org-reveal-mathjax permette di abilitare equazioni LaTex + + Per il tutto ho preso spunto da Using emacs series [[https://www.youtube.com/watch?v=psDpCpcIVYs][Video 11]] + #+begin_src emacs-lisp :tangle no + ;; ---> (use-package ox-reveal + ;; ---> :ensure ox-reveal) + ;; ---> (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/") + ;; ---> (setq org-reveal-mathjax t) + #+end_src + + Il tutto sembra non funzionare, se confronto la pagina html generata da me con quella + dell'esempio dal [[https://www.youtube.com/watch?v=psDpCpcIVYs][sito]] si vede che io inserisco la linea: + : + mentre nell'esempio si ha: + : + : + Quindi sulla mia esportazione manca il codice: + : + + Alcune informazioni utili su come utilizzarlo anche in locale sono presenti + sull'articolo sul portale opensource: + [[https://opensource.com/article/18/2/how-create-slides-emacs-org-mode-and-revealjs][How to create slides with Emacs Org mode and Reveal.js]] + +*** Package: Yasnippet + Permette di inserire testi tramite abbreviazioni e poi tab, estende quindi le + funzionalità base di emacs. I vari sniptes si possono personalizzare a piacere. + + Siti di riferimento: [[https://melpa.org/#/yasnippet][Melpa]], [[https://github.com/joaotavora/yasnippet][GitHub]], [[http://joaotavora.github.io/yasnippet/][Manual]] + #+begin_src emacs-lisp :tangle no + (use-package yasnippet + :ensure t + :init + (yas-global-mode 1)) + #+end_src + +*** Package: Magit :ToReview:Disable: + I siti di riferimento sono: [[https://magit.vc/][magit.vc]], [[https://github.com/magit/magit][GitHub]], [[https://www.emacswiki.org/emacs/Magit][emacswiki]] + +*** - : org-manage: :ToReview: + Dal sito [[https://github.com/dmgerman/org-manage][github]] ricavo il file [[file:~/.MyCfg/emacs/AddOn/org-manage.el][org-manage.el]] che permette di avere un riepilogo dei + file org. Il file lo ho copiato nella directory che carico allo startup (vedi relativo + #Add-AddOn paragrafo); per velocizzare si può anche compilare il file ma per ora non lo faccio. + + Configuro quindi il load del modo e gli associo i relativi file: + #+begin_src emacs-lisp :tangle no + ;; Installo il pacchetto necessario: + (require 'ctable) + ;; Installo il pacchetto vero e propio: + (require 'org-manage) + ;; Inizializzo org-manage indicando la cartella da scansionare per i file org: + (setq org-manage-directory-org "~/Doc/Org") + ;; Ora basta richiamare la funzione: + ;; M-x org-manage + ;; o usare il bind 'Alt+F11' + #+end_src + Con la versione 28 di emacs, questo non funziona più, in particolare dà errore + #+begin_comment + ... remove-duplicates ... + #+end_comment + per risolverlo, ho dovuto cambiare il comando lisp 'remove-duplicates' che non è più + supportato, con il comando 'seq-uniq' + + Inoltre si ha un problema con la funzione org-manage che non definisce bene il Hook al + click e quindi quando clicco non mi porta al file corretto. Se invece copio la funzione + sul buffer scratch e la valuto con C-j o C-M-q, poi funziona correttamente. + +*** TODO Trovare come bypassare/risolvere il problema al Click +Servirebbe fare un eval automatico della funzione dopo l'avvio di emacs. Guardando in +internet ho vvisto un simil hook sull'avvio di emacs che richiama del codice e quindi +sarebbe da usare per richiamare il codice che compila la funzione. + +*** ???? Hem ???? :ToReview:Disable: + Package per gestire autocompletamenti e abbreviazioni. Simile ma più potente di IDO, + devo approfondire. [[https://github.com/emacs-helm/helm][helm from GitHub]] + +*** ???? Projectile ???? :ToReview:Disable: + Package per gestire i progetti in base alle directory (tipo i project di notepad++ o di + sublimetext). Merita approfondimenti. + +*** ???? Dashboard ???? :ToReview:Disable: + Package per visualizzare un albero a sinistra con link ai file di una directory. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/emacs-dashboard/emacs-dashboard][dashboard]] + +*** ???? Treemacs ???? :ToReview:Disable: + Package per mostrare l'albero del progetto a sinistra come faccio con + notepad++. Gestisce più progetti e più cose, da approfondire. + + visto sul video del corso di emacs di Lukewh [[https://www.youtube.com/watch?v=Bu7nF9hPSts][Video 10]] e come sito di riferimento ha + [[https://github.com/Alexander-Miller/treemacs][treemacs]]. + +