160 KiB
«α & ω» 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:
- ✓ Intro
- ✓ Reference:
- ✓ File di preconfigurazione: early-init.el
- File di configurazione principale: init.el
- Impostazioni per rendere silenziosa la compilazione nativa
- Impostazione per mandare
custom-filenell'oblio: - Impostazione per rendere
C-gun po' più utile - Impostazione per eseguire Emacs come server
- Impostazione per formato di default dei file: UTF-8
- Impostazione per directory con il codice lisp custom:
- Impostazioni grafiche base:
- Impostazioni per disabilitare backup e file di blocco
- Impostazione per eliminare il testo selezionato all'inserimento
- Impostazione per il calendario in Italiano
- Impostazione per la data e l'ora nella modeline
- Impostazione per i fusi orari (world-clock)
- Impostazioni per impostare il numero di caratteri
- Impostazione per mostrare il numero delle righe durante la programmazione
- Impostazione per mostrare il numero delle colonne
- Impostazione per abbreviare le risposte Yes or No
- Impostazione per il matching delle parentesi
- Impostazione per la directory iniziale o cartella di default
- Impostazione per il completamento dinamico sul minibuffer:
- Impostazione per il Kill buffer automatico
- Impostazione per la dimensione della finestra
- Impostazione per fare il Buzzer visibile
- Impostazione per gestire i package:
- Impostazione per l'uso del Package: Try
- Impostazione per l'uso del Package: Which-key
- Impostazione per l'uso del Package: auto-complete
- Impostazione per l'uso del Package: htmlize
- Impostazione per i caratteri non presenti sulla tastiera:
- Carico file di configurazione della UI
- Carico file di configurazione del minibuffer
- Carico file di configurazione di org-mode
- ✓ File di configurazione della grafica UI-init.el
- Impostazione per i nerd icon
- Impostazione per l'uso del Package: Org-bullet
- Impostazione per l'uso del Package: Org-superstar
- Impostazione per l'uso del Package: Org-modern
- Impostazione per selezionare il tema utilizzato:
- Impostazione del tema interno: modus-operandi-deuteranopia
- Impostazione per l'uso del Package: Theme Zenburn
- Impostazione per l'uso del Package: Theme Spacemacs
- Impostazione del tema interno: dichromacy
- File di configurazione del minibuffer: mnbfr-init.el
- Impostazione per l'uso del Package: vertigo
- Impostazione per l'uso del Package: marginalia
- Impostazione per l'uso del Package: orderless
- Impostazione per l'uso del Package: consult
- Impostazione per l'uso del Package: corfu
- Impostazione per l'uso del Package: dired
- Impostazione per l'uso del Package: trashed
- Impostazione per l'uso del Package: savehist
- Impostazioni per l'uso delle dynamic abbreviations M-/
- Impostazioni per l'uso delle static abbreviations
- → File di configurazione di org-mode: org-init.el
- Attivazione di org
- Impostazione per formato di default dei file: UTF-8
- Imposto la visibilità iniziale di default:
- KeyBinding
- Tasks and States
- Tags
- Setup org-capture
- Refil
- org-protocol
- Agenda
- Time Clocking, Reporting, Tracking, Estimate
- GTD stuff (Project & Archiving)
- Reminders
- Publishing and Exporting
- Custom function :
- Impostazione per l'uso del Package: buffer-to-pdf
- ξ From Old version to review
Only for test autocommit delle 14:01
→ 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 comandoM-x org-id-get-createche 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).
- https://opensource.com/article/20/3/blog-emacs articolo di un blog che parla della pbblicazione
- mettere comandi semplici per esportare tutto su html
- mettere a punto esportazione su pdf
-
mettere a punto espansione dei testi abbreviati soprattutto per:
- i blocchi codice
- form di introduzione di dati ripetitivi tipo un resum di un lavoro.
-
mettere comandi veloci per:
-
sfruttare nuova struttura:
- file unico (Inbox) con i lavori attuali e indici a file di riferimento per ciascun cliente.
- file di reference dei vari clienti magari vedendo se può essere uno solo e sfruttare aggenda per estrarre i dati tramite tag o altro
- file con le nozioni e i CFG dell'ufficio e della casa
- file con i riferimenti money report per capire come investo e quanto ho nei vari investimenti
-
sistemare con le nuove caratteristiche i capture in modo che fuzionino bene per:
- link utili da rivedere o per bibbliografia
- telefonate
- ToDo
- Note
- appuntamenti
- Idee future
-
sistemare i tag per:
- classificare i vari reference per il TGD
- classificare le cose per future ricerche
- Pensare come legarsi con keep per sincronizarsi con cellulare
-
Esempi di emacs:
- come configurare emacs: https://github.com/abrochard/emacs-config (dal video https://meet.jit.si/FAR_HJ9Bzjs0tmF0DlA9qHIE)
- Tutorial molto bello in vari video: https://cestlaz.github.io/stories/emacs/
- Indagare sui bookmark di emacs per capire come sfruttarli (vedi 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)
- flycheck anche da Lukewh video 17
- 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
*.eldelle 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.elin 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
worgper 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: a basic and capable configuration per una confugurazione base,ma già
molto utile per migliorare la UI.
@Usato - Emacs: GNU Emacs configuration per la sua configurazione completa
disponibile nei repository indicati sopra. Vi è anche il relativo video.
@Usato - Emacs: decent defaults I shared with Sacha Chua configurazione minima
definita in live nel video.
@Usato - Emacs: organise your init file in cui descrive il metodo attualmente usato
per fare questo file org. Vi è anche il relativo Video.
@Usato - Emacs: modern minibuffer packages (Vertico, Consult, etc.) in cui descrive
come migliorare la UI del minibuffer. Vi è anche il relativo video.
@Usato - Emacs: control where buffers are displayed (the 'display-buffer-alist') in
cui descrive come gestire la visualizzazione dei buffer e la relativa
navigazione. Vi è anche il relativo video.
@ToReview - Emacs: use-package essentials in cui descrive come utilizzare i package di
emacs per nuove funzionalità, soprattutto dal punto di vista della
configuraione. Vi è anche il relativo video.
@ToReview - Emacs: basics of search and replace in cui descrive le basi del
trova/sostituisci con emacs. Vi è anche il relativo video.
@ToReview - Emacs: ediff basics in cui descrive come fare un diff (stile winmerge) di
due file su emacs. Vi è anche il relativo video.
@ToReview - Emacs: Org todo and agenda basics in cui descrive le basi dell'aggenda e
come filtrare gli eventi. Vi è anche il relativo video.
@ToReview - Emacs: custom Org clock report for my coaching in cui descrive come utilizza
i timer e i relativi report per misurare il tempo di lavoro. Vi è anche il
relativo video.
@ToReview - Emacs: commands in popup frames with 'emacsclient' in cui descrive come
visualizzare dei comandi iterattivi in finestre popup. Vi è anche il
relativo video.
@ToReview - Emacs: abbreviations with abbrev-mode (quick text expansion) in cui descrive
come sfruttare le abbreviazioni per inserire velocemente testo. Vi è anche
il relativo video.
@ToReview - Emacs: Basics of the powerful Emacs file manager (Dired) 1 in cui descrive
il pacchetto dired e come usarlo. Vi è anche il relativo video.
@ToReview - Emacs: Basics of the powerful Emacs file manager (Dired) 2 in cui descrive
il pacchetto dired e come usarlo. Vi è anche il relativo video.
@ToReview - Emacs: Introduction to keyboard macros in Emacs in cui descrive le macro in
emacs. Vi è anche il relativo video.
@ToReview - Emacs: Practical macros in Emacs in cui descrive l'uso pratico delle macro
in emacs. Vi è anche il relativo video.
@ToReview - Emacs: ISEARCH features and tweaks in cui descrive come trova/sostituisci
usando isearch. Vi è anche il relativo video.
@ToReview - Emacs: basics of Org mode in cui descrive le basi di org-mode e relativa
aggenda. Vi è anche il relativo video.
@ToReview - Emacs: file and Dired basics in cui descrive il pacchetto
dired. Vi è anche il relativo video.@ToReview - Emacs: mark and register basics in cui descrive come sfruttare la tastiera
per editare (selezionare testi, navigare ecc…). Vi è anche il relativo
video.
@ToReview
- Emacs: a basic and capable configuration per una confugurazione base,ma già
molto utile per migliorare la UI.
- ?
- 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- Sacha Chua's Emacs configuration disponibile sui repository codeberg o GitHub
- Yay Emacs 10: Talking to Prot about Emacs workflows con relativi video e articolo
- ?
-
Come personalizzare l'esportazione:
@ToReview- https://www.reddit.com/r/emacs/comments/3pvbag/is_there_a_collection_of_css_styles_for_org/
- https://www.reddit.com/r/emacs/comments/eozyyv/exporting_orgmode_to_beautiful_websites/
- https://github.com/jessekelly881/Rethink
- https://github.com/jessekelly881/Imagine
- https://github.com/grc/jujutsu-website/tree/master
- https://github.com/alphapapa/org-html-theme-darksun
- https://github.com/Zilong-Li/org-tufte
- https://juanjose.garciaripoll.com/blog/css-style-org-mode/
Old References from previous version to review:
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!
- Link video
- ?
-
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))
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:
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")
✓ 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) eM-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, quindiM-peM-nmostrano 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-jo 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 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
Journaldel 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.
@ToReviewdevo 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
- : 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.