emacs, как скопировать регион и оставить его выделенным?


9

Я достаточно доволен Mw по умолчанию, (kill-ring-save)который теряет подсветку региона при запуске команды. Я не хочу изменять его поведение, но я хочу повторно <C-insert>выполнить привязку, чтобы выполнить подобное действие и сохранить выделение региона.

Я попытался (не) установить transient-mark-modeнапрямую и через функцию, но регион по-прежнему теряет свою подсветку.

Запуск только (kill-ring-save (region-beginning) (region-end))в интерактивной функции работает как положено, т.е. он теряет выделение.

Запуск только (exchange-point-and-mark) (exchange-point-and-mark)в интерактивной функции работает как положено, т.е. это повторно подсвечивает область и помещает / оставляет точку в ее оригинальном / правильном месте.

Однако когда я соединяю их все вместе в функцию, она не выделяет регион заново. Вот неработающая функция и привязка:

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

Использование: GNU Emacs 23.1.1 в Ubuntu 10.04.3

Ответы:


8

Запуск kill-ring-saveне деактивировать метку непосредственно, а лишь устанавливает переменную deactivate-markдля tдля того , чтобы дезактивация быть сделана позже . Чтобы предотвратить это, сбросьте deactivate-markна nil перед тем дезактивацию.

(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

Регион выделен, потому что метка «активна», поэтому активная метка делает свое дело. Примечание: я не совсем уверен, почему обмен баллов / баллов не работает. Вот обновленная функция, я также обновил ее, чтобы использовать интерактив для заполнения аргументов.

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

Спасибо за указатели на интерактивные аргументы и activate-mark, но это все еще не работает. Я даже установил чистую виртуальную машину Ubuntu 11.04 с единственным кодом .emacs, выполняющим эту функцию, но она по-прежнему не активирует метку, но применяется вручную C-x C-xсразу после C-insertвосстановления подсветки ...
Peter.O

@fred ты пробовал это в Emacs без твоего .emacs? т.е. запустить emacs -qс кодом и проверить, работает ли он.
Трей Джексон

Я запустил его (безуспешно) без чего-либо, кроме этой единственной функции, ~/.emacsи без чего-либо внутри ~/.emacs.d/, и, как уже упоминалось, также в новой установке emacs на новой виртуальной машине .... Я сейчас попробовал эту команду, но это тоже не работает: /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))'... Функция работает для вас?
Peter.O
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.