program - emacs source code
¿Cómo obtengo la región(selección) programáticamente en Emacs Lisp? (2)
Verifique la variable marca activa, por ej. Ch v mark-active
==> mark-active es una variable definida en `C source code ''. Su valor es nulo Local en buffer Apropos ; el valor global es nulo
Automáticamente se convierte en buffer-local cuando se establece de cualquier manera.
Documentación: No-nil significa que la marca y la región están activas actualmente en este búfer.
(defun get-search-term ()
(interactive)
(if mark-active
(let (
(selection (buffer-substring-no-properties (region-beginning) (region-end))))
(if (= (length selection) 0)
(message "empty string")
(message selection))
)
(error "mark not active"))
)
Necesito acceder a la selección en el buffer de Emacs. He encontrado este artículo ¿Cómo accedo a los contenidos de la región actual en Emacs Lisp? y me ayuda mucho
Pero hay un problema. La primera vez que selecciono (resaltar) una región, funciona bien, pero cuando presiono Cg y muevo el cursor normalmente a otro lugar sin resaltar ningún carácter, recibí una cadena de la última marca hasta el punto actual mientras esperaba una vacía. .
De hecho, necesito implementar una función que devuelva la selección actual (resaltada) como una cadena, o una cadena vacía si no hay nada resaltado. El siguiente código puede expresarme más claramente.
(defun get-search-term ()
(interactive)
(let (
(selection (buffer-substring-no-properties (region-beginning) (region-end))))
(if (= (length selection) 0)
(message "empty string")
(message selection))))
¿Alguna sugerencia? ¡Muchas gracias!
La especificación "r" de interactiva es tonta. Estás viendo por qué.
(defun get-search-term (beg end)
"message region or /"empty string/" if none highlighted"
(interactive (if (use-region-p)
(list (region-beginning) (region-end))
(list (point-min) (point-min))))
(let ((selection (buffer-substring-no-properties beg end)))
(if (= (length selection) 0)
(message "empty string")
(message selection))))
No me refiero a "tonto" como en estúpido y no útil; solo que no le importa si la marca está activa o no. Creo que es anterior a transient-mark-mode.
EDITAR : Usar (point-min)
dos veces más arriba hace que el código sea más difícil de entender al volver a leer. Aquí hay una mejor implementación:
(defun get-search-term (beg end)
"message region or /"empty string/" if none highlighted"
(interactive (if (use-region-p)
(list (region-beginning) (region-end))
(list nil nil)))
(message "%s" (if (and beg end)
(buffer-substring-no-properties beg end)
"empty string")))