Muoversi in Emacs

Leonardo Tamiano

Created: 2021-12-25 sab 02:05

Overview

Utilizzando lo schema introdotto nel video precedente possiamo inquadrare i concetti che affronteremo in questo video.

Definizioni

Prima di procedere qualche definizione utile…

Punto

Il punto (point) è il luogo in cui emacs inserisce il prossimo carattere che scriviamo.

Ogni buffer ha associato il proprio punto.

In elisp il punto è rappresentato come un intero.

La funzione (point) ritorna l'intero corrispondente al punto nel buffer corrente.

Per testare il valore del point possiamo eseguire il seguente codice elisp, andandolo a copiare in un buffer vuoto e chiamando il comando eval-buffer.

(defun print-point()
  (interactive)
  (message "%d" (point))
  )

(global-set-key (kbd "C-c C-y") 'print-point)

Senza entrare nel dettaglio, tale codice definisce una funzione che stampa il valore del punto nel buffer in cui ci troviamo. Tale funziona viene bindata al keybind

C-c C-y.

Esempio di utilizzo (vedere il minibuffer)

Inizio buffer

Fine buffer

Cursore

Il cursore (cursor) invece rappresenta il "punto grafico", ovvero ciò che possiamo vedere visivamente mentre scriviamo.

Il cursore è il riquadro sopra la lettera i

Possiamo cambiare il tipo di cursore utilizzato tramite la variabile cursor-type. I valori possibili sono

t               use the cursor specified for the frame
nil             don’t display a cursor
box             display a filled box cursor
hollow          display a hollow box cursor
bar             display a vertical bar cursor with default width
(bar . WIDTH)   display a vertical bar cursor with width WIDTH
hbar            display a horizontal bar cursor with default height
(hbar . HEIGHT) display a horizontal bar cursor with height HEIGHT
ANYTHING ELSE   display a hollow box cursor

Tra i particolari valori i più interessanti sono box e bar.

Cursore box

Cursore bar

Quando utilizziamo un cursore tipo box, ovvero quando il cursore appare sopra un carattere, il punto è immediatamente prima del carattere. Questo significa che la successiva lettera sarà scritta alla sinistra di quella coperta dal cursore.

Se invece utilizziamo un cursore di tipo bar, allora il punto è nella stessa posizione del cursore.

Movimenti Cursore Base

I movimenti base del cursore sono i seguenti

Keybind Comando
C-p previous-line
C-n next-line
C-b backward-char
C-f forward-char

Graficamente

Perché?

Inizialmente i keybinds per muoversi in Emacs potrebbero confondere, specialmente a chi non è abituato a questa tipologia di software (Emacs/Vim/Unix).

Detto questo, c'è una chiara e semplice motivazione dietro a questi keybinds: non allontanare la posizione delle mani dal centro della tastiera

Infatti, il tempo impiegato per muoversi dal centro dalla tastiera al mouse, per quanto piccolo possa essere, diventa significativo quando consideriamo il numero di volte in cui dobbiamo farlo.

Utilizzando i keybinds di Emacs siamo in grado di restare sempre al centro della tastiera, in modo da avere accesso alla maggior parte dei tasti senza dover spostare la mano.

Consideriamo la mia tastiera…

Movimenti Cursore Avanzati

Oltre ai movimenti base, che ci spostano di un carattere alla volta, ci sono altri keybinds che ci permettono di effettuare degli spostamenti più ampi.

Per parola

Keybind Comando
M-f forward-word
M-b backward-word

Inizio/Fine linea

Keybind Comando
C-a (beginning-of-visual-line)
C-e (end-of-visual-line)

Per frase

Keybind Comando
M-a (backward-sentence)
M-e (forward-sentence)

Per paragrafo

Keybind Comando
M-{ (backward-paragraph)
M-} (forward-paragraph)

Movimento Schermo

Oltre a muovere il cursore, è possibile anche muovere lo schermo, ovvero la sezione del buffer visibile. Questa tipologia di movimenti sono molto utili quando abbiamo a che fare con file molto grandi.

Il movimento dello schermo può essere effettuato sia con il mouse che automaticamente muovendo il cursore.

Abbiamo poi i seguenti keybinds

Keybind Comando
C-v scroll-down-command
M-v scroll-up-command
M-< beginning-of-buffer
M-> end-of-buffer
C-l recenter-top-bottom

Infine, troviamo i seguenti comandi

Keybind Comando
- goto-line
- goto-char

che sono molto utili quando dobbiamo, ad esempio, capire un errore di compilazione.

Esercizi

Task #1

Assegnare il comando goto-line ad un keybind a scelta, e utilizzarlo.

Task #2

Aprire un file e muoversi nel file utilizzando solamente i keybinds per il movimento base, senza arrows né mouse.

Task #3

Cambiare lo stile del cursore al valore hbar.