Grep / ack / ag çıkış modlarında query-change kullanmanın bir yolu var mı?


31

find-grep-diredKarşılık gelen dosyaları işaretleyerek ve ardından işaretli dosyaları Qçalıştırmak dired-do-query-replace-regexpiçin tuşuna basarak farkındayım . Maalesef bu, grep'i yeniden başlatmayı gerektirir ve artık git-grep, ack veya ag kullanarak ve find-greparama için farklı bir sözdizimine sahip olan kullanımı değiştirmeyi gerektirir .

Ayrıca farkındayım multi-occurve occur-edit-modebu aramayı kullanarak yeniden başlatmayı gerektirir. Son olarak, ag-direddosya içeriğinde değil, dosya adında eşleşiyor gibi görünüyor.

Mevcut yaklaşımım grep çıktısını oluşturmak ve sonra grep arabelleğinde başlayan ve her eşleşmeyi ziyaret eden ve değiştiren bir makroyu çalıştırmaktır. query-replaceBulunan eşleşme kümesi üzerinde doğrudan kullanmayı tercih ederim .

Yapmak istediğim, uygun dosyaları işaretleyebilmem ve üzerinde sorgu-regexp'i çağırabilmem için grep çıktısını hızlı bir şekilde dizilmiş bir arabellek oluşturmak veya grep çıktısını multi-occurkullanabilmek occur-edit-modeiçin arabellek listesine dönüştürmek . yerinde düzenleyin ve query-replacebu tamponda çalıştırın .

Bu işlevsellik var mı, yoksa bu sorunu çözen başka bir iş akışı var mı?

Yanıtlar:


28

@ Malababa wgrepgrep / ack / ag sonuçlarını düzenlemek için paket kullanımından bahsetti .

agPaket wgrep-agkullanarak 'taranmış' sonuçları düzenlemek için paketi ve paketleri nasıl kullandığımı ayrıntılı bir şekilde incelemek istiyorum multiple-cursors.

Bu paketlere Melpa'dan erişilebilir. Ayrıca sisteminizde agaka the_silver_searcher olması gerekir.

Bu inceleme, bulunan tüm / seçilen konumlarda tek satır düzenlemeleri yapmanın bir yolunu aradığınız durumlar için geçerlidir ag.

  • agSisteminize ve yukarıda belirtilen emacs paketlerine yükleyin .

  • agbelirttiğiniz regex ile eşleşen içeriğe sahip dosyaları aramayı destekler. agProje kökünün neresine boş bir .gitklasör koymak olduğunu söylemenin en basit yolu . Ardından kullanarak aramayı yapın M-x ag-project-regexp.

  • Ag aramasının sonuç arabelleği varsayılan olarak düzenlenemez. Düzenlenebilir hale getirmek M-x wgrep-change-to-wgrep-modeiçin wgrep-default bağlamayı yapın veya kullanın C-c C-p.

  • Şimdi, tüm dosyalarınızda 'abcdef' i 'ghijkl' olarak değiştirmeniz gerekirse, 'abcdef' i ararsınız ve ag results buffer bu dizeyi içeren tüm satırları görüntüler. Ardından bu tamponu düzenlenebilir hale getirir ve bu dizeleri manuel olarak değiştirirsiniz ve bu değişiklikler M-x wgrep-finish-edit, varsayılan bağlama işlemini yaparken veya kullanırken gerçek dosya tamponlarına yansıtır C-c C-e. Ayrıca query-replace-regexpbu aramayı değiştirmek için de kullanabilirsiniz .

  • multiple-cursorsHızlı yeniden düzenleme için kullanmayı tercih ediyorum, böylece birden fazla düzenlememin aynı anda gerçekleştiği yerin gerçek zamanlı geri bildirimini görebiliyorum. Bu ag sonuçları arabelleğinde değiştirmek istediğiniz dizeyi vurgulayın ve arayın M-x mc/mark-all-like-thisve ardından aynı anda birden fazla noktada düzenlenmiş şeyleri gördüğünüzde huşu içinde düzenleyin.

  • Düzenlemelerden memnun olduğunuzda, yukarıda bahsettiğim gibi, C-c C-egerçek arabelleklerdeki değişiklikleri "yansıtmak" için yapın. Tamponlar henüz kaydedilmedi.

  • Tüm tamponları kaydetmek için, genellikle bir seferde, emacs varsayılan C-x s !bağlama özelliğini kullanarak yapıyorum .

İşte ekran görüntüleri olan bir örnek kullanım örneği:

Bu tüm örneklerini değiştirilmesi işlemini göstermektedir bind-to-modi-mapetmek bind-to-my-mapskinTenimde ~/.emacs.d/.

Ben aradığınız zaman bind-to-modi-mapbenim emacs kurulum klasöründe, ben 'ag'ged sonucu altında olsun:ag sonuçları, değiştirilmemiş

Bu arabellek salt okunur.

