¿Cómo accedo a los contenidos de la región actual en Emacs Lisp?
Pregunta
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
Solución
buffer-substring
junto con comienzo de región
y region-end
pueden hacer eso.
Otros consejos
Como dice starblue, (buffer-substring (mark) (point))
devuelve el contenido de la región, si la marca está establecida. Si no desea las propiedades de cadena , puede utilizar la variante 'buffer-substring-no-properties
.
Sin embargo, si está escribiendo un comando interactivo , hay una mejor manera de obtener los puntos finales de la región, mediante el formulario (interactivo " 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 (interactivo ...)
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 correspondientes: 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 el formulario (interactivo ...)
y el código " r "
proporciona 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 Usando Interactive y 21.2.2 Caracteres de código para interactivo .
Si desea copiar el contenido de la región en un código Lisp a una estructura de datos accesible por el usuario como kill-ring, X portapapeles o registro, el manual de Emacs Lisp recomienda utilizar filter-buffer-substring
en lugar de simplemente < código> buffer-substring . Antes de copiar, la función aplica funciones de filtro de una variable de lista llamada filter-buffer-substring-functions
. La función fue agregada en la versión 22.3 .