El comportamiento normal de Emacs cuando el modo de marca transitoria está activo es que cuando realiza una selección de desplazamiento, si el siguiente comando es un movimiento sin desplazamiento, la marca se desactiva. Por ejemplo, después de los comandos M-l
(para marcar la línea actual con la función a continuación) y C-f
, la marca se desactiva. ¿Cómo emular ese comportamiento de elisp después (set-mark-command nil)
?
Por ejemplo:
(defun my-mark-current-line ()
(interactive)
(beginning-of-line)
(set-mark-command nil)
(end-of-line)
(forward-char))
(global-set-key (kbd "M-l") 'my-mark-current-line)
Ahora haga Ml Cf y la región crecerá, pero en cambio, quiero el comportamiento predeterminado, es decir, la región se desactivará cuando Cf y crecerá con CSf.
EDITAR : ¿debería usar una función diferente a set-mark-command que permita esto? No pude encontrar ninguno.
C-S-f
es análoga aC-SPC
(activar una región) +C-f
(navegación). Probablemente pueda obtener lo que desea vinculandoC-f
a una función de contenedor que primero desactiva una región si está activa y luego procede a hacer lo queC-f
hace (forward-char
); y se unenC-S-f
directamente aforward-char
. Tenga en cuenta que si alguna vez usa emacs en modo terminal,C-f
yC-S-f
ambos se comportarán yaC-f
que el terminal no puede distinguir entre los dos.C-f
se aplicarán a todos los demás comandos de navegación que use también.C-f
despuésM-l
no extiende la región porque no hay una región activa al final deM-l
(que está vinculadadowncase-word
de forma predeterminada).M-l
referido por el OP no es el enlace predeterminado (downcase-word
), sino el enlace personalizado demy-mark-current-line
Respuestas:
Debido a que la traducción de turno y la activación temporal de la marca se manejan mediante el bucle de comando, deberá llamar a las versiones interactivas de las funciones de movimiento para obtener el comportamiento de selección de turno adecuado de ellas:
Actualizar:
Desde que escribí la respuesta anterior, me tomé el tiempo para aprender un poco más sobre cómo la selección de turnos realmente funciona bajo el capó. Establece el valor del símbolo de
transient-mark-mode
ser una celda de contras del formulario(only . OLDVAL)
, dondeOLDVAL
es el valor antes de la selección de turno.La solución a continuación evita el uso
call-interactively
activando la marca según sea necesario y estableciendo el valor apropiado detransient-mark-mode
. Básicamente, considero que esta solución es menos pirata que la primera.Como beneficio adicional, ahora tiene un recuento de repetición opcional y ampliará la selección actual en cualquier dirección si la marca ya está activa.
fuente