Sonra M-x wgrep-change-to-wgrep-modevurgularım, bu seçimleri düzenleyerek ve yaptıktan sonra -modi-mapbu seçimin tüm örneklerini seçin , aşağıdaki gibi görünür: M-x mc/mark-all-like-this-my-mapçoklu imleçler kullanılarak değiştirilmiş ag sonuçları

Mavi vurgu, bastığımda hangi çizgilerin değiştirileceğini gösterir C-c C-e.

Vuruşta C-c C-e, asıl dosyaya yansıyan değişikliği bu ekran görüntüsünde görebilirsiniz: ag sonuçlarını düzenledikten sonra

Sonra değiştirilen tüm dosyaları kullanarak kaydederdim C-x s !.


Bu gerçekten dize değiştirmek için en iyi yoldur. Bir projeye dahil, ag hariç tutma, toplu iş yapmak kolay, yine de doğru şeyi değiştirdiğinizi doğrulayabiliyor.
PascalVKooten

13

Yapmak istediğim, hızlı bir şekilde varolan grep çıktısından [...] dired bir tampon oluşturmak veya grep çıktısını çoklu oluşum için bir tamponlar listesine dönüştürmek […].

Grep results buffer'ı herhangi bir şeye dönüştürmenize gerek yoktur, grep çıktısını düzenlemek için özel bir mod zaten vardır (ve tabii ki değişiklikleri dosyalara yansıtır).

  1. Yükleme wgrep Melpa paketi.
  2. (require 'wgrep) init dosyanızda.
  3. Bir grep araması yaptıktan sonra vurun C-c C-pve düzenleyin!
  4. Düzenlemelerinizi ile kaydedin C-c C-e

Hatta ack ve ag ile de çalışır.


2
Ben bunu yapıyorum (ag.el ile). Magnars ile birlikte, çoklu imleç düzenleme basit yeniden düzenlemeler çok kolaydır.
Tom Regner

4

Bu işlev mermi ( projectile-replace) içinde bulunmaktadır . Olayları bulmak ve tags-query-replacesorgu değiştirme işlemini yapmak için (varsa) mümkünse ag / ack / git grep / grep komutunu kullanır .


Find-grep-dired ile aynı sorunlardan muzdarip. Mevcut grep çıkışını kullanmıyor. Mermi-çoklu-oluşumu ile benzer sorunlar var. Eşleşmeler listesine baktıktan sonra sorgunun yerini almayı tercih ederim ve altta yatan aramanın yöntemini değiştirmedim. Yine de alternatif bir iş akışı.
14'te

Sesleri tanımladığınız gibi, metni değiştirmek için çok hızlı bir makro oluşturarak ve tekrar tekrar arayarak M-g n C-x e(örneğin, next-errorolaylar arasında gezinmek için kullanın) kolayca gerçekleştirilebilir.
shosti

1

İşte buz sarkıtları kullanan başka bir yaklaşım .

Emacs *grep*çıkış tamponunuzda, Icicle modunda *grep*komut vermek için tamponda bağlı olan Cc `ye (bu Cc backquote) basın icicle-compilation-search. Bu grep, herhangi bir sırayla seçtiğiniz arama isabetlerinden herhangi biri ( isabetler) arasında hızlı bir şekilde gezinmenizi sağlar .

Mini arabelleğe girdiğiniz giriş, arama isabetleri kümesini dinamik olarak filtreler (daraltır) ve art arda birden çok deseni (ör. Alt diziler, regexps) eşleştirerek daraltmak için aşamalı tamamlamayı kullanabilirsiniz .

Arama isabetleri arasında gezinirken, istediklerinizin herhangi birini değiştirebilirsiniz - ya isabetin tamamı (çizgi) ya da yalnızca mevcut mini arabellek girişinizle eşleşen parça.

Bkz derleme'yi veya Grep - Icicles Arama . Buz sarkıtları aramaya bir giriş burada ve Buz sarkıtları arama sırasında eşleşmeleri değiştirme hakkında bilgi burada .


0

Ben bunu kullandım xah_find.el yazdım

Yazdım çünkü:

  • Saf elisp. Windows'ta grep veya İşletim Sistemi'ne emac'ler arasında Unicode iletimi hakkında endişelenmenize gerek yok. emacs grep problemi
  • Eğer ağır unicode kullanıcısıysanız, unix araçlarının bazı yarı hataları vardır. linux uniq problemi
  • Her hafta 5 bin dosyada buluyorum / değiştiriyorum. Ben yıllarca dired-do-query-replace-regexp kullanıyordum. Etkileşimli doğanın zamanımı gerçekten etkilediğini düşünüyorum, ancak değişikliklerin sonuçlarını kontrol etmem gerekiyor. Böylece, çözümüm artık toplu halde çalışıyor ancak dosyaya yazma seçeneğiyle, tüm arama / değiştirme sonuçlarında tarayabileceğim hoş bir raporum var.

Bu elisp utili, emacs'ta unix grep çağırmaktan 5 ila 10 kat daha yavaştır, fakat benim için işe yaramazdı.

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.