¿Cómo accedo a los contenidos de la región actual en Emacs Lisp?
region (3)
Quiero acceder al contenido de la región actual como una cadena dentro de una función. Por ejemplo:
(concat "stringa" (get-region-as-string) "stringb")
Gracias
Ed
Como dice starblue, (buffer-substring (mark) (point))
devuelve el contenido de la región, si la marca está configurada. Si no desea las propiedades de la cadena , puede usar la variante ''buffer-substring-no-properties
.
Sin embargo, si está escribiendo un comando interactivo , hay una manera mejor de obtener los puntos finales de la región, utilizando el formulario (interactive "r")
. Aquí hay un ejemplo de 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)))
Cuando se llama desde el código Lisp, el formulario (interactive ...)
se ignora, por lo que puede usar esta función para contar las líneas en cualquier parte del búfer, no solo la región, pasando los argumentos apropiados: por ejemplo, (count-lines-region (point-min) (point-max))
para contar las líneas en la parte reducida del búfer. Pero cuando se llama interactivamente, se evalúa la forma (interactive ...)
y el código "r"
suministra el punto y la marca, como dos argumentos numéricos, el más pequeño primero.
Consulte el Manual de Emacs Lisp, secciones 21.2.1 Uso de Interactive y 21.2.2 Code Characters para interactivo .
Si desea copiar el contenido de la región en un código Lisp a una estructura de datos accesible para el usuario como kill-ring, X clipboard o register, el manual de Emacs Lisp recomienda usar filter-buffer-substring
lugar de simplemente buffer-substring
. Antes de copiar, la función aplica funciones de filtro desde una variable de lista llamada filter-buffer-substring-functions
. La función se agregó en la versión 22.3 .
buffer-substring
junto con region-beginning
region-end
puede hacer eso.