อ่าใช่ iSearch อ่านคีย์ที่คุณพิมพ์ดูพวกเขาในisearch-mode-map
และจะเรียกพวกเขาในบัฟเฟอร์ปัจจุบัน
Isearch ไม่ได้ปรากฏตัว แต่ใช้ minibuffer มันใช้พื้นที่เสียงสะท้อน นั่นคือสิ่งที่คุณเห็นมีข้อความที่ส่งออกจริงรวมถึง echoes ของตัวละครที่คุณพิมพ์
สิ่งนี้ควรทำในสิ่งที่คุณถาม:
(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 คำถามของคุณบอกว่าdelete
ตัวละคร แต่คุณเขียนDEL
ซึ่งเป็นตัวอักษร Backspace)
@Malabarba ชี้ให้เห็นในความคิดเห็นเมื่อคุณตั้งค่าสตริงการค้นหาใหม่เป็น""
(สตริงว่าง) with-isearch-suspended
ดำเนินการต่อโดยค้นหาสตริงการค้นหาล่าสุดแทนที่จะเริ่มต้นด้วยสตริงการค้นหาที่ว่างเปล่า
นี่คือ " คุณสมบัติ " ของwith-isearch-suspended
โดยทั่วไป แต่เนื่องจากบางครั้งคุณอาจต้องการล้างสตริงการค้นหาสำหรับการเริ่มต้นใหม่ในเวอร์ชันของwith-isearch-suspended
ในisearch + .elฉันได้เพิ่มตัวแปรisearchp-if-empty-prefer-resuming-with-last
เพื่อควบคุมสิ่งนี้ หากคุณผูกสิ่งนั้นกับnil
และคุณตั้งค่าisearch-new-string
ให้""
ค้นหาการดำเนินการต่อด้วยสตริงการค้นหาที่ว่างเปล่า
ดังนั้นด้วยIsearch +คุณสามารถทำสิ่งที่คุณต้องการด้วยคำจำกัดความนี้:
(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 "")))))
ฉันสังเกตเห็นด้วยตอนนี้ที่ Emacs 24.4 ได้นำการถดถอยมาซึ่งฉันได้ยื่นข้อบกพร่องของ Emacs # 20466สำหรับซึ่งหมายความว่าการผูกDEL
เข้าisearch-mode-map
ไม่เพียงพอ เขาเสริมแยกผูกพันนอกเหนือไปจากหนึ่งสำหรับ<backspace>
DEL
นั่นหมายความว่าจะ<backspace>
ไม่ได้รับการแปลอีกต่อไปDEL
สำหรับ Isearch (แต่ยังคงได้รับการแปลสำหรับ Emacs โดยทั่วไป)
ดังนั้นหากคุณต้องการปุ่ม Backspace จะทำในสิ่งที่คุณถามใน Emacs 24.4 หรือสูงกว่านั้นคุณก็ไม่สามารถผูกไปDEL
mydelete
คุณจำเป็นต้องผูกไป<backspace>
mydelete
ใบ้, AFAICT, mais บน n'arrete pas le progres ...
ฉันได้เพิ่มคำสั่งที่คล้ายกันในIsearch +และผูกไว้กับC-M-l
(คีย์เดียวกันที่ใช้ในการลบไม่ตรงกันเสร็จสมบูรณ์ในIcicles )
ระวังด้วยเช่นกันว่าC-g
ใน Isearch จะมีข้อความที่ไม่ตรงกันให้ลบข้อความที่ไม่ตรงกันด้วย (แต่C-g
ก็มีผลเมื่อการค้นหาสำเร็จ)
ฉันควรจะกล่าวว่าIsearch +ยังมีพฤติกรรมที่เป็นตัวเลือกตามบรรทัดที่คล้ายกันมาระยะหนึ่งแล้ว M-k
ระหว่าง Isearch สลับระหว่าง 3 พฤติกรรมซึ่งควบคุมโดยค่าของตัวเลือกisearchp-drop-mismatch
:
replace-last
- อินพุตปัจจุบันของคุณแทนที่ข้อความที่ไม่ตรงกันล่าสุด คุณสามารถดูอินพุตล่าสุดของคุณได้ตลอดแม้ว่าจะไม่ตรงกัน M-e
และจะสามารถใช้ได้สำหรับการแก้ไขโดยใช้
nil
- อินพุตปัจจุบันของคุณถูกต่อท้ายแม้ว่าอินพุตก่อนหน้านี้มีส่วนที่ไม่ตรงกัน
สิ่งอื่นใด - อินพุตปัจจุบันของคุณถูกละเว้น (ลบ) หากไม่ตรงกัน สตริงการค้นหามีการจับคู่ที่ประสบความสำเร็จเสมอ