Memilih (yaitu, sebagai wilayah) yang cocok saat ini dalam pencarian tambahan

9

Saat mencari string dengan C-s, saya ingin dapat menekan beberapa tombol untuk keluar dari mode pencarian tetapi tetap mempertahankan pemilihan yang cocok. Dengan begitu saya bisa langsung mulai mengetik dan mengganti yang paling cocok.

Misalnya, katakan saya memiliki dokumen berikut:

The quick brown fox jumps over the lazy dog.

Jika saya mencari "lazy", emacs akan memilih kata itu seperti itu (tanda kurung siku adalah pilihan, pipa adalah kursor):

The quick brown fox jumps over the [lazy|] dog.

Sekarang, jika saya menekan return, emacs akan mempertahankan posisi kursor saya, tetapi itu akan membatalkan pilihan "malas":

The quick brown fox jumps over the lazy| dog.

Alih-alih ini, saya ingin jalan pintas yang akan keluar dari mode pencarian tetapi mempertahankan pemilihan pertandingan saat ini, seperti di negara bagian kedua di atas.

Ben
sumber
Bukan M-x query-replaceapa yang kamu cari?
Nsukami _
1
@Nsukami_ Saya tidak selalu tahu apa yang saya inginkan, atau bahkan apa yang ingin saya gantikan sebelum mencari. Jauh lebih mudah untuk menekan C-sdan mengetik apa yang saya pikir saya ingin cari, kemudian ubah kueri w / backspace menjadi nol pada hal yang ingin saya ubah. Lalu saya bermain-main dengan apa yang sebenarnya ingin saya gantikan. M-%terlalu "formal."
Ben
Solusinya sangat berguna bagi saya, seperti ketika saya mencari kata untuk membunuhnya dan kemudian menariknya ke tempat yang berbeda. query-replacetidak menyelesaikan ini.
GergelyPolonkai

Jawaban:

7

Inilah satu pendekatan:

(defun isearch-exit-mark-match ()
  "Exit isearch and mark the current match."
  (interactive)
  (isearch-exit)
  (push-mark isearch-other-end)
  (activate-mark))

(define-key isearch-mode-map (kbd "<C-return>") #'isearch-exit-mark-match)

Ini mengikat kunci yang berbeda (C-return) untuk keluar dari pencarian saat ini dan juga membiarkan pertandingan terakhir dipilih. Ini akan bekerja dengan isearch-forward-regexpbaik, yang berguna.

glukas
sumber
1
Saya mendapatkan "Definisi fungsi simbol tidak berlaku: bind-key." Dari mana bind-keydatangnya?
Ben
1
Maaf, bind-keyberasal dari perpustakaan lain. Saya telah mengubah jawaban untuk menggunakan define-keyfungsi bawaan.
glucas
4

Library Isearch + memungkinkan Anda melakukannya dengan mudah , dan bahkan mengaktifkan / mematikannya dengan cepat.

  • Opsi non-nil isearchp-set-region-flagsecara otomatis menetapkan wilayah (pilihan) di sekitar target pencarian terakhir ketika Anda keluar dari pencarian.

  • Perintah isearchp-toggle-set-region, terikat M-s M-SPCselama opsi matikan isearch isearchp-set-region-flag.

  • Perintah set-region-around-search-targetsecara manual mengatur wilayah di sekitar target pencarian terakhir. (Jadi, bahkan jika opsi tidak diatur, sehingga Anda tidak mendapatkan seleksi otomatis, Anda dapat melakukannya secara manual.)


Library Replace + memungkinkan Anda melakukan hal yang sama untuk query-replacedll. Ini membuat wilayah sekitar (yaitu, memilih) kejadian penggantian terakhir. Ini menggunakan opsi yang sama isearchp-set-region-flag,, untuk mengontrol ini, dan perintah set-region-around-search-targetmemiliki efek yang sama.

Drew
sumber