emacs, Jak skopiować region i pozostawić go podświetlonym?

9

Jestem zadowolony z domyślnego Mw, (kill-ring-save)który traci podświetlenie regionu po uruchomieniu polecenia. Nie chcę zmieniać jego zachowania, ale chcę ponownie powiązać, <C-insert>aby wykonać podobną akcję i zachować podświetlanie regionu.

Próbowałem (cofnąć) ustawienie transient-mark-modebezpośrednio i za pomocą funkcji, ale region wciąż traci wyróżnienie.

Uruchamianie tylko (kill-ring-save (region-beginning) (region-end))w funkcji interaktywnej działa zgodnie z oczekiwaniami, tj. traci podświetlanie.

Uruchamianie tylko (exchange-point-and-mark) (exchange-point-and-mark)w funkcji interaktywnej działa zgodnie z oczekiwaniami, tj. ponownie podkreśla region i umieszcza / pozostawia punkt w jego oryginalnym / poprawnym miejscu.

Jednak kiedy zestawię je wszystkie w funkcję, nie spowoduje to ponownego podświetlenia regionu. Oto funkcja niedziałająca i wiążąca:

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

Używanie: GNU Emacs 23.1.1 w Ubuntu 10.04.3

Peter.O
źródło

Odpowiedzi:

8

Uruchomienie kill-ring-savenie dezaktywuje znaku bezpośrednio, a jedynie ustawia zmienną deactivate-markna t, aby dezaktywacja mogła zostać wykonana później . Aby temu zapobiec, przywróć deactivate-markdo nil przed dezaktywacją.

(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
źródło
0

Region jest podświetlony, ponieważ znak jest „aktywny” - więc wyraźne aktywowanie znaku załatwia sprawę. Uwaga: Nie jestem pewien, dlaczego wymiana punktu / znaku nie działa. Oto zaktualizowana funkcja, zaktualizowałem ją również, aby używać interaktywnego do wypełniania argumentów.

(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
źródło
Dzięki za wskazówki na temat interaktywnych argumentów i activate-mark, ale nadal nie działa. Zainstalowałem nawet czystą maszynę wirtualną z Ubuntu 11.04 z jedynym kodem .emacsbędącym tą funkcją, ale nadal nie aktywuje znaku, ale ręczne zastosowanie C-x C-xnatychmiast po tym C-insertpowoduje przywrócenie podświetlenia ...
Peter.O
@ fred wypróbowałeś to w Emacsie bez swojego .emacs? tj. uruchom emacs -qz kodem i sprawdź, czy działa.
Trey Jackson
Uruchomiłem go (bez powodzenia) bez niczego oprócz tej jednej funkcji wewnątrz ~/.emacsi bez niczego ~/.emacs.d/, i jak wspomniano, również w zupełnie nowej instalacji emacsa w zupełnie nowej maszynie wirtualnej .... Próbowałem teraz tego polecenia, ale to też nie działa: /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))'... Czy funkcja działa dla Ciebie?
Peter.O