Isearch dizesinin eşleşmeyen kısmını veya tam eşleşme varsa son karakteri silin


11

Aşağıdakilere sahibim

(defun isearch-del-fail-or-char ()
  "Delete failed isearch text, or if there is none, a single character."
  (interactive)
  (if (isearch-fail-pos)
      (delete-region (isearch-fail-pos) (point))
    (isearch-del-char)))

(define-key isearch-mode-map (kbd "DEL") 'isearch-del-fail-or-char)

Kodun amacı, deleteisearch'te başarısız dizenin tamamını (veya başarısız dizge yoksa sadece tek bir karakteri) silmektir.

Ancak, delete-regionarabellekten metin silme isearch, arama ara belleğinin kendisini değil aramaktadır.

Bunu yapmanın uygun yolu nedir? Benim emacs lisp tarzı geri kalan eleştiri de açığız :)

Yanıtlar:


12

Ah evet. Isearch, yazdığınız tuşları okur, arar ve geçerli arabellekteisearch-mode-map çağırır .

ISearch yapar değil , görünüşe rağmen, minibuffer kullanın. Yankı alanını kullanır. Yani, gördüğünüz şey aslında yazdığınız karakterlerin yankıları da dahil olmak üzere çıktı mesajlarıdır.

İstediğinizi yapmalısınız:

(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, sorunuz deletekarakteri söylüyor , ancak DELgeri karakter olan yazdınız.)


@Malabarba bir yorumda belirttiği gibi, yeni arama dizesini ""(boş dize) olarak ayarladığınızda, with-isearch-suspendedboş bir arama dizesiyle başlayarak son arama dizesini arayarak devam eder.

Bu genel olarak bir " özelliktir " with-isearch-suspended. Bazen gerçekten sürümünde, tekrar başlatılması için arama dizesini boşaltmak isteyebilirsiniz çünkü with-isearch-suspendediçinde ISearch + .el ben ekledim değişken isearchp-if-empty-prefer-resuming-with-last, bunu kontrol etmek. Bunu bağlarsanız nilve olarak ayarlarsanız isearch-new-string, ""arama işlemi boş bir arama dizesiyle devam eder.

Yani Isearch + ile bu tanımla istediğinizi yapabilirsiniz:

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

Ben de şimdi Emacs 24.4 ben bulundum gerilemesine tanıttı fark Emacs hata # 20466 için, bağlayıcı anlama geldiğini DELde isearch-mode-mapyeterli değildir. Bir bağlayıcı ayrı ilave <backspace>için bir ek olarak, DEL. Bu , Isearch için <backspace>artık çevrilmediği anlamına gelir DEL(ancak yine de genellikle Emacs için bu şekilde tercüme edilir).

Yani Geri tuşu Emacs 24.4 sordu ya da geç o zaman sadece bağlamaz ne yapmak istiyorsanız DELiçin mydelete. Bağlanman <backspace>gerek mydelete. Aptal, AFAICT, n'arrete pas le progres üzerinde mais ...


I benzer bir komutu ekledik ISearch + ve bunu bağlanan C-M-l(bir tamamlama uyumsuzluğu kaldırmak için kullanılan aynı anahtar Icicles ).

Çok unutmayın C-gbir uyumsuzluk olduğunda ISearch de, eşleşmeyen metni kaldıracaktır. (Ancak C-garama başarılı olduğunda da bir etkisi vardır.)


Bunu bahsetmeliydik ISearch + Ayrıca artık uzunca bir süre benzer çizgiler boyunca isteğe bağlı bir davranış olmuştur. M-kIsearch sırasında, seçeneğin değeri tarafından kontrol edilen 3 davranış arasında geçiş yapar isearchp-drop-mismatch:

  • replace-last- Geçerli girişiniz, en son eşleşmeyen metnin yerini alır. Bir uyumsuzluk olsa bile her zaman son girdinizi görebilirsiniz. Ve kullanarak düzenleme için kullanılabilir M-e.

  • nil - Önceki girişinizde eşleşmeyen bir bölüm olsa bile geçerli girişiniz eklenir.

  • başka bir şey - Uyumsuzluğa neden olursa geçerli girişiniz yok sayılır (kaldırılır). Arama dizesi her zaman başarılı eşleşmelere sahiptir.


BTW, başarısız bölümün vurgulanmasını eklediğimden (yıllar önce, GNU Emacs'a eklemeden önce) benzer bir komut eklemeyi düşündüm, ama hiç bu kadar uğraşmadım . Bunu şimdi yaptım . (Ancak, bir karakterin silinmesini dahil etmedim. Eklediğim komut, başarısız bir bölüm yoksa bir
Drew

OS X kullanıyorum. Geriye silme demek istedim.
asmeurer

İsearch + replace-last davranışı oldukça hoş görünüyor. Yine de, arama her başarısız olduğunda zili çalmamayı sağlar mı?
asmeurer

2
Sitesinin yeni bir sürümünü yükledim isearch+.el. (A) otomatik uyumsuzluğun giderilmesini giderir, böylece sarma tamamlanır. Ve isearchp-ring-bell-functionarama sırasında zili bastırmak için kullanabileceğiniz bir seçenek ekler .
Drew

3
Malabarba, ilginç. Böceğe bir atış yaptım ve bununla bitirdim . Çoğunlukla kargodan kültürlendi isearch-del-charve Drew'un cevabı ama amaçlandığı gibi çalışıyor gibi görünüyor. with-isearch-suspendedMakro suçlu oldu.
jbm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.