Files
NewCfg/my-emacs-config.org

171 KiB
Raw Permalink Blame History

«α & ω» della configurazione di emacs Vrs 1.0©®

[ Ultima revisione ed esportazione il {{{latest-export-date}}} con un conteggio di parole {{{word-count}}}. ]

  • coding: utf-8
  • Utilizzato un fill-colum a 80 caratteri

→ Esigenze:   @ToReview

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'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).

  • 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:

  • 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:

  • Indagare sui bookmark di emacs per capire come sfruttarli (vedi Lukewh video 12) 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: Lukewh video 16 o Company mode on GitHub
  • vedere per la correzione ortografica (Flycheck, flymake o altro)

  • ORG PUBBLISH: Sul sito 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 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: Manage your daily schedule with Git
  • rivedere il gestore di calendari in modo testuale khal perchè sempbra molto carino.

✓ Intro

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:

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 simboli grafici gestiti da org, utilizzo questi caratteri all'inizio delle headline per enfatizarle. Questo è comodo perchè poi si ritroveranno anche sulla TOC.

✓
per indicare le headline che sono a posto e non prevedo di ritoccare fino alla prossima versione
Ξ
per indicare le headline che devo ancora rivedere o terminare
→
per le headline che necessitano di revisione urgente

Applicativo emacs:

Come emacs, utilizzo direttamente quello scaricabile dal progetto 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:

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

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

  (executable-find "find")

ritorna il valore

  "c:/WINDOWS/system32/find.exe"

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

  (setq find-program "C:/Program Files/Git/usr/bin/find.exe")

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.

  ;; 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/")

✓ Reference:   @ToReview

Editor emacs
Sito web da cui scaricare emacs
org-mode web site
Sito originale del pacchetto org-mode, con i manuali ufficiali (orgguide.pdf e org.pdf) e la sezione worg per tutorial e molte info utili.
Org Mode - Organize Your Life In Plain Text!
Sito che ha dato il via a tutto. Datato ma sempre ottimo.
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.
?
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 journaling-org.html.
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.
Rudolf Adamkovič Blog
Blog dell'autore di The Zen of Task Management with Org che ha molti articoli interessanti.
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: GitHub Repo o GitLab Repo. Alcuni articoli del blog che ritengo particolarmente interessanti:

?
Emacs Bedrock configurazione minima ma bella, creata dal blog da rivedere per prendere spunti. @ToReview
?
SystemCrafters/crafted-emacs configurazione creata nella video serie di system crafter. @ToReview
?

sachachua blog blog pieno di informazioni e di configurazioni. @ToReview

?

Come personalizzare l'esportazione: @ToReview

Old References from previous version to review:

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:

Org Mode - Organize Your Life In Plain Text!
Bel esempio di come utilizzare in particolar modo org-mode nella produttività.
Using Emacs Series
serie di video su emacs di Mike Zamansky che hanno anche il relativo GitHub repo
Lukewh
Playlist di video su emacs. Ne parla anche su LBRY
?
http://pages.sachachua.com/.emacs.d/Sacha.html
?
Sacha Blog
?
Emacs File Encoding FAQ
?
Using org-mode for meeting minutes
?
Emacs: introduction to MAGIT
?
Blog molto carino: irreal
?
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

?

Socially isolating my Emacs with Docker!

?

riconfigurare l'esportazione in html:

  • tenere conto delle info dal sito blog-emacs per personalizzare il file mapindex
  • rivedere l'esportazione partendo tutto in ~/Pub e in esso mantenere anche i reference e styli.

✓ File di preconfigurazione: early-init.el

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

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.

(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)

Impostiamo i parametri del frame per desktop

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.

  ;; 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)

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:

 ;; Imposto la dimensione del testo: (punti*10)
 (set-face-attribute 'default nil :height 110)

Impostazioni del garbage-collection per velocizzare avvio:

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.

  ;; 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)))

Impostazioni della cache dei pacchetti

Utilizzo lo standard package.el per gestire i miei pacchetti Emacs.

  ;; 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)

Imposto la directory per il codice lisp custom:

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.

  (setq user-lisp-directory (locate-user-emacs-file "~/.emacs.d/MyAddOn/"))

per ora i file custom li carico qui: lisp custom on init.el

Assegna un nome al frame predefinito

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).

  ;; rinomino il buffer in Home:
  (add-hook 'after-init-hook (lambda () (set-frame-name "home")))

File di configurazione principale: init.el

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

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.

  ;; Make native compilation silent.
  (when (native-comp-available-p)
    (setq native-comp-async-report-warnings-errors 'silent))

Salvare in automatico tutti i buffer ogni ora:

Siccome ho lo script che fa il commit ogni ora dei documenti, il minuto precedente, lancio il comando di salvataggio di tutti i buffer in emacs, così posso committarli e mantenere il backup di tutto usando gitea.

  ;; Dalle 00:00 e ripetuto ogni ora:
  (run-at-time "00:00" 3600 'org-save-all-org-buffers)

Impostazione per mandare custom-file nell'oblio:

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…

  ;; -  ;; 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)

Impostazione per 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:

  (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)

Impostazione 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.

  ;; Emacs server (allow emacsclient to connect to running session)
  (setq server-client-instructions nil)
  (require 'server)
  (unless (or (server-running-p) (daemonp))
    (server-start))

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

Imposto come formato di default dei file: UTF8

  ;; 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)

Impostazione per directory con il codice lisp custom:

[2026-05-31 dom 16:28] <- Imposto il pacchetto: org-super-links

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 early-init.el, lo comando in modo esplicito:

 ;; Carico il path dei file lisp che aggiungo:
 (add-to-list 'load-path (expand-file-name "~/.emacs.d/MyAddOn/"))

Impostazioni grafiche base:   @Obsolete

Le impostazioni grafiche base delle finestre, sono ora gestite direttamente nel file early-init.el e quindi i seguenti comandi non sono più utilizzati.

  ;; 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)

Impostazioni per disabilitare backup e file di blocco

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.

  ;; 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)

Impostazione per eliminare il testo selezionato all'inserimento   @ToReview

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:

  ;; 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))

