Vim'den sed tarzı ikame komutlarına eşdeğer bir şey var mı?


14

Vim'den özlediğim şeylerden biri, birden fazla satır üzerinde çalışacak bir ikame komutu yazabilmek, örneğin:

:/begin/,/end/s/foo/bar/g

Yukarıdaki komut, "start" içeren ilk satırdan başlayıp "end" içeren satırdan sonra biten "bar" yerine "foo" ifadesinin yerine geçer.

Emac'lerde benzer bir şey yapmanın bir yolu var mı?

Yanıtlar:


7

evil, soyulmuş bir sürümünü sağlar ex, bu yüzden bunun tam bir drop-in olmadığını varsaymak muhtemelen en iyisidir. Ancak, sağladığınız örnek, bu nokta ilk satırdan önce olması durumunda (örn., Örneğinizdeki satır) kutudan çıkar begin.


Vim'de arama da noktadan başlayacaktı, bu yüzden aradığım şey gibi geliyor. Teşekkürler!
Larry Coleman

8

Yalnızca yerleşik işlevselliği kullanan bunu yapmanın bir yolu:

  1. İlk satırın bulunduğu satırda nokta ile begintuşuna basın C-SPC.

  2. Şunun bir sonraki tekrarına git end:

    C-s end RET

  3. Değiştir fooile bar:

    M-% foo RET bar RET !

Bu, query-replaceeğer varsa, tüm tampon yerine aktif bölge üzerinde çalışacak olan gerçeği kullanır .


Elbette, özel bir komut da tanımlayabilirsiniz:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

Bu komut her zaman arabellek başından itibaren arama yapar, bu nedenle nokta, onu çağırdığınızda begin/ foo/ sonra olabilir end.

Bunun için bir anahtar ciltleme ayarlayın:

(global-set-key (kbd "C-c r") 'replace-from-to)

5

Genel olarak, bu sizin narrow-to-regioniçin kullanacağınız bir şeydir .

İmleci bölgenin başlangıcına taşıyın (örneğin, arayarak) ve düğmesine basın C-SPC, ardından bölgenin sonuna gidin ve yazın M-x narrow-to-region. Artık istediğiniz arama ve değiştirme komutlarını verebilirsiniz ve bunlar ara belleğin daraltılmış kısmına uygulanır. İşiniz bittiğinde, M-x widenarabellek içeriğini geri yüklemek için yazın .


4
Eğer begin/ endBir programlama dilinde sınırlayıcı olan, büyük olasılıkla kullanabilirsiniz C-M-Spaceçalıştırmak için mark-sexpbir komut bölgeyi seçmek için.
14'te

1
Varsayılan bağlantılar: C-x n n( narrow-to-region) ve C-x n w( widen).
itsjeyd
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.