【问题标题】:fix to get smooth scrolling in emacs?修复以在 emacs 中平滑滚动?
【发布时间】:2010-09-02 20:58:36
【问题描述】:

我发现自己想使用 Emacs,主要是因为 org-mode,但我在习惯不流畅的滚动行为时遇到了很多麻烦。我知道这是 Emacs 的一个众所周知的问题/怪癖,并且有多种方法可以最大限度地减少滚动时的抖动。但到目前为止,我尝试过的任何方法都效果不佳。

我看到的主要建议是 (setq scroll-conservatively 10000) 或使用 smooth-scrolling.el 中提供的更全面的修复。我认为这两种方法对我来说都可以,但是当我按住向上箭头和向下箭头键以重复向上或向下滚动时,两者都失败了。当我这样做时,屏幕冻结,我看到滚动边距中的滚动指示条向上或向下移动。在我停止按住向上箭头或向下箭头键之前,屏幕不会刷新。

如果我反复按向上箭头或向下箭头,那么我的行为确实接近我想要的,即屏幕平滑滚动并且光标键不会重置到屏幕中间。但这是不可取的,因为 (1) 它需要重复按键,并且 (2) 我认为滚动速度比我应该能够在更好的解决方案中获得的速度要慢。

在我看来,按住光标键的问题似乎是向上箭头或向下箭头的重复率如此之快,以至于它会触发 emacs 停止屏幕刷新,直到释放键为止。我想知道对我来说可能的解决方法是在键重复率或在 emacs 中调用下一行/上一行函数的速率中添加一些延迟。

我没有看到其他人将此报告为问题,我想知道其他人是否也遇到过相同的行为。什么是解决问题的最佳方法,以便我可以按住向上/向下箭头键并具有足够慢的重复率以使屏幕不会冻结?

更新:上述行为是我在 Win7/64 上运行 emacs 时得到的。在同一台机器上,当我在运行 Ubuntu 10.04 的 VirtualBox VM 中运行 emacs 时,即使按住光标键,滚动也没有问题。

【问题讨论】:

  • scroll-conservatively 的大值为我解决了这个问题...也许您的计算机比键盘慢? :)
  • Trey -- 谢谢,我想知道是否可能是这种情况。所以看来我需要进一步的步骤才能平滑滚动。我的电脑不是怪物机器,但我不会说它慢;这是一台配备 Pentium SU4100、双核 1.3GHz 芯片和 4GB RAM 的笔记本电脑。
  • 请问,您能否告诉我们您是否在 Windows、Un*x 上安装了 emacs,它是在 gnome 等桌面环境内的终端窗口 (-nw) 中还是在 GUI(屏幕)外?

标签: windows emacs


【解决方案1】:

我遇到了同样的问题!尝试了所有 scroll-* 设置,在按住向下箭头时没有帮助。但是在gnu.emacs.help 上找到了这个,它终于奏效了(至少对我来说):

(setq redisplay-dont-pause t)

这是我现在在 .emacs 中的内容:

(setq redisplay-dont-pause t
  scroll-margin 1
  scroll-step 1
  scroll-conservatively 10000
  scroll-preserve-screen-position 1)

【讨论】:

  • +1;在相当强大的 Win7 x64 机器上遇到与 OP 相同的问题;此修复使滚动可以容忍(尽管不如其他启用了 smooth-scrolling.el 的平台好)
  • 我还需要(setq-default scroll-up-aggressively 0.01 scroll-down-aggressively 0.01)让事情变得合理(见zhangda.wordpress.com/2009/05/21/…
  • 我注意到redisplay-dont-pause 上的文档自 24.5 以来已过时。但是,我不确定为什么。
  • 省略 scroll-step 1 对我有用。查看scroll-step emacs 的帮助建议只使用滚动保守。自最初提出此问题以来,该内部文档可能已更改。
【解决方案2】:

scroll-conservatively 有帮助,但我也喜欢一个边距,这样我就可以看到滚动的内容——它为我保留了屏幕上的上下文。几年来,这些设置对我的各种计算机都很有效:

(setq scroll-conservatively 10)
(setq scroll-margin 7)

【讨论】:

  • 谢谢,但我已经尝试了不同的滚动保守值和滚动边距值,但它们并不能解决问题。如果我在每次向上或向下移动时离散地按下光标键,滚动就足够平滑,但是如果我按住光标键,屏幕会冻结,而滚动指示器显示在文件中移动的位置。在我将手指从按键上移开之前,屏幕不会刷新。
  • 是的,我注意到您在帖子中说过...我在 GNU Emacs 中使用了这些设置,从运行 Ubuntu 的 Atom 上网本到运行 OS X 的 Core 2 Duo 和 Quad - 工作中的核心 Windows 桌面...您使用的是什么品牌和构建的 Emacs?
  • 我在 64 位 Windows 7 上运行它: 2009 年 11 月 3 日的 GNU Emacs 23.1.50.1 (i386-mingw-nt6.1.7600) 在 LENNART-69DE564(已修补)上。我必须检查一下,但我很确定我在其他计算机上也有相同的行为,其中包括 atom 上网本和其他几个笔记本。
  • 另外,虽然我假设你已经尝试过,但你没有提到它:Adam Spiers smooth-scrolling.el。如果没有,这里有一个链接:adamspiers.org/computing/elisp/smooth-scrolling.el 滚动问题是一个众所周知的问题,尽管除了我上面发布的修复它之外我从来不需要太多。
  • 接受了这个答案,因为它确实指出了改进滚动的公认方法,但是这和 smooth-scrolling.el 修复都没有解决我在 Win7/64 上运行的主 Emacs 上的问题。不过,它们在 Ubuntu 上对我来说工作得很好。
【解决方案3】:

试试这个:

;; 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-default smooth-scroll-margin 0)
(setq scroll-step 1
      scroll-margin 1
      scroll-conservatively 100000)

并使用 pager.el。

;; Pager
(require 'pager-default-keybindings)

这就是我想要的 :) 享受吧!

【讨论】:

    【解决方案4】:

    请注意,这里没有提到这一点,但我发现对于较大的文件,我最终会遇到一些令人讨厌的延迟,滚动会落后于字体更新。

    这依赖于重绘不会那么慢到系统更新太慢。

    详情请见this question


    这些设置对我很有效:

    (setq
     scroll-conservatively 1000                     ;; only 'jump' when moving this far
     scroll-margin 4                                ;; scroll N lines to screen edge
     scroll-step 1                                  ;; keyboard scroll one line at a time
     mouse-wheel-scroll-amount '(6 ((shift) . 1))   ;; mouse scroll N lines
     mouse-wheel-progressive-speed nil              ;; don't accelerate scrolling
    
     redisplay-dont-pause t                         ;; don't pause display on input
    
     ;; Always redraw immediately when scrolling,
     ;; more responsive and doesn't hang!
     fast-but-imprecise-scrolling nil
     jit-lock-defer-time 0
     )
    

    【讨论】:

      【解决方案5】:

      并非在所有平台上都会遇到此行为。对于那些存在问题的平台,我建议使用此设置:

      (setq scroll-conservatively 0)
      

      每次滚动到另一页时,它会将光标置于屏幕中间。

      【讨论】:

      • 我认为这是所有平台上的默认设置。问题是它甚至没有真正滚动,当你到达底部时,屏幕只会向上跳半页。也许使用 emacs 多年的人会接受这种工作方式,但它与几乎所有其他编辑器都不同。其他文本编辑器(和其他应用程序,如浏览器和文字处理器)滚动。让缓冲区窗口突然向上移动半个屏幕令人不安且不友好。
      【解决方案6】:

      正如 rpdillon 所建议的,我对 Adam Spiers 的 smooth-scrolling 非常满意。我认为它应该有自己的答案。

      【讨论】:

      • 我也试过smooth-scrolling.el,正如我在原帖中所说的那样。它对我来说并不比滚动保守解决方案更好。
      【解决方案7】:

      通过将其添加到我的 .emacs 中,我只能使用 M-Up / M-Down 滚动一行:

      (global-set-key (kbd "M-<down>") (lambda () (interactive) (scroll-up   1)))
      (global-set-key (kbd "M-<up>")   (lambda () (interactive) (scroll-down 1)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        相关资源
        最近更新 更多