Impostazione per il calendario in Italiano   @ToReview @Disable

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]

  ;; -  ;; 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)

Impostazione per la data e l'ora nella modeline

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.

  (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

Impostazione per i fusi orari (world-clock)   @ToReview @Disable

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.

  ;; -  (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")

Impostazioni per impostare il numero di caratteri

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:

  ;; fill-colum 80 caratteri:
  (setq-default fill-column 80)

Impostazione per mostrare il numero delle righe durante la programmazione

  ;; Show line numbers on programming mode
  (add-hook 'prog-mode-hook 'display-line-numbers-mode)

Impostazione per mostrare il numero delle colonne

  ;; Show the column number
  (column-number-mode 1)

Impostazione per abbreviare le risposte Yes or No

  ;; Make all "yes or no" prompts be "y or n" instead
  (fset 'yes-or-no-p 'y-or-n-p)

Impostazione per il matching delle parentesi

Abilito l'evidenziazione delle coppie di parentesi e riduco al minimo il tempo di attesa

  ;; Show the matching parenthesis and do it immediately, we are in a hurry
  (show-paren-mode t)
  (setq show-paren-delay 0)

Impostazione per la directory iniziale o cartella di default

Imposto la directory iniziale che è quella da cui partire per ricercare o inserire file

  ;; Directory iniziale o cartella di default
  (setq default-directory "~/Doc/Org/")

Impostazione per il completamento dinamico sul minibuffer:   @Disable

[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.

  ;; -  ;; 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)

Impostazione per il Kill buffer automatico   @Disable

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:

  ;; -  (global-set-key (kbd "C-x k") 'kill-this-buffer)

Impostazione per la dimensione della finestra   @Obsolete

[ Questo è integrato in parametri frame in early-init.el ]

Ridimensiono la finestra di emacs in base a quanto visto nella pagina della wiki.

  ;; 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))

Impostazione per fare il Buzzer visibile

Dal sito Pragmatic emacs ho trovato come visualizzare un lampeggio in emacs al posto del beep (per errori o allarmi) di emacs.

  ;; Buzzer visibile
  (setq visible-bell t)

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:

  • gnu-elpa Repository ufficiale con le versioni stabili
  • gnu-elpa-devel Repository ufficiale con le versioni in sviluppo
  • nongnu Repository NonGNU
  • 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:

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

  ;; 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)))

Impostazioni per l'aggiornamento dei pacchetti   @ToReview @Disable

Queste configurazioni vengono dalla vecchia versione, per ora le disabilito, ma dovrò capire come usarle nella nuova configuraione.

  ;; 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))

Impostazione per 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.

  (add-to-list 'display-buffer-alist
               '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'"
                 (display-buffer-no-window)
                 (allow-no-window . t)))

Impostazione per l'uso del 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 Melpa, GitHub

 (use-package try
   :ensure t)

Impostazione per l'uso del Package: Which-key   @Obsolete

