Ottimizza Salvataggio e Modifica File in Vim con eventi automatici

Tra gli aspetti più potenti di Vim, è da sottolineare la possibilità di personalizzare e ottimizzare il tuo ambiente di lavoro attraverso gli autocomandi (autocmd). Gli autocomandi ti consentono di eseguire azioni automatiche in risposta a specifici eventi durante la modifica o il salvataggio dei file. In precedenti articoli, ti ho introdotto al concetto di autocomando con Impara a Usare autocmd in Vim per una Configurazione Perfetta e ti ho mostrato gli eventi di lettura e scrittura in Guida Completa agli Eventi di Lettura e Scrittura con autocmd in Vim. Questi articoli forniscono una base solida su come utilizzare gli autocomandi per ottimizzare la tua configurazione di Vim.

In questo articolo, esploreremo alcuni degli eventi di modifica e salvataggio e ti mostreremo come implementarli per migliorare il tuo lavoro di scrittura in Vim. Analizzeremo esempi concreti utilizzando gli eventi TextChanged, TextChangedI, BufWritePre, e BufWritePost.

Cos'è un Evento di Modifica o Salvataggio?

Gli eventi di modifica e salvataggio in Vim sono azioni che vengono automaticamente attivate in risposta a cambiamenti nel buffer o durante il salvataggio dei file. Gli autocomandi sono le istruzioni che Vim esegue automaticamente quando si verificano questi eventi. Gli eventi che esploreremo sono:

  • TextChanged: Si attiva ogni volta che il testo in un buffer viene modificato
  • TextChangedI: Si attiva durante la modifica del testo in modalità di inserimento
  • BufWritePre: Si attiva prima che un buffer venga scritto su disco
  • BufWritePost: Si attiva subito dopo che un buffer è stato scritto su disco

Evento TextChanged

L'evento TextChanged in Vim si attiva quando modifichi il contenuto di un file. L'evento può essere usato per eseguire funzioni o comandi specifici in risposta a queste modifiche. Questo evento è particolarmente utile per applicare modifiche dinamiche al contenuto del buffer, come aggiornamenti automatici, calcoli o visualizzazioni interattive. Ad esempio, puoi usarlo per contare le parole nel documento ogni volta che il testo viene modificato.

Vediamo come utilizzare questo evento per conteggiare il numero di parole nel tuo documento mentre modifichi il testo. Questa funzionalità è particolarmente utile per chi scrive articoli di frequente e deve tenere sotto controllo il numero delle parole inserite.

Definiamo la funzione ContaParole all'interno del file .vimrc:

function! ContaParole()
    " Conta le parole nel buffer corrente
    let l:conteggio = wordcount().words
    echo "Parole nel documento: " . l:conteggio
endfunction

Definita la funzione, associamo il conteggio delle parole ai soli file con estensione .txt e .md, come segue:

autocmd TextChanged *.txt,*.md call ContaParole()

Nell'istruzione autocmd associa all'evento TextChanged, sui file con estensioni .txt e .md, la chiamata alla funzione ContaParole. Questa chiamata si verifica ogni volta che il contenuto del file cambia.

Evento TextChangedI

L'evento TextChangedI in Vim è simile all'evento TextChanged, ma è specificamente progettato per attivarsi durante le modifiche al testo in modalità di inserimento. Questo evento si attiva durante la digitazione del testo e quindi è indicato per tutte quelle azioni che devono essere eseguite in tempo reale, come la sottolineatura di parole, la validazione del contenuto.

Vediamo come utilizzare questo evento per evidenziare automaticamente la parola corrente sotto il cursore. Questo ti aiuta a capire se nel tuo testo ci sono troppe parole ripetute o, se stai programmando, ad evidenziare Keywords nel codice sorgente.

Definiamo la funzione EvidenziaParole all'interno del file .vimrc:

function! EvidenziaParole()
    " Ottieni il testo fino alla posizione corrente
    let l:riga_corrente = getline('.')
    let l:parola = matchstr(l:riga_corrente[0:col('.')-2], '\k*$')
    execute "match Search /" . l:parola . "/"
