💾 Archived View for it.omarpolo.com › articoli › pillole-di-emacs-022 captured on 2024-05-12 at 14:50:42. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-03-20)
-=-=-=-=-=-=-
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 $