[ 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 Melpa, 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.

  (use-package which-key
    :ensure t
    :config
  	 (which-key-mode))

Impostazione per l'uso del Package: auto-complete   @ToReview @Disable

[ 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 dynamic abbreviations M-/) questa visualizza i suggerimenti tipo intellisense e quindi è carina da vedere.

I siti di riferimento sono: Melpa, GitHub

 (use-package auto-complete
   :ensure t
   :init
   (progn
 (ac-config-default)
 (global-auto-complete-mode t)
   ))

Impostazione per l'uso del Package: htmlize

Per convertire il testo ed i blocchi in testo html con associati i vari colori.

Siti di riferimento: Melpa, 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
  (use-package htmlize
    :ensure t)

Impostazione per i caratteri non presenti sulla tastiera:

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.

  ;; Tilde
  (global-set-key (kbd "C-ù") (kbd "~"))
  ;;
  ;; Riassegnamento del set mark al posto di C-SPC
  (global-set-key (kbd "C-ò") 'set-mark-command)

Carico file di configurazione della UI

Carico il file con la configurazione della UI, che descrivo qui.

  ;; Load Custon UI Preference File:
  (load "~/.emacs.d/UI-init.el")

Carico file di configurazione del minibuffer

Carico il file con la configurazione del minibuffer, che descrivo qui.

  ;; Load Custon UI Preference File:
  (load "~/.emacs.d/mnbfr-init.el")

Carico file di configurazione di org-mode

Carico il file con la configurazione della UI che descrivo qui.

  ;; Load Custon UI Preference File:
  (load "~/.emacs.d/org-init.el")

Uso dei pacchetti zip e find di unix:

Per prima cosa ho scaricato gli eseguibili dal progetto GnuWin32 e li homessi nella cartella C:\MyTools\GnuWin32. Quindi ho configurato emacs per caricare quella cartella in modo che ritrovi i relativi eseguibili.

  	;; 1. Aggiunge la cartella con zip.exe e unzip.exe ai percorsi di Emacs
  	(add-to-list 'exec-path "C:/MyTools/GnuWin32")

  	;; 2. Disattiva il vecchio standard PKZIP (obbligatorio su Windows moderno)
  	(setq archive-zip-use-pkzip nil)

  	;; 3. Definisce i comandi esatti per la gestione degli archivi zip
  	(setq archive-zip-program "zip")
  	(setq archive-zip-extract '("unzip" "-qq" "-c"))

  	;; Verifica che sta prendendo gli eseguibili voluti:
  	;; (executable-find "zip") C-j   --> "c:/MyTools/GnuWin32/zip.exe"
  	;; (executable-find "unzip") C-j --> "c:/MyTools/GnuWin32/unzip.exe"
  	;; (executable-find "find") C-j  --> "c:/MyTools/GnuWin32/find.exe"

Uso del Latex

Per usare latex, utilizzo il pacchetto portable MikTex, che ho configurato sul disco virtuale X tramite il file batch C:\MyTools\miktex\miktex - Avvia.bat. In questo modo posso esportare in latex avendo l'accortezza di lanciare miktex prima di avviare l'esportazione.

Per fare in modo che emacs riconosca miktex, ho configurato:

  	;; X:/texmfs/install/miktex/bin/x64/pdflatex.exe
  	;; 1. Aggiunge la cartella con MikTex ai percorsi di Emacs
  	(add-to-list 'exec-path "X:/texmfs/install/miktex/bin/x64")
  	;;	;; 1. Dice a Emacs dove trovare pdflatex su Windows
  	;;	(setenv "PATH" (concat "C:\\Users\\" (user-login-name) "\\AppData\\Local\\Programs\\MiKTeX\\miktex\\bin\\x64;" (getenv "PATH")))
  	;;	;; 2. Sincronizza il percorso interno di Emacs
  	;;	;;	(setq exec-path (append '("C:/Users/" (user-login-name) "/AppData/Local/Programs/MiKTeX/miktex/bin/x64") exec-path))
  	;;	;; 3. Dice a Org-mode di usare pdflatex
  	;;	(setq org-latex-pdf-process '("pdflatex -interaction nonstopmode -output-directory %o %F"))
  	;;	;; questultima dà ancora errore pdflatex non trovato, quindi lo indico direttamente:
  	;; Risolviamo aggirando completamente il problema del PATH: inseriamo il percorso assoluto dell'eseguibile direttamente nel comando di compilazione, così Windows non dovrà "cercarlo".
  	(setq org-latex-pdf-process '("X:/texmfs/install/miktex/bin/x64/pdflatex.exe -interaction nonstopmode -output-directory %o %F"))
  	;; dopo questo ho:
  	;; (executable-find "pdflatex") --> "x:/texmfs/install/miktex/bin/x64/pdflatex.exe"
  	;; (executable-find "dvipng")  --> "x:/texmfs/install/miktex/bin/x64/dvipng.exe"

Alcune volte dà problemi, per esempio se vi sono formule matematiche in latex, perchè non riesce a caricare correttamente dvipng. Per risolvere bisogna utilizzare i riferimenti assoluti %F dei file e non relativi %f e quindi occorre sistemare la variabile org-preview-latex-process-alist in modo che tutti i riferimenti siano assoluti:

  ;; Configurazione presa da internet
  (with-eval-after-load 'org
    (add-to-list 'org-preview-latex-process-alist
                 '(dvisvgm :programs ("latex" "dvisvgm")
                           :description "dvi > svg"
                           :message "you need to install the programs: latex and dvisvgm."
                           :use-xcolor t
                           :image-input-type "dvi"
                           :image-output-type "svg"
                           :image-size-adjust (1.7 . 1.5)
                           :latex-compiler ("latex -interaction nonstopmode -output-directory %o %f")
                           :image-converter ("dvisvgm %f -n -b min -c %S --currentcolor -o %O")))
    
    ;; Imposta il programma predefinito per il rendering
    (setq org-preview-latex-default-process 'dvisvgm))
  ;; Configurazione creata da me con M-x customize-variable RET org-preview-latex-process-alist RET
  (custom-set-variables
   ;; custom-set-variables was added by Custom.
   ;; If you edit it by hand, you could mess it up, so be careful.
   ;; Your init file should contain only one such instance.
   ;; If there is more than one, they won't work right.
   '(org-preview-latex-process-alist
     '((dvipng :programs ("latex" "dvipng") :description "dvi > png"
  	     :message
  	     "you need to install the programs: latex and dvipng."
  	     :image-input-type "dvi" :image-output-type "png"
  	     :image-size-adjust (1.0 . 1.0) :latex-compiler
  	     ("latex -interaction nonstopmode -output-directory %o %F")
  	     :image-converter ("dvipng -D %D -T tight -o %O %F")
  	     :transparent-image-converter
  	     ("dvipng -D %D -T tight -bg Transparent -o %O %F"))
       (dvisvgm :programs ("latex" "dvisvgm") :description "dvi > svg"
  	      :message
  	      "you need to install the programs: latex and dvisvgm."
  	      :image-input-type "dvi" :image-output-type "svg"
  	      :image-size-adjust (1.7 . 1.5) :latex-compiler
  	      ("latex -interaction nonstopmode -output-directory %o %F")
  	      :image-converter
  	      ("dvisvgm %F --no-fonts --exact-bbox --scale=%S --output=%O"))
       (imagemagick :programs ("latex" "convert") :description
  		  "pdf > png" :message
  		  "you need to install the programs: latex and imagemagick."
  		  :image-input-type "pdf" :image-output-type "png"
  		  :image-size-adjust (1.0 . 1.0) :latex-compiler
  		  ("pdflatex -interaction nonstopmode -output-directory %o %F")
  		  :image-converter
  		  ("convert -density %D -trim -antialias %F -quality 100 %O")))))

✓ File di configurazione della grafica UI-init.el

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 qui.

In questo file imposterò in particolare:

  • font utili (nerd icons)
  • thema utilizzato

Impostazione per i nerd icon

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.

  ;; 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))

Impostazione per l'uso del Package: Org-bullet   @Obsolete

Questo pacchetto permette di sostituire gli asterichi nelle header con dei bullet più carini. Dai siti di riferimento Melpa, 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:

  (use-package org-bullets
       :ensure t
       :config
  	(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))

Impostazione per l'uso del Package: Org-superstar   @Obsolete

[ 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 Melpa 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").

  ;; 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)

Impostazione per l'uso del Package: Org-modern   @ToReview @Disable

Dai siti di riferimento ELPA e 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 Iosevka , ad esempio Iosevka Term Curly. org-modern-mode cerca di regolare la visualizzazione dell'etichetta del tag in base all'altezza del carattere.

  ;; 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))

Ecco una configurazione più estesa:

  ;; 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)

Il font in uso ora è Courier New. Si può pensare di cambiarlo in questo modo:

  ;; 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)

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à.

  ;; 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.
    )

