Le comportement normal d'Emacs lorsque le mode de marque transitoire est actif est que lorsque vous effectuez une sélection de décalage, alors si la commande suivante est un mouvement sans décalage, la marque est désactivée. Par exemple, après les commandes M-l
(pour marquer la ligne actuelle avec la fonction ci-dessous) et C-f
, la marque est désactivée. Comment émuler ce comportement d'Elisp après (set-mark-command nil)
?
Par exemple:
(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)
Maintenant, faites Ml Cf et la région augmentera, mais à la place, je veux que le comportement par défaut, c'est-à-dire que la région se désactive lorsque Cf, et grandisse avec CSf.
EDIT : devrait utiliser une fonction différente de set-mark-command qui permet cela? Je n'en ai pas trouvé.
C-S-f
est analogue àC-SPC
(activation d'une région) +C-f
(navigation). Vous pouvez probablement obtenir ce que vous voulez en vous liantC-f
à une fonction wrapper qui désactive d'abord une région si elle est active, puis continue de faire ceC-f
qui (forward-char
); et lierC-S-f
directement àforward-char
. Notez que si jamais vous utilisez emacs en mode terminal,C-f
etC-S-f
que vous vous comporterez tous les deuxC-f
car le terminal ne pourra pas distinguer les deux.C-f
appliqués s'appliqueraient également à toutes les autres commandes de navigation que vous utilisez également.C-f
afterM-l
n'étend pas la région car il n'y a pas de région active à la fin deM-l
(qui est liée àdowncase-word
par défaut).M-l
référence à l'OP n'est pas la liaison par défaut (downcase-word
), mais la liaison personnalisée demy-mark-current-line
Réponses:
Étant donné que la traduction de décalage et l'activation temporaire de la marque sont gérées par la boucle de commande, vous devrez appeler les versions interactives des fonctions de mouvement afin d'obtenir le comportement de sélection de décalage approprié:
Mise à jour:
Depuis la rédaction de la réponse ci-dessus, j'ai pris le temps d'en apprendre un peu plus sur le fonctionnement réel de la sélection des équipes sous le capot. Il définit la valeur du symbole de
transient-mark-mode
comme une contre-cellule du formulaire(only . OLDVAL)
, oùOLDVAL
est la valeur avant la sélection de décalage.La solution ci-dessous évite l'utilisation de
call-interactively
en activant la marque au besoin et en définissant la valeur appropriée detransient-mark-mode
. Fondamentalement, je considère que cette solution est moins un hack que la première.En prime, il a désormais un nombre de répétitions facultatif et étendra la sélection actuelle dans les deux sens si la marque est déjà active.
la source