tutorial source program para mac how descargar code emacs elisp

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")))