Infine per evitare l'errore di visalizzazione del terzo livello (perchè il font non ha il relativo carattere), utilizzo la soluzione ricavata da redit o GitHub:

  ;; Sostituisco i caratteri standard con la mia preferenza:
  (setq org-modern-fold-stars
        '(
  	("▶" . "▼")
  	("▷" . "▽")
  	("▸" . "▾")
  	("▹" . "▿")
  	)
        )

Impostazione 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.

Come reference per i theme ci sono i seguenti siti:

  ;; 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)

Impostazione del tema interno: modus-operandi-deuteranopia   @Disable

Dal sito del thema, impostiamo l'utilizzo del tema modus-operandi-deuteranopia impostando anche l'evidenziazione dei titoli ingrandendo il font.

  ;; 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)

Impostazione per l'uso del Package: Theme Zenburn   @Disable

[ Il tema non mi piace più, quindi lo disabilito ]

Permette di gestire comodamente il thema ZenBurn

I siti di riferimento sono: Melpa, 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.

  ;;    ;; 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))

Impostazione per l'uso del 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 è: Spacemacs o Video

I siti di riferimento sono: Melpa, GitHub da cui ricavo anche che il thema gestisce dimensioni diverse per le headline e anche il grassetto.

  ;; Load theme
  (use-package spacemacs-theme
    :ensure t
    :config (load-theme 'spacemacs-light t))

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:

  ;; 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))))
  )

File di configurazione del minibuffer: mnbfr-init.el

[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 qui.

Impostazione per l'uso del Package: vertigo

Utilizziamo il pacchetto vertico per creare un layout verticale nel minibuffer. Ciò semplifica la visualizzazione delle opzioni disponibili.

  ;; 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))

Impostazione per l'uso del Package: marginalia

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.

  ;; Load marginalia package
  (use-package marginalia
    :ensure t
    :config
    (marginalia-mode 1))

Impostazione per l'uso del Package: orderless

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.

  ;; Load ordeless package
  (use-package orderless
    :ensure t
    :config
    (setq completion-styles '(orderless basic))
    (setq completion-category-defaults nil)
    (setq completion-category-overrides nil))

Impostazione per l'uso del Package: consult   @Disable @ToReview

[ 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).

  ;; 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)
  	 ))

Il comando consult-find non funziona su windows, infatti utilizza il programma find.exe che però non è quello unix. In particolare con il comando

  (executable-find "find")

ritorna il valore

  "c:/WINDOWS/system32/find.exe"

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

  (setq find-program "C:/Program Files/Git/usr/bin/find.exe")

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.

  ;; 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)

Impostazione per l'uso del Package: corfu   @ToReview @Disable

[ 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.

  (use-package corfu
    :ensure t
    :hook (after-init . global-corfu-mode)
    :bind (:map corfu-map ("<tab>" . 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)))

Impostazione per l'uso del Package: dired

Emacs include un potente file manager integrato. Se ne parla a lungo in questo video: 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.

  ;; 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))

