Düzgünleştirilecek / yer paylaşacak metin olmadan pencere konumunda geçici metin?


9

S: Düzgünleştirmek / yer paylaşımı için metin olmayan ekran konumlarındaki bir pencerede metni geçici olarak nasıl gösterebilirim?

Ben metin özellikleri ve bindirmeleri (ayrıca bu konuya bakınız ) arkasındaki temel fikir aşina, birkaç kez kullandım, ama hiçbir şekilde onlarla usta değilim. Sınırlı anlayışım, düzgünleştirmek veya kaplamak için metin olması gerektiğidir, ancak bir pencerenin içinde metin olmayan bölümlerin nasıl kullanılacağını merak ediyorum.

İşte bir örnek için ekran görüntüsü:

resim açıklamasını buraya girin

Ekran görüntüsündeki kırmızı kutulardan birine, yani metnin sağındaki boşluğa veya arabellekteki son satırın altına nasıl metin (geçici olarak) yerleştirilebilir?


Kısacası, orada olmayan metni görüntülemek için display özelliğini kullanabilirsiniz. Eve dönmeden önce birisi tam cevap verebilir.
Malabarba

şirket kipi, display özelliğiyle noktadan sonra veya sonra yeterliyse metnin üzerine bindirmeyi başarır, alternatif olarak arabellek sonunun altında bir şey görüntülemek için after-string özelliğini kullanır. Yan tarafta bir şey görüntülemekten daha az eminim, ancak bindirmenin doğru genişliği ve konumu ile mümkün görünüyor.
wasamasa

Sadece insertarabelleğe metin yazıp bunu düzeltemez misiniz?
rekado

Yanıtlar:


6

Ben bir dize alır ve geçici olarak arabellek metni sonra bir zaman aşımı ile görüntüler bir fonksiyonun çalışma örneği çırpılmış:

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Aşağıdaki büyütme, alt kırmızı kutu örneğinizle sonuçlanacaktır:

(my-momentarily-display-after-buffer-end "Nothing to see here...")

Bunun nedeni, bindirmelerin işaretleyicileri arasında görüntülenecek konumlar olarak kullanmalarıdır. En dıştaki konumu, yer paylaşımının başlangıç ​​ve bitiş noktası olarak kullanmak, özelliği kullanarak metni görüntüledikten sonra görüntülemenizi sağlar after-string. Kaplamalar düzgün metin içerebileceğinden, girintili ve çevresinde boşluk kalacak şekilde ayarladım.

Diğer örnek, satır sonundan sonra metni görüntülemek için aynı fikri kullanabilir:

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Aşağıdaki çağrı, sağ taraftaki kırmızı kutu örneğinizle sonuçlanacaktır:

(my-momentarily-display-after-line-end "annotation")

Bu kaplamaları arabellek metninden ayırmak için çok daha çılgınca gidebilir ve yüzler ekleyebilir, zaman aşımına göre daha uzun süre görüntüleyebilir, konumlarını ayarlayabilir, boş alan olmadığında algılayabilir ve normalleştirilmiş metinlerin normal katmanlarını kullanabilirsiniz, vb. şirket modunun kaynak kodu çok okunabilir ve önerilen özelliklere sahip esnek bir açılır menü oluşturmak için kaplamaların daha ayrıntılı (ve çoğunlukla hatasız) kullanımını gösterir.


2

Bu işlevle geçici olarak arabellekteki metni görüntüleyebilirsiniz momentary-string-display. Görüntülenecek bir mesaj ve arabellekteki bir konum gerekir.

Bu:

(momentary-string-display "hello there" 200)

"merhaba" dizesini arabellekteki 200 konumuna yerleştirir. "Merhaba dünya" için yer açmak için bu noktada diğer tüm metinleri yan tarafa taşıyacaktır, ancak her şey herhangi bir tuşa bastığınızda olduğu yere geri yüklenecektir.

Bindirmeler oluşturmak için arabellekte metne ihtiyacınız yoktur, ancak bu metin özellikleri için bir gereksinimdir. Aşağıda, sıfır genişliğe sahip ek metin görüntülenmesine neden olan bir kaplama yer almaktadır:

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

Bu yer paylaşımının arabellek metnini uzağa iteceğini unutmayın; belirtilen konumdaki metni kapsamaz.

Tamponda point-max/ değerinden daha büyük herhangi bir konuma bir kaplama yerleştirmek mümkün görünmemektedir buffer-size, yani, bu kısıtlamanın çevresini ele geçirmedikçe, muhtemelen tampon metnin altında belirli bir konuma metin yerleştiremezsiniz. Tabii ki, metni arabellek metninden hemen sonra, after-stringözelliği point-maxkonuma sabitlenmiş bir bindirme üzerine yerleştirebilirsiniz.

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.