Reibungsloser Bildlauf (mit der Maus) für Inline-Bilder?

23

Ich zeige Bilder in einer Linie mit begin_src & result blocks an.

Wenn ich jedoch bei großen Bildern am unteren Rand des Bildes vorbeirolle, bekomme ich einen „Ruck“ und das gesamte Bild wird weggerollt. Wenn ich nach oben scrolle und auf ein Bild stoße, bekomme ich einen Ruck und sehe das ganze Bild, anstatt es Stück für Stück inkrementell zu sehen.

Dies macht es schwierig, mit großen Plantuml / Graphviz-Diagrammen im Organisationsmodus zu arbeiten.

Ich möchte ein reibungsloses Scollerlebnis, um sanft wie in einem Webbrowser über das Bild zu scrollen, ohne zu ruckeln.

Ich habe versucht:

(setq auto-window-vscroll nil)

und auch

(setq scroll-margin 1
scroll-conservatively 0
scroll-up-aggressively 0.01
scroll-down-aggressively 0.01)

Ich habe versucht, Smooth-Scroll-Paket und dieses Snippet auch.

Es sieht jedoch so aus, als würde ein Inline-Bild nur eine Zeile beanspruchen, und die Korrektur von Emacs, die nur einen einzeiligen Bildlauf ausführen, behebt das Problem nicht.

Irgendeine Lösung für dieses Problem?

[Bearbeiten] Scrollen zwischen Tastatur und Maus:

Das Scrollen mit der Maus ist impliziert. Aber das Scrollen mit der Tastatur wäre ein Bonus, wenn das Scrollen mit der Maus funktionieren würde.

[Bearbeiten]
Eine Art Workaround, aber nützlich für die Arbeit mit Bildern im Organisationsmodus, war das Öffnen dieser Bilder in einer externen App, die beim Ändern von Dateien automatisch neu geladen wird. Beispiel wäre eog (eye of gnome)oder shutteroder prievew (on OS X). Es kann org-file-appsdurch Hinzufügen von konfiguriert werden :

extension: \.png\'
Command:   eog "%s"
Leo Ufimtsev
quelle
Führen Sie einen tastaturbasierten Bildlauf oder einen Mausbildlauf durch?
mankoff
Maus scrollen, danke für die Klarstellung.
Leo Ufimtsev
Möglicherweise ist ein Patch für Emacs erforderlich. Ich weiß, dass die Funktionen / Vorteile des Mac-spezifischen Ports beim Scrollen flüssig sind : github.com/railwaycat/emacs-mac-port/blob/master/README-mac Aber selbst das ist nur mit der Maus möglich. Tastaturen bewegen sich zeilenweise und Bilder sind nur eine Zeile hoch ...
mankoff
Es wäre schön, einen
solchen
Wie wäre es (setq scroll-conservatively 101), wenn Sie alle anderen in der obigen Frage genannten Bildlaufeinstellungen auskommentieren und das Smooth-Scroll-Paket und / oder das Snippet deaktivieren? Die doc-Zeichenfolge für scroll-conservativelylautet: " Wenn der Wert größer als 100 ist, wird bei der erneuten Anzeige der Punkt nie neu zentriert, es wird jedoch immer so viel Text gescrollt, dass der Punkt sichtbar wird, auch wenn Sie sich weit wegbewegen. Ein Wert von Null bedeutet, dass der Punkt immer neu zentriert wird wenn es vom Bildschirm verschiebt. "
Gesetzesliste

Antworten:

7

Seit Emacs 26.1 kann der Puffer durch einzelne Pixel anstatt nur durch Linien gescrollt werden, um mit dem Mausrad reibungslos über Bilder zu scrollen. Um dies zu erreichen, habe ich die folgende Konfiguration verwendet:

;;; Scrolling.
;; Good speed and allow scrolling through large images (pixel-scroll).
;; Note: Scroll lags when point must be moved but increasing the number
;;       of lines that point moves in pixel-scroll.el ruins large image
;;       scrolling. So unfortunately I think we'll just have to live with
;;       this.
(pixel-scroll-mode)
(setq pixel-dead-time 0) ; Never go back to the old scrolling behaviour.
(setq pixel-resolution-fine-flag t) ; Scroll by number of pixels instead of lines (t = frame-char-height pixels).
(setq mouse-wheel-scroll-amount '(1)) ; Distance in pixel-resolution to scroll each mouse wheel event.
(setq mouse-wheel-progressive-speed nil) ; Progressive speed is too fast for me.

Bearbeiten:

Ich habe festgestellt, dass diese Lösung einige Einschränkungen aufweist, die hilfreich sein können, um zu wissen:

  • Wenn Sie über ein Bild scrollen, das höher als das Fenster ist, wird immer noch ein großer Erschütterungssprung erzeugt, bei dem das Fenster so lange gescrollt wird, bis das Bild nicht mehr sichtbar ist (die nächste Zeile befindet sich oben im Fenster).
  • Sie können den Bildlauf nicht sofort ausführen (weniger intensiv), aber dennoch um Pixel anstatt um Linien scrollen.
  • Wenn ein neues Bildlaufereignis ausgegeben wird, bevor die vorhandene Animation beendet ist, springt das Fenster zum Start der nächsten Animation, was zu einer Unterbrechung beim reibungslosen Bildlauf führt.
  • Viele Menschen haben mit dieser Methode einen solchen Leistungsabfall erlebt, dass sie einfach nicht verwendbar ist. Anscheinend ist dies häufig der Fall, wenn einige Modifikationen der Modusleitung verwendet werden.
Matthew Palermo
quelle
Das sollten Sie nicht brauchen, (require 'pixel-scroll)da pixel-scroll-modees automatisch geladen wird.
Tobias
Ah ja, du hast recht. Ich habe nur die Anweisungen in der Dokumentationszeichenfolge in pixel-scroll.el befolgt, aber ich denke, sie sind für ein etwas anderes Publikum.
Matthew Palermo
1

Wie wäre es damit:

;; scroll one line at a time (less "jumpy" than defaults)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
(setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling
(setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse
(setq scroll-step 1) ;; keyboard scroll one line at a time
C137
quelle
1

Das Problem, wie ich es verstehe, ist, dass das Bild eine einzelne Linie ist. Das Ändern des Bildlaufverhaltens löst das Problem nicht.

Die einzige Lösung, die mir bekannt ist, besteht darin, das Bild so aufzuteilen, dass es technisch gesehen viele kürzere Bilder gibt. Dies kann mit erfolgen insert-sliced-image.

Ista
quelle
Können Sie die Verwendung von insert-sliced-imagenäher erläutern ? Ist es möglich zu überschreiben org-toggle-inline-images, um diese zuerst aufzuschneiden?
Adam
Sie können dies insert-sliced-imagedurch eine Bewertung nachlesen. (describe-function 'insert-sliced-image)Ich habe keine nützlichen Erläuterungen, die der Dokumentation hinzugefügt werden könnten. Ich habe den org-display-inline-imagesCode durchgesehen , kann aber nicht verstehen, wo die Bilder tatsächlich eingefügt werden. Ich bin sicher, dass es möglich ist, es neu zu schreiben insert-sliced-image, aber ich verstehe nicht, wie es geht.
Ista