emacs, Wie kopiere ich eine Region und lasse sie hervorgehoben?

9

Ich bin mit dem Standard-Mw zufrieden, bei dem (kill-ring-save)die Hervorhebung der Region beim Ausführen des Befehls verloren geht. Ich möchte sein Verhalten nicht ändern, aber ich möchte erneut binden <C-insert>, um eine ähnliche Aktion auszuführen und die Hervorhebung der Region beizubehalten.

Ich habe versucht, die Einstellung transient-mark-modedirekt und über eine Funktion (un) einzustellen , aber die Region verliert immer noch ihre Hervorhebung.

Das Ausführen nur (kill-ring-save (region-beginning) (region-end))in einer interaktiven Funktion funktioniert wie erwartet, d. H. es verliert die Hervorhebung.

Das Ausführen nur (exchange-point-and-mark) (exchange-point-and-mark)in einer interaktiven Funktion funktioniert wie erwartet, d. H. Es hebt die Region erneut hervor und setzt / verlässt den Punkt an seiner ursprünglichen / korrekten Stelle.

Wenn ich sie jedoch alle in einer Funktion zusammenstelle, wird die Region nicht erneut hervorgehoben. Hier ist nicht funktionierende Funktion und Bindung:

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

Verwenden von: GNU Emacs 23.1.1 in Ubuntu 10.04.3

Peter.O
quelle

Antworten:

8

Beim Ausführen kill-ring-savewird die Markierung nicht direkt deaktiviert, sondern lediglich die Variable deactivate-markauf gesetzt t, damit die Deaktivierung anschließend erfolgen kann . Um dies zu verhindern, setzen Sie deactivate-markauf nil vor der Deaktivierung.

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

Die Region wird hervorgehoben, weil die Marke "aktiv" ist. Das ausdrückliche Aktivieren der Marke reicht also aus. Hinweis: Ich bin mir nicht ganz sicher, warum das Austauschen des Punkts / der Marke nicht funktioniert. Hier ist eine aktualisierte Funktion. Ich habe sie auch aktualisiert, um sie interaktiv zum Ausfüllen der Argumente zu verwenden.

(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
quelle
Vielen Dank für die Hinweise auf interaktive Argumente und activate-mark, aber es funktioniert immer noch nicht. Ich habe sogar eine Clean-Slate-VM von Ubuntu 11.04 mit dem einzigen Code in .emacsdieser Funktion installiert , aber sie aktiviert die Markierung immer noch nicht, aber das manuelle Anwenden C-x C-xunmittelbar danach C-insertsetzt die Hervorhebung wieder her ...
Peter.O
@fred hast du es in einem Emacs ohne deine .emacs versucht? dh emacs -qmit dem Code ausführen und prüfen, ob es funktioniert.
Trey Jackson
Ich hatte es (ohne Erfolg) ohne irgendetwas außer dieser einen Funktion in ~/.emacsund ohne irgendetwas in ~/.emacs.d/und wie erwähnt auch in einer brandneuen Installation von Emacs in einer brandneuen VM ausgeführt ... Ich habe diesen Befehl jetzt ausprobiert, aber es funktioniert auch nicht: /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))'... Funktioniert die Funktion für Sie?
Peter.O