endfunction

Definita la funzione, associamo la sottolineatura delle parole a tutti i tipi di file, come segue:

autocmd TextChangedI * call EvidenziaParole()

Al riavvio dell'editor, quando digiterai una parola, su tutti i file saranno evidenziati i caratteri sia della parola sia di altre parole con le stesse lettere.

Evento BufWritePre

L'evento BufWritePre in Vim viene attivato immediatamente prima che un buffer venga scritto su disco. L'evento è utile per eseguire operazioni precedenti alla scrittura dei dati del buffer. Ad esempio, puoi utilizzare BufWritePre per rimuovere spazi bianchi alla fine delle righe, formattare il codice, o eseguire controlli di qualità sui dati. Considerando che l'evento si verifica prima del salvataggio effettivo, questo ti consente di mantenere il tuo codice e i tuoi documenti in uno stato ottimale senza dover intervenire manualmente ogni volta che salvi un file.

Vediamo come utilizzare questo evento per rimuovere gli spazi bianchi presenti alla fine delle righe. Per facilitare la visualizzazione di questa automatizzazione, è consigliabile attivare la visualizzazione dei caratteri speciali con il comando:

:set list

Definiamo la funzione RimuoviSpaziBianchi all'interno del file .vimrc:

function! RimuoviSpaziBianchi()
    " Rimuove gli spazi bianchi alla fine di ogni riga
    let l:buftype = &buftype
    if l:buftype != 'nofile' && l:buftype != 'terminal'
        %s/\s\+$//e
    endif
endfunction

Associamo la chiamata alla funzione prima del salvataggio dei file con l'istruzione:

autocmd BufWritePre * call RimuoviSpaziBianchi()

Evento BufWritePost

L'evento BufWritePost in Vim viene attivato immediatamente dopo che un buffer è stato scritto su disco. Hai già incontrato questo evento nell'articolo Guida Completa agli Eventi di Lettura e Scrittura con autocmd in Vim. Solitamente, le operazioni associate all'evento riguardano aggiornamenti e azioni di verifica. Puoi utilizzare BufWritePost per automatizzare la ricarica di configurazioni, eseguire script di test, o sincronizzare file con altri strumenti.

Vediamo come utilizzare questo evento per ricaricare la configurazione di Vim ogni volta che facciamo una modifica al file .vimrc. Questa operazione è utilissima poiché evita di dover eseguire tale operazione manualmente, dato che quando facciamo delle modifiche alle configurazioni di Vim, le vogliamo vedere in opera immediatamente.

Definiamo la funzione RicaricaConfig all'interno del file .vimrc:

if !exists('*RicaricaConfig')
    function! RicaricaConfig()
        let l:percorso_file = expand('%:p')
        let l:vimrc_percorso = $MYVIMRC
        echom "Percorso del file corrente: " . l:percorso_file
        echom "Percorso del vimrc: " . l:vimrc_percorso
        if l:percorso_file == l:vimrc_percorso
            source $MYVIMRC
            echo "Configurazione di Vim ricaricata."
        else
            echo "Non è il file vimrc, niente da ricaricare."
        endif
    endfunction
endif

Il codice della funzione necessita che la variabile d'ambiente MYVIMRC sia valorizzata con il percorso sul filesystem che porta al file .vimrc da ricaricare.

Associamo la chiamata al file con l'evento BufWritePost, come segue:

autocmd BufWritePost ~/.vimrc call RicaricaConfig()

Conclusioni

Gli eventi di modifica e salvataggio in Vim sono strumenti potenti per automatizzare e personalizzare il tuo ambiente di lavoro. Utilizzando eventi come TextChanged, TextChangedI, BufWritePre, e BufWritePost, puoi creare un editor che si adatta perfettamente alle tue esigenze, migliorando la tua produttività e mantenendo il tuo codice pulito e ordinato.