Elisp yalnızca seçilen bölgeye komut uygulamak için


19

Söyle, böyle bir kod var:

(defun some-function ()
  (interactive)
  ;; do something
  )

Şimdi some-functionsadece arabellekte seçilen bölgede mi çalışmak istiyorum ? Bunu nasıl yapabilirim ? Ayrıca, bir bölge seçtiysem bir şey yapmak ve seçmediysem başka bir şey yapmak için iki ayrı kod yolu olabilir.

Yanıtlar:


23
(defun some-function (beginning end)
  (interactive "r")
  (if (use-region-p)
      (message "The region is active, and is from %d to %d" beginning end)
    (message "The region is still there (from % d to %d), but it is inactive" 
             beginning end)))

Kullanımı (interactive "r")parametreleri olduğunu araçlarla beginningve endotomatik bölge başında ve bölge sonuna değerlerini alacak sırasıyla işlev çağrıldığında. (Ayrıca bu değerler her zaman işlevleri kullanarak alabilirsiniz region-beginningve region-endsırasıyla.)

Bölge her zaman mevcuttur (geçerli arabellekte bir işaret varsa), ancak olduğunu düşünmeyebilirsiniz. Bölge vurgulandığında etkindir (metin seçilidir). Yüklemeyi kullanarak bölgenin etkin olup olmadığını test edebilirsiniz region-active-p. Ancak genellikle daha iyi bir testtir use-region-p, çünkü (varsayılan olarak nil) yalnızca bölge hem aktif hem de boş olduğunda (nokta ve işaret farklı olduğunda) true değerini döndürür .

Başlangıçta bölgenin vurgulanması yoktu. Ve uzun süre, vurgulama mevcut olsa da, varsayılan davranış değildi. Vurgulamanın gerçekleşmesi için, transient-mark-modeaçık (veya en azından geçici olarak açılmış) olmanız gerekir . Varsayılan olarak, transient-mark-modeson Emacs sürümlerinde açıktır.

Yüklemin tanımına bakmak yardımcı olur use-region-p:

(defun use-region-p ()
  (and (region-active-p)
       (or use-empty-active-region
           (> (region-end) (region-beginning)))))

use-empty-active-regionvarsayılan değeri nil(true) olan bir kullanıcı seçeneğidir, yani use-region-pbölge boşsa varsayılan olarak true değerini döndürmez. Bu durumda, bölgenin geri dönmesi için, bölgenin sonu başlangıçtan daha büyük olmalıdır (yukarıda tarif ettiğim davranış).

Ve eğer tanımına bakarsak region-active-p:

(defun region-active-p ()
  (and transient-mark-mode
       mark-active
       (mark)))

nilTüm bunlar doğru olduğunda bunun true (non- ) döndürdüğünü görüyoruz :

  • transient-mark-mode açık.
  • İşareti etkin ( mark-active).
  • Geçerli tamponda bir işaret var.

Aktif olma işareti gerçekten aktif olan bölgenin ne olduğudur. Aktif olduğunda, aktif transient-mark-modeolduğu ve mevcut tamponda bir işaret olduğu varsayılarak , bölge vurgulanır.


AFAICS, işaret nokta olarak ayarlanmışsa, yani bölge genişlememişse, işaret etkin sıfırdır. Bu nedenle, oldukça aktif fonksiyonlarda değer katan tek şey mark aktif ve geçici mark modu.
Andreas Röhler

1
@ AndreasRöhler: Hayır. C-SPC M-: mark-active=> t. Yine de aktif olan boş bir bölgeye sahip olabilirsiniz.
Drew

Tamam teşekkürler. Yine de mark-active ve region-active-p - daha büyük sıfır olarak tanımlanmış - tüm ihtiyaç duyulduğunu düşünüyorum.
Andreas Röhler
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.