Ah iya. Isearch membaca kunci yang Anda ketikkan, mencari di dalamnya isearch-mode-map
, dan memanggil mereka di buffer saat ini .
Isearch tidak , meskipun penampilannya, menggunakan minibuffer. Ini menggunakan area gema. Artinya, apa yang Anda lihat sebenarnya adalah pesan keluaran , termasuk gema dari karakter yang Anda ketikkan.
Ini harus melakukan apa yang Anda minta:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string ""))))
(define-key isearch-mode-map (kbd "DEL") 'mydelete)
(BTW, pertanyaan Anda mengatakan delete
karakter, tetapi Anda menulis DEL
, yang merupakan karakter backspace.)
Seperti @Malabarba tunjukkan dalam komentar, saat Anda mengatur string pencarian baru ke ""
(string kosong), with-isearch-suspended
dilanjutkan dengan mencari string pencarian terakhir, alih-alih memulai dengan string pencarian kosong.
Ini adalah " fitur " dari with-isearch-suspended
, secara umum. Tetapi karena Anda kadang-kadang mungkin benar-benar ingin mengosongkan string pencarian untuk dilanjutkan, dalam versi with-isearch-suspended
di isearch + .el saya telah menambahkan variabel isearchp-if-empty-prefer-resuming-with-last
, untuk mengontrol ini. Jika Anda mengikat itu ke nil
dan Anda mengatur isearch-new-string
untuk ""
kemudian melanjutkan dengan string pencarian kosong.
Jadi dengan Isearch + Anda dapat melakukan apa yang Anda inginkan dengan definisi ini:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(let ((isearchp-if-empty-prefer-resuming-with-last nil))
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string "")))))
Saya melihat terlalu sekarang bahwa Emacs 24.4 memperkenalkan regresi, yang saya sudah mengajukan Emacs bug # 20.466 untuk, yang berarti bahwa mengikat DEL
dalam isearch-mode-map
tidak cukup. Mereka menambahkan ikatan terpisah untuk <backspace>
, selain satu untuk DEL
. Itu berarti bahwa <backspace>
tidak lagi diterjemahkan ke DEL
, untuk Isearch (tetapi masih diterjemahkan untuk Emacs secara umum).
Jadi jika Anda ingin tombol Backspace untuk melakukan apa yang Anda minta dalam Emacs 24.4 atau lambat maka Anda tidak bisa hanya mengikat DEL
untuk mydelete
. Anda perlu untuk mengikat <backspace>
ke mydelete
. Bodoh, AFAICT, mais on progres n'arrete ...
Saya telah menambahkan perintah yang mirip dengan Isearch + dan mengikatnya C-M-l
(kunci yang sama digunakan untuk menghapus ketidakcocokan penyelesaian dalam Icicles ).
Perlu diketahui juga bahwa C-g
di Isearch juga, ketika ada ketidakcocokan, hapus teks yang tidak cocok. (Tetapi C-g
juga memiliki efek ketika pencarian berhasil.)
Saya seharusnya menyebutkan bahwa Isearch + juga memiliki perilaku opsional di sepanjang baris yang sama untuk sementara waktu sekarang. M-k
selama Isearch beralih di antara 3 perilaku, yang dikendalikan oleh nilai opsi isearchp-drop-mismatch
:
replace-last
- Input Anda saat ini menggantikan teks yang tidak cocok terakhir. Anda selalu dapat melihat input terakhir Anda, bahkan jika itu adalah ketidakcocokan. Dan tersedia untuk diedit menggunakan M-e
.
nil
- Input Anda saat ini ditambahkan, bahkan jika input sebelumnya memiliki porsi yang tidak cocok.
hal lain - Input Anda saat ini diabaikan (dihapus) jika menyebabkan ketidakcocokan. String pencarian selalu memiliki kecocokan yang berhasil.
isearch+.el
. Ini (a) memperbaiki penghapusan ketidakcocokan otomatis sehingga sampul berfungsi dengan baik. Dan itu menambahkan opsi,,isearchp-ring-bell-function
yang dapat Anda gunakan untuk menekan bel selama pencarian.isearch-del-char
dan jawaban Drew tetapi tampaknya berfungsi sebagaimana dimaksud. Thewith-isearch-suspended
makro adalah pelakunya.