Pencere kaydırıldığında pencere sonu nasıl alınır?

window-end belgesinin belgesinden:

Güncelleme sıfır değilse bile, noktadan ekran kalkmışsa, pencere sonu, ekranı kaydırmaya çalışmaz, gerçek yeniden görüntülemenin yolu. Pencere başlangıç ​​değerini değiştirmez. Aslında, kaydırma gerekli değilse görüntülenen metnin nerede biteceğini bildirir.

window-end (kod ), kaydırma yapılması gerekmiyorsa görüntülenen metnin nerede biteceğini bildirdiğinden , doğru pencere-sonu için ne yapmalıyım? > geçerli pencerenin sonunda next-line 'i çağırdıktan sonra, pencerenin bir satırda ilerlemesine neden olur? window-end işlevini çağırmadan önce pencereyi yeniden görüntülemeye zorlamak gibi bir şeye ihtiyacım var mı?

3
IIUC, bunu yapamazsınız (belki önce bir yeniden görüntülemeye zorlayarak, örneğin (yeniden görüntülemeli) ile. Büyük ihtimalle, yapmaya çalıştığınız şeyin daha fazlasını açıklarsanız, size bir daha iyi cevap.
katma yazar sds, kaynak
"Bazı işlevler" in ne olduğunu bilmiyorum ve neden pencerenin başlangıç ​​/ bitişini bilmesi gerektiğini ve neden sonraki satırın yürütülmesi sırasında niçin ihtiyaç duyduğunu bile bilmiyorum.
katma yazar sds, kaynak
Öyleyse bunun için pencere-başlama ve pencere-sonu bilmeniz gerekmez. Bunun yerine, görüntülenen arabelleğin her bir bölümünde çağrılacak olan fontification-functions komutunu kullanmak istersiniz. Genellikle bu doğrudan kullanılmaz, bunun yerine jit-lock-register ile yapılır.
katma yazar sds, kaynak
Örnek için nlinum kipine (GNU ELPA'da) bakın.
katma yazar sds, kaynak
@Stefan bazı işlevleri uygulamaya çalışıyorum paket. Sorun şu ki, görünen tüm satırları almak için pencere-başlangıcı ve pencere-sonu 'nı bilmem gerekiyor, ama sonraki satır pencerenin kaydırılmasına neden olur, bu pencere sınırları doğru değildir.
katma yazar Mahesh, kaynak
@Stefan jit-lock-register kullanmaya çalışırken şansım yok. Sadece parametrelerini basan basit bir işlev kaydedildikten sonra, pencereyi kaydırmak için next-line kullandığımda çağrılmıyor gibi görünüyor. Bunu kullanan bazı kodları işaret edebilir misiniz? DÜZENLEME: bir arabelleği ilk ziyaret ettiğinde farklı parametrelerle birden çok kez denir.
katma yazar Mahesh, kaynak
Görsel hatları etiketlemek istediğim için window-start ve window-end 'i bilmelisiniz. sonraki satır pencerenin kaydırılmasına neden olduğunda, görsel çizgiler değişir, bu yüzden kaplamayı uygun şekilde değiştirmemiz gerekir.
katma yazar Mahesh, kaynak

1 cevap

Bir kullanıcının yapabileceği en iyi şey - bir yeniden görüntülemeyi zorlamadan veya C-kaynak kodunu değiştirmeden - window-end fonksiyonunu kullanır. İsteğe bağlı ikinci argüman ile t ile birlikte olarak ayarlanan window-scroll-functions hook iki argüman alır - https://www.gnu.org/software/emacs /manual/html_node/elisp/Window-Hooks.html#Window-Hooks [NOT: Bir yeniden görüntüyü zorlamak çıplak göze (bölünmüş bir saniye için) bitmemiş bir ürün ortaya çıkarabilir - örneğin, yeni yer paylaşımları belki de henüz kaldırılmamış/yerleştirilmemiş.

CAVEAT:  Beware that the window-scroll-functions hook fires sometimes more than once during each command loop (while redisplay performs its job), and the first values for window-start and window-end win t are not always correct, and the last values are not always correct either -- e.g., when inserting/yanking, or when using goto. [Fn 1.] When the window-scroll-functions hook runs multiple times, the function attached to the hook can cause significant performance issues depending upon the complexity of said function. And, as mentioned, sometimes the user is simply out of luck -- i.e., correct values can never be obtained. Using pos-visible-in-window-p can be helpful as a workaround to set up some checks to prevent the function attached to the hook from fully running its course if point is not yet fully visible; and, a variable can be set up to test for whether the function has already fully run one time during that command loop (so that it doesn't keep running).

Kendi kişisel kurulumum için her zaman doğru window-start ve window-end sırasında yeniden görüntüle; Ancak, programcı olmadığımdan ve gerçekten motive olmuş tek kişi olduğumdan, ana yolun içine giremez: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22404 window-start-end-hook olarak adlandırılır - - Ancak bir kullanıcı sadece taslak yama ile deneme yapmak ve Emacs'i kaynaktan oluşturmak istiyorsa kullanılabilir. Taslak yamam, pencere kaydırma işleminden bağımsız olarak çalışır, örn., Görünür pencerede nokta taşırken çalışır; goto kullanırken çalışır; takarken/yanarken çalışır; ve, kaydırma yaparken çalışır. Bu konsepti geliştirmeyle ilgilenen herkes 22404 özellik talebine bir gönderi göndermekten çekinmelidir.


Ayrıca ilgili konulara bakınız:

Yeniden arama çağırmadan pencere başlangıcı nasıl güncellenir?

https://stackoverflow.com/questions/23923371/ emacs-hesaplanması-new-pencere-başlangıç ​​sonu olmadan-yeniden görüntülemek/24216247 # 24216247


NOTE:  Debugging functions that run during redisplay may require using a feature called trace-redisplay (after launching Emacs from the command line) that is available when building Emacs from source with options such as: ./configure --enable-checking='glyphs'.


[Fn. 1.]:  When working with Bug #22637, Eli Z. on the Emacs development team explained that the reason the window-scroll-functions hook does not yield correct results for inserting/yanking or goto is because it was never designed for those scenarios: "The reason window-scroll-functions aren't run in both of these test cases is that what happens there is not considered 'scrolling'. Scrolling is informally defined as either an explicit call to a function that scrolls the window, or a pseudo-scroll done by the display engine when it detects that some part of the window's previous display is still present, but in a different vertical position. Moving point to an arbitrary location is neither." https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22637#35

3
katma
Dürüst olmak gerekirse, bence bunu çözmenin kolay ve anlaşılır bir yolu olmalı ve Emacs bunu sağlamalıdır. Bu sorunun ne kadar karmaşık olduğunu görmek beni şaşırttı. Bu yüzden açık bırakacağım. Cevabınız ve bu sorunu çözme çabanız için teşekkürler.
katma yazar Mahesh, kaynak
Teşekkürler! Emacs'in yeniden görüntülenme kodunun gerçekten karmaşık olduğunu duydum. Her neyse, postanız ve @ abo-abo'nun ilgili konudaki yorumları geçici bir çözüm için yeterli ipucu verir. Bunu olduğu gibi bırakmalı mıyım yoksa çözülecek mi? Belki başka biri de benzer problemlerle karşılaşabilir.
katma yazar Mahesh, kaynak
Yeniden görüntülemeden önce window-start ve window-end neden çalıştırılabileceğini sorabilir miyim? Kulağa tuhaf geliyor çünkü window-start ve window-end redisplay tarafından belirlenen mevcut görsel alana bağlı olmalıdır. Neden görsel alanın belirlenmesinden önce geri dönüyorlar? (Emacs'in içsel büyüsünden hiçbirini bilmiyorum ...)
katma yazar Mahesh, kaynak
Bir geliştiricinin bakış açısından bakıldığında, bu sorunun çözülmesini engelleyen şeyleri göremiyorum. window-start ve window-end 'in her zaman doğru değerleri döndürebilmesini beklemeliyiz - bu, bu işlevlerin ne yapması gerektiği. Bahsettiğiniz yöntemleri ve @ abo-abo'nun yaklaşımını deneyeceğim.
katma yazar Mahesh, kaynak
@ Abo-abo'nun zaten benzer bir soru sorduğunu bilmiyorum! Temelde onunla aynı sorularım var. Gönderinizi bu konuya okudum ve henüz zarif bir çözüm yok gibi görünüyor. window-start-end-hook iyi, ancak özellik talebini nasıl ileriye götürebiliriz?
katma yazar Mahesh, kaynak
Eli Z.'ye eşzamanlı bir e-posta göndermenin yanı sıra, 22404'ün girişinizi seslendirmesi dışında, özelliği gerçeğe dönüştürmek için başka neler yapabileceğimi bilmiyorum. John, tüm hata e-postalarını okuduğu için doğrudan karbon kopyalanmasına gerek olmadığını söyledi. Sakıncası yoksa (son olayları düzenli olarak gözden geçiremediğimden), 22404 özel e-postaların bir kopyasını almayı takdir ediyorum.]
katma yazar lawlist, kaynak
window-start-end-hook noktası tamamen göründüğünde tamamen (yani, kodun tamamını çalıştırır) tetikler, ancak nokta olduğunda tamamen ateşlenebilecek bazı yerleşik kodlar vardır. kısmen görünür. Bazı kullanıcılar kısmen görünür olan bu özelliği isteyebilir - nil olarak ayarlanabilen yerleşik make-imleç-satır-tamamen görünür için belge dizgisine bakınız. ancak varsayılan değer t . Başka bir deyişle, taslak kanıt konseptim nihai bir ürün değil (yine de bazı TLC kullanıyor olabilir) - ama bunu kendi kurulumumda birkaç hafta boyunca kullanıyorum ve çok mutluyum.
katma yazar lawlist, kaynak
Eli Z., bir kullanıcının Lisp'i yeniden gösterime sokmasına izin vermenin Emacs'in asılmasına veya çökmesine neden olabileceğinden endişe duyuyor; bununla birlikte, beni endişelendirdiğini düşündüğüm safe_call 'ı kullanmam için bana rehberlik etti, çünkü yeniden görünme sırasında bir hata olduğunda Lisp fonksiyonu iptal edilecek. Eli Z., teklif edilen redisplay-hook-kancayu olarak adlandırdığı son kancayı tercih eder; Ancak, çözümümün daha iyi olduğuna inanıyorum çünkü bir kullanıcının düzeni değiştiren Lisp'i tanıtmasına izin verir (örneğin, nokta hareket eder veya yazı tipi boyutunu artırır) ve yeniden görüntüleme, geçici sonucu tekrar kontrol eder ve gerekirse daha fazla iş yapar.
katma yazar lawlist, kaynak
Sorun şu ki, window-start ve window-end için yeni değerlerin nihayetinde ne olacağını, yani işinin bir parçası olduğunu yeniden ortaya koyuyor. window-start ve window-end gibi işlevler önce yeniden göster işlemi başlar (bu yeni potansiyel değerler olduğunda) hala belirsiz ve/veya bilinmeyen) - böylece yeniden görüntülemenin kuyruk sonunda bir çözüm gereklidir. [Yeniden oynatma sırasında Lisp hata mesajları kullanılamaz, bu nedenle izleme-yeniden görüntülemeyi gibi bir şey hata ayıklama için gereklidir.]
katma yazar lawlist, kaynak
Örneğin, pencere kaydırma işlevleri kanca ve yeniden-öncesi-gösterme işlevi , her ikisinin de ekrana yansıyan işlevleri içerebilir - örneğin, hareket noktası veya artış Yazı boyutunu küçült Yeniden görüntülemenin, yeni window-start ve window-end 'in nihayetinde ne olacağına karar vermek için ek çalışmalar yapması gerekir. window-start-end-hook adlı yeni taslak kavramı, aynı zamanda, nokta taşıma veya font boyutunu büyütme/azaltma işlevlerini de içerebilir; böylece window-start değerlerinde bir değişiklik olur. ve pencere sonu . Normal Lisp fonksiyonları, </>> yeniden görüntülemeden önce çalışır.
katma yazar lawlist, kaynak
<�İ> Neden Emacs ne yaparsa yapsın, sadece yeni Emacs özelliklerimi uygulamak için birincil olarak C dilini öğrenmeye başlayan bir programlama hobisi (ticaretle değil) ve/veya Emacs geliştirme ekibine yeni özellikler ve değişiklikler önermek. Ancak bana göre, window-start-end-hook veya post-redisplay-hook gibi bir şeye kesinlikle ihtiyacımız var.
katma yazar lawlist, kaynak
Bu konuya dikkat çekiyorum, ki bu benim bir tutkum. Çözdüğünü işaretlerseniz, insanlar ilgilerini kaybeder. abo-abo, muhtemelen cevaptan memnun olmadığından ya da yeni bir özellik istediğinden ya da bu konuya daha fazla ilgi duymasından dolayı sorusunu açık bıraktı. Benim kişisel tercihim, bu soruyu kabul edilebilir bir cevaba sahip olmadığından bırakmaktır, böylece dikkat çeker. Ama karar sizinkidir - bu sizin sorunuzdur ve tatmin edici bir çözümün olup olmadığı konusunda nihai sözünüz vardır. Bir onay işareti almak için acelem yok :)
katma yazar lawlist, kaynak