-- Leo's gemini proxy

-- Connecting to it.omarpolo.com:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=it

022 — Pillole di Emacs: minibuffer completion


Una delle "accortezze" di UI/UX di Emacs che preferisco e di cui sento la mancanza in altri programmi è di sicuro il minibuffer.


Il minibuffer è quell'area, solitamente in fondo alla finestra di Emacs, dove in alcune circostanze l'editor richiede l'input. In certi casi si tratta di una semplice domanda sì/no, in altri di scegliere un'opzione tra quelle proposte, in altre ancora di inserire del testo più o meno libero.


C-x C-f (find-file) ad esempio attiva il minibuffer per chiedere all'utente quale file aprire, permettendo di inserire del testo libero, ma opzionalmente fornendo l'autocompletamento.


Il minibuffer "standard" di Emacs è stato per diverso tempo piuttosto limitato, forse per questo sono nati alcuni pacchetti come Helm o Ivy che lo rivoluzionano, ma negli ultimi anni una marea di piccoli pacchetti che interagiscono, più o meno, con il minibuffer "standard" di Emacs hanno spinto Emacs stesso a migliorare l'esperienza out-of-the-box. O meglio, l'esperienza che si può avere senza pacchetti esterni, out-of-the-box poco è cambiato.


Da ex utente Ivy, poi selectrum, poi vertico, poi mct posso tranquillamente affermare che una più che decente l'esperienza "stock" è finalmente possibile.


Ma bando alle ciance, iniziamo a vedere alcuni delle variabili disponibili e i miei valori preferiti:


(setq tab-always-indent 'complete
      completion-ignore-case t
      read-file-name-completion-ignore-case t
      read-buffer-completion-ignore-case t
      completion-auto-help 'always
      completion-auto-select 'second-tab
      completions-max-height 10
      completions-format 'horizontal
      completions-header-format ""
      completion-show-help nil)

Non entrerò nel dettaglio di tutte queste, C-h v (describe-variable) è sempre a portata di mano, ma a grandi linee:


tab-always-indent: settato su 'complete fa si che il tasto tab funga tanto da trigger per l'autocompletamento quanto come indentazione della riga

completion-auto-select controlla quando passare il focus al buffer *Completions*

completions-header-format e completion-show-help controllano il testo d'aiuto nel buffer *Completions*, cosa che preferisco disabilitare


A questo punto il tasto Tab dovrebbe far comparire il buffer *Completions* in fondo alla finestra quando premuto due volte di seguito e mostrare alcuni suggerimenti. Come si selezionano però?


Le combinazioni di default per selezionare gli elementi sono un po' scomode, quindi le ho cambiate con:


(define-key minibuffer-local-map (kbd "C-p") #'minibuffer-previous-completion)
(define-key minibuffer-local-map (kbd "C-n") #'minibuffer-next-completion)

(define-key completion-in-region-mode-map (kbd "C-p")
            #'minibuffer-previous-completion)
(define-key completion-in-region-mode-map (kbd "C-n")
            #'minibuffer-next-completion)

Tanto per le completions mentre si interagisce col minibuffer, quanto quelle fornite mentre si cerca di autocompletare del testo in un buffer, possono essere navigate con control-p e control-n, come -credo- ci si aspetti!


Per finire, piccola ciliegina sulla torta:


(define-key completion-in-region-mode-map (kbd "RET")
            #'minibuffer-choose-completion)

Permette di selezionare un item dell'autocompletamento in un buffer qualsiasi (si noti completion-in-region-mode-map!) usando invio.


Non ho idea del perchè le keybinding che propongo qui non siano state impostate come default, ma poco male comunque. Con una configurazione del genere è possibile gestire, su Emacs 29, tanto gli autocompletamenti del minibuffer quanto quelli "normali" con una semplice interfaccia e senza pacchetti aggiuntivi. Non male!



$BlogIt: index.gmi,v 1.1 2023/03/07 15:54:39 op Exp $

-- Response ended

-- Page fetched on Thu May 2 10:39:40 2024