Il pacchetto dired-subtree fornisce comandi per visualizzare rapidamente il contenuto di una cartella utilizzando il tasto TAB.

  (use-package dired-subtree
    :ensure t
    :after dired
    :bind
    ( :map dired-mode-map
      ("<tab>" . dired-subtree-toggle)
      ("TAB" . dired-subtree-toggle)
      ("<backtab>" . dired-subtree-remove)
      ("S-TAB" . dired-subtree-remove))
    :config
    (setq dired-subtree-use-backgrounds nil))

Impostazione per l'uso del Package: trashed

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.

  (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"))

Impostazione per l'uso del Package: savehist

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).

  ;; Load savelist package
  (use-package savehist
    :ensure nil ; it is built-in
    :hook (after-init . 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.

  ;;;; `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)

Impostazioni per l'uso delle dynamic abbreviations M-/   @ToReview

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.

  ;;;; `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))

Impostazioni per l'uso delle static abbreviations   @ToReview

[Vedi articolo/video relativo: Emacs: abbreviations with abbrev-mode]

A differenza delle 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).

  ;; -  ;;;; `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: <https://protesilaos.com/codelog/2024-02-03-emacs-abbrev-mode/>.
  ;; -  (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)

→ File di configurazione di org-mode: org-init.el   @ToReview

Essendo un file di configurazione ausiliario, va caricato nel file init.el come fatto qui.

Nella 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:

      ;; aggiorno org:
      ;; - prima aggiorna le definizioni dei pacchetti
      ;; - infine aggiorna l'installazione di org
      (progn (package-refresh-contents) (package-upgrade 'org))
  • riavviare emacs e verificare la versione di org

Attivazione di org

Dal sito di riferimento di org: orgmode.org ricavo l'abilitazione del pacchetto:

  ;; 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)

Impostazione per formato di default dei file: UTF-8

Oltre a quanto fatto prima imposto nello specifico il formato UTF8 per i file org:

  ;; default coding system  UTF-8
  (setq org-export-coding-system 'utf-8)
  (setq default-process-coding-system '(utf-8-unix . utf-8-unix))

Imposto il pacchetto: org-id

Per poter usare gli id univoci, abilito l'uso del pacchetto org-id:

Org-id è una funzionalità integrata di Org Mode che assegna identificatori univoci e permanenti a titoli o file specifici. Consente di creare collegamenti ipertestuali permanenti e resilienti che continuano a funzionare anche se si sposta, rinomina o archivia il file di destinazione.

Come si vede dal sito Org ID, Org Attach & Better Folder Names ricavo come personalizzare org-id e org-attach per id più significativi:

  ;; Load org-id
  (require 'org-id)
  ;; 
  ;; Customize how IDs are generated (optional)
  ;; 'ts generates a timestamped ID,
  ;; 'uuid generates a random UUID (default)
  (setq org-id-method 'ts)
  ;;
  ;; Ordino anche le funzioni pe ril path:
  ;; La funzione UUID prende i primi due caratteri dell'UUID e crea una cartella
  ;; padre a partire da essi, mentre la funzione ts prende i primi sei cioè
  ;; l'anno e il mese.
  (setq org-attach-id-to-path-function-list
        '(org-attach-id-ts-folder-format org-attach-id-uuid-folder-format)
        )
  ;;
  ;; Dalla configurazione di org-super-links:
  (setq org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id)

Comandi essenziali

Una volta caricati, è possibile gestire gli ID utilizzando i seguenti comandi interattivi:

M-x org-id-get-create
Assegna una proprietà :ID: univoca al titolo nel punto specificato (annidata all'interno di un riquadro :PROPERTIES:). Se esiste già un ID, lo lascia invariato.
M-x org-store-link (C-c l)
Mentre ci si trova su un titolo con un ID, questo comando memorizza un collegamento che punta specificamente a quell'ID.
M-x org-insert-link (C-c C-l)
Inserisce il collegamento ID precedentemente memorizzato nel documento, consentendo di assegnare un nome alla descrizione del collegamento.

Imposto il pacchetto: org-super-links

[2026-05-31 dom 16:28] -> Impostazione per directory con il codice lisp custom:

Dai reference GitHub, Karl Voit article, Lee Hinman article

L'idea generale è quella di creare link con backlink automatici. In poche parole, questo pacchetto automatizza la creazione di ID org, il loro collegamento a un'intestazione org e la creazione di un backlink da tale intestazione a quella che si collega da essa.

Mi basta cercare l'intestazione a cui voglio collegarmi e tutto viene creato automaticamente: un ID per l'intestazione in cui mi trovo, un ID per l'intestazione a cui mi sto collegando, un link che punta a quell'ID nel mio marcatore e un backlink nell'intestazione a cui mi sto collegando che punta all'intestazione in cui mi trovo.

Nel post, Hinman spiega che se si utilizzano gli ID nel file org, si otterrà un vantaggio anche durante l'esportazione in un file HTML: i link di intestazione utilizzati punteranno alla posizione desiderata, anche dopo aver spostato le intestazioni.

Per ora non vi è un pacchetto ELPA, quindi bisogna scaricare i file org-super-links.el, org-super-links-org-ql.el, org-super-links-org-rifle.el e metterli nella cartella di custom lisp in modo che siano caricati all'avvio di emacs.

  (use-package org-super-links
    :bind (
  	 ("C-c s s" . org-super-links-link)
  	 ("C-c s l" . org-super-links-store-link)
  	 ("C-c s C-l" . org-super-links-insert-link)
  	 ("C-c s d" . org-super-links-quick-insert-drawer-link)
           ("C-c s i" . org-super-links-quick-insert-inline-link)
           ("C-c s C-d" . org-super-links-delete-link)
  	 )
    :config (
  	   setq org-super-links-related-into-drawer t
  		org-super-links-link-prefix 'org-super-links-link-prefix-timestamp)
  )

Utilizzo:

Si può semplicemente usarlo in sostituzione del collegamento Org:

Usalo esattamente come useresti i normali link org. Invece di chiamare org-store-link chiama org-super-links-store-link (C-c s l). Quindi per inserire il link invece di org-insert-link chiama org-super-links-insert-link (C-c s C-l). Questo inserirà un link normalmente aggiungendo anche un backlink alla destinazione del link. Questo dovrebbe funzionare allo stesso modo dei normali link org, con il vantaggio di aggiungere il backlink.

Imposto la visibilità iniziale di default:

Imposto la visibilità iniziale a tutto ragruppato per velocizzare la vista dall'alto.

  ;; Visibilità iniziale: tutto ragruppato
  (setq org-startup-folded t)

Questo comportamento generale, si può modificare per ciascun file e per ciascun header come esplicitato nei seguenti paramgrafi:

Opzione STARTUP

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

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

Funzioni generali:

Impostiamo alcuni dei key binding di default:

  ;;(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)

Tasti funzione:   @ToReview

Analisi dei tasti funzioni disponibili:

Key Binding originale My Bingind
<F2> Divide schermo verticalmente
S-<F2> Divide schermo verticalmente
C-<F2> Non Definito
M-<F2> Non Definito
<F1> Show Help
S-<F1> Show Help
C-<F1> Non Definito
M-<F1> Non Definito
<F3> Defining kbd macro…
S-<F3> Defining kbd macro…
C-<F3> Non Definito
M-<F3> Non Definito
<F4> Excute macro
S-<F4> ???
C-<F4> Non Definito
M-<F4> Non Definito
<F5> Non Definito
S-<F5> Non Definito
C-<F5> Non Definito
M-<F5> Non Definito
<F6> Non Definito
S-<F6> Non Definito
C-<F6> Non Definito
M-<F6> Non Definito
<F7> Non Definito
S-<F7> Non Definito
C-<F7> Non Definito
M-<F7> Non Definito
<F8> Non Definito
S-<F8> Non Definito
C-<F8> Non Definito
M-<F8> Non Definito
<F9> Non Definito Visualizza tutto
S-<F9> Non Definito Visualizza solo ramo attuale
C-<F9> Non Definito Nascondi ramo attuale
M-<F9> Non Definito
<F10> Passa il focus al menu
S-<F10> Passa il focus al menu
C-<F10> Passa il focus al sottomenu
M-<F10> Vista Intero/Finestra
<F11> Vista Intero/Finestra Vis. dove c'è il clock attivo
S-<F11> Vista Intero/Finestra Fa partire il clock di timing
C-<F11> Non Definito Termina il clock di timing
M-<F11> Non Definito ex Org manage per navigare fra i file
<F12> Non Definito Apre agenda (C-c a)
S-<F12> Non Definito Aprire subito Trash.org
C-<F12> Non Definito Aprire subito InBox.org
M-<F12> Non Definito Aprire subito Mrk.org
C-S-<F12> 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:

  ;; Key F9 dedicato alle viste
  (global-set-key (kbd   "<f9>") 'widen)
  (global-set-key (kbd "C-<f9>") 'MRK/hide-other)
  (global-set-key (kbd "S-<f9>") 'narrow-to-region)
  ;; Key F11 dedicato ai timer
  (global-set-key (kbd   "<f11>") 'org-clock-goto)
  (global-set-key (kbd "C-<f11>") 'org-clock-in)
  (global-set-key (kbd "S-<f11>") 'org-clock-out)
  ;; (global-set-key (kbd "M-<f11>") 'org-manage )
  ;; Key F12 dedicato ai file
  (global-set-key (kbd     "<f12>") 'org-agenda)
  (global-set-key (kbd   "S-<f12>") (lambda() (interactive)(find-file "~/Doc/Trash/Trash.org")))
  (global-set-key (kbd   "C-<f12>") (lambda() (interactive)(find-file "~/Doc/Org/InBox.org")))
  (global-set-key (kbd   "M-<f12>") (lambda() (interactive)(find-file "~/Doc/Org/Private/MRK.org")))
  (global-set-key (kbd "C-S-<f12>") 'MRK/save-then-publish)
To Review:

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 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 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:

  ;; Vecchio binding solo per reference:
  ;;(global-set-key (kbd "<f12>") 'org-agenda)
  ;;(global-set-key (kbd "<f5>") 'bh/org-todo)
  ;;(global-set-key (kbd "<S-f5>") 'bh/widen)
  ;;(global-set-key (kbd "<f7>") 'bh/set-truncate-lines)
  ;;(global-set-key (kbd "<f8>") 'org-cycle-agenda-files)
  ;;(global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
  ;;(global-set-key (kbd "<f9> b") 'bbdb)
  ;;(global-set-key (kbd "<f9> c") 'calendar)
  ;;(global-set-key (kbd "<f9> f") 'boxquote-insert-file)
  ;;(global-set-key (kbd "<f9> g") 'gnus)
  ;;(global-set-key (kbd "<f9> h") 'bh/hide-other)
  ;;(global-set-key (kbd "<f9> n") 'bh/toggle-next-task-display)
  ;;(global-set-key (kbd "<f9> I") 'bh/punch-in)
  ;;(global-set-key (kbd "<f9> O") 'bh/punch-out)
  ;;(global-set-key (kbd "<f9> o") 'bh/make-org-scratch)
  ;;(global-set-key (kbd "<f9> r") 'boxquote-region)
  ;;(global-set-key (kbd "<f9> s") 'bh/switch-to-scratch)
  ;;(global-set-key (kbd "<f9> t") 'bh/insert-inactive-timestamp)
  ;;(global-set-key (kbd "<f9> T") 'bh/toggle-insert-inactive-timestamp)
  ;;(global-set-key (kbd "<f9> v") 'visible-mode)
  ;;(global-set-key (kbd "<f9> l") 'org-toggle-link-display)
  ;;(global-set-key (kbd "<f9> SPC") 'bh/clock-in-last-task)
  ;;(global-set-key (kbd "C-<f9>") 'previous-buffer)
  ;;(global-set-key (kbd "M-<f9>") 'org-toggle-inline-images)
  ;;(global-set-key (kbd "C-x n r") 'narrow-to-region)
  ;;(global-set-key (kbd "C-<f10>") 'next-buffer)
  ;;(global-set-key (kbd "<f11>") 'org-clock-goto)
  ;;(global-set-key (kbd "C-<f11>") 'org-clock-in)
  ;;(global-set-key (kbd "C-<f12>") 'MRK/save-then-publish)

Tasks and States   @Missing @ToReview

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:

  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

per le chiamate:

  title Phone Call Task State
  [*] -> PHONE
  PHONE -> [*]

per i meeting:

  title Meeting Task State
  [*] -> MEETING
  MEETING -> [*]

Per ciacuno di essi, definisco anche la lettera di abbreviazione per l'inserimento veloce

  ;; Task keywords definitions:
  (setq org-todo-keywords
    (quote (
      (sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
      (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "ABORT(a@/!)" "PHONE" "MEETING")
      )
    )
  )

Per ciascuna keyword posso personalizzare il faceplate, ma per ora non lo faccio.

  ;; -  ;; 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)
  ;; -  )))

Ai tipi di ToDo, associo anche in modo automatico dei tag per facilitare filtri o ricerche:

  ;; 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"))
  )))

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.

  ;; 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)

Tags   @Missing

Imposto i tag generali in uso

Setup org-capture   @Missing

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:

  (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
  	  )
  	
  	)
        )

Refil   @Missing

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 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: My org-refile workflow

org-protocol   @Missing

Imposto org protocol per interagire con altri programmi

Agenda   @Missing

[ 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.
  ;; 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"
  				 )
  			 )
    )
  )

Time Clocking, Reporting, Tracking, Estimate   @Missing

Dal manuale, si ricavano i seguenti comandi per la retentività dei clock:

  (setq org-clock-persist 'history)
  (org-clock-persistence-insinuate)

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

Imposto i set per usare GTD ed eventualmente projetile e treemacs

Reminders   @Missing

Imposto i remainder e come utilizzarli.

Publishing and Exporting   @ToReview

Impostazioni generali utili per l'esportazione (anche del singolo file):

  ;; 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")

Imposto Babel:

  ;; 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)))
  ;;

Altro sull'esportazione:

  ;; 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 "<link rel=\"stylesheet\" href=\"file://C:/_Home/Pub/.Styles/norang/doc.norang.ca_org.css\" type=\"text/css\" />")
  ;		(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" . "<?xml version=\"1.0\" encoding=\"%s\"?>")
  ("php" . "<?php echo \"<?xml version=\\\"1.0\\\" encoding=\\\"%s\\\" ?>\"; ?>")
  )))
  ;; 
  ;; Permetto in automatico l'override delle variabili di personalizzazione dell'esportazione
  (setq org-export-allow-BIND t)
  ;;
  ;;

Infine definisco il progetto di esportazione:

  ;; 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 "<!-- Start Favicon e style per il sitemap -->\n<link rel=\"stylesheet\" type=\"text/css\" href=\"file://C:/_Home/Pub/.Styles/solarized-css/solarized-dark.css\"/>\n<link rel=\"icon\" type=\"image/x-icon\" href=\"file://C:/_Home/Pub/.Res/Img/CSiCo_favicon.ico\">\n<!-- End Favicon e style per il sitemap -->"
	: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"))
  )))

Template per le esportazioni   @ToReview

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 GITHub ricavato l'esporter per esportare i file org, come documenti HTML compatibili ;; con il 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 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: ;; org.css e che dispone del repository: 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 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 fniessen è stato forkato da 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: GitHub ;; ;; * Repository paulzql/org-html-themes ;; Sito di riferimento: 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 :

MRK/save-then-publish

Funzione ricavata dall'esempio in 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
  (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 "<a href=\"http://validator.w3.org/check?uri=referer\">Validate XHTML 1.0</a>")
  	)
      (org-publish-current-project force)
    )
  )

MRK/hide-other

Funzione per aprire completamente il ramo in cui sono e ragruppare tutti gli altri.

  (defun bh/hide-other ()
    (interactive)
    (save-excursion
      (org-back-to-heading 'invisible-ok)
      (hide-other)
      (org-cycle)
      (org-cycle)
    )
  )

Impostazione per l'uso del Package: buffer-to-pdf   @Disable

[ Nel test fatto, risponde come se avesse creato tutto senza errore, ma in realtà non crea nulla. ]

Dall'articolo di prot (vi è anche il relativo video e repository GitHub) mi interessa esportare in pdf il buffer, rispettando ciò che si vede (il narrowin) e quindi provo:

  (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/"))

ξ 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.

  ;;
  ;; - - - - - - - - - - - - -  End File  - - - - - - - - - - - - -
  ;;
  ;; - - - - - - - - - - - - -  End File  - - - - - - - - - - - - -
  ;;
  ;; - - - - - - - - - - - - -  End File  - - - - - - - - - - - - -
  ;;
  ;; - - - - - - - - - - - - -  End File  - - - - - - - - - - - - -
  ;;
  ;; - - - - - - - - - - - - -  End File  - - - - - - - - - - - - -

Correttore ortografico:   ToReview Disable

Dal sito 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:

  ;; 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")
   )
  )

Ora posso avviare il correttore sul file aperto tramite il comando:

M-x ispell

Come reference ho utilizzato anche i seguenti siti:

Colorization   ToReview Disable

  ;; --->	;; use colorization for all modes
  ;; --->	(global-font-lock-mode t)

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:

  ;; --->	(global-set-key (kbd "<f5>") 'revert-buffer)

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:

  ;; --->	;; 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)

Visual Basic Mode

Dal sito 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 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").

  ;; 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)

Visual Basic .NET mode

Dal sito 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 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.

  ;; 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))

C#: csharp-mode

Da Stack Overflow: C# Emacs mode questions - indentation and build e successivamente dal sito GitHub csharp-mode ricavato i file csharp-mode.el e 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:

  ;; --->	;; --->	;; 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)
Obsoleto:

Dal sito code.google e successivamente dal sito GitHub ricavo il file 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:

  ;; --->	;; 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))

Power Shell mode   Disable Obsolete

Ricercando info per il vbnet-mode ho trovato il sito Wiki da cui si ricava il file 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:

  ;; --->	;; 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))

[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 Video 6 e i siti di riferimento sono: Melpa, GitHub

  ;;  --->	;; 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 "<f6>") '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 "<f1> f") 'counsel-describe-function)
  ;;  --->	(global-set-key (kbd "<f1> v") 'counsel-describe-variable)
  ;;  --->	(global-set-key (kbd "<f1> l") 'counsel-load-library)
  ;;  --->	(global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
  ;;  --->	(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
  ;;  --->	(global-set-key (kbd "C-c g") 'counsel-git)
  ;;  --->	(global-set-key (kbd "C-c j") 'counsel-git-grep)
  ;;  --->	(global-set-key (kbd "C-c k") 'counsel-ag)
  ;;  --->	(global-set-key (kbd "C-x l") 'counsel-locate)
  ;;  --->	(global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
  ;;  --->	(define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
  ;;  --->	))

Package: ox-Reveal   ToReview Disable

Permette di generare da org delle presentazioni web tramite lo script reveal.js

Siti di riferimento: Melpa, GitHub si capisce che:

  • tramite la variabile org-reveal-root si indica quale reveal.js utilizzare (locale o web)
  • org-reveal-mathjax permette di abilitare equazioni LaTex

Per il tutto ho preso spunto da Using emacs series Video 11

  ;; --->	(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)

Il tutto sembra non funzionare, se confronto la pagina html generata da me con quella dell'esempio dal sito si vede che io inserisco la linea:

<script src="http://cdn.jsdelivr.net/reveal.js/3.0.0/js/reveal.js"></script>

mentre nell'esempio si ha:

<script src="http://cdn.jsdelivr.net/reveal.js/3.0.0/lib/js/head.min.js"></script>
<script src="http://cdn.jsdelivr.net/reveal.js/3.0.0/js/reveal.js"></script>

Quindi sulla mia esportazione manca il codice:

<script src="http://cdn.jsdelivr.net/reveal.js/3.0.0/lib/js/head.min.js"></script>

Alcune informazioni utili su come utilizzarlo anche in locale sono presenti sull'articolo sul portale opensource: 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: Melpa, GitHub, Manual

  (use-package yasnippet
    :ensure t
    :init
(yas-global-mode 1))

Package: Magit   ToReview Disable

I siti di riferimento sono: magit.vc, GitHub, emacswiki

- : org-manage:   ToReview

Dal sito github ricavo il file 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:

  ;; 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'

Con la versione 28 di emacs, questo non funziona più, in particolare dà errore

… remove-duplicates …

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. 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 Video 10 e come sito di riferimento ha 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 Video 10 e come sito di riferimento ha treemacs.