💾 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

View Raw

More Information

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

019 — Pillole di Emacs: narrowing

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 $