如何在 GNU Emacs 中逐行滚动?
Posted
技术标签:
【中文标题】如何在 GNU Emacs 中逐行滚动?【英文标题】:How to scroll line by line in GNU Emacs? 【发布时间】:2009-07-15 01:23:48 【问题描述】:简单地说,我正在尝试像在 vim 和大多数其他编辑器中一样在 emacs 中滚动;例如,当我从底部/顶部开始两行时,我按下/向上 (Ctrl-p,n, ↑,↓) 它只向上或向下移动一行,而不是屏幕的一半。
【问题讨论】:
我确信这将永远无法解决。这是上个 90 年代的缺陷,到 2010 年仍然存在。 @Steve Kuo:别再抨击了——这按设计工作,但可以通过简单的设置进行更改(或“修复”)。 @Teddy 这个“简单设置”是什么? @Teddy 是的,它是什么? @Rook:实际上我建议在 vim 中更频繁地使用z.
以获得 Emacs 的感觉 ;-) 这可能是不寻常的,但它实际上比逐行滚动更有用恕我直言。
【参考方案1】:
查看 Emacs Wiki 上的一些建议:
Emacs Wiki: Smooth Scrolling(setq scroll-step 1
scroll-conservatively 10000)
【讨论】:
实际上看到了 - 两个答案,你的和 jrockway 的,但在 Wiki 上都没有推荐。不幸的是,其原因并没有得到清楚的解释。这就是我发布这个问题的原因,希望有人找到一种没有缺陷的方法。 我不明白为什么不推荐这样做。我一直在使用类似的配置,并且运行良好。为了进一步向您保证,请参阅此滚动步骤文档(注意最后一句):*当点移出时尝试滚动窗口的行数。如果这无法将点带回帧上,则将点居中。如果为零,则点在移出框架后始终居中。如果您希望每次滚动始终为一行,则应将 `scroll-conservatively' 设置为较大的值,而不是将其设置为 1。 是的,环顾四周,我没有看到更多支持 wiki 上的警告说明的内容。例如,通过谷歌搜索,滚动步骤在多个 .emacs 文件中似乎很常见。也许wiki作者指的是旧版本的emacs? 从来没有遇到过scroll-conservatively
的任何问题。对此的警告有点奇怪 - 如果它引起问题,很容易从 init.el 中删除该行!
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… 所以对于 emacs
【参考方案2】:
如果要准确定位屏幕,可以使用Ctrl-L。
默认情况下,它将当前行定位在屏幕中间。
ESC 0 Ctrl-L 将当前行置于顶部。
【讨论】:
不要误会,但这与逐行滚动有什么关系? (即问题) 提供一种(在作者看来)使用手头工具更自然的替代工作流程是合理的。但您应该在前面加上免责声明,并解释为什么这种方法“更好”(如果可能的话)。 @dmckee - 我用过 vim ...嗯,很长时间了。很好用。然而,由于我正在使用 lisp 做一些事情,我开始强迫自己至少再次掌握 emacs,而这种“另类”的移动方式目前对我来说太过分了。阅读教程,知道它......但是,这太奇怪了,恕我直言。不自然。 @Idigas:当然。这很公平,你不需要听星蓝的建议。但我认为这种回答可以提供帮助,如果它是预先的并且包含令人信服的解释。 是的,这只需几次击键即可完成。 (我在 Google 上搜索了“如何逐行滚动”,只是因为这似乎是一种搜索“如何使代码按我想要的位置”的有用方法。)谢谢!【参考方案3】:我参加聚会有点晚了,但如果你不介意安装一个包,那么 smooth-scrolling(github,也可以在 MELPA 中找到)可能就是你想要的'正在寻找 - 它确实对我有用。
安装后,您可以在 init.el 中弹出以下内容:
(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)
最后一行是可选的;它开始在屏幕边缘附近滚动,而不是在屏幕边缘滚动,因此您始终可以在该点周围获得一些上下文。调整口味。
【讨论】:
当我读到这篇文章时,我哭了起来。很确定这是问题的答案。 是的,作为一个尝试 Emacs 的 Vim 用户,这正是我想要的。 我同时使用了这个解决方案和滚动步骤解决方案,当我从底部移动到第 6 行并按下它会滚动一行时,这种组合很有趣,从顶部开始也是如此。跨度> 遗憾的是,当您使用发生模式或搜索在文件中跳转时,平滑滚动现在经常失败:两者都可以将点移出屏幕,您必须按 C-L 才能让你的结果显示出来。【参考方案4】:我的解决方案不是更改 Emac 的默认滚动,而是从宏创建键序列命令。这样,您就可以方便地一次滚动一行。不理想,但超级容易。刚好有 M-(↓) 和 M-(↑) 可用,所以我用的就是这个。
我就是这样做的。首先,你需要录制一个用于上下滚动的宏。
开始宏
C-x (
向下滚动一个
C-u 1 C-v
停止宏
C-x )
向上滚动一个,使用
C-u 1 M-v
接下来您需要为宏命名。
M-x name-last-kbd-macro
当提示时给它一个名字:
down-one-line
然后只需使用以下命令将键序列绑定到该命令名称:
M-x global-set-key
在提示时,使用类似:
M-(down arrow)
然后它会问你要绑定哪个命令,你应该给它你之前发明的名字,例如,down-one-line。
这是我获得此信息的地方。您还可以在下面和其他地方找到有关将宏添加到 .emacs 文件的说明。
Here宏定义说明
Here 了解如何控制滚动
【讨论】:
【参考方案5】:自 2000 年以来,我一直在我的 .emacs
文件中使用这些。
(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward))
这样,我可以保持 Emacs 的默认行为以及一次滚动一行,这取决于我在做什么。
这至少工作到 GNU Emacs 22。我最近升级到 Emacs 24,发现 View-scroll-line-forward
和 View-scroll-line-backward
不再可用。经过一番打猎,我发现向上滚动和向下滚动行的工作。所以如果你使用的是 Emacs 24,你可以使用这个。
(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line))
我大多跳过了 Emacs 23,所以如果你使用的是那个版本,你可以尝试以上两种方法。
注意:scroll-up-line
实际上是向下滚动一行,因为缓冲区被向上移动了一行。
【讨论】:
谢谢,这行得通……但我遇到了另一个我在这里问过的问题:***.com/questions/19256551/…【参考方案6】:我重新绑定箭头键以执行滚动操作。
(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))
(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))
【讨论】:
这不是我想要的。我不想让屏幕滚动(因为它希望启用滚动锁定),但是让屏幕“移动”......哦,......记事本是如何做到的:)【参考方案7】:Simple 这样做:
(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))
然后元光标向上移动,元光标向下移动。
QED。不知道以上所有人都在抽什么烟!
【讨论】:
或者,正如我刚刚发布的,您可以使用向上滚动和向下滚动。【参考方案8】:我的 .emacs 文件中有以下内容,以启用良好的 ctrl-up、ctrl-down 滚动行为。我也将它用于鼠标滚轮。
(defun scroll-down-in-place (n)
(interactive "p")
(previous-line n)
(scroll-down n))
(defun scroll-up-in-place (n)
(interactive "p")
(next-line n)
(scroll-up n))
(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)
【讨论】:
我刚刚尝试过,但这不是我想要的行为。它使您可以向下到屏幕上的最后一行,但是单击向下时仍会“将屏幕向上拉几行”……不知道如何更好地解释。 我喜欢映射鼠标滚轮的想法。但是内置的 View-scroll-line-forward 和 View-scroll-line-backward (或更新的向上滚动和向下滚动)不会起作用,而不是定义自己的函数吗?跨度> 【参考方案9】:要让“vim”滚动把它放到你的 .emacs 文件中:
(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)
【讨论】:
@Matt 对我有用【参考方案10】:如果您正在寻找一种快速创建类似滚动效果的方法,请依次输入C-n
和C-l
,这会将光标向下移动然后居中。
【讨论】:
【参考方案11】:因为使用 M-up、M-down 会很烦人,因为它会干扰 org-mode,从而使这些命令过载。为了避免这个问题,我个人使用那些结合了 M-page-up M-page-down" 的命令。在这里我定义了向上和向下滚动到 1 行。
;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
(scroll-down number-of-lines)
(forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
(scroll-up number-of-lines)
(forward-line number-of-lines))))
;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
(scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
(scroll-up number-of-lines))))
【讨论】:
【参考方案12】:M-x customize-variable scroll-conservatively
将其设置为 1。
不过,你并不是真的想这样做。
【讨论】:
实际上看到了 - 两个答案,你的和 ars 的,但在 Wiki 上都没有推荐。不幸的是,其原因并没有得到清楚的解释。这就是我发布这个问题的原因,希望有人找到一种没有缺陷的方法。 如果您能向我们这些菜鸟说明为什么这不是一个好主意,那将会很方便。 我认为这不是一个好主意的唯一原因是滚动变慢:您总是必须一次滚动一行,而不是默认的半屏滚动。 (我猜?)【参考方案13】:如果您不介意使用鼠标并且有滚轮,您可以通过以下任一方式自定义变量 mouse-wheel-scroll-amount:
C-h v mouse-wheel-scroll-amount(点击自定义,将值更改为“特定行数”1,ApplyAndSave。)
或在 .emacs 中添加以下行: '(mouse-wheel-scroll-amount '(1 ((shift) . 1) ((meta)) ((control) . text-scale)))
这里列出了很多可能性 https://www.emacswiki.org/emacs/Scrolling
【讨论】:
【参考方案14】:如果你在 .xsession 中启动 emacs,在我的情况下,将滚动保守设置为 100+ 将不起作用,滚动步骤 1 也不起作用。但是如果你在 X 之后启动 emacs,它会起作用。
【讨论】:
【参考方案15】:在使用了可用配置(emacs 26.3)后,我得到了以下一组值:
(setq scroll-step 1
scroll-preserve-screen-position t
scroll-margin 10
scroll-conservatively 10
maximum-scroll-margin 0.0
scroll-up-aggressively 0.0
scroll-down-aggressively 0.0)
我相信scroll-margin
和scroll-conservatively
的值无关紧要,因为maximum-scroll-margin
会限制它们。他们只需要平等(也许?)。
滚动逐行发生,甚至在文件末尾(对我来说是最坏的情况)。唯一缺少的功能是顶部和底部的边距丢失了。
这是一种妥协,对我来说,平滑滚动是值得的。
【讨论】:
以上是关于如何在 GNU Emacs 中逐行滚动?的主要内容,如果未能解决你的问题,请参考以下文章