Genellikle bir bölgeye metin uygulamam gereken bir durum var. HTML ve basit durumlar için zaten bunun için kütüphaneler var. Peki ya genel durum? Bölgenin başına ve sonuna ne ekleyeceğimi sormak istiyorum.
Genellikle bir bölgeye metin uygulamam gereken bir durum var. HTML ve basit durumlar için zaten bunun için kütüphaneler var. Peki ya genel durum? Bölgenin başına ve sonuna ne ekleyeceğimi sormak istiyorum.
Yanıtlar:
Etrafta dolaştım ve bu gönderiyi John D. Cook tarafından buldum . Bölgenin etrafındaki HTML / XML etiketlerini kolayca almak için basit bir etkileşimli işlevin nasıl oluşturulacağını gösterir. Bundan iki kez sormak için işlevi değiştirdim.
(defun tag-word-or-region (text-begin text-end)
"Surround current word or region with given text."
(interactive "sStart tag: \nsEnd tag: ")
(let (pos1 pos2 bds)
(if (and transient-mark-mode mark-active)
(progn
(goto-char (region-end))
(insert text-end)
(goto-char (region-beginning))
(insert text-begin))
(progn
(setq bds (bounds-of-thing-at-point 'symbol))
(goto-char (cdr bds))
(insert text-end)
(goto-char (car bds))
(insert text-begin)))))
Daha da önemlisi, bu işlev, örneğin bazı belirli metin parçalarını eşlemek için tuşları bağlamak istediğinizde yardımcı bir araç olarak da kullanılabilir.
(defun tag-php ()
(interactive)
(tag-word-or-region "<?php " "?>"))
evil
ben burada o çatışacak kullandıkları. Belki bir tür işlev interactive "r"
daha sağlam çalıştı?
Farklı bir yaklaşım öneririm. Bir bölge olduğunda, tanım gereği bölgenin point
başında (veya sonunda) mark
olmalı ve sonunda (veya başında) olmalıdır. Yani noktaya istediğiniz metni girebilir ve daha sonra exchange-point-and-mark
, yani C-x C-x
bölgenin diğer ucuna atlamak için kullanabilirsiniz . Paketleyicinizin ikinci yarısını girin ve işiniz bitti.
Ekleme metni için açıkça sorulmuyor, ancak aynı şeyi daha az çaba ile gerçekleştirmenin bir yolu olacağını hayal edemiyorum.
multiple-cursors
ise, etkin bölgenin başında ve sonunda aynı anda metin eklemek için benzer bir şeyin değiştirilip düzeltilemeyeceğini merak ediyorum .
C-x C-x
. Cevabınızla, işlevinizi ( C-c something
) çağırmanız ve ayrıca return
her girişten sonra vurmanız gerekir . Ne yaparsanız yapın, iki tuşa daha sahipsiniz. Bununla birlikte, elisp'den bir şey aramak istiyorsanız yardımcı olmaz.
Sadece çeşitlilik uğruna:
Bunu gelişigüzel başlangıç ve bitiş metinleriyle yapmanın başka bir yolu replace-regexp
da bölgede kullanmaktır : eşleşmek .+
ve değiştirmek before \& after
veya before
ve için kullanmak istediğiniz herhangi bir metin after
.
Bunu yapmak için bir komut yazabilirsiniz, ancak belirli bir dosyada aynı başlangıç / bitiş metnini birden çok yere uygulamak istediğiniz bir durum düşünüyorum. Bir makro kaydedebilir veya başka bir bölgede tekrarlamak için minibuffer geçmişini kullanabilirsiniz.
Elbette, sarmak istediğiniz metin normal bir ifade olarak ifade edilebilirse, o zaman bir bölge seçmeniz gerekmez query-replace-regexp
ve arabellekte bir de yapabilirsiniz , ancak muhtemelen sarmak istediğiniz metin o kadar tutarlı değildir.
<?php
...?>
ve ardından, bir bölge ve tür<?php
(veya tuş bağlama) seçtiğinizde , çiftin içine sarmasını isteyin . Ancak afaik, tek atışlık çiftleriniz varsa bu kütüphaneleri kullanmanın kolay bir yolu yoktur.