emacs, Bagaimana cara menyalin wilayah, dan membiarkannya disorot?

9

Saya cukup senang dengan Mw default (kill-ring-save)yang kehilangan sorotan wilayah saat menjalankan perintah. Saya tidak ingin mengubah perilakunya, tetapi saya ingin mengikat kembali <C-insert>untuk melakukan tindakan serupa dan mempertahankan penyorotan wilayah tersebut.

Saya sudah mencoba (un) mengatur transient-mark-modesecara langsung dan melalui suatu fungsi, tetapi wilayah tersebut masih kehilangan sorotannya.

Berjalan hanya (kill-ring-save (region-beginning) (region-end))dalam fungsi interaktif berfungsi seperti yang diharapkan, yaitu. kehilangan sorotan.

Berjalan hanya (exchange-point-and-mark) (exchange-point-and-mark)dalam fungsi interaktif berfungsi seperti yang diharapkan, yaitu. itu menyoroti kembali wilayah dan menempatkan / meninggalkan titik di tempat aslinya / benar.

Namun ketika saya menempatkan mereka semua bersama-sama dalam suatu fungsi, itu tidak kembali menyoroti wilayah tersebut. Berikut adalah fungsi dan pengikatan yang tidak berfungsi:

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

Menggunakan: GNU Emacs 23.1.1 di Ubuntu 10.04.3

Peter.O
sumber

Jawaban:

8

Menjalankan kill-ring-savetidak menonaktifkan tanda secara langsung, tetapi hanya menetapkan variabel deactivate-markke tdalam rangka untuk penonaktifan yang harus dilakukan sesudahnya . Untuk mencegahnya, setel ulang deactivate-markke nil sebelum penonaktifan.

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

Wilayah disorot karena tandanya "aktif" - jadi secara aktif mengaktifkan tandanya. Catatan: Saya tidak yakin mengapa bertukar titik / tanda tidak berfungsi. Inilah fungsi yang diperbarui, saya juga memperbaruinya untuk menggunakan interaktif untuk mengisi argumen.

(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
sumber
Terima kasih atas petunjuk tentang arg interaktif dan activate-mark, tetapi masih tidak berhasil. Saya bahkan memasang VM clean-slate dari Ubuntu 11.04 dengan satu-satunya kode .emacsuntuk fungsi ini, tetapi masih belum mengaktifkan tanda, namun secara manual menerapkan C-x C-xsegera setelah C-insertmengembalikan kembali penyorotan ...
Peter.O
@ fred sudahkah Anda mencobanya di Emacs tanpa .emacs Anda? yaitu jalankan emacs -qdengan kode dan periksa untuk melihat apakah itu berfungsi.
Trey Jackson
Saya telah menjalankannya (tidak berhasil) tanpa apa pun kecuali fungsi yang satu ini ~/.emacsdan tanpa apa pun di dalamnya ~/.emacs.d/, dan seperti yang disebutkan, juga dalam instalasi emacs baru dalam VM baru .... Saya sekarang sudah mencoba perintah ini, tetapi itu juga tidak berfungsi: /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))'... Apakah fungsinya bekerja untukmu?
Peter.O