emacs, Comment copier une région et la laisser en surbrillance?

9

Je suis assez satisfait du Mw par défaut (kill-ring-save)qui perd la mise en évidence de la région lors de l'exécution de la commande. Je ne souhaite pas modifier son comportement, mais je souhaite <C-insert>effectuer une nouvelle liaison pour effectuer une action similaire et conserver la mise en évidence de la région.

J'ai essayé de (dé) régler transient-mark-modedirectement et via une fonction, mais la région perd toujours sa mise en évidence.

Exécuter uniquement (kill-ring-save (region-beginning) (region-end))dans une fonction interactive fonctionne comme prévu, c'est-à-dire. il perd la mise en évidence.

Exécuter uniquement (exchange-point-and-mark) (exchange-point-and-mark)dans une fonction interactive fonctionne comme prévu, c'est-à-dire. il re-met en évidence la région et met / laisse le point à sa place d'origine / correcte.

Cependant, lorsque je les rassemble dans une fonction, cela ne met pas en évidence la région. Voici la fonction non fonctionnelle et la liaison:

(defun kill-ring-save-keep-highlight ()
  (interactive)
  (kill-ring-save (region-beginning) (region-end))
  (exchange-point-and-mark) (exchange-point-and-mark)
)
(global-unset-key (kbd "<C-insert>"))
(global-set-key   (kbd "<C-insert>") 'kill-ring-save-keep-highlight)

Utilisation de: GNU Emacs 23.1.1 dans Ubuntu 10.04.3

Peter.O
la source

Réponses:

8

L'exécution kill-ring-savene désactive pas directement la marque, mais définit simplement la variable deactivate-marksur tafin que la désactivation soit effectuée par la suite . Pour éviter cela, réinitialisez- deactivate-markle nil avant la désactivation.

(defun kill-ring-save-keep-highlight (beg end)
  "Keep the region active after the kill"
  (interactive "r")
  (prog1 (kill-ring-save beg end)
    (setq deactivate-mark nil)))

(global-set-key (kbd "<C-insert>") 'kill-ring-save-keep-highlight)
yibe
la source
0

La région est mise en évidence parce que la marque est "active" - ​​donc l'activation expresse de la marque fait l'affaire. Remarque: je ne sais pas trop pourquoi l'échange du point / de la marque ne fonctionne pas. Voici une fonction mise à jour, je l'ai également mise à jour pour utiliser interactive pour remplir les arguments.

(defun kill-ring-save-keep-highlight (beg end)
  "Keep the region active after the kill"
  (interactive "r")
  (kill-ring-save beg end)
  (activate-mark))
Trey Jackson
la source
Merci pour les pointeurs sur les arguments interactifs et activate-mark, mais cela ne fonctionne toujours pas. J'ai même installé une machine virtuelle de Ubuntu 11.04 avec le seul code à .emacsêtre cette fonction, mais elle n'active toujours pas la marque, mais l'application manuelle C-x C-ximmédiatement après C-insertrétablit la mise en surbrillance ...
Peter.O
@fred l'avez-vous essayé dans un Emacs sans votre .emacs? c'est-à-dire, exécutez emacs -qavec le code et vérifiez si cela fonctionne.
Trey Jackson
Je l'avais exécuté (sans succès) sans rien sauf cette fonction dans ~/.emacset sans rien ~/.emacs.d/, et comme mentionné, également dans une toute nouvelle installation d'emacs dans une toute nouvelle VM .... J'ai maintenant essayé cette commande, mais cela ne fonctionne pas non plus: /usr/bin/emacs --no-init-file --no-site-file --eval '(defun kill-ring-save-keep-highlight (beg end) (interactive "r") (kill-ring-save beg end) (activate-mark))'... La fonction fonctionne-t-elle pour vous?
Peter.O