Metni değiştirmek için arama / değiştirme benzeri özellik


12

Sık sık kendim örn değiştirmeye çalışırken bulmak fooile barve barile foobir tampon içerisinde.

Ben genellikle yapmak yolu ya:

  • 3 sorgu yerine geçer: aaa -> @@@, bbb -> aaa,@@@ -> bbb
  • otomasyondan vazgeçmek ve sadece el ile değiştirme yapmak

Eşleşen dize olup olmadığını test etmek için ,sözdizimi kullanarak bir şey almak mümkün olduğunu varsayalım veya . Ama ortaya çıkan sözdizimi çok hantal olurdu, bu yüzden gerçekten denemedim.query-replace-regexpaaabbb

Mesele, ne kadar yaygın bir görev olduğu göz önüne alındığında, bence yerleşik veya mevcut bir pakette daha iyi, tek adımlık bir yolun olması gerekir. Var mı?


Tek adımlı bir yol olabilir, ancak ilk yolunuz fena değil IMO. Ve eğer yerine yedek dizeyi seçerseniz, ikinci geçiş için sorgu gerektirmeden değiştirme yapabilirsiniz.
Drew

@Drew Düzenli olarak query-replace, M-% str1 str2noktayı hareket ettirmenin ve değişikliği elle yapmanın genellikle daha hızlı olduğunu biliyorum . Güzel, çünkü tek bir olay olsa bile, en hızlı neyin olacağını düşünmek için zaman harcamak zorunda değilim str1. İdeal olarak, metin çevirmenin de aynı hızda olmasını istiyorum, böylece onu düşünmeden de kullanabilirim.
T. Verron

Birisi basit bir cevap verecektir. Kuşkusuz, örneğin değiştirilecek metne atıfta bulunmak için bir Lisp ifadesi kullanarak istediğinizi yapabilirsiniz. Örneğin, takas deyimine benzer bir şey kullanın (setq a (prog1 b (setq b a))). Ve daha basit bir yol bile olabilir.
Drew

2
\,(if \1 "b" "a")Özellikle çirkin bulmuyorum ( normal ifadesine karşı \(a\)\|b), ama yine de kelimeler sizi rahatsız ediyorsa iki kez yazılmalıdır.
politza

2
Neden olmasın \(aaa\)\|bbb?
politza

Yanıtlar:


8

İşte bunu yapacak küçük bir komut:

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

Teşekkür ederim, bu kendim yazdığım bir şeyden çok daha ayrıntılı! Belki de uygulanan özellikler hakkında ayrıntılı bilgi verebilir misiniz? Ben önek argümanı ile geriye gitmek, görüyorum ki sadece gerektiğinde yerine gerçekleştirir ... Ya da sadece query-replaceinversiyon için bir yeniden yazma , böylece tüm özelliklerini korumak mı?
Emacs'mdaki

@ T.Verron Bu, query-replaceen son sürümdeki işlev ailesinin standart bir gövdesidir , bu nedenle tüm özellikleri korur. İşlevin sonuna Emacs kılavuzunda belirtilen dizeleri değiştirmem için önerilen yolumu ekledim.
link0ff

Muhtemelen çok hızlı kabul ettim. İşlev yalnızca burada (emacs 24.3) çalışırsam backwardve region-noncontiguous-pçağrıdan yorum yaparsam çalışır perform-replace. Bu genel bir sorun mu, yoksa arayüzün perform-replacesürümler arasında değiştiği anlamına mı geliyor?
T. Verron

Evet, arayüz en son sürümde eklenen bu 2 argümanla değişti, bu yüzden daha önce mevcut değiller,
link0ff

2
Bu çözüm de şimdi iyi görünüyor.
İsim

9

yükleme plur

ve komutu çalıştır plur-query-replace

ve girdi {foo,bar}ve değiştirilmesi{bar,foo}

Olayları yistediğiniz gibi değiştirmek için tuşuna basın .

Bu komutun etkileşimli olmayan ve isearch benzeri varyantları da vardır.


Teşekkürler! plur'un amacı da bazen aradığım bir şey, kesinlikle bir göz atacağım. Tek tereddütüm yukarıdaki paketin yazarının yorumundan kaynaklanıyor ...;)
T. Verron

1
plurgerektirir emacs 24.4.
T. Verron
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.