emacs, ¿Cómo copiar la región y dejarla resaltada?

9

Estoy bastante contento con el Mw predeterminado (kill-ring-save)que pierde el resaltado de la región al ejecutar el comando. No quiero alterar su comportamiento, pero sí quiero volver a vincular <C-insert>para realizar una acción similar y mantener el resaltado de la región.

He intentado (des) configurar transient-mark-modedirectamente y a través de una función, pero la región aún pierde su resaltado.

Ejecutar solo (kill-ring-save (region-beginning) (region-end))en una función interactiva funciona como se esperaba, es decir. pierde el resaltado.

Ejecutar solo (exchange-point-and-mark) (exchange-point-and-mark)en una función interactiva funciona como se esperaba, es decir. vuelve a resaltar la región y pone / deja el punto en su lugar original / correcto.

Sin embargo, cuando los pongo todos juntos en una función, no vuelve a resaltar la región. Aquí está la función y el enlace que no funcionan:

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

Usando: GNU Emacs 23.1.1 en Ubuntu 10.04.3

Peter.O
fuente

Respuestas:

8

Correr kill-ring-saveno desactiva la marca directamente, sino que se limita a establecer la variable deactivate-marka tfin de que la desactivación a hacerse tarde . Para evitar esto, restablezca deactivate-marka nil antes de la desactivación.

(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
fuente
0

La región se resalta porque la marca está "activa", por lo que la activación expresa de la marca hace el truco. Nota: No estoy muy seguro de por qué el intercambio del punto / marca no funciona. Aquí hay una función actualizada, también la actualicé para usar interactiva para completar los argumentos.

(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
fuente
Gracias por los punteros en los argumentos interactivos y activate-mark, pero todavía no funciona. Incluso instalé una máquina virtual de pizarra limpia de Ubuntu 11.04 con el único código que .emacses esta función, pero todavía no activa la marca, pero la aplicación manual C-x C-xinmediatamente después C-insertrestablece el resaltado ...
Peter.O
@fred, ¿lo has probado en un Emacs sin tus .emacs? es decir, ejecutar emacs -qcon el código y verificar si funciona.
Trey Jackson
Lo había ejecutado (sin éxito) sin nada excepto esta función en ~/.emacsy sin nada en ~/.emacs.d/, y como se mencionó, también en una nueva instalación de emacs en una nueva máquina virtual ... Ahora he probado este comando, pero tampoco funciona: /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))'... ¿Funciona la función para usted?
Peter.O