Come posso accedere ai contenuti della regione corrente in Emacs Lisp?
Domanda
Voglio accedere al contenuto della regione corrente come stringa all'interno di una funzione. Ad esempio:
(concat "stringa" (get-region-as-string) "stringb")
Grazie
Ed
Soluzione
buffer-substring
insieme a inizio regione
e fine regione
possono farlo.
Altri suggerimenti
Come dice starblue, (buffer-substring (mark) (point))
restituisce il contenuto della regione, se il segno è impostato. Se non si desidera proprietà stringa , puoi usare la variante 'buffer-substring-no-properties
.
Tuttavia, se stai scrivendo un comando interattivo , c'è un modo migliore per ottenere gli endpoint della regione, usando il modulo (interattivo " r ")
. Ecco un esempio da simple.el
:
(defun count-lines-region (start end) "Print number of lines and characters in the region." (interactive "r") (message "Region has %d lines, %d characters" (count-lines start end) (- end start)))
Quando chiamato dal codice Lisp, il modulo (interattivo ...)
viene ignorato, quindi puoi usare questa funzione per contare le linee in qualsiasi parte del buffer , non solo la regione, passando gli argomenti appropriati: ad esempio (count-lines-region (point-min) (point-max))
per contare le linee nella parte ristretta del buffer . Ma quando chiamato in modo interattivo, viene valutato il modulo (interattivo ...)
e il codice " r "
fornisce il punto e il segno, come due argomenti numerici, il più piccolo prima.
Vedi il manuale Emacs Lisp, sezioni 21.2.1 Uso di Interactive e 21.2.2 Caratteri codice per interattivo .
Se si desidera copiare il contenuto della regione in un codice Lisp in una struttura di dati accessibile all'utente come kill-ring, appunti X o registro, il manuale di Emacs Lisp consiglia di utilizzare filter-buffer-substring
invece che semplicemente < code> di buffer-sottostringa . Prima di copiare, la funzione applica le funzioni di filtro da una variabile di elenco denominata filter-buffer sottostringhe funzioni
. La funzione era aggiunta nella versione 22.3 .