💾 Archived View for it.omarpolo.com › articoli › pillole-di-emacs-022 captured on 2023-09-08 at 15:57:28. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-03-20)

-=-=-=-=-=-=-

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:

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 $