Belirli bir metin bölge etrafına nasıl kaydırılır


11

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.


Bunu, bir kez veya birkaç kez rastgele içerik eklemek için kullanmak ister misiniz? İkinci durumda, smartparens gibi kütüphaneler yararlı olabilir ve özel çiftlerle genişletilebilir. Örneğin, bir çift ekleyebilirsiniz <?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.
T. Verron

@ T.Verron: Bunların var olduğunu biliyorum. Ancak, koddan geçip bir şeyleri işaretlemek için benzersiz bir ihtiyaç olduğu anlar için tek, genel, yeniden kullanılabilir bir işlev en iyi uyuyor
nperson325681

Yanıtlar:


6

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

Btw, bunun bazı sınır durumlarını işleme biçimi optimal değildir; başlangıç ​​araması bazen başarısız olabilir ve her iki etiketi de sonunda bırakabilir. Olabilir evilben burada o çatışacak kullandıkları. Belki bir tür işlev interactive "r" daha sağlam çalıştı?
nperson325681

4

Farklı bir yaklaşım öneririm. Bir bölge olduğunda, tanım gereği bölgenin pointbaşında (veya sonunda) markolmalı 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-xbö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.


Başlangıç ​​ve bitiş metni aynı multiple-cursorsise, etkin bölgenin başında ve sonunda aynı anda metin eklemek için benzer bir şeyin değiştirilip düzeltilemeyeceğini merak ediyorum .
glucas

Bu, daha az editör kullanıcılarının yine de yapmaya zorlandığı manuel yol gibi görünüyor. Neyse cevabınızın bir alt metni olarak makro kullanımını okudum, söylemeliyim.
Tarzını

1
@progo - Thanks :) Daha manuel bir yaklaşım gibi geliyor , ancak aslında alternatifinizden daha az tuş vuruşu kullanıyor . Bu yaklaşımla, sarma metni dışında, sadece ihtiyacınız var C-x C-x. Cevabınızla, işlevinizi ( C-c something) çağırmanız ve ayrıca returnher 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.
Tyler

3

Sadece çeşitlilik uğruna:

Bunu gelişigüzel başlangıç ​​ve bitiş metinleriyle yapmanın başka bir yolu replace-regexpda bölgede kullanmaktır : eşleşmek .+ve değiştirmek before \& afterveya beforeve 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-regexpve arabellekte bir de yapabilirsiniz , ancak muhtemelen sarmak istediğiniz metin o kadar tutarlı değildir.

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.