emacs, Come copiare la regione e lasciarla evidenziata?


9

Sono abbastanza contento del valore predefinito Mw (kill-ring-save)che perde l'evidenziazione della regione quando si esegue il comando. Non voglio alterare il suo comportamento, ma voglio rilegare <C-insert>per eseguire un'azione simile e mantenere l'evidenziazione della regione.

Ho provato a (annullare) l'impostazione transient-mark-modedirettamente e tramite una funzione, ma la regione perde ancora l'evidenziazione.

L'esecuzione solo (kill-ring-save (region-beginning) (region-end))in una funzione interattiva funziona come previsto, ad es. perde l'evidenziazione.

L'esecuzione solo (exchange-point-and-mark) (exchange-point-and-mark)in una funzione interattiva funziona come previsto, ad es. evidenzia nuovamente la regione e mette / lascia il punto nella sua posizione originale / corretta.

Tuttavia, quando li metto tutti insieme in una funzione, non ri-evidenzia la regione. Ecco una funzione non funzionante e vincolante:

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

Utilizzando: GNU Emacs 23.1.1 in Ubuntu 10.04.3

Risposte:


8

La corsa kill-ring-savenon disattiva direttamente il segno, ma imposta semplicemente la variabile deactivate-markper tconsentire la disattivazione successiva . Per evitare questo, riportare deactivate-markalla nil prima della disattivazione.

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

0

La regione è evidenziata perché il segno è "attivo" - quindi l'attivazione esplicita del segno fa il trucco. Nota: non sono del tutto sicuro del perché lo scambio del punto / segno non funzioni. Ecco una funzione aggiornata, l'ho anche aggiornata per usare interattivo per compilare gli argomenti.

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

Grazie per i suggerimenti sugli argomenti interattivi e activate-mark, ma non funziona ancora. Ho persino installato una VM pulita di Ubuntu 11.04 con l'unico codice in .emacsquesta funzione, ma non attiva ancora il segno, ma l'applicazione manuale C-x C-xsubito dopo C-insertripristina l'evidenziazione ...
Peter.O

@fred l'hai provato in un Emacs senza il tuo .emacs? cioè eseguire emacs -qcon il codice e verificare se funziona.
Trey Jackson,

L'avevo eseguito (senza successo) senza nulla tranne questa funzione in ~/.emacse senza nulla in ~/.emacs.d/, e come detto, anche in una nuovissima installazione di emacs in una VM nuova di zecca .... Ora ho provato questo comando, ma anche non funziona: /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 funzione funziona per te?
Peter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.