💾 Archived View for it.omarpolo.com › articoli › pillole-di-emacs-019 captured on 2023-01-29 at 02:26:59. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
Emacs ha da secoli una funzionalità piuttosto peculiare: il "narrowing".
Il narrowing è un meccanismo semplice permette di limitare la porzione di file visualizzata: invece di visualizzare tutto il buffer dall'inizio alla fine, viene virtualmente ristretto ad un intervallo di righe. Questa piccola funzionalità , che io sappia non presente in altri editor, permette alcune interazioni particolare.
(Beh, editor come ed, sam o Acme permettono di eseguire comandi solo su alcune righe, che è simile ma non proprio la stessa cosa.)
Poniamo ad esempio il problema di rinominare una variabile locale in una funzione: ci sono molte soluzioni diverse e possibilmente molto sofisticate che variano da LSP, multiple cursors o iedit, e forse molte altre. Una "poor man solution" invece può essere quella di fare un `narrow-to-defun' per limitare il buffer alla funzione intorno al cursore (point) e poi usare un semplice query-replace.
Certo, soluzioni come LSP sono più sofisticate e hanno un margine di precisione maggiore, ma richiedono l'ausilio di strumenti più complessi e di effettuare vari setup (dall'installazione dei vari major mode necessari e dei programmi di supporto alla configurazione di LSP), mentre queste semplici soluzioni non richiedono nulla di tutto ciò e funzionano bene il 90% delle volte (statistica completamente a caso.)
Su Emacs ci sono diverse funzioni per il narrowing:
con dei dovuti keybinding presenti di default.
Tempo fa ho letto un post su endless paretheses riguardo il narrowing e l'autore ha presentato una funzione simile alla seguente:
(defun op/narrow-or-widen-dwim (p) "Widen if the buffer is narrowed, narrow-dwim otherwise. Dwim means: region, org-src-block, org-subtree or defun, whichever applies first. Narrowing to org-src-blocks actually calls `org-edit-src-code'. With prefix P, don't widen, just narrow even if buffer is already narrowed. With P being -, narrow to page instead of to defun. Taken from endless parentheses." (interactive "P") (declare (interactive-only)) (cond ((and (buffer-narrowed-p) (not p)) (widen)) ((region-active-p) (narrow-to-region (region-beginning) (region-end))) ((derived-mode-p 'org-mode) ;; `org-edit-src-code' isn't a real narrowing (cond ((ignore-errors (org-edit-src-code) t)) ((ignore-errors (org-narrow-to-block) t)) (t (org-narrow-to-subtree)))) ((eql p '-) (narrow-to-page)) (t (narrow-to-defun))))
che ho convenientemente bindato su `C-c w': da allora non mi sono più dovuto preoccupare di ricordare tre diverse keybinding quando una sola fa quello che voglio :-)
$BlogIt: index.gmi,v 1.1 2022/05/23 09:11:15